quantumflow-sdk 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. api/__init__.py +1 -0
  2. api/auth.py +208 -0
  3. api/main.py +403 -0
  4. api/models.py +137 -0
  5. api/routes/__init__.py +1 -0
  6. api/routes/auth_routes.py +234 -0
  7. api/routes/teleport_routes.py +415 -0
  8. db/__init__.py +15 -0
  9. db/crud.py +319 -0
  10. db/database.py +93 -0
  11. db/models.py +197 -0
  12. quantumflow/__init__.py +47 -0
  13. quantumflow/algorithms/__init__.py +48 -0
  14. quantumflow/algorithms/compression/__init__.py +7 -0
  15. quantumflow/algorithms/compression/amplitude_amplification.py +189 -0
  16. quantumflow/algorithms/compression/qft_compression.py +133 -0
  17. quantumflow/algorithms/compression/token_compression.py +261 -0
  18. quantumflow/algorithms/cryptography/__init__.py +6 -0
  19. quantumflow/algorithms/cryptography/qkd.py +205 -0
  20. quantumflow/algorithms/cryptography/qrng.py +231 -0
  21. quantumflow/algorithms/machine_learning/__init__.py +7 -0
  22. quantumflow/algorithms/machine_learning/qnn.py +276 -0
  23. quantumflow/algorithms/machine_learning/qsvm.py +249 -0
  24. quantumflow/algorithms/machine_learning/vqe.py +229 -0
  25. quantumflow/algorithms/optimization/__init__.py +7 -0
  26. quantumflow/algorithms/optimization/grover.py +223 -0
  27. quantumflow/algorithms/optimization/qaoa.py +251 -0
  28. quantumflow/algorithms/optimization/quantum_annealing.py +237 -0
  29. quantumflow/algorithms/utility/__init__.py +6 -0
  30. quantumflow/algorithms/utility/circuit_optimizer.py +194 -0
  31. quantumflow/algorithms/utility/error_correction.py +330 -0
  32. quantumflow/api/__init__.py +1 -0
  33. quantumflow/api/routes/__init__.py +4 -0
  34. quantumflow/api/routes/billing_routes.py +520 -0
  35. quantumflow/backends/__init__.py +33 -0
  36. quantumflow/backends/base_backend.py +184 -0
  37. quantumflow/backends/braket_backend.py +345 -0
  38. quantumflow/backends/ibm_backend.py +112 -0
  39. quantumflow/backends/simulator_backend.py +86 -0
  40. quantumflow/billing/__init__.py +25 -0
  41. quantumflow/billing/models.py +126 -0
  42. quantumflow/billing/stripe_service.py +619 -0
  43. quantumflow/core/__init__.py +12 -0
  44. quantumflow/core/entanglement.py +164 -0
  45. quantumflow/core/memory.py +147 -0
  46. quantumflow/core/quantum_backprop.py +394 -0
  47. quantumflow/core/quantum_compressor.py +309 -0
  48. quantumflow/core/teleportation.py +386 -0
  49. quantumflow/integrations/__init__.py +107 -0
  50. quantumflow/integrations/autogen_tools.py +501 -0
  51. quantumflow/integrations/crewai_agents.py +425 -0
  52. quantumflow/integrations/crewai_tools.py +407 -0
  53. quantumflow/integrations/langchain_memory.py +385 -0
  54. quantumflow/integrations/langchain_tools.py +366 -0
  55. quantumflow/integrations/mcp_server.py +575 -0
  56. quantumflow_sdk-0.1.0.dist-info/METADATA +190 -0
  57. quantumflow_sdk-0.1.0.dist-info/RECORD +60 -0
  58. quantumflow_sdk-0.1.0.dist-info/WHEEL +5 -0
  59. quantumflow_sdk-0.1.0.dist-info/entry_points.txt +2 -0
  60. quantumflow_sdk-0.1.0.dist-info/top_level.txt +3 -0
@@ -0,0 +1,415 @@
1
+ """
2
+ Quantum Teleportation & Secure Messaging API Routes.
3
+
4
+ Endpoints for quantum teleportation, QKD, and secure messaging
5
+ that can be consumed by external applications.
6
+ """
7
+
8
+ from typing import Optional, List
9
+ from fastapi import APIRouter, HTTPException, Depends
10
+ from pydantic import BaseModel
11
+
12
+ from quantumflow.core.teleportation import (
13
+ QuantumTeleporter,
14
+ QKDExchange,
15
+ SecureMessenger,
16
+ )
17
+ from api.auth import get_optional_user
18
+ from db.models import User
19
+
20
+ router = APIRouter(prefix="/v1/quantum", tags=["Quantum Teleportation"])
21
+
22
+ # Global instances
23
+ _teleporter: Optional[QuantumTeleporter] = None
24
+ _qkd: Optional[QKDExchange] = None
25
+ _messenger: Optional[SecureMessenger] = None
26
+
27
+
28
+ def get_teleporter() -> QuantumTeleporter:
29
+ global _teleporter
30
+ if _teleporter is None:
31
+ _teleporter = QuantumTeleporter(backend="simulator")
32
+ return _teleporter
33
+
34
+
35
+ def get_qkd() -> QKDExchange:
36
+ global _qkd
37
+ if _qkd is None:
38
+ _qkd = QKDExchange(backend="simulator")
39
+ return _qkd
40
+
41
+
42
+ def get_messenger() -> SecureMessenger:
43
+ global _messenger
44
+ if _messenger is None:
45
+ _messenger = SecureMessenger(backend="simulator")
46
+ return _messenger
47
+
48
+
49
+ # ==================== Request/Response Models ====================
50
+
51
+
52
+ class TeleportStateRequest(BaseModel):
53
+ """Request to teleport a quantum state."""
54
+ state_real: List[float] # Real parts [α_r, β_r]
55
+ state_imag: List[float] = [0.0, 0.0] # Imaginary parts [α_i, β_i]
56
+ bell_pair_id: Optional[str] = None
57
+
58
+
59
+ class TeleportStateResponse(BaseModel):
60
+ """Response from teleportation."""
61
+ success: bool
62
+ bell_measurement: List[int]
63
+ corrections_applied: str
64
+ fidelity: float
65
+ original_state: Optional[List[dict]] = None
66
+ teleported_state: Optional[List[dict]] = None
67
+
68
+
69
+ class CreateBellPairsRequest(BaseModel):
70
+ """Request to create Bell pairs."""
71
+ count: int = 10
72
+
73
+
74
+ class BellPairResponse(BaseModel):
75
+ """Bell pair information."""
76
+ id: str
77
+ state: str
78
+ fidelity: float
79
+
80
+
81
+ class QKDExchangeRequest(BaseModel):
82
+ """Request for QKD key exchange."""
83
+ key_length: int = 256
84
+ simulate_eve: bool = False
85
+
86
+
87
+ class QKDExchangeResponse(BaseModel):
88
+ """Response from QKD exchange."""
89
+ key: str
90
+ key_length: int
91
+ raw_photons: int
92
+ sifted_bits: int
93
+ error_rate: float
94
+ eve_detected: bool
95
+ secure: bool
96
+
97
+
98
+ class EstablishChannelRequest(BaseModel):
99
+ """Request to establish secure channel."""
100
+ recipient: str
101
+ bell_pairs: int = 100
102
+ key_length: int = 256
103
+
104
+
105
+ class ChannelResponse(BaseModel):
106
+ """Secure channel information."""
107
+ channel_id: str
108
+ recipient: str
109
+ bell_pairs_available: int
110
+ qkd_key_established: bool
111
+ key_length: int
112
+ ready: bool
113
+
114
+
115
+ class SendMessageRequest(BaseModel):
116
+ """Request to send secure message."""
117
+ message: str
118
+ channel_id: Optional[str] = None
119
+
120
+
121
+ class SendMessageResponse(BaseModel):
122
+ """Response from sending message."""
123
+ success: bool
124
+ message_length: int
125
+ original_bits: int
126
+ compressed_qubits: int
127
+ classical_bits_transmitted: int
128
+ compression_ratio: float
129
+ teleportation_fidelity: float
130
+ qkd_secured: bool
131
+ eavesdrop_detected: bool
132
+ security: str
133
+
134
+
135
+ class CompressedTeleportRequest(BaseModel):
136
+ """Request for compressed teleportation."""
137
+ data: str
138
+ use_qkd: bool = True
139
+
140
+
141
+ class CompressedTeleportResponse(BaseModel):
142
+ """Response from compressed teleportation."""
143
+ success: bool
144
+ original_size: int
145
+ compressed_qubits: int
146
+ classical_bits_sent: int
147
+ compression_ratio: float
148
+ teleportation_fidelity: float
149
+ qkd_key_used: bool
150
+ error_detected: bool
151
+
152
+
153
+ # ==================== Teleportation Endpoints ====================
154
+
155
+
156
+ @router.post("/teleport", response_model=TeleportStateResponse)
157
+ async def teleport_state(
158
+ request: TeleportStateRequest,
159
+ user: Optional[User] = Depends(get_optional_user),
160
+ ):
161
+ """
162
+ Teleport a quantum state from Alice to Bob.
163
+
164
+ Uses pre-shared Bell pairs and classical communication
165
+ to transfer a quantum state without sending qubits.
166
+
167
+ The state is specified as |ψ⟩ = α|0⟩ + β|1⟩ where α and β
168
+ are complex numbers.
169
+ """
170
+ teleporter = get_teleporter()
171
+
172
+ # Construct complex state
173
+ if len(request.state_real) != 2 or len(request.state_imag) != 2:
174
+ raise HTTPException(status_code=400, detail="State must have 2 amplitudes")
175
+
176
+ state = [
177
+ complex(request.state_real[0], request.state_imag[0]),
178
+ complex(request.state_real[1], request.state_imag[1]),
179
+ ]
180
+
181
+ result = teleporter.teleport_state(state, request.bell_pair_id)
182
+
183
+ # Convert complex to dict for JSON
184
+ def complex_to_dict(c):
185
+ return {"real": c.real, "imag": c.imag}
186
+
187
+ return TeleportStateResponse(
188
+ success=result.success,
189
+ bell_measurement=list(result.bell_measurement),
190
+ corrections_applied=result.corrections_applied,
191
+ fidelity=result.fidelity,
192
+ original_state=[complex_to_dict(c) for c in result.original_state] if result.original_state else None,
193
+ teleported_state=[complex_to_dict(c) for c in result.teleported_state] if result.teleported_state else None,
194
+ )
195
+
196
+
197
+ @router.post("/teleport/compressed", response_model=CompressedTeleportResponse)
198
+ async def teleport_compressed(
199
+ request: CompressedTeleportRequest,
200
+ user: Optional[User] = Depends(get_optional_user),
201
+ ):
202
+ """
203
+ Teleport compressed data using the full pipeline:
204
+
205
+ 1. Compress data into quantum state (N bytes → log(N) qubits)
206
+ 2. Teleport each compressed qubit using Bell pairs
207
+ 3. Secure classical correction bits with QKD (optional)
208
+
209
+ This achieves massive bandwidth reduction while maintaining
210
+ physics-based security.
211
+ """
212
+ teleporter = get_teleporter()
213
+ result = teleporter.teleport_compressed(request.data, request.use_qkd)
214
+
215
+ return CompressedTeleportResponse(
216
+ success=result.success,
217
+ original_size=result.original_size,
218
+ compressed_qubits=result.compressed_qubits,
219
+ classical_bits_sent=result.classical_bits_sent,
220
+ compression_ratio=result.compression_ratio,
221
+ teleportation_fidelity=result.teleportation_fidelity,
222
+ qkd_key_used=result.qkd_key_used,
223
+ error_detected=result.error_detected,
224
+ )
225
+
226
+
227
+ @router.post("/bell-pairs", response_model=List[BellPairResponse])
228
+ async def create_bell_pairs(
229
+ request: CreateBellPairsRequest,
230
+ user: Optional[User] = Depends(get_optional_user),
231
+ ):
232
+ """
233
+ Create entangled Bell pairs for teleportation.
234
+
235
+ In a real system, this would distribute entanglement
236
+ between quantum devices. Each pair can be used for
237
+ one teleportation operation.
238
+ """
239
+ teleporter = get_teleporter()
240
+ pairs = teleporter.create_bell_pairs(request.count)
241
+
242
+ return [
243
+ BellPairResponse(id=p.id, state=p.state, fidelity=p.fidelity)
244
+ for p in pairs
245
+ ]
246
+
247
+
248
+ @router.get("/bell-pairs")
249
+ async def list_bell_pairs(
250
+ user: Optional[User] = Depends(get_optional_user),
251
+ ):
252
+ """List available Bell pairs."""
253
+ teleporter = get_teleporter()
254
+ return {
255
+ "count": len(teleporter.bell_pairs),
256
+ "pairs": [
257
+ {"id": p.id, "state": p.state, "fidelity": p.fidelity}
258
+ for p in teleporter.bell_pairs
259
+ ],
260
+ }
261
+
262
+
263
+ # ==================== QKD Endpoints ====================
264
+
265
+
266
+ @router.post("/qkd/exchange", response_model=QKDExchangeResponse)
267
+ async def qkd_exchange(
268
+ request: QKDExchangeRequest,
269
+ user: Optional[User] = Depends(get_optional_user),
270
+ ):
271
+ """
272
+ Perform BB84 quantum key distribution.
273
+
274
+ Establishes a shared secret key between Alice and Bob
275
+ using polarized photons. Any eavesdropping attempt
276
+ introduces detectable errors (~25% error rate).
277
+
278
+ Set simulate_eve=true to see how eavesdropping is detected.
279
+ """
280
+ qkd = get_qkd()
281
+ result = qkd.exchange(request.key_length, request.simulate_eve)
282
+
283
+ return QKDExchangeResponse(**result)
284
+
285
+
286
+ # ==================== Secure Messaging Endpoints ====================
287
+
288
+
289
+ @router.post("/channel", response_model=ChannelResponse)
290
+ async def establish_channel(
291
+ request: EstablishChannelRequest,
292
+ user: Optional[User] = Depends(get_optional_user),
293
+ ):
294
+ """
295
+ Establish a secure quantum channel with a recipient.
296
+
297
+ This creates:
298
+ 1. Bell pairs for teleportation
299
+ 2. QKD key for securing classical bits
300
+
301
+ Use the returned channel_id for subsequent messages.
302
+ """
303
+ messenger = get_messenger()
304
+ result = messenger.establish_channel(
305
+ request.recipient,
306
+ request.bell_pairs,
307
+ request.key_length,
308
+ )
309
+
310
+ return ChannelResponse(**result)
311
+
312
+
313
+ @router.post("/message", response_model=SendMessageResponse)
314
+ async def send_secure_message(
315
+ request: SendMessageRequest,
316
+ user: Optional[User] = Depends(get_optional_user),
317
+ ):
318
+ """
319
+ Send a message using compressed quantum teleportation.
320
+
321
+ The message is:
322
+ 1. Compressed into quantum state (log N qubits)
323
+ 2. Teleported via pre-shared Bell pairs
324
+ 3. Classical bits encrypted with QKD key
325
+
326
+ Returns efficiency metrics showing bandwidth savings
327
+ compared to classical transmission.
328
+
329
+ Example for 1000 byte message:
330
+ - Classical: 8000 bits
331
+ - Compressed Teleport: ~20 classical bits
332
+ """
333
+ messenger = get_messenger()
334
+ result = messenger.send_message(request.message, request.channel_id)
335
+
336
+ return SendMessageResponse(**result)
337
+
338
+
339
+ @router.get("/channel/stats")
340
+ async def get_channel_stats(
341
+ user: Optional[User] = Depends(get_optional_user),
342
+ ):
343
+ """Get statistics about the secure quantum channel."""
344
+ messenger = get_messenger()
345
+ return messenger.get_channel_stats()
346
+
347
+
348
+ # ==================== Demo Endpoint ====================
349
+
350
+
351
+ @router.post("/demo/full-pipeline")
352
+ async def demo_full_pipeline(
353
+ message: str = "Hello, quantum world!",
354
+ simulate_eve: bool = False,
355
+ user: Optional[User] = Depends(get_optional_user),
356
+ ):
357
+ """
358
+ Demo the full quantum secure messaging pipeline.
359
+
360
+ Shows step-by-step:
361
+ 1. QKD key exchange
362
+ 2. Bell pair creation
363
+ 3. Message compression
364
+ 4. Quantum teleportation
365
+ 5. Security verification
366
+
367
+ Perfect for understanding how the system works.
368
+ """
369
+ messenger = get_messenger()
370
+ qkd = get_qkd()
371
+ teleporter = get_teleporter()
372
+
373
+ # Step 1: QKD
374
+ qkd_result = qkd.exchange(key_length=128, eve_present=simulate_eve)
375
+
376
+ # Step 2: Bell pairs
377
+ pairs = teleporter.create_bell_pairs(10)
378
+
379
+ # Step 3-4: Compressed teleportation
380
+ teleport_result = teleporter.teleport_compressed(message, use_qkd=True)
381
+
382
+ return {
383
+ "message": message,
384
+ "steps": {
385
+ "1_qkd_exchange": {
386
+ "key_length": qkd_result["key_length"],
387
+ "error_rate": round(qkd_result["error_rate"], 4),
388
+ "eve_detected": qkd_result["eve_detected"],
389
+ "secure": qkd_result["secure"],
390
+ },
391
+ "2_bell_pairs": {
392
+ "created": len(pairs),
393
+ "average_fidelity": round(sum(p.fidelity for p in pairs) / len(pairs), 4),
394
+ },
395
+ "3_compression": {
396
+ "original_bytes": teleport_result.original_size,
397
+ "compressed_qubits": teleport_result.compressed_qubits,
398
+ "ratio": round(teleport_result.compression_ratio, 2),
399
+ },
400
+ "4_teleportation": {
401
+ "classical_bits_sent": teleport_result.classical_bits_sent,
402
+ "fidelity": round(teleport_result.teleportation_fidelity, 4),
403
+ },
404
+ "5_security": {
405
+ "qkd_secured": teleport_result.qkd_key_used,
406
+ "eavesdrop_detected": teleport_result.error_detected or qkd_result["eve_detected"],
407
+ "protection": "physics-based (no-cloning theorem)",
408
+ },
409
+ },
410
+ "efficiency": {
411
+ "classical_transmission": f"{teleport_result.original_size * 8} bits",
412
+ "quantum_transmission": f"{teleport_result.classical_bits_sent} classical bits",
413
+ "bandwidth_saved": f"{round((1 - teleport_result.classical_bits_sent / (teleport_result.original_size * 8)) * 100, 1)}%",
414
+ },
415
+ }
db/__init__.py ADDED
@@ -0,0 +1,15 @@
1
+ """QuantumFlow Database Package."""
2
+
3
+ from db.database import get_db, engine, SessionLocal
4
+ from db.models import Base, User, APIKey, Job, UsageRecord
5
+
6
+ __all__ = [
7
+ "get_db",
8
+ "engine",
9
+ "SessionLocal",
10
+ "Base",
11
+ "User",
12
+ "APIKey",
13
+ "Job",
14
+ "UsageRecord",
15
+ ]