swiftpy-framework 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 (211) hide show
  1. swiftpy/.gitignore +0 -0
  2. swiftpy/__init__.py +572 -0
  3. swiftpy/admin/__init__.py +50 -0
  4. swiftpy/admin/auth.py +522 -0
  5. swiftpy/admin/registry.py +567 -0
  6. swiftpy/admin/views.py +1583 -0
  7. swiftpy/ai/__init__.py +199 -0
  8. swiftpy/ai/_deterministic.py +40 -0
  9. swiftpy/ai/_fake.py +604 -0
  10. swiftpy/ai/agents/__init__.py +30 -0
  11. swiftpy/ai/agents/base_agent.py +506 -0
  12. swiftpy/ai/agents/memory.py +864 -0
  13. swiftpy/ai/client.py +1011 -0
  14. swiftpy/ai/conversation.py +171 -0
  15. swiftpy/ai/embeddings.py +321 -0
  16. swiftpy/ai/exceptions.py +75 -0
  17. swiftpy/ai/history_strategies.py +157 -0
  18. swiftpy/ai/middleware.py +918 -0
  19. swiftpy/ai/observability/__init__.py +28 -0
  20. swiftpy/ai/observability/drivers.py +763 -0
  21. swiftpy/ai/observability/observer.py +364 -0
  22. swiftpy/ai/pool.py +102 -0
  23. swiftpy/ai/pricing.py +101 -0
  24. swiftpy/ai/prompts/__init__.py +6 -0
  25. swiftpy/ai/prompts/loader.py +343 -0
  26. swiftpy/ai/providers/__init__.py +22 -0
  27. swiftpy/ai/providers/anthropic_provider.py +353 -0
  28. swiftpy/ai/providers/base.py +273 -0
  29. swiftpy/ai/providers/openai_provider.py +275 -0
  30. swiftpy/ai/rag/__init__.py +53 -0
  31. swiftpy/ai/rag/context_formatter.py +263 -0
  32. swiftpy/ai/rag/pipeline_builder.py +544 -0
  33. swiftpy/ai/rag/reranker.py +484 -0
  34. swiftpy/ai/rag/result.py +78 -0
  35. swiftpy/ai/rag/retriever.py +315 -0
  36. swiftpy/ai/redis_store.py +227 -0
  37. swiftpy/ai/streaming.py +115 -0
  38. swiftpy/ai/tools/__init__.py +22 -0
  39. swiftpy/ai/tools/base_tool.py +489 -0
  40. swiftpy/ai/tools/first_party.py +384 -0
  41. swiftpy/ai/tools/tool_loop.py +417 -0
  42. swiftpy/ai/vectorstore/__init__.py +46 -0
  43. swiftpy/ai/vectorstore/base.py +542 -0
  44. swiftpy/ai/vectorstore/chroma_adapter.py +435 -0
  45. swiftpy/ai/vectorstore/in_memory_adapter.py +321 -0
  46. swiftpy/ai/vectorstore/lancedb_adapter.py +370 -0
  47. swiftpy/ai/vectorstore/pgvector_adapter.py +496 -0
  48. swiftpy/ai/vectorstore/pinecone_adapter.py +445 -0
  49. swiftpy/ai/vectorstore/qdrant_adapter.py +418 -0
  50. swiftpy/auth/__init__.py +50 -0
  51. swiftpy/auth/api_key_guard.py +544 -0
  52. swiftpy/auth/auth_manager.py +259 -0
  53. swiftpy/auth/exceptions.py +71 -0
  54. swiftpy/auth/jwt_guard.py +230 -0
  55. swiftpy/auth/jwt_issuer.py +658 -0
  56. swiftpy/auth/token_blacklist.py +300 -0
  57. swiftpy/cache/__init__.py +14 -0
  58. swiftpy/cache/cache.py +251 -0
  59. swiftpy/cache/driver.py +216 -0
  60. swiftpy/cache/drivers/memory.py +199 -0
  61. swiftpy/cache/drivers/redis.py +421 -0
  62. swiftpy/console/__init__.py +0 -0
  63. swiftpy/console/cli.py +68 -0
  64. swiftpy/console/commands/__init__.py +0 -0
  65. swiftpy/console/commands/cache.py +164 -0
  66. swiftpy/console/commands/make.py +935 -0
  67. swiftpy/console/commands/migrate.py +280 -0
  68. swiftpy/console/commands/new.py +1806 -0
  69. swiftpy/console/commands/queue.py +306 -0
  70. swiftpy/console/commands/seed.py +252 -0
  71. swiftpy/console/commands/start.py +171 -0
  72. swiftpy/console/commands/storage.py +104 -0
  73. swiftpy/console/loader.py +21 -0
  74. swiftpy/console/stubs/__init__.py +26 -0
  75. swiftpy/console/stubs/controller.stub +14 -0
  76. swiftpy/console/stubs/event.stub +14 -0
  77. swiftpy/console/stubs/job.stub +22 -0
  78. swiftpy/console/stubs/listener.stub +14 -0
  79. swiftpy/console/stubs/mail.stub +20 -0
  80. swiftpy/console/stubs/middleware.stub +16 -0
  81. swiftpy/console/stubs/migration.alter.stub +17 -0
  82. swiftpy/console/stubs/migration.api_keys.stub +22 -0
  83. swiftpy/console/stubs/migration.blank.stub +11 -0
  84. swiftpy/console/stubs/migration.create.stub +15 -0
  85. swiftpy/console/stubs/migration.stub +11 -0
  86. swiftpy/console/stubs/migration.update.stub +17 -0
  87. swiftpy/console/stubs/model.stub +17 -0
  88. swiftpy/console/stubs/provider.stub +18 -0
  89. swiftpy/console/stubs/repository.stub +10 -0
  90. swiftpy/console/stubs/request.stub +16 -0
  91. swiftpy/console/stubs/resource.stub +21 -0
  92. swiftpy/console/stubs/schema.stub +12 -0
  93. swiftpy/console/stubs/seeder.stub +14 -0
  94. swiftpy/console/stubs/service.stub +10 -0
  95. swiftpy/core/__init__.py +0 -0
  96. swiftpy/core/application.py +1306 -0
  97. swiftpy/core/bootstrap.py +30 -0
  98. swiftpy/core/config.py +432 -0
  99. swiftpy/core/container.py +596 -0
  100. swiftpy/core/container_exceptions.py +18 -0
  101. swiftpy/core/context.py +148 -0
  102. swiftpy/core/exceptions.py +352 -0
  103. swiftpy/core/providers/base.py +35 -0
  104. swiftpy/database/__init__.py +41 -0
  105. swiftpy/database/exceptions.py +42 -0
  106. swiftpy/database/identifiers.py +105 -0
  107. swiftpy/database/migrations/__init__.py +36 -0
  108. swiftpy/database/migrations/blueprint.py +431 -0
  109. swiftpy/database/migrations/lock.py +104 -0
  110. swiftpy/database/migrations/migration.py +22 -0
  111. swiftpy/database/migrations/migrator.py +507 -0
  112. swiftpy/database/migrations/schema.py +435 -0
  113. swiftpy/database/orm/__init__.py +33 -0
  114. swiftpy/database/orm/fields.py +92 -0
  115. swiftpy/database/orm/model.py +2034 -0
  116. swiftpy/database/orm/registry.py +33 -0
  117. swiftpy/database/orm/relationships.py +836 -0
  118. swiftpy/database/pagination/__init__.py +16 -0
  119. swiftpy/database/pagination/contracts.py +60 -0
  120. swiftpy/database/pagination/paginator.py +112 -0
  121. swiftpy/database/pagination/simple_paginator.py +97 -0
  122. swiftpy/database/pool.py +218 -0
  123. swiftpy/database/query_builder.py +1803 -0
  124. swiftpy/database/seeder.py +39 -0
  125. swiftpy/database/transaction.py +276 -0
  126. swiftpy/events/__init__.py +10 -0
  127. swiftpy/events/dispatcher.py +308 -0
  128. swiftpy/events/redis_bus.py +552 -0
  129. swiftpy/filesystem/__init__.py +227 -0
  130. swiftpy/filesystem/disk.py +378 -0
  131. swiftpy/filesystem/drivers/__init__.py +11 -0
  132. swiftpy/filesystem/drivers/base.py +156 -0
  133. swiftpy/filesystem/drivers/local.py +559 -0
  134. swiftpy/filesystem/drivers/s3.py +655 -0
  135. swiftpy/filesystem/events.py +37 -0
  136. swiftpy/filesystem/exceptions.py +127 -0
  137. swiftpy/filesystem/manager.py +138 -0
  138. swiftpy/filesystem/metadata.py +22 -0
  139. swiftpy/filesystem/paths.py +99 -0
  140. swiftpy/filesystem/service_provider.py +17 -0
  141. swiftpy/filesystem/uploads/__init__.py +13 -0
  142. swiftpy/filesystem/uploads/handlers.py +362 -0
  143. swiftpy/filesystem/uploads/uploaded_file.py +222 -0
  144. swiftpy/filesystem/uploads/validators.py +186 -0
  145. swiftpy/filesystem/visibility.py +22 -0
  146. swiftpy/helpers/__init__.py +42 -0
  147. swiftpy/helpers/helper.py +180 -0
  148. swiftpy/http/exceptions.py +41 -0
  149. swiftpy/http/middleware.py +307 -0
  150. swiftpy/http/request.py +375 -0
  151. swiftpy/http/response.py +442 -0
  152. swiftpy/http/router.py +1050 -0
  153. swiftpy/mail/__init__.py +58 -0
  154. swiftpy/mail/attachments.py +255 -0
  155. swiftpy/mail/config.py +71 -0
  156. swiftpy/mail/envelope.py +183 -0
  157. swiftpy/mail/exceptions.py +90 -0
  158. swiftpy/mail/facade.py +312 -0
  159. swiftpy/mail/mailable.py +53 -0
  160. swiftpy/mail/manager.py +240 -0
  161. swiftpy/mail/message.py +186 -0
  162. swiftpy/mail/models.py +19 -0
  163. swiftpy/mail/queue/__init__.py +5 -0
  164. swiftpy/mail/queue/job.py +279 -0
  165. swiftpy/mail/service_provider.py +19 -0
  166. swiftpy/mail/templates/__init__.py +5 -0
  167. swiftpy/mail/templates/renderer.py +173 -0
  168. swiftpy/mail/transports/__init__.py +21 -0
  169. swiftpy/mail/transports/api/__init__.py +13 -0
  170. swiftpy/mail/transports/api/base.py +194 -0
  171. swiftpy/mail/transports/api/mailgun.py +158 -0
  172. swiftpy/mail/transports/api/resend.py +156 -0
  173. swiftpy/mail/transports/api/sendgrid.py +172 -0
  174. swiftpy/mail/transports/base.py +24 -0
  175. swiftpy/mail/transports/console.py +91 -0
  176. swiftpy/mail/transports/sendmail.py +128 -0
  177. swiftpy/mail/transports/smtp.py +466 -0
  178. swiftpy/queue/__init__.py +13 -0
  179. swiftpy/queue/dispatcher.py +813 -0
  180. swiftpy/queue/job.py +541 -0
  181. swiftpy/queue/worker.py +556 -0
  182. swiftpy/support/__init__.py +12 -0
  183. swiftpy/support/keys.py +108 -0
  184. swiftpy/support/redis_config.py +223 -0
  185. swiftpy/support/strings.py +114 -0
  186. swiftpy/testing/__init__.py +20 -0
  187. swiftpy/testing/fakes/__init__.py +11 -0
  188. swiftpy/testing/fakes/ai_fake.py +21 -0
  189. swiftpy/testing/fakes/vectorstore_fake.py +194 -0
  190. swiftpy/testing/fixtures.py +124 -0
  191. swiftpy/testing/http_client.py +730 -0
  192. swiftpy/testing/test_case.py +126 -0
  193. swiftpy/validation/__init__.py +97 -0
  194. swiftpy/validation/exceptions.py +26 -0
  195. swiftpy/validation/form_request.py +302 -0
  196. swiftpy/validation/protocols.py +33 -0
  197. swiftpy/validation/rules/__init__.py +89 -0
  198. swiftpy/validation/rules/builtin.py +391 -0
  199. swiftpy/validation/rules/exists.py +86 -0
  200. swiftpy/validation/rules/registry.py +290 -0
  201. swiftpy/validation/rules/required.py +55 -0
  202. swiftpy/validation/rules/unique.py +138 -0
  203. swiftpy/validation/validator.py +612 -0
  204. swiftpy/websockets/__init__.py +19 -0
  205. swiftpy/websockets/connection.py +317 -0
  206. swiftpy/websockets/manager.py +271 -0
  207. swiftpy_framework-0.1.0.dist-info/METADATA +603 -0
  208. swiftpy_framework-0.1.0.dist-info/RECORD +211 -0
  209. swiftpy_framework-0.1.0.dist-info/WHEEL +4 -0
  210. swiftpy_framework-0.1.0.dist-info/entry_points.txt +2 -0
  211. swiftpy_framework-0.1.0.dist-info/licenses/LICENSE +21 -0
swiftpy/ai/__init__.py ADDED
@@ -0,0 +1,199 @@
1
+ from __future__ import annotations
2
+
3
+ from swiftpy.ai.agents import (
4
+ Agent,
5
+ AgentMemory,
6
+ AgentResponse,
7
+ AgentTask,
8
+ BaseAgent,
9
+ BaseMemoryBackend,
10
+ DatabaseMemoryBackend,
11
+ InMemoryMemoryBackend,
12
+ RedisMemoryBackend,
13
+ )
14
+ from swiftpy.ai.client import AI, AIClient, ai
15
+ from swiftpy.ai.conversation import Conversation
16
+ from swiftpy.ai.embeddings import (
17
+ EmbeddingsClient,
18
+ generate_deterministic_embedding,
19
+ )
20
+ from swiftpy.ai.exceptions import (
21
+ AgentLoopError,
22
+ AIAuthenticationError,
23
+ AIBudgetExceededError,
24
+ AIConfigurationError,
25
+ AIConnectionError,
26
+ AIContentModerationError,
27
+ AIError,
28
+ AIModuleDisabledError,
29
+ AIProviderError,
30
+ AIRateLimitError,
31
+ )
32
+ from swiftpy.ai.history_strategies import (
33
+ HistoryStrategy,
34
+ SlidingWindowStrategy,
35
+ TokenBudgetStrategy,
36
+ )
37
+ from swiftpy.ai.middleware import (
38
+ AIMiddleware,
39
+ AIMiddlewarePipeline,
40
+ AIRateLimitMiddleware,
41
+ ContentModerationMiddleware,
42
+ TokenBudgetMiddleware,
43
+ )
44
+ from swiftpy.ai.observability import (
45
+ AIObservabilityManager,
46
+ AIObservation,
47
+ BaseObservabilityDriver,
48
+ DatabaseObservabilityDriver,
49
+ FileObservabilityDriver,
50
+ InMemoryObservabilityDriver,
51
+ ObservationContext,
52
+ compute_prompt_hash,
53
+ get_observability,
54
+ )
55
+ from swiftpy.ai.pool import AIHttpPool
56
+ from swiftpy.ai.pricing import (
57
+ calculate_token_cost,
58
+ register_model_pricing,
59
+ )
60
+ from swiftpy.ai.prompts import (
61
+ PromptLoader,
62
+ load_prompt,
63
+ )
64
+ from swiftpy.ai.providers.base import (
65
+ LLMRequest,
66
+ LLMResponse,
67
+ Message,
68
+ ProviderInterface,
69
+ TokenUsage,
70
+ ToolCall,
71
+ ToolResult,
72
+ )
73
+ from swiftpy.ai.rag import (
74
+ BaseReranker,
75
+ CohereReranker,
76
+ ContextFormatter,
77
+ CrossEncoderReranker,
78
+ NumberedListFormatter,
79
+ PlainConcatenationFormatter,
80
+ RAGPipelineBuilder,
81
+ RAGResult,
82
+ Retriever,
83
+ XMLBlocksFormatter,
84
+ rag,
85
+ )
86
+ from swiftpy.ai.redis_store import (
87
+ ConversationStore,
88
+ InMemoryConversationStore,
89
+ RedisConversationStore,
90
+ )
91
+ from swiftpy.ai.streaming import parse_sse_events
92
+ from swiftpy.ai.tools import (
93
+ BaseTool,
94
+ CalculatorTool,
95
+ DateTimeTool,
96
+ FunctionTool,
97
+ ToolLoop,
98
+ WebSearchTool,
99
+ tool,
100
+ )
101
+ from swiftpy.ai.vectorstore import (
102
+ ChromaAdapter,
103
+ InMemoryVectorStore,
104
+ LanceDbAdapter,
105
+ PgVectorAdapter,
106
+ PineconeAdapter,
107
+ QdrantAdapter,
108
+ SearchResult,
109
+ VectorRecord,
110
+ VectorStore,
111
+ )
112
+
113
+ __all__ = [
114
+ "AI",
115
+ "AIAuthenticationError",
116
+ "AIBudgetExceededError",
117
+ "AIClient",
118
+ "AIConfigurationError",
119
+ "AIConnectionError",
120
+ "AIContentModerationError",
121
+ "AIError",
122
+ "AIHttpPool",
123
+ "AIMiddleware",
124
+ "AIMiddlewarePipeline",
125
+ "AIModuleDisabledError",
126
+ "AIObservabilityManager",
127
+ "AIObservation",
128
+ "AIProviderError",
129
+ "AIRateLimitError",
130
+ "AIRateLimitMiddleware",
131
+ "Agent",
132
+ "AgentLoopError",
133
+ "AgentMemory",
134
+ "AgentResponse",
135
+ "AgentTask",
136
+ "BaseAgent",
137
+ "BaseMemoryBackend",
138
+ "BaseObservabilityDriver",
139
+ "BaseReranker",
140
+ "BaseTool",
141
+ "CalculatorTool",
142
+ "ChromaAdapter",
143
+ "CohereReranker",
144
+ "ContentModerationMiddleware",
145
+ "ContextFormatter",
146
+ "Conversation",
147
+ "ConversationStore",
148
+ "CrossEncoderReranker",
149
+ "DatabaseMemoryBackend",
150
+ "DatabaseObservabilityDriver",
151
+ "DateTimeTool",
152
+ "EmbeddingsClient",
153
+ "FileObservabilityDriver",
154
+ "FunctionTool",
155
+ "HistoryStrategy",
156
+ "InMemoryConversationStore",
157
+ "InMemoryMemoryBackend",
158
+ "InMemoryObservabilityDriver",
159
+ "InMemoryVectorStore",
160
+ "LLMRequest",
161
+ "LLMResponse",
162
+ "LanceDbAdapter",
163
+ "Message",
164
+ "NumberedListFormatter",
165
+ "ObservationContext",
166
+ "PgVectorAdapter",
167
+ "PineconeAdapter",
168
+ "PlainConcatenationFormatter",
169
+ "PromptLoader",
170
+ "ProviderInterface",
171
+ "QdrantAdapter",
172
+ "RAGPipelineBuilder",
173
+ "RAGResult",
174
+ "RedisConversationStore",
175
+ "RedisMemoryBackend",
176
+ "Retriever",
177
+ "SearchResult",
178
+ "SlidingWindowStrategy",
179
+ "TokenBudgetMiddleware",
180
+ "TokenBudgetStrategy",
181
+ "TokenUsage",
182
+ "ToolCall",
183
+ "ToolLoop",
184
+ "ToolResult",
185
+ "VectorRecord",
186
+ "VectorStore",
187
+ "WebSearchTool",
188
+ "XMLBlocksFormatter",
189
+ "ai",
190
+ "calculate_token_cost",
191
+ "compute_prompt_hash",
192
+ "generate_deterministic_embedding",
193
+ "get_observability",
194
+ "load_prompt",
195
+ "parse_sse_events",
196
+ "rag",
197
+ "register_model_pricing",
198
+ "tool",
199
+ ]
@@ -0,0 +1,40 @@
1
+ from __future__ import annotations
2
+
3
+ import hashlib
4
+ import math
5
+
6
+
7
+ def generate_deterministic_embedding(text: str, dimensions: int = 1536) -> list[float]:
8
+ """
9
+ Generate deterministic, normalized test embeddings using character n-grams and SHA-256 feature hashing.
10
+
11
+ This provides dependency-free embeddings for development and functional testing;
12
+ it is not a substitute for trained semantic embedding models.
13
+ """
14
+ if not text or not text.strip():
15
+ return [0.0] * dimensions
16
+
17
+ vec = [0.0] * dimensions
18
+ raw_words = [w.strip(".,;:!?\"'()[]{}").lower() for w in text.split() if w.strip()]
19
+
20
+ for word in raw_words:
21
+ tokens = [f"<{word}>"]
22
+ word_len = len(word)
23
+ for n in (3, 4, 5):
24
+ if word_len >= n:
25
+ for i in range(word_len - n + 1):
26
+ tokens.append(word[i : i + n])
27
+
28
+ for tok in tokens:
29
+ digest = hashlib.sha256(tok.encode("utf-8")).digest()
30
+ for i in range(2):
31
+ idx = int.from_bytes(digest[i * 4 : (i + 1) * 4], "big") % dimensions
32
+ sign = 1.0 if digest[i] % 2 == 0 else -1.0
33
+ vec[idx] += sign
34
+
35
+ # Normalize vector to unit length (L2 norm)
36
+ norm = math.sqrt(sum(x * x for x in vec))
37
+ if norm > 0.0:
38
+ vec = [x / norm for x in vec]
39
+
40
+ return vec