synapsekit 1.4.2__tar.gz → 1.4.6__tar.gz

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 (365) hide show
  1. {synapsekit-1.4.2 → synapsekit-1.4.6}/CHANGELOG.md +60 -0
  2. {synapsekit-1.4.2 → synapsekit-1.4.6}/PKG-INFO +32 -10
  3. {synapsekit-1.4.2 → synapsekit-1.4.6}/README.md +10 -9
  4. synapsekit-1.4.6/assets/banner.svg +54 -0
  5. synapsekit-1.4.6/assets/logo.svg +13 -0
  6. {synapsekit-1.4.2 → synapsekit-1.4.6}/pyproject.toml +22 -2
  7. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/__init__.py +16 -0
  8. synapsekit-1.4.6/src/synapsekit/agents/tools/python_repl.py +161 -0
  9. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/checkpointers/sqlite.py +6 -0
  10. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/mermaid.py +9 -1
  11. synapsekit-1.4.6/src/synapsekit/graph/subgraph.py +133 -0
  12. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/trace.py +10 -5
  13. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/__init__.py +2 -0
  14. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/multimodal.py +3 -0
  15. synapsekit-1.4.6/src/synapsekit/llm/sambanova.py +88 -0
  16. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/__init__.py +6 -0
  17. synapsekit-1.4.6/src/synapsekit/loaders/discord.py +147 -0
  18. synapsekit-1.4.6/src/synapsekit/loaders/google_drive.py +210 -0
  19. synapsekit-1.4.6/src/synapsekit/loaders/xml_loader.py +39 -0
  20. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/prompts/template.py +31 -3
  21. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/rag/facade.py +8 -1
  22. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/__init__.py +8 -0
  23. synapsekit-1.4.6/src/synapsekit/retrieval/lancedb.py +158 -0
  24. synapsekit-1.4.6/src/synapsekit/retrieval/milvus.py +194 -0
  25. synapsekit-1.4.6/src/synapsekit/retrieval/pgvector.py +203 -0
  26. synapsekit-1.4.6/src/synapsekit/retrieval/weaviate.py +114 -0
  27. synapsekit-1.4.6/src/synapsekit/text_splitters/base.py +40 -0
  28. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/test_shell_tool.py +1 -1
  29. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/test_tools.py +60 -0
  30. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/graph/test_checkpointing.py +10 -0
  31. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/graph/test_mermaid.py +17 -3
  32. synapsekit-1.4.6/tests/graph/test_subgraph_errors.py +262 -0
  33. synapsekit-1.4.6/tests/llm/test_sambanova_provider.py +141 -0
  34. synapsekit-1.4.6/tests/loaders/test_discord_loader.py +189 -0
  35. synapsekit-1.4.6/tests/loaders/test_google_drive_loader.py +380 -0
  36. synapsekit-1.4.6/tests/loaders/test_xml_loader.py +274 -0
  37. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v100_features.py +1 -1
  38. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/text_splitters/test_splitters.py +106 -0
  39. {synapsekit-1.4.2 → synapsekit-1.4.6}/uv.lock +364 -2
  40. synapsekit-1.4.2/assets/banner.svg +0 -63
  41. synapsekit-1.4.2/assets/logo.svg +0 -13
  42. synapsekit-1.4.2/src/synapsekit/agents/tools/python_repl.py +0 -55
  43. synapsekit-1.4.2/src/synapsekit/graph/subgraph.py +0 -60
  44. synapsekit-1.4.2/src/synapsekit/text_splitters/base.py +0 -12
  45. {synapsekit-1.4.2 → synapsekit-1.4.6}/.all-contributorsrc +0 -0
  46. {synapsekit-1.4.2 → synapsekit-1.4.6}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  47. {synapsekit-1.4.2 → synapsekit-1.4.6}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  48. {synapsekit-1.4.2 → synapsekit-1.4.6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  49. {synapsekit-1.4.2 → synapsekit-1.4.6}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  50. {synapsekit-1.4.2 → synapsekit-1.4.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  51. {synapsekit-1.4.2 → synapsekit-1.4.6}/.github/profile/README.md +0 -0
  52. {synapsekit-1.4.2 → synapsekit-1.4.6}/.github/workflows/ci.yml +0 -0
  53. {synapsekit-1.4.2 → synapsekit-1.4.6}/.github/workflows/publish.yml +0 -0
  54. {synapsekit-1.4.2 → synapsekit-1.4.6}/.github/workflows/welcome.yml +0 -0
  55. {synapsekit-1.4.2 → synapsekit-1.4.6}/.gitignore +0 -0
  56. {synapsekit-1.4.2 → synapsekit-1.4.6}/.pre-commit-config.yaml +0 -0
  57. {synapsekit-1.4.2 → synapsekit-1.4.6}/CODE_OF_CONDUCT.md +0 -0
  58. {synapsekit-1.4.2 → synapsekit-1.4.6}/CONTRIBUTING.md +0 -0
  59. {synapsekit-1.4.2 → synapsekit-1.4.6}/LICENSE +0 -0
  60. {synapsekit-1.4.2 → synapsekit-1.4.6}/Makefile +0 -0
  61. {synapsekit-1.4.2 → synapsekit-1.4.6}/SECURITY.md +0 -0
  62. {synapsekit-1.4.2 → synapsekit-1.4.6}/assets/favicon.svg +0 -0
  63. {synapsekit-1.4.2 → synapsekit-1.4.6}/examples/README.md +0 -0
  64. {synapsekit-1.4.2 → synapsekit-1.4.6}/examples/agent_tools.py +0 -0
  65. {synapsekit-1.4.2 → synapsekit-1.4.6}/examples/caching_retries.py +0 -0
  66. {synapsekit-1.4.2 → synapsekit-1.4.6}/examples/graph_workflow.py +0 -0
  67. {synapsekit-1.4.2 → synapsekit-1.4.6}/examples/multi_provider.py +0 -0
  68. {synapsekit-1.4.2 → synapsekit-1.4.6}/examples/rag_quickstart.py +0 -0
  69. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/_api.py +0 -0
  70. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/_compat.py +0 -0
  71. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/a2a/__init__.py +0 -0
  72. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/a2a/agent_card.py +0 -0
  73. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/a2a/client.py +0 -0
  74. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/a2a/server.py +0 -0
  75. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/a2a/types.py +0 -0
  76. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/__init__.py +0 -0
  77. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/base.py +0 -0
  78. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/executor.py +0 -0
  79. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/function_calling.py +0 -0
  80. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/guardrails.py +0 -0
  81. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/memory.py +0 -0
  82. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/multi/__init__.py +0 -0
  83. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/multi/crew.py +0 -0
  84. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/multi/handoff.py +0 -0
  85. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/multi/supervisor.py +0 -0
  86. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/pii_redactor.py +0 -0
  87. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/react.py +0 -0
  88. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/registry.py +0 -0
  89. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/step_events.py +0 -0
  90. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tool_decorator.py +0 -0
  91. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/__init__.py +0 -0
  92. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/api_builder.py +0 -0
  93. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/arxiv_search.py +0 -0
  94. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/aws_lambda.py +0 -0
  95. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/bing_search.py +0 -0
  96. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/brave_search.py +0 -0
  97. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/calculator.py +0 -0
  98. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/datetime_tool.py +0 -0
  99. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/duck_search.py +0 -0
  100. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/email_tool.py +0 -0
  101. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/file_list.py +0 -0
  102. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/file_read.py +0 -0
  103. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/file_write.py +0 -0
  104. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/github_api.py +0 -0
  105. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/google_calendar.py +0 -0
  106. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/google_search.py +0 -0
  107. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/graphql.py +0 -0
  108. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/http_request.py +0 -0
  109. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/human_input.py +0 -0
  110. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/image_analysis.py +0 -0
  111. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/jira.py +0 -0
  112. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/json_query.py +0 -0
  113. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/pdf_reader.py +0 -0
  114. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/pubmed_search.py +0 -0
  115. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/regex_tool.py +0 -0
  116. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/sentiment.py +0 -0
  117. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/shell.py +0 -0
  118. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/slack.py +0 -0
  119. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/speech_to_text.py +0 -0
  120. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/sql_query.py +0 -0
  121. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/sql_schema.py +0 -0
  122. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/summarization.py +0 -0
  123. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/tavily_search.py +0 -0
  124. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/text_to_speech.py +0 -0
  125. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/translation.py +0 -0
  126. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/vector_search.py +0 -0
  127. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/web_scraper.py +0 -0
  128. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/web_search.py +0 -0
  129. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/wikipedia.py +0 -0
  130. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/wolfram.py +0 -0
  131. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/agents/tools/youtube_search.py +0 -0
  132. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/cli/__init__.py +0 -0
  133. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/cli/main.py +0 -0
  134. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/cli/serve.py +0 -0
  135. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/cli/test.py +0 -0
  136. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/embeddings/__init__.py +0 -0
  137. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/embeddings/backend.py +0 -0
  138. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/evaluation/__init__.py +0 -0
  139. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/evaluation/base.py +0 -0
  140. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/evaluation/decorators.py +0 -0
  141. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/evaluation/faithfulness.py +0 -0
  142. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/evaluation/groundedness.py +0 -0
  143. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/evaluation/pipeline.py +0 -0
  144. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/evaluation/regression.py +0 -0
  145. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/evaluation/relevancy.py +0 -0
  146. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/__init__.py +0 -0
  147. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/approval.py +0 -0
  148. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/checkpointers/__init__.py +0 -0
  149. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/checkpointers/base.py +0 -0
  150. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/checkpointers/json_file.py +0 -0
  151. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/checkpointers/memory.py +0 -0
  152. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/checkpointers/postgres.py +0 -0
  153. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/checkpointers/redis.py +0 -0
  154. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/compiled.py +0 -0
  155. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/dynamic_route.py +0 -0
  156. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/edge.py +0 -0
  157. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/errors.py +0 -0
  158. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/fan_out.py +0 -0
  159. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/graph.py +0 -0
  160. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/interrupt.py +0 -0
  161. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/node.py +0 -0
  162. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/state.py +0 -0
  163. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/streaming.py +0 -0
  164. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/graph/visualization.py +0 -0
  165. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/_cache.py +0 -0
  166. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/_cache_dynamodb.py +0 -0
  167. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/_cache_memcached.py +0 -0
  168. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/_filesystem_cache.py +0 -0
  169. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/_rate_limit.py +0 -0
  170. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/_redis_cache.py +0 -0
  171. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/_retry.py +0 -0
  172. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/_semantic_cache.py +0 -0
  173. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/_sqlite_cache.py +0 -0
  174. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/ai21.py +0 -0
  175. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/aleph_alpha.py +0 -0
  176. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/anthropic.py +0 -0
  177. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/azure_openai.py +0 -0
  178. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/base.py +0 -0
  179. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/bedrock.py +0 -0
  180. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/cerebras.py +0 -0
  181. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/cloudflare.py +0 -0
  182. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/cohere.py +0 -0
  183. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/cost_router.py +0 -0
  184. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/databricks.py +0 -0
  185. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/deepseek.py +0 -0
  186. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/ernie.py +0 -0
  187. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/fallback_chain.py +0 -0
  188. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/fireworks.py +0 -0
  189. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/gemini.py +0 -0
  190. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/groq.py +0 -0
  191. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/huggingface.py +0 -0
  192. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/llamacpp.py +0 -0
  193. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/minimax.py +0 -0
  194. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/mistral.py +0 -0
  195. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/moonshot.py +0 -0
  196. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/ollama.py +0 -0
  197. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/openai.py +0 -0
  198. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/openrouter.py +0 -0
  199. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/perplexity.py +0 -0
  200. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/structured.py +0 -0
  201. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/together.py +0 -0
  202. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/vertex_ai.py +0 -0
  203. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/llm/zhipu.py +0 -0
  204. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/audio.py +0 -0
  205. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/base.py +0 -0
  206. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/csv.py +0 -0
  207. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/directory.py +0 -0
  208. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/docx.py +0 -0
  209. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/excel.py +0 -0
  210. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/html.py +0 -0
  211. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/image.py +0 -0
  212. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/json_loader.py +0 -0
  213. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/markdown.py +0 -0
  214. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/pdf.py +0 -0
  215. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/pptx.py +0 -0
  216. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/text.py +0 -0
  217. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/video.py +0 -0
  218. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/web.py +0 -0
  219. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/loaders/yaml_loader.py +0 -0
  220. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/mcp/__init__.py +0 -0
  221. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/mcp/client.py +0 -0
  222. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/mcp/server.py +0 -0
  223. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/memory/__init__.py +0 -0
  224. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/memory/buffer.py +0 -0
  225. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/memory/conversation.py +0 -0
  226. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/memory/entity.py +0 -0
  227. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/memory/hybrid.py +0 -0
  228. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/memory/redis.py +0 -0
  229. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/memory/sqlite.py +0 -0
  230. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/memory/summary_buffer.py +0 -0
  231. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/memory/token_buffer.py +0 -0
  232. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/observability/__init__.py +0 -0
  233. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/observability/audit_log.py +0 -0
  234. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/observability/budget_guard.py +0 -0
  235. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/observability/cost_tracker.py +0 -0
  236. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/observability/distributed.py +0 -0
  237. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/observability/otel.py +0 -0
  238. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/observability/tracer.py +0 -0
  239. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/observability/ui.py +0 -0
  240. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/parsers/__init__.py +0 -0
  241. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/parsers/json_parser.py +0 -0
  242. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/parsers/list_parser.py +0 -0
  243. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/parsers/pydantic_parser.py +0 -0
  244. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/plugins.py +0 -0
  245. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/prompts/__init__.py +0 -0
  246. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/prompts/hub.py +0 -0
  247. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/py.typed +0 -0
  248. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/rag/__init__.py +0 -0
  249. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/rag/pipeline.py +0 -0
  250. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/adaptive.py +0 -0
  251. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/base.py +0 -0
  252. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/chroma.py +0 -0
  253. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/cohere_reranker.py +0 -0
  254. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/contextual.py +0 -0
  255. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/contextual_compression.py +0 -0
  256. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/crag.py +0 -0
  257. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/cross_encoder.py +0 -0
  258. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/ensemble.py +0 -0
  259. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/faiss.py +0 -0
  260. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/flare.py +0 -0
  261. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/graphrag.py +0 -0
  262. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/hybrid_search.py +0 -0
  263. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/hyde.py +0 -0
  264. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/multi_step.py +0 -0
  265. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/parent_document.py +0 -0
  266. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/pinecone.py +0 -0
  267. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/qdrant.py +0 -0
  268. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/query_decomposition.py +0 -0
  269. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/rag_fusion.py +0 -0
  270. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/retriever.py +0 -0
  271. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/self_query.py +0 -0
  272. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/self_rag.py +0 -0
  273. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/sentence_window.py +0 -0
  274. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/step_back.py +0 -0
  275. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/retrieval/vectorstore.py +0 -0
  276. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/text_splitters/__init__.py +0 -0
  277. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/text_splitters/character.py +0 -0
  278. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/text_splitters/markdown.py +0 -0
  279. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/text_splitters/recursive.py +0 -0
  280. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/text_splitters/semantic.py +0 -0
  281. {synapsekit-1.4.2 → synapsekit-1.4.6}/src/synapsekit/text_splitters/token.py +0 -0
  282. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/__init__.py +0 -0
  283. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/__init__.py +0 -0
  284. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/test_api_builder_tool.py +0 -0
  285. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/test_aws_lambda_tool.py +0 -0
  286. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/test_bing_search.py +0 -0
  287. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/test_executor.py +0 -0
  288. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/test_function_calling.py +0 -0
  289. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/test_google_calendar_tool.py +0 -0
  290. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/test_memory.py +0 -0
  291. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/test_pii_redactor.py +0 -0
  292. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/test_react.py +0 -0
  293. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/test_sql_schema.py +0 -0
  294. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/test_streaming_steps.py +0 -0
  295. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/test_tool_decorator.py +0 -0
  296. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/test_web_scraper.py +0 -0
  297. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/test_wolfram_alpha.py +0 -0
  298. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/tools/test_google_search.py +0 -0
  299. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/agents/tools/test_sql_query.py +0 -0
  300. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/conftest.py +0 -0
  301. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/graph/__init__.py +0 -0
  302. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/graph/test_build.py +0 -0
  303. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/graph/test_cycles.py +0 -0
  304. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/graph/test_json_checkpointer.py +0 -0
  305. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/graph/test_run.py +0 -0
  306. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/graph/test_state.py +0 -0
  307. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/graph/test_stream.py +0 -0
  308. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/graph/test_visualization.py +0 -0
  309. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/llm/__init__.py +0 -0
  310. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/llm/test_cache_dynamodb.py +0 -0
  311. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/llm/test_cache_memcached.py +0 -0
  312. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/llm/test_cache_retry.py +0 -0
  313. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/llm/test_filesystem_cache.py +0 -0
  314. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/llm/test_function_calling_providers.py +0 -0
  315. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/llm/test_huggingface.py +0 -0
  316. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/llm/test_llamacpp.py +0 -0
  317. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/llm/test_llm.py +0 -0
  318. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/llm/test_new_providers_185.py +0 -0
  319. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/llm/test_providers.py +0 -0
  320. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/llm/test_vertex_ai.py +0 -0
  321. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/loaders/__init__.py +0 -0
  322. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/loaders/test_audio_video_loaders.py +0 -0
  323. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/loaders/test_docx_loader.py +0 -0
  324. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/loaders/test_loaders.py +0 -0
  325. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/loaders/test_markdown_loader.py +0 -0
  326. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/loaders/test_yaml_loader.py +0 -0
  327. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/memory/__init__.py +0 -0
  328. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/memory/test_memory.py +0 -0
  329. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/memory/test_redis_memory.py +0 -0
  330. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/observability/__init__.py +0 -0
  331. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/observability/test_audit_log.py +0 -0
  332. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/observability/test_tracer.py +0 -0
  333. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/parsers/__init__.py +0 -0
  334. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/parsers/test_parsers.py +0 -0
  335. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/prompts/__init__.py +0 -0
  336. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/prompts/test_prompts.py +0 -0
  337. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/rag/__init__.py +0 -0
  338. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/rag/test_facade.py +0 -0
  339. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/rag/test_pipeline.py +0 -0
  340. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/retrieval/__init__.py +0 -0
  341. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/retrieval/test_backends.py +0 -0
  342. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/retrieval/test_graphrag.py +0 -0
  343. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/retrieval/test_hyde.py +0 -0
  344. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/retrieval/test_retriever.py +0 -0
  345. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/retrieval/test_vectorstore.py +0 -0
  346. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v051_features.py +0 -0
  347. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v052_features.py +0 -0
  348. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v053_features.py +0 -0
  349. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v060_features.py +0 -0
  350. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v061_features.py +0 -0
  351. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v062_features.py +0 -0
  352. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v063_features.py +0 -0
  353. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v065_features.py +0 -0
  354. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v066_features.py +0 -0
  355. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v068_features.py +0 -0
  356. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v069_features.py +0 -0
  357. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v070_features.py +0 -0
  358. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v080_features.py +0 -0
  359. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v090_features.py +0 -0
  360. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v120_features.py +0 -0
  361. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v120_integration.py +0 -0
  362. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v130_eval_regression.py +0 -0
  363. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/test_v130_routing.py +0 -0
  364. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/text_splitters/__init__.py +0 -0
  365. {synapsekit-1.4.2 → synapsekit-1.4.6}/tests/text_splitters/test_markdown.py +0 -0
@@ -7,6 +7,66 @@ SynapseKit uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
8
  ---
9
9
 
10
+ ## [1.4.6] — 2026-04-01
11
+
12
+ ### Added
13
+
14
+ - **Subgraph error handling** — `subgraph_node()` gains four keyword-only parameters: `on_error` (`"raise"` / `"retry"` / `"fallback"` / `"skip"`), `max_retries` (default 3), and `fallback` (a secondary `CompiledGraph`). On any handled failure the parent state receives `"__subgraph_error__"` with `"type"`, `"message"`, and `"attempts"` keys. Backward-compatible: default behaviour (`on_error="raise"`) is unchanged. (#378)
15
+ - 17 new tests (1450 total)
16
+
17
+ ---
18
+
19
+ ## [1.4.5] — 2026-03-31
20
+
21
+ ### Added
22
+
23
+ - **WeaviateVectorStore** — Weaviate v4 client; lazy collection creation; cosine vector search via `query.near_vector`; metadata filtering; `pip install synapsekit[weaviate]`
24
+ - **PGVectorStore** — PostgreSQL + pgvector; async psycopg3; cosine / L2 / inner-product distance; SQL-injection-safe via `psycopg.sql.Identifier`; metadata JSONB; `pip install synapsekit[pgvector]`
25
+ - **MilvusVectorStore** — IVF_FLAT and HNSW index types; `MilvusIndexType` enum; metadata filtering via Milvus expressions; Zilliz Cloud support; `pip install synapsekit[milvus]`
26
+ - **LanceDBVectorStore** — embedded, serverless; local and cloud (S3/GCS) storage; automatic FTS index; metadata filtering; `pip install synapsekit[lancedb]`
27
+
28
+ All four backends follow the existing lazy-import `_BACKENDS` pattern and are included in `synapsekit[all]`.
29
+
30
+ - 0 new tests (1433 total)
31
+
32
+ ---
33
+
34
+ ## [1.4.4] — 2026-03-30
35
+
36
+ ### Added
37
+
38
+ - **SambaNova provider** — fast inference on Meta Llama, Qwen, and other open models via SambaNova Cloud's OpenAI-compatible API; requires `pip install synapsekit[openai]`; always set `provider="sambanova"`
39
+ - **GoogleDriveLoader** — load files and folders from Google Drive via service-account credentials; supports Google Docs (text export), Sheets (CSV export), PDFs, and text files; `pip install synapsekit[gdrive]`
40
+ - **`split_with_metadata()`** — new method on `BaseSplitter`; returns `list[dict]` with `text` and `metadata` keys; automatically injects `chunk_index`; all splitters inherit it
41
+
42
+ ### Fixed
43
+
44
+ - `asyncio.get_event_loop()` → `asyncio.get_running_loop()` in `GoogleDriveLoader` (deprecated in Python 3.10+)
45
+ - `build()` in `GoogleDriveLoader.aload()` wrapped in executor (was blocking the event loop)
46
+ - Failed file downloads in `GoogleDriveLoader._load_folder` now log a warning instead of silently skipping
47
+
48
+ - 49 new tests (1452 total)
49
+
50
+ ---
51
+
52
+ ## [1.4.3] — 2026-03-29
53
+
54
+ ### Added
55
+
56
+ - **XMLLoader** — load XML files via stdlib `xml.etree.ElementTree`; optional `tags` filter; no new dependencies
57
+ - **DiscordLoader** — load messages from Discord channels via bot token; `before_message_id` / `after_message_id` pagination; rich metadata (author, timestamp, attachments); `pip install synapsekit[discord]`
58
+ - **PythonREPLTool timeout** — `timeout: float = 5.0` parameter; Unix uses `signal.SIGALRM`, Windows uses `multiprocessing.Process`; security warning logged on instantiation
59
+
60
+ ### Improved
61
+
62
+ - **Mermaid conditional edges** — render as dashed arrows (`-.->`) to distinguish from deterministic edges; branch labels prefixed with condition function name (e.g. `route:approve`)
63
+ - **SQLiteCheckpointer** — supports `async with` for automatic connection cleanup
64
+ - **Windows compatibility** — `audio/x-wav` MIME normalised to `audio/wav`; shell timeout test uses portable Python sleep; graph tracer uses `time.perf_counter()` for sub-millisecond resolution
65
+
66
+ - 35 new tests (1403 total)
67
+
68
+ ---
69
+
10
70
  ## [1.4.2] — 2026-03-28
11
71
 
12
72
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synapsekit
3
- Version: 1.4.2
3
+ Version: 1.4.6
4
4
  Summary: Async-native Python framework for building production-grade LLM applications. Streaming-first, 2 dependencies, fully transparent.
5
5
  Project-URL: Homepage, https://github.com/SynapseKit/SynapseKit
6
6
  Project-URL: Repository, https://github.com/SynapseKit/SynapseKit
@@ -33,24 +33,30 @@ Requires-Dist: beautifulsoup4>=4.12; extra == 'all'
33
33
  Requires-Dist: boto3>=1.34; extra == 'all'
34
34
  Requires-Dist: chromadb>=0.5; extra == 'all'
35
35
  Requires-Dist: cohere>=5.0; extra == 'all'
36
+ Requires-Dist: discord-py>=2.0; extra == 'all'
36
37
  Requires-Dist: duckduckgo-search>=6.0; extra == 'all'
37
38
  Requires-Dist: erniebot>=0.5; extra == 'all'
38
39
  Requires-Dist: faiss-cpu>=1.7; extra == 'all'
39
40
  Requires-Dist: fastapi>=0.110; extra == 'all'
41
+ Requires-Dist: google-api-python-client>=2.0; extra == 'all'
42
+ Requires-Dist: google-auth>=2.0; extra == 'all'
40
43
  Requires-Dist: google-cloud-aiplatform>=1.38; extra == 'all'
41
44
  Requires-Dist: google-generativeai>=0.7; extra == 'all'
42
45
  Requires-Dist: google-search-results>=2.4; extra == 'all'
43
46
  Requires-Dist: groq>=0.9; extra == 'all'
44
47
  Requires-Dist: httpx>=0.27; extra == 'all'
45
48
  Requires-Dist: huggingface-hub>=0.20; extra == 'all'
49
+ Requires-Dist: lancedb>=0.5; extra == 'all'
46
50
  Requires-Dist: llama-cpp-python>=0.2; extra == 'all'
47
51
  Requires-Dist: lxml>=5.0; extra == 'all'
48
52
  Requires-Dist: mcp>=1.0; extra == 'all'
49
53
  Requires-Dist: mistralai>=1.0; extra == 'all'
50
54
  Requires-Dist: ollama>=0.2; extra == 'all'
51
55
  Requires-Dist: openai>=1.0; extra == 'all'
56
+ Requires-Dist: pgvector>=0.2; extra == 'all'
52
57
  Requires-Dist: pinecone>=3.0; extra == 'all'
53
58
  Requires-Dist: psycopg[binary]>=3.1; extra == 'all'
59
+ Requires-Dist: pymilvus>=2.4; extra == 'all'
54
60
  Requires-Dist: pypdf>=4.0; extra == 'all'
55
61
  Requires-Dist: pyyaml>=6.0; extra == 'all'
56
62
  Requires-Dist: qdrant-client>=1.9; extra == 'all'
@@ -58,6 +64,7 @@ Requires-Dist: redis>=5.0; extra == 'all'
58
64
  Requires-Dist: sentence-transformers>=2.7; extra == 'all'
59
65
  Requires-Dist: tavily-python>=0.3; extra == 'all'
60
66
  Requires-Dist: uvicorn[standard]>=0.29; extra == 'all'
67
+ Requires-Dist: weaviate-client>=4.0; extra == 'all'
61
68
  Requires-Dist: wolframalpha>=5.0; extra == 'all'
62
69
  Requires-Dist: youtube-search-python>=1.6; extra == 'all'
63
70
  Provides-Extra: anthropic
@@ -74,6 +81,8 @@ Provides-Extra: cloudflare
74
81
  Requires-Dist: httpx>=0.27; extra == 'cloudflare'
75
82
  Provides-Extra: cohere
76
83
  Requires-Dist: cohere>=5.0; extra == 'cohere'
84
+ Provides-Extra: discord
85
+ Requires-Dist: discord-py>=2.0; extra == 'discord'
77
86
  Provides-Extra: docx
78
87
  Requires-Dist: python-docx>=1.0; extra == 'docx'
79
88
  Provides-Extra: dynamodb
@@ -86,6 +95,9 @@ Provides-Extra: faiss
86
95
  Requires-Dist: faiss-cpu>=1.7; extra == 'faiss'
87
96
  Provides-Extra: gcal-tool
88
97
  Requires-Dist: google-api-python-client>=2.0; extra == 'gcal-tool'
98
+ Provides-Extra: gdrive
99
+ Requires-Dist: google-api-python-client>=2.0; extra == 'gdrive'
100
+ Requires-Dist: google-auth>=2.0; extra == 'gdrive'
89
101
  Provides-Extra: gemini
90
102
  Requires-Dist: google-generativeai>=0.7; extra == 'gemini'
91
103
  Provides-Extra: google-search
@@ -99,12 +111,16 @@ Provides-Extra: http
99
111
  Requires-Dist: aiohttp>=3.9; extra == 'http'
100
112
  Provides-Extra: huggingface
101
113
  Requires-Dist: huggingface-hub>=0.20; extra == 'huggingface'
114
+ Provides-Extra: lancedb
115
+ Requires-Dist: lancedb>=0.5; extra == 'lancedb'
102
116
  Provides-Extra: llamacpp
103
117
  Requires-Dist: llama-cpp-python>=0.2; extra == 'llamacpp'
104
118
  Provides-Extra: mcp
105
119
  Requires-Dist: mcp>=1.0; extra == 'mcp'
106
120
  Provides-Extra: memcached
107
121
  Requires-Dist: aiomcache>=0.8; extra == 'memcached'
122
+ Provides-Extra: milvus
123
+ Requires-Dist: pymilvus>=2.4; extra == 'milvus'
108
124
  Provides-Extra: minimax
109
125
  Requires-Dist: httpx>=0.27; extra == 'minimax'
110
126
  Provides-Extra: mistral
@@ -115,6 +131,9 @@ Provides-Extra: openai
115
131
  Requires-Dist: openai>=1.0; extra == 'openai'
116
132
  Provides-Extra: pdf
117
133
  Requires-Dist: pypdf>=4.0; extra == 'pdf'
134
+ Provides-Extra: pgvector
135
+ Requires-Dist: pgvector>=0.2; extra == 'pgvector'
136
+ Requires-Dist: psycopg[binary]>=3.1; extra == 'pgvector'
118
137
  Provides-Extra: pinecone
119
138
  Requires-Dist: pinecone>=3.0; extra == 'pinecone'
120
139
  Provides-Extra: postgres
@@ -138,6 +157,8 @@ Provides-Extra: vertex
138
157
  Requires-Dist: google-cloud-aiplatform>=1.38; extra == 'vertex'
139
158
  Provides-Extra: video
140
159
  Requires-Dist: openai>=1.0; extra == 'video'
160
+ Provides-Extra: weaviate
161
+ Requires-Dist: weaviate-client>=4.0; extra == 'weaviate'
141
162
  Provides-Extra: web
142
163
  Requires-Dist: beautifulsoup4>=4.12; extra == 'web'
143
164
  Requires-Dist: httpx>=0.27; extra == 'web'
@@ -155,12 +176,13 @@ Description-Content-Type: text/markdown
155
176
 
156
177
  <div align="center">
157
178
 
158
- [![PyPI version](https://img.shields.io/pypi/v/synapsekit?color=0a7bbd&label=pypi&logo=pypi&logoColor=white)](https://pypi.org/project/synapsekit/)
159
- [![Python](https://img.shields.io/badge/python-3.10%2B-blue?logo=python&logoColor=white)](https://www.python.org/)
179
+ [![PyPI version](https://img.shields.io/pypi/v/synapsekit?color=22c55e&label=pypi&logo=pypi&logoColor=white)](https://pypi.org/project/synapsekit/)
180
+ [![Python](https://img.shields.io/badge/python-3.10%2B-22c55e?logo=python&logoColor=white)](https://www.python.org/)
160
181
  [![License: Apache 2.0](https://img.shields.io/badge/license-Apache%202.0-22c55e)](LICENSE)
161
- [![Tests](https://img.shields.io/badge/tests-1305%20passing-22c55e?logo=pytest&logoColor=white)]()
162
- [![Downloads](https://img.shields.io/pypi/dm/synapsekit?color=0a7bbd&logo=pypi&logoColor=white)](https://pypistats.org/packages/synapsekit)
163
- [![Docs](https://img.shields.io/badge/docs-online-0a7bbd?logo=readthedocs&logoColor=white)](https://synapsekit.github.io/synapsekit-docs/)
182
+ [![Tests](https://img.shields.io/badge/tests-1433%20passing-22c55e?logo=pytest&logoColor=white)]()
183
+ [![Downloads](https://img.shields.io/pypi/dm/synapsekit?color=22c55e&logo=pypi&logoColor=white)](https://pypistats.org/packages/synapsekit)
184
+ [![PyPI Downloads](https://static.pepy.tech/personalized-badge/synapsekit?period=total&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads)](https://pepy.tech/projects/synapsekit)
185
+ [![Docs](https://img.shields.io/badge/docs-online-22c55e?logo=readthedocs&logoColor=white)](https://synapsekit.github.io/synapsekit-docs/)
164
186
 
165
187
  **[Documentation](https://synapsekit.github.io/synapsekit-docs/) · [Quickstart](https://synapsekit.github.io/synapsekit-docs/docs/getting-started/quickstart) · [API Reference](https://synapsekit.github.io/synapsekit-docs/docs/api/llm) · [Changelog](CHANGELOG.md) · [Report a Bug](https://github.com/SynapseKit/SynapseKit/issues/new?template=bug_report.yml)**
166
188
 
@@ -192,7 +214,7 @@ Token-level streaming is the default,<br/>not an afterthought.<br/>Works across
192
214
  <tr>
193
215
  <td align="center" width="33%">
194
216
  <h3>🔌 One interface</h3>
195
- 19 LLM providers and 5 vector stores<br/>behind the same API.<br/>Swap without rewriting.
217
+ 27 LLM providers and 5 vector stores<br/>behind the same API.<br/>Swap without rewriting.
196
218
  </td>
197
219
  <td align="center" width="33%">
198
220
  <h3>🧩 Composable</h3>
@@ -235,7 +257,7 @@ Retrieval-augmented generation with streaming, BM25 reranking, conversation memo
235
257
  <td width="50%">
236
258
 
237
259
  **🤖 Agents**<br/>
238
- ReAct loop (any LLM) and native function calling (OpenAI / Anthropic / Gemini / Mistral). 35 built-in tools including calculator, Python REPL, web search, SQL, HTTP, shell, summarization, sentiment analysis, and translation. Fully extensible.
260
+ ReAct loop (any LLM) and native function calling (OpenAI / Anthropic / Gemini / Mistral). 41 built-in tools including calculator, Python REPL, web search, SQL, HTTP, shell, arxiv, pubmed, wolfram, wikipedia, and more. Fully extensible.
239
261
 
240
262
  </td>
241
263
  </tr>
@@ -249,7 +271,7 @@ DAG-based async pipelines. Nodes run in waves — parallel nodes execute concurr
249
271
  <td width="50%">
250
272
 
251
273
  **🧠 LLM Providers**<br/>
252
- OpenAI, Anthropic, Ollama, Gemini, Cohere, Mistral, Bedrock, Azure OpenAI, Groq, DeepSeek, OpenRouter, Together, Fireworks, Cerebras, Cloudflare, Moonshot, Perplexity, Vertex AI, Zhipu — all behind one interface. Auto-detected from the model name. Swap without rewriting.
274
+ OpenAI, Anthropic, Ollama, Gemini, Cohere, Mistral, Bedrock, Azure OpenAI, Groq, DeepSeek, OpenRouter, Together, Fireworks, Cerebras, Cloudflare, Moonshot, Perplexity, Vertex AI, Zhipu, AI21 Labs, Databricks, Baidu ERNIE, llama.cpp, Minimax, Aleph Alpha, Hugging Face, SambaNova — all behind one interface. Auto-detected from the model name. Swap without rewriting.
253
275
 
254
276
  </td>
255
277
  </tr>
@@ -309,7 +331,7 @@ Everything you need to get started and go deep is in the docs.
309
331
  | 🗂 [RAG](https://synapsekit.github.io/synapsekit-docs/docs/rag/pipeline) | Pipelines, loaders, retrieval, vector stores |
310
332
  | 🤖 [Agents](https://synapsekit.github.io/synapsekit-docs/docs/agents/overview) | ReAct, function calling, tools, executor |
311
333
  | 🔀 [Graph Workflows](https://synapsekit.github.io/synapsekit-docs/docs/graph/overview) | DAG pipelines, conditional routing, parallel execution |
312
- | 🧠 [LLM Providers](https://synapsekit.github.io/synapsekit-docs/docs/llms/overview) | All 13 providers with examples |
334
+ | 🧠 [LLM Providers](https://synapsekit.github.io/synapsekit-docs/docs/llms/overview) | All 27 providers with examples |
313
335
  | 📖 [API Reference](https://synapsekit.github.io/synapsekit-docs/docs/api/llm) | Full class and method reference |
314
336
 
315
337
  ---
@@ -4,12 +4,13 @@
4
4
 
5
5
  <div align="center">
6
6
 
7
- [![PyPI version](https://img.shields.io/pypi/v/synapsekit?color=0a7bbd&label=pypi&logo=pypi&logoColor=white)](https://pypi.org/project/synapsekit/)
8
- [![Python](https://img.shields.io/badge/python-3.10%2B-blue?logo=python&logoColor=white)](https://www.python.org/)
7
+ [![PyPI version](https://img.shields.io/pypi/v/synapsekit?color=22c55e&label=pypi&logo=pypi&logoColor=white)](https://pypi.org/project/synapsekit/)
8
+ [![Python](https://img.shields.io/badge/python-3.10%2B-22c55e?logo=python&logoColor=white)](https://www.python.org/)
9
9
  [![License: Apache 2.0](https://img.shields.io/badge/license-Apache%202.0-22c55e)](LICENSE)
10
- [![Tests](https://img.shields.io/badge/tests-1305%20passing-22c55e?logo=pytest&logoColor=white)]()
11
- [![Downloads](https://img.shields.io/pypi/dm/synapsekit?color=0a7bbd&logo=pypi&logoColor=white)](https://pypistats.org/packages/synapsekit)
12
- [![Docs](https://img.shields.io/badge/docs-online-0a7bbd?logo=readthedocs&logoColor=white)](https://synapsekit.github.io/synapsekit-docs/)
10
+ [![Tests](https://img.shields.io/badge/tests-1433%20passing-22c55e?logo=pytest&logoColor=white)]()
11
+ [![Downloads](https://img.shields.io/pypi/dm/synapsekit?color=22c55e&logo=pypi&logoColor=white)](https://pypistats.org/packages/synapsekit)
12
+ [![PyPI Downloads](https://static.pepy.tech/personalized-badge/synapsekit?period=total&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads)](https://pepy.tech/projects/synapsekit)
13
+ [![Docs](https://img.shields.io/badge/docs-online-22c55e?logo=readthedocs&logoColor=white)](https://synapsekit.github.io/synapsekit-docs/)
13
14
 
14
15
  **[Documentation](https://synapsekit.github.io/synapsekit-docs/) · [Quickstart](https://synapsekit.github.io/synapsekit-docs/docs/getting-started/quickstart) · [API Reference](https://synapsekit.github.io/synapsekit-docs/docs/api/llm) · [Changelog](CHANGELOG.md) · [Report a Bug](https://github.com/SynapseKit/SynapseKit/issues/new?template=bug_report.yml)**
15
16
 
@@ -41,7 +42,7 @@ Token-level streaming is the default,<br/>not an afterthought.<br/>Works across
41
42
  <tr>
42
43
  <td align="center" width="33%">
43
44
  <h3>🔌 One interface</h3>
44
- 19 LLM providers and 5 vector stores<br/>behind the same API.<br/>Swap without rewriting.
45
+ 27 LLM providers and 5 vector stores<br/>behind the same API.<br/>Swap without rewriting.
45
46
  </td>
46
47
  <td align="center" width="33%">
47
48
  <h3>🧩 Composable</h3>
@@ -84,7 +85,7 @@ Retrieval-augmented generation with streaming, BM25 reranking, conversation memo
84
85
  <td width="50%">
85
86
 
86
87
  **🤖 Agents**<br/>
87
- ReAct loop (any LLM) and native function calling (OpenAI / Anthropic / Gemini / Mistral). 35 built-in tools including calculator, Python REPL, web search, SQL, HTTP, shell, summarization, sentiment analysis, and translation. Fully extensible.
88
+ ReAct loop (any LLM) and native function calling (OpenAI / Anthropic / Gemini / Mistral). 41 built-in tools including calculator, Python REPL, web search, SQL, HTTP, shell, arxiv, pubmed, wolfram, wikipedia, and more. Fully extensible.
88
89
 
89
90
  </td>
90
91
  </tr>
@@ -98,7 +99,7 @@ DAG-based async pipelines. Nodes run in waves — parallel nodes execute concurr
98
99
  <td width="50%">
99
100
 
100
101
  **🧠 LLM Providers**<br/>
101
- OpenAI, Anthropic, Ollama, Gemini, Cohere, Mistral, Bedrock, Azure OpenAI, Groq, DeepSeek, OpenRouter, Together, Fireworks, Cerebras, Cloudflare, Moonshot, Perplexity, Vertex AI, Zhipu — all behind one interface. Auto-detected from the model name. Swap without rewriting.
102
+ OpenAI, Anthropic, Ollama, Gemini, Cohere, Mistral, Bedrock, Azure OpenAI, Groq, DeepSeek, OpenRouter, Together, Fireworks, Cerebras, Cloudflare, Moonshot, Perplexity, Vertex AI, Zhipu, AI21 Labs, Databricks, Baidu ERNIE, llama.cpp, Minimax, Aleph Alpha, Hugging Face, SambaNova — all behind one interface. Auto-detected from the model name. Swap without rewriting.
102
103
 
103
104
  </td>
104
105
  </tr>
@@ -158,7 +159,7 @@ Everything you need to get started and go deep is in the docs.
158
159
  | 🗂 [RAG](https://synapsekit.github.io/synapsekit-docs/docs/rag/pipeline) | Pipelines, loaders, retrieval, vector stores |
159
160
  | 🤖 [Agents](https://synapsekit.github.io/synapsekit-docs/docs/agents/overview) | ReAct, function calling, tools, executor |
160
161
  | 🔀 [Graph Workflows](https://synapsekit.github.io/synapsekit-docs/docs/graph/overview) | DAG pipelines, conditional routing, parallel execution |
161
- | 🧠 [LLM Providers](https://synapsekit.github.io/synapsekit-docs/docs/llms/overview) | All 13 providers with examples |
162
+ | 🧠 [LLM Providers](https://synapsekit.github.io/synapsekit-docs/docs/llms/overview) | All 27 providers with examples |
162
163
  | 📖 [API Reference](https://synapsekit.github.io/synapsekit-docs/docs/api/llm) | Full class and method reference |
163
164
 
164
165
  ---
@@ -0,0 +1,54 @@
1
+ <svg width="900" height="200" viewBox="0 0 900 200" xmlns="http://www.w3.org/2000/svg">
2
+ <defs>
3
+ <linearGradient id="nodegrad" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" style="stop-color:#22c55e"/>
5
+ <stop offset="100%" style="stop-color:#15803d"/>
6
+ </linearGradient>
7
+ </defs>
8
+
9
+ <!-- Background: clean off-white -->
10
+ <rect width="900" height="200" fill="#f8fafc" rx="12"/>
11
+
12
+ <!-- Left green accent bar -->
13
+ <rect x="0" y="0" width="5" height="200" fill="#22c55e"/>
14
+
15
+ <!-- Subtle dot grid -->
16
+ <pattern id="dots" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse">
17
+ <circle cx="10" cy="10" r="1" fill="#e2e8f0"/>
18
+ </pattern>
19
+ <rect x="5" y="0" width="895" height="200" fill="url(#dots)" opacity="0.9"/>
20
+ <rect x="5" y="0" width="895" height="200" fill="#f8fafc" opacity="0.7"/>
21
+
22
+ <!-- Graph node logo mark -->
23
+ <circle cx="55" cy="100" r="10" fill="url(#nodegrad)"/>
24
+ <circle cx="88" cy="76" r="7" fill="#16a34a" opacity="0.85"/>
25
+ <circle cx="88" cy="124" r="7" fill="#16a34a" opacity="0.85"/>
26
+ <line x1="64" y1="95" x2="82" y2="80" stroke="url(#nodegrad)" stroke-width="2.2" stroke-linecap="round"/>
27
+ <line x1="64" y1="105" x2="82" y2="120" stroke="url(#nodegrad)" stroke-width="2.2" stroke-linecap="round"/>
28
+
29
+ <!-- Vertical divider -->
30
+ <line x1="113" y1="68" x2="113" y2="132" stroke="#cbd5e1" stroke-width="1.5"/>
31
+
32
+ <!-- SynapseKit wordmark -->
33
+ <text x="130" y="119" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif" font-size="50" font-weight="800" fill="#0f172a" letter-spacing="-2">SynapseKit</text>
34
+
35
+ <!-- Tagline -->
36
+ <text x="132" y="146" font-family="'SF Mono','Fira Code','Consolas',monospace" font-size="12.5" fill="#64748b" letter-spacing="0.2">async-native Python · RAG pipelines · agents · graph workflows · 2 hard deps</text>
37
+
38
+ <!-- Stat pills -->
39
+ <rect x="132" y="159" width="90" height="22" rx="11" fill="#f0fdf4" stroke="#bbf7d0" stroke-width="1.5"/>
40
+ <text x="177" y="174" font-family="'SF Mono','Fira Code','Consolas',monospace" font-size="10" fill="#15803d" text-anchor="middle">27 providers</text>
41
+
42
+ <rect x="230" y="159" width="68" height="22" rx="11" fill="#f0fdf4" stroke="#bbf7d0" stroke-width="1.5"/>
43
+ <text x="264" y="174" font-family="'SF Mono','Fira Code','Consolas',monospace" font-size="10" fill="#15803d" text-anchor="middle">41 tools</text>
44
+
45
+ <rect x="306" y="159" width="76" height="22" rx="11" fill="#f0fdf4" stroke="#bbf7d0" stroke-width="1.5"/>
46
+ <text x="344" y="174" font-family="'SF Mono','Fira Code','Consolas',monospace" font-size="10" fill="#15803d" text-anchor="middle">18 loaders</text>
47
+
48
+ <rect x="390" y="159" width="100" height="22" rx="11" fill="#f1f5f9" stroke="#e2e8f0" stroke-width="1.5"/>
49
+ <text x="440" y="174" font-family="'SF Mono','Fira Code','Consolas',monospace" font-size="10" fill="#64748b" text-anchor="middle">9 vector stores</text>
50
+
51
+ <rect x="498" y="159" width="88" height="22" rx="11" fill="#f1f5f9" stroke="#e2e8f0" stroke-width="1.5"/>
52
+ <text x="542" y="174" font-family="'SF Mono','Fira Code','Consolas',monospace" font-size="10" fill="#64748b" text-anchor="middle">async-native</text>
53
+
54
+ </svg>
@@ -0,0 +1,13 @@
1
+ <svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
2
+ <defs>
3
+ <linearGradient id="g" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" style="stop-color:#22c55e"/>
5
+ <stop offset="100%" style="stop-color:#15803d"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <circle cx="8" cy="16" r="4.5" fill="url(#g)"/>
9
+ <circle cx="25" cy="7" r="3.5" fill="#16a34a" opacity="0.9"/>
10
+ <circle cx="25" cy="25" r="3.5" fill="#16a34a" opacity="0.9"/>
11
+ <line x1="12" y1="13.5" x2="22" y2="9" stroke="url(#g)" stroke-width="1.8" stroke-linecap="round"/>
12
+ <line x1="12" y1="18.5" x2="22" y2="23" stroke="url(#g)" stroke-width="1.8" stroke-linecap="round"/>
13
+ </svg>
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "synapsekit"
7
- version = "1.4.2"
7
+ version = "1.4.6"
8
8
  description = "Async-native Python framework for building production-grade LLM applications. Streaming-first, 2 dependencies, fully transparent."
9
9
  authors = [{ name = "Amit", email = "de.amit.nautiyal@gmail.com" }]
10
10
  license = { text = "Apache-2.0" }
@@ -47,6 +47,9 @@ chroma = ["chromadb>=0.5"]
47
47
  faiss = ["faiss-cpu>=1.7"]
48
48
  qdrant = ["qdrant-client>=1.9"]
49
49
  pinecone = ["pinecone>=3.0"]
50
+ weaviate = ["weaviate-client>=4.0"]
51
+ milvus = ["pymilvus>=2.4"]
52
+ lancedb = ["lancedb>=0.5"]
50
53
  ollama = ["ollama>=0.2"]
51
54
  ai21 = ["ai21>=2.0"]
52
55
  cohere = ["cohere>=5.0"]
@@ -79,8 +82,11 @@ ernie = ["erniebot>=0.5"]
79
82
  minimax = ["httpx>=0.27"]
80
83
  serve = ["fastapi>=0.110", "uvicorn[standard]>=0.29"]
81
84
  postgres = ["psycopg[binary]>=3.1"]
85
+ pgvector = ["psycopg[binary]>=3.1", "pgvector>=0.2"]
82
86
  wolfram = ["wolframalpha>=5.0"]
83
87
  dynamodb = ["boto3>=1.34"]
88
+ discord = ["discord.py>=2.0"]
89
+ gdrive = ["google-api-python-client>=2.0", "google-auth>=2.0"]
84
90
  all = [
85
91
  "openai>=1.0",
86
92
  "anthropic>=0.25",
@@ -93,6 +99,10 @@ all = [
93
99
  "faiss-cpu>=1.7",
94
100
  "qdrant-client>=1.9",
95
101
  "pinecone>=3.0",
102
+ "weaviate-client>=4.0",
103
+ "pymilvus>=2.4",
104
+ "lancedb>=0.5",
105
+ "pgvector>=0.2",
96
106
  "ollama>=0.2",
97
107
  "ai21>=2.0",
98
108
  "cohere>=5.0",
@@ -116,6 +126,9 @@ all = [
116
126
  "llama-cpp-python>=0.2",
117
127
  "erniebot>=0.5",
118
128
  "wolframalpha>=5.0",
129
+ "discord.py>=2.0",
130
+ "google-api-python-client>=2.0",
131
+ "google-auth>=2.0",
119
132
  ]
120
133
 
121
134
  [dependency-groups]
@@ -182,8 +195,12 @@ module = [
182
195
  "synapsekit.embeddings.backend",
183
196
  "synapsekit.retrieval.chroma",
184
197
  "synapsekit.retrieval.faiss",
198
+ "synapsekit.retrieval.lancedb",
199
+ "synapsekit.retrieval.milvus",
200
+ "synapsekit.retrieval.pgvector",
185
201
  "synapsekit.retrieval.qdrant",
186
202
  "synapsekit.retrieval.pinecone",
203
+ "synapsekit.retrieval.weaviate",
187
204
  "synapsekit.llm.groq",
188
205
  "synapsekit.llm.azure_openai",
189
206
  "synapsekit.llm.deepseek",
@@ -215,6 +232,7 @@ pep621_dev_dependency_groups = ["dev"]
215
232
  [tool.deptry.package_module_name_map]
216
233
  google-generativeai = "google"
217
234
  google-api-python-client = "googleapiclient"
235
+ google-auth = "google"
218
236
  beautifulsoup4 = "bs4"
219
237
  faiss-cpu = "faiss"
220
238
  python-pptx = "pptx"
@@ -223,8 +241,10 @@ tavily-python = "tavily"
223
241
  youtube-search-python = "youtubesearchpython"
224
242
  google-cloud-aiplatform = "vertexai"
225
243
  llama-cpp-python = "llama_cpp"
244
+ "discord.py" = "discord"
226
245
 
227
246
  [tool.deptry.per_rule_ignores]
228
247
  DEP001 = ["sqlalchemy", "pydantic", "aiohttp", "opentelemetry", "whisper", "botocore", "aiomcache", "nest_asyncio", "huggingface_hub", "serpapi"]
229
- DEP002 = ["numpy", "rank-bm25", "beautifulsoup4", "lxml", "faiss-cpu", "google-generativeai", "tavily-python", "youtube-search-python", "psycopg", "google-search-results"]
248
+ DEP002 = ["numpy", "rank-bm25", "beautifulsoup4", "lxml", "faiss-cpu", "google-generativeai", "tavily-python", "youtube-search-python", "psycopg", "google-search-results", "discord.py", "google-auth", "weaviate-client", "pymilvus", "lancedb", "pgvector"]
249
+ DEP003 = ["sqlalchemy", "botocore", "nest_asyncio"]
230
250
  DEP004 = ["pydantic"]
@@ -251,6 +251,7 @@ __all__ = [
251
251
  "MoonshotLLM",
252
252
  "OpenRouterLLM",
253
253
  "PerplexityLLM",
254
+ "SambaNovaLLM",
254
255
  "TogetherLLM",
255
256
  "VertexAILLM",
256
257
  "ZhipuLLM",
@@ -261,8 +262,12 @@ __all__ = [
261
262
  "InMemoryVectorStore",
262
263
  "ChromaVectorStore",
263
264
  "FAISSVectorStore",
265
+ "LanceDBVectorStore",
266
+ "MilvusVectorStore",
267
+ "PGVectorStore",
264
268
  "QdrantVectorStore",
265
269
  "PineconeVectorStore",
270
+ "WeaviateVectorStore",
266
271
  # Retrieval
267
272
  "Retriever",
268
273
  "AdaptiveRAGRetriever",
@@ -490,6 +495,9 @@ __all__ = [
490
495
  "VideoLoader",
491
496
  "ImageLoader",
492
497
  "YAMLLoader",
498
+ "DiscordLoader",
499
+ "XMLLoader",
500
+ "GoogleDriveLoader",
493
501
  # Plugins
494
502
  "PluginRegistry",
495
503
  # API stability markers
@@ -503,8 +511,12 @@ _LAZY_IMPORTS = {
503
511
  # Vector stores
504
512
  "ChromaVectorStore": "retrieval.chroma",
505
513
  "FAISSVectorStore": "retrieval.faiss",
514
+ "LanceDBVectorStore": "retrieval.lancedb",
515
+ "MilvusVectorStore": "retrieval.milvus",
516
+ "PGVectorStore": "retrieval.pgvector",
506
517
  "QdrantVectorStore": "retrieval.qdrant",
507
518
  "PineconeVectorStore": "retrieval.pinecone",
519
+ "WeaviateVectorStore": "retrieval.weaviate",
508
520
  # LLM providers
509
521
  "AsyncLRUCache": "llm._cache",
510
522
  "DynamoDBCacheBackend": "llm._cache_dynamodb",
@@ -518,6 +530,7 @@ _LAZY_IMPORTS = {
518
530
  "HuggingFaceLLM": "llm.huggingface",
519
531
  "OpenRouterLLM": "llm.openrouter",
520
532
  "PerplexityLLM": "llm.perplexity",
533
+ "SambaNovaLLM": "llm.sambanova",
521
534
  "TogetherLLM": "llm.together",
522
535
  "MinimaxLLM": "llm.minimax",
523
536
  "MoonshotLLM": "llm.moonshot",
@@ -534,6 +547,9 @@ _LAZY_IMPORTS = {
534
547
  "ExcelLoader": "loaders.excel",
535
548
  "PowerPointLoader": "loaders.pptx",
536
549
  "YAMLLoader": "loaders.yaml_loader",
550
+ "DiscordLoader": "loaders.discord",
551
+ "XMLLoader": "loaders.xml_loader",
552
+ "GoogleDriveLoader": "loaders.google_drive",
537
553
  }
538
554
 
539
555
 
@@ -0,0 +1,161 @@
1
+ from __future__ import annotations
2
+
3
+ import contextlib
4
+ import io
5
+ import logging
6
+ import math
7
+ import multiprocessing
8
+ import platform
9
+ import signal
10
+ import sys
11
+ from typing import Any
12
+
13
+ from ..base import BaseTool, ToolResult
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class _CodeTimeoutError(Exception):
19
+ """Raised when code execution times out."""
20
+
21
+
22
+ def _exec_with_capture(code: str, namespace: dict, output_queue: multiprocessing.Queue) -> None:
23
+ """Execute code in a subprocess and send results back via queue.
24
+
25
+ Used for Windows timeout implementation with multiprocessing.
26
+ """
27
+ old_stdout = sys.stdout
28
+ sys.stdout = buf = io.StringIO()
29
+
30
+ try:
31
+ exec(code, namespace)
32
+ output = buf.getvalue()
33
+ # Send back (success, output, error, namespace)
34
+ output_queue.put((True, output, None, namespace))
35
+ except Exception as e:
36
+ error_msg = f"{type(e).__name__}: {e}"
37
+ output_queue.put((False, "", error_msg, namespace))
38
+ finally:
39
+ sys.stdout = old_stdout
40
+
41
+
42
+ class PythonREPLTool(BaseTool):
43
+ """
44
+ Execute arbitrary Python code and capture stdout.
45
+
46
+ Timeout behavior:
47
+ - Unix/Linux: Uses signal.SIGALRM (fast, full namespace persistence)
48
+ - Windows: Uses multiprocessing.Process (reliable timeout, namespace limited to picklable objects)
49
+
50
+ Warning: This executes real Python code. Only use in trusted environments.
51
+ """
52
+
53
+ name = "python_repl"
54
+ description = (
55
+ "Execute Python code and return its output. "
56
+ "Input: a Python code string. Use print() to produce output. "
57
+ "WARNING: executes real Python — only use in trusted environments."
58
+ )
59
+ parameters = {
60
+ "type": "object",
61
+ "properties": {
62
+ "code": {
63
+ "type": "string",
64
+ "description": "Python code to execute",
65
+ }
66
+ },
67
+ "required": ["code"],
68
+ }
69
+
70
+ def __init__(self, timeout: float = 5.0) -> None:
71
+ logger.warning(
72
+ "PythonREPLTool executes arbitrary Python code. "
73
+ "Only use in trusted environments with controlled input. "
74
+ "Malicious code can access files, network, and system resources."
75
+ )
76
+ self._namespace: dict = {}
77
+ self.timeout = timeout
78
+
79
+ async def run(self, code: str = "", **kwargs: Any) -> ToolResult:
80
+ src = code or kwargs.get("input", "")
81
+ if not src:
82
+ return ToolResult(output="", error="No code provided.")
83
+
84
+ is_windows = platform.system() == "Windows"
85
+
86
+ if is_windows:
87
+ return await self._run_windows(src)
88
+ else:
89
+ return await self._run_unix(src)
90
+
91
+ async def _run_unix(self, code: str) -> ToolResult:
92
+ """Execute code with signal.SIGALRM timeout (Unix/Linux)."""
93
+ old_stdout = sys.stdout
94
+ sys.stdout = buf = io.StringIO()
95
+
96
+ def timeout_handler(signum, frame):
97
+ raise _CodeTimeoutError(f"Code execution timed out after {self.timeout} seconds")
98
+
99
+ try:
100
+ signal.signal(signal.SIGALRM, timeout_handler)
101
+ signal.alarm(max(1, math.ceil(self.timeout)))
102
+ try:
103
+ exec(code, self._namespace)
104
+ finally:
105
+ signal.alarm(0) # Cancel alarm
106
+
107
+ output = buf.getvalue()
108
+ return ToolResult(output=output or "(no output)")
109
+ except _CodeTimeoutError as e:
110
+ return ToolResult(output="", error=str(e))
111
+ except Exception as e:
112
+ return ToolResult(output="", error=f"{type(e).__name__}: {e}")
113
+ finally:
114
+ sys.stdout = old_stdout
115
+ signal.alarm(0) # Ensure alarm is cancelled
116
+
117
+ async def _run_windows(self, code: str) -> ToolResult:
118
+ """Execute code with multiprocessing timeout (Windows).
119
+
120
+ Note: Namespace persistence limited to picklable objects.
121
+ """
122
+ output_queue: multiprocessing.Queue = multiprocessing.Queue()
123
+
124
+ # Create process to execute code
125
+ process = multiprocessing.Process(
126
+ target=_exec_with_capture, args=(code, self._namespace.copy(), output_queue)
127
+ )
128
+
129
+ process.start()
130
+ process.join(timeout=self.timeout)
131
+
132
+ if process.is_alive():
133
+ # Timeout occurred
134
+ process.terminate()
135
+ process.join(timeout=1.0) # Wait for graceful termination
136
+ if process.is_alive():
137
+ process.kill() # Force kill if still running
138
+ return ToolResult(
139
+ output="", error=f"Code execution timed out after {self.timeout} seconds"
140
+ )
141
+
142
+ # Process completed, get results
143
+ if not output_queue.empty():
144
+ success, output, error, updated_namespace = output_queue.get()
145
+
146
+ # Update namespace with picklable objects from subprocess
147
+ # This allows persistence of basic types but not complex objects
148
+ with contextlib.suppress(Exception):
149
+ self._namespace.update(updated_namespace)
150
+
151
+ if success:
152
+ return ToolResult(output=output or "(no output)")
153
+ else:
154
+ return ToolResult(output="", error=error)
155
+ else:
156
+ # Process died without sending results
157
+ return ToolResult(output="", error="Code execution failed unexpectedly")
158
+
159
+ def reset(self) -> None:
160
+ """Clear the persistent namespace between runs."""
161
+ self._namespace.clear()