symbolicai 1.6.0__tar.gz → 1.7.0__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 (264) hide show
  1. {symbolicai-1.6.0 → symbolicai-1.7.0}/PKG-INFO +2 -2
  2. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/neurosymbolic_engine.md +22 -0
  3. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/FEATURES/contracts.md +38 -1
  4. {symbolicai-1.6.0 → symbolicai-1.7.0}/pyproject.toml +1 -1
  5. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/__init__.py +1 -1
  6. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_anthropic_claudeX_chat.py +1 -0
  7. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_anthropic_claudeX_reasoning.py +48 -1
  8. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_cerebras.py +1 -0
  9. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/mixin/anthropic.py +37 -16
  10. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/strategy.py +44 -4
  11. {symbolicai-1.6.0 → symbolicai-1.7.0}/symbolicai.egg-info/PKG-INFO +2 -2
  12. {symbolicai-1.6.0 → symbolicai-1.7.0}/symbolicai.egg-info/requires.txt +1 -1
  13. {symbolicai-1.6.0 → symbolicai-1.7.0}/uv.lock +1004 -1057
  14. {symbolicai-1.6.0 → symbolicai-1.7.0}/.gitbook.yaml +0 -0
  15. {symbolicai-1.6.0 → symbolicai-1.7.0}/.github/FUNDING.yml +0 -0
  16. {symbolicai-1.6.0 → symbolicai-1.7.0}/.gitignore +0 -0
  17. {symbolicai-1.6.0 → symbolicai-1.7.0}/.symai/symsh.config.json +0 -0
  18. {symbolicai-1.6.0 → symbolicai-1.7.0}/AGENTS.md +0 -0
  19. {symbolicai-1.6.0 → symbolicai-1.7.0}/CITATION.cff +0 -0
  20. {symbolicai-1.6.0 → symbolicai-1.7.0}/Dockerfile +0 -0
  21. {symbolicai-1.6.0 → symbolicai-1.7.0}/LICENSE +0 -0
  22. {symbolicai-1.6.0 → symbolicai-1.7.0}/MANIFEST.in +0 -0
  23. {symbolicai-1.6.0 → symbolicai-1.7.0}/README.md +0 -0
  24. {symbolicai-1.6.0 → symbolicai-1.7.0}/app.py +0 -0
  25. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/banner.png +0 -0
  26. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/cat.jpg +0 -0
  27. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/cat.png +0 -0
  28. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/contract_flow.png +0 -0
  29. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img1.png +0 -0
  30. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img10.png +0 -0
  31. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img2.png +0 -0
  32. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img3.png +0 -0
  33. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img4.png +0 -0
  34. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img5.png +0 -0
  35. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img6.png +0 -0
  36. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img7.png +0 -0
  37. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img8.png +0 -0
  38. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img9.png +0 -0
  39. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/preview.gif +0 -0
  40. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/screen1.jpeg +0 -0
  41. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/symai_logo.png +0 -0
  42. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/symsh.png +0 -0
  43. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/vid1.png +0 -0
  44. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/vid2.png +0 -0
  45. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/vid3.png +0 -0
  46. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/vid4.png +0 -0
  47. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/vid5.png +0 -0
  48. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/vid6.png +0 -0
  49. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/results/news.html +0 -0
  50. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/results/news.png +0 -0
  51. {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/results/news_prev.png +0 -0
  52. {symbolicai-1.6.0 → symbolicai-1.7.0}/bin/install.ps1 +0 -0
  53. {symbolicai-1.6.0 → symbolicai-1.7.0}/bin/install.sh +0 -0
  54. {symbolicai-1.6.0 → symbolicai-1.7.0}/build.py +0 -0
  55. {symbolicai-1.6.0 → symbolicai-1.7.0}/docker-compose.yml +0 -0
  56. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/clip_engine.md +0 -0
  57. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/custom_engine.md +0 -0
  58. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/drawing_engine.md +0 -0
  59. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/file_engine.md +0 -0
  60. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/indexing_engine.md +0 -0
  61. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/local_engine.md +0 -0
  62. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/ocr_engine.md +0 -0
  63. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/scrape_engine.md +0 -0
  64. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/search_engine.md +0 -0
  65. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/speech_to_text_engine.md +0 -0
  66. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/symbolic_engine.md +0 -0
  67. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/FEATURES/error_handling.md +0 -0
  68. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/FEATURES/expressions.md +0 -0
  69. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/FEATURES/import.md +0 -0
  70. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/FEATURES/operations.md +0 -0
  71. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/FEATURES/primitives.md +0 -0
  72. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/INSTALLATION.md +0 -0
  73. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/INTRODUCTION.md +0 -0
  74. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/QUICKSTART.md +0 -0
  75. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/SUMMARY.md +0 -0
  76. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/TOOLS/chatbot.md +0 -0
  77. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/TOOLS/packages.md +0 -0
  78. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/TOOLS/shell.md +0 -0
  79. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/TUTORIALS/chatbot.md +0 -0
  80. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/TUTORIALS/context.md +0 -0
  81. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/TUTORIALS/data_query.md +0 -0
  82. {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/TUTORIALS/video_tutorials.md +0 -0
  83. {symbolicai-1.6.0 → symbolicai-1.7.0}/environment.yml +0 -0
  84. {symbolicai-1.6.0 → symbolicai-1.7.0}/examples/contracts.ipynb +0 -0
  85. {symbolicai-1.6.0 → symbolicai-1.7.0}/examples/primitives.ipynb +0 -0
  86. {symbolicai-1.6.0 → symbolicai-1.7.0}/icon_converter.py +0 -0
  87. {symbolicai-1.6.0 → symbolicai-1.7.0}/installer.py +0 -0
  88. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/Basics.ipynb +0 -0
  89. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/ChatBot.ipynb +0 -0
  90. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/Conversation.ipynb +0 -0
  91. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/Indexer.ipynb +0 -0
  92. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/News.ipynb +0 -0
  93. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/Queries.ipynb +0 -0
  94. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/TTS_Persona.ipynb +0 -0
  95. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/Lean engine.png +0 -0
  96. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/a_star.txt +0 -0
  97. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/abstract.py +0 -0
  98. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/audio.mp3 +0 -0
  99. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/dbpedia_samples.jsonl +0 -0
  100. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/dbpedia_samples_prepared_train.jsonl +0 -0
  101. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/dbpedia_samples_prepared_valid.jsonl +0 -0
  102. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/demo.py +0 -0
  103. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/demo_strategy.py +0 -0
  104. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/docs.py +0 -0
  105. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/einsteins_puzzle.txt +0 -0
  106. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/file.json +0 -0
  107. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/lean.py +0 -0
  108. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/news.py +0 -0
  109. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/paper.pdf +0 -0
  110. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/paper.py +0 -0
  111. {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/sql.py +0 -0
  112. {symbolicai-1.6.0 → symbolicai-1.7.0}/public/eai.svg +0 -0
  113. {symbolicai-1.6.0 → symbolicai-1.7.0}/pytest.ini +0 -0
  114. {symbolicai-1.6.0 → symbolicai-1.7.0}/ruff.toml +0 -0
  115. {symbolicai-1.6.0 → symbolicai-1.7.0}/setup.cfg +0 -0
  116. {symbolicai-1.6.0 → symbolicai-1.7.0}/setup.py +0 -0
  117. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/TERMS_OF_SERVICE.md +0 -0
  118. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/__init__.py +0 -0
  119. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/base.py +0 -0
  120. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/__init__.py +0 -0
  121. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/drawing/engine_bfl.py +0 -0
  122. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/drawing/engine_gemini_image.py +0 -0
  123. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/drawing/engine_gpt_image.py +0 -0
  124. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/embedding/engine_llama_cpp.py +0 -0
  125. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/embedding/engine_openai.py +0 -0
  126. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/execute/engine_python.py +0 -0
  127. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/files/engine_io.py +0 -0
  128. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/imagecaptioning/engine_blip2.py +0 -0
  129. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/imagecaptioning/engine_llavacpp_client.py +0 -0
  130. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/index/engine_pinecone.py +0 -0
  131. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/index/engine_qdrant.py +0 -0
  132. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/index/engine_vectordb.py +0 -0
  133. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/lean/engine_lean4.py +0 -0
  134. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/__init__.py +0 -0
  135. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_deepseekX_reasoning.py +0 -0
  136. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_google_geminiX_reasoning.py +0 -0
  137. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_groq.py +0 -0
  138. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_huggingface.py +0 -0
  139. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_llama_cpp.py +0 -0
  140. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_openai_gptX_chat.py +0 -0
  141. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_openai_gptX_reasoning.py +0 -0
  142. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_openai_responses.py +0 -0
  143. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_openrouter.py +0 -0
  144. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/ocr/engine_apilayer.py +0 -0
  145. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/output/engine_stdout.py +0 -0
  146. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/scrape/engine_requests.py +0 -0
  147. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/search/__init__.py +0 -0
  148. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/search/engine_firecrawl.py +0 -0
  149. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/search/engine_openai.py +0 -0
  150. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/search/engine_parallel.py +0 -0
  151. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/search/engine_perplexity.py +0 -0
  152. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/search/engine_serpapi.py +0 -0
  153. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/speech_to_text/engine_local_whisper.py +0 -0
  154. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/symbolic/engine_wolframalpha.py +0 -0
  155. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/text_to_speech/engine_openai.py +0 -0
  156. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/text_vision/engine_clip.py +0 -0
  157. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/userinput/engine_console.py +0 -0
  158. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/mixin/__init__.py +0 -0
  159. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/mixin/cerebras.py +0 -0
  160. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/mixin/deepseek.py +0 -0
  161. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/mixin/google.py +0 -0
  162. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/mixin/groq.py +0 -0
  163. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/mixin/openai.py +0 -0
  164. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/mixin/openrouter.py +0 -0
  165. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/settings.py +0 -0
  166. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/chat.py +0 -0
  167. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/components.py +0 -0
  168. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/constraints.py +0 -0
  169. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/context.py +0 -0
  170. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/core.py +0 -0
  171. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/core_ext.py +0 -0
  172. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/endpoints/__init__py +0 -0
  173. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/endpoints/api.py +0 -0
  174. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/exceptions.py +0 -0
  175. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/.DS_Store +0 -0
  176. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/__init__.py +0 -0
  177. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/api_builder.py +0 -0
  178. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/arxiv_pdf_parser.py +0 -0
  179. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/bibtex_parser.py +0 -0
  180. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/conversation.py +0 -0
  181. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/document.py +0 -0
  182. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/file_merger.py +0 -0
  183. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/graph.py +0 -0
  184. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/html_style_template.py +0 -0
  185. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/__init__.py +0 -0
  186. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/blip_2.py +0 -0
  187. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/clip.py +0 -0
  188. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/console.py +0 -0
  189. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/dall_e.py +0 -0
  190. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/file.py +0 -0
  191. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/firecrawl.py +0 -0
  192. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/flux.py +0 -0
  193. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/gpt_image.py +0 -0
  194. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/input.py +0 -0
  195. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/llava.py +0 -0
  196. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/local_search.py +0 -0
  197. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/naive_scrape.py +0 -0
  198. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/naive_vectordb.py +0 -0
  199. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/nanobanana.py +0 -0
  200. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/ocr.py +0 -0
  201. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/openai_search.py +0 -0
  202. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/parallel.py +0 -0
  203. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/perplexity.py +0 -0
  204. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/pinecone.py +0 -0
  205. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/python.py +0 -0
  206. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/serpapi.py +0 -0
  207. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/terminal.py +0 -0
  208. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/tts.py +0 -0
  209. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/whisper.py +0 -0
  210. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/wolframalpha.py +0 -0
  211. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/metrics/__init__.py +0 -0
  212. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/metrics/similarity.py +0 -0
  213. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/os_command.py +0 -0
  214. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/packages/__init__.py +0 -0
  215. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/packages/symdev.py +0 -0
  216. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/packages/sympkg.py +0 -0
  217. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/packages/symrun.py +0 -0
  218. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/repo_cloner.py +0 -0
  219. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/seo_query_optimizer.py +0 -0
  220. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/solver.py +0 -0
  221. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/summarizer.py +0 -0
  222. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/taypan_interpreter.py +0 -0
  223. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/vectordb.py +0 -0
  224. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/formatter/__init__.py +0 -0
  225. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/formatter/emoji.pytxt +0 -0
  226. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/formatter/formatter.py +0 -0
  227. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/formatter/regex.py +0 -0
  228. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/functional.py +0 -0
  229. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/imports.py +0 -0
  230. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/interfaces.py +0 -0
  231. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/memory.py +0 -0
  232. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/menu/__init__.py +0 -0
  233. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/menu/screen.py +0 -0
  234. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/misc/__init__.py +0 -0
  235. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/misc/console.py +0 -0
  236. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/misc/loader.py +0 -0
  237. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/models/__init__.py +0 -0
  238. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/models/base.py +0 -0
  239. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/models/errors.py +0 -0
  240. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/ops/__init__.py +0 -0
  241. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/ops/measures.py +0 -0
  242. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/ops/primitives.py +0 -0
  243. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/post_processors.py +0 -0
  244. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/pre_processors.py +0 -0
  245. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/processor.py +0 -0
  246. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/prompts.py +0 -0
  247. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/server/__init__.py +0 -0
  248. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/server/huggingface_server.py +0 -0
  249. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/server/llama_cpp_server.py +0 -0
  250. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/server/qdrant_server.py +0 -0
  251. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/shell.py +0 -0
  252. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/shellsv.py +0 -0
  253. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/symbol.py +0 -0
  254. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/symsh.md +0 -0
  255. {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/utils.py +0 -0
  256. {symbolicai-1.6.0 → symbolicai-1.7.0}/symbolicai.egg-info/SOURCES.txt +0 -0
  257. {symbolicai-1.6.0 → symbolicai-1.7.0}/symbolicai.egg-info/dependency_links.txt +0 -0
  258. {symbolicai-1.6.0 → symbolicai-1.7.0}/symbolicai.egg-info/entry_points.txt +0 -0
  259. {symbolicai-1.6.0 → symbolicai-1.7.0}/symbolicai.egg-info/top_level.txt +0 -0
  260. {symbolicai-1.6.0 → symbolicai-1.7.0}/tests/README.md +0 -0
  261. {symbolicai-1.6.0 → symbolicai-1.7.0}/tests/data/audio.mp3 +0 -0
  262. {symbolicai-1.6.0 → symbolicai-1.7.0}/tests/data/pg1727.txt +0 -0
  263. {symbolicai-1.6.0 → symbolicai-1.7.0}/tests/data/symmetry_breaking.pdf +0 -0
  264. {symbolicai-1.6.0 → symbolicai-1.7.0}/trusted_repos.yml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: symbolicai
3
- Version: 1.6.0
3
+ Version: 1.7.0
4
4
  Summary: A Neurosymbolic Perspective on Large Language Models
5
5
  Author-email: Marius-Constantin Dinu <marius@extensity.ai>, Leoveanu-Condrei Claudiu <leo@extensity.ai>
6
6
  License: BSD 3-Clause License
@@ -52,7 +52,7 @@ Requires-Dist: tqdm>=4.66.3
52
52
  Requires-Dist: python-box>=7.1.1
53
53
  Requires-Dist: pandas>=2.2.2
54
54
  Requires-Dist: scikit-learn>=1.5.0
55
- Requires-Dist: torch>=2.2.2
55
+ Requires-Dist: torch<2.10.0
56
56
  Requires-Dist: torchaudio>=2.2.2
57
57
  Requires-Dist: torchvision>=0.17.2
58
58
  Requires-Dist: PyYAML>=6.0.1
@@ -126,6 +126,28 @@ print(res)
126
126
  print(metadata["thinking"])
127
127
  ```
128
128
 
129
+ ### Claude 1M Context (Reasoning Models, Runtime Opt-In)
130
+
131
+ For Anthropic reasoning models, you can opt into 1M context per request using `long_context_1m=True`.
132
+ This is runtime-only and is not configured via `symai.config.json`.
133
+
134
+ ```python
135
+ from symai import Symbol
136
+
137
+ # Supported aliases in this mode:
138
+ # - claude-opus-4-6
139
+ # - claude-sonnet-4-5
140
+ res = Symbol("Analyze this very long corpus...").query(
141
+ "Extract a structured timeline of key events.",
142
+ model="claude-opus-4-6",
143
+ long_context_1m=True,
144
+ )
145
+ print(res)
146
+ ```
147
+
148
+ If `long_context_1m=True` is used with an unsupported model alias, SymbolicAI warns via `UserMessage`
149
+ and falls back to the standard 200K context behavior.
150
+
129
151
  ### Gemini (Google)
130
152
 
131
153
  ```python
@@ -72,7 +72,7 @@ class MyContractedClass(Expression):
72
72
  If `True`, attempts to automatically correct output validation failures (from your `post` method or type mismatches) using LLM-based type and semantic remediation.
73
73
  * `accumulate_errors` (bool, default: `False`):
74
74
  Controls whether error messages from multiple failed validation attempts (during remediation) are accumulated and provided to the LLM in subsequent retry attempts. See more details in the "Error Accumulation" section below.
75
- * `verbose` (bool, default: `False`):
75
+ * `verbose` (bool, default: `False`):
76
76
  If `True`, enables detailed logging of the contract's internal operations, including prompts sent to the LLM and validation steps.
77
77
  * `remedy_retry_params` (dict, default: `{ "tries": 5, "delay": 0.5, "max_delay": 15, "jitter": 0.1, "backoff": 2, "graceful": False }`):
78
78
  A dictionary configuring the retry behavior for both type and semantic validation/remediation functions.
@@ -85,6 +85,43 @@ class MyContractedClass(Expression):
85
85
  - Exceptions from validation/remediation are suppressed and `self.contract_exception` remains `None`.
86
86
  - The automatic final output type check (which would raise a `TypeError` for mismatched return types) is skipped, preventing upstream errors.
87
87
  This lets your `forward` method receive invalid or missing results without interruption and implement custom fallback logic.
88
+ * `dynamic_engine` (optional): A `symai.components.DynamicEngine` instance used for zero-shot fallback and remedy retries. When provided, retry/remedy calls run inside that engine context instead of the currently active default engine.
89
+
90
+ #### Optional: Run contract remedies on a dynamic engine
91
+
92
+ You can force retry/remedy attempts to execute on a different model by passing `dynamic_engine` inside
93
+ `remedy_retry_params`.
94
+
95
+ ```python
96
+ import os
97
+ from symai import Expression
98
+ from symai.components import DynamicEngine
99
+ from symai.strategy import contract
100
+
101
+ repair_engine = DynamicEngine(
102
+ model="claude-opus-4-6",
103
+ api_key=os.environ["ANTHROPIC_API_KEY"],
104
+ )
105
+
106
+ @contract(
107
+ pre_remedy=True,
108
+ post_remedy=True,
109
+ remedy_retry_params={
110
+ "tries": 3,
111
+ "delay": 0.4,
112
+ "max_delay": 4.0,
113
+ "jitter": 0.15,
114
+ "backoff": 1.8,
115
+ "graceful": False,
116
+ "dynamic_engine": repair_engine,
117
+ },
118
+ )
119
+ class MyContractedClass(Expression):
120
+ ...
121
+ ```
122
+
123
+ This keeps your main engine selection unchanged while routing contract correction passes through
124
+ the specified dynamic engine.
88
125
 
89
126
  ### 2. Input and Output Data Models
90
127
  **Note**: You can use native Python types directly in your `pre`, `act`, `post`, and `forward` method signatures (e.g., `str`, `int`, `list[int]`, `dict[str, int]`, `Optional[...]`, `Union[...]`), or mix them with traditional `LLMDataModel` types in hybrid scenarios (e.g., LLMDataModel inputs with list outputs). The system will dynamically generate internal LLMDataModel wrappers (with a single `value` field) for validation and automatically unwrap the `value` field back to your native data on return, making simple use cases more concise than defining full Pydantic models.
@@ -34,7 +34,7 @@ dependencies = [
34
34
  "python-box>=7.1.1",
35
35
  "pandas>=2.2.2",
36
36
  "scikit-learn>=1.5.0",
37
- "torch>=2.2.2",
37
+ "torch<2.10.0", # weird errors, things like "no torch.Tensor"
38
38
  "torchaudio>=2.2.2",
39
39
  "torchvision>=0.17.2",
40
40
  "PyYAML>=6.0.1",
@@ -31,7 +31,7 @@ os.environ["TOKENIZERS_PARALLELISM"] = "false"
31
31
  # Create singleton instance
32
32
  config_manager = settings.SymAIConfig()
33
33
 
34
- SYMAI_VERSION = "1.6.0"
34
+ SYMAI_VERSION = "1.7.0"
35
35
  __version__ = SYMAI_VERSION
36
36
  __root_dir__ = config_manager.config_dir
37
37
 
@@ -64,6 +64,7 @@ class ClaudeXChatEngine(Engine, AnthropicMixin):
64
64
  and "4-0" not in self.config.get("NEUROSYMBOLIC_ENGINE_MODEL")
65
65
  and "4-1" not in self.config.get("NEUROSYMBOLIC_ENGINE_MODEL")
66
66
  and "4-5" not in self.config.get("NEUROSYMBOLIC_ENGINE_MODEL")
67
+ and "4-6" not in self.config.get("NEUROSYMBOLIC_ENGINE_MODEL")
67
68
  )
68
69
  ):
69
70
  return "neurosymbolic"
@@ -66,6 +66,7 @@ class ClaudeXReasoningEngine(Engine, AnthropicMixin):
66
66
  or "4-0" in self.config.get("NEUROSYMBOLIC_ENGINE_MODEL")
67
67
  or "4-1" in self.config.get("NEUROSYMBOLIC_ENGINE_MODEL")
68
68
  or "4-5" in self.config.get("NEUROSYMBOLIC_ENGINE_MODEL")
69
+ or "4-6" in self.config.get("NEUROSYMBOLIC_ENGINE_MODEL")
69
70
  )
70
71
  ):
71
72
  return "neurosymbolic"
@@ -348,9 +349,48 @@ class ClaudeXReasoningEngine(Engine, AnthropicMixin):
348
349
 
349
350
  return {"role": "user", "content": user_text}
350
351
 
352
+ def _build_output_config(self, response_format):
353
+ if response_format is None:
354
+ return NOT_GIVEN
355
+
356
+ if response_format["type"] == "json_schema":
357
+ schema = response_format.get("schema")
358
+ if schema is None and response_format.get("json_schema") is not None:
359
+ schema = response_format["json_schema"].get("schema", response_format["json_schema"])
360
+ if schema is None:
361
+ return NOT_GIVEN
362
+ return {"format": {"type": "json_schema", "schema": schema}}
363
+
364
+ if response_format["type"] == "json_object":
365
+ schema = response_format.get("schema")
366
+ if schema is None:
367
+ return NOT_GIVEN
368
+ return {"format": {"type": "json_schema", "schema": schema}}
369
+
370
+ return NOT_GIVEN
371
+
351
372
  def _prepare_request_payload(self, argument):
352
373
  kwargs = argument.kwargs
353
374
  model = kwargs.get("model", self.model)
375
+ long_context_1m = bool(kwargs.get("long_context_1m", False))
376
+ use_long_context_1m = long_context_1m and self.supports_long_context_1m(model)
377
+ effective_context_tokens = self.api_max_context_tokens(model=model)
378
+ if effective_context_tokens is None:
379
+ effective_context_tokens = 200_000
380
+ if use_long_context_1m:
381
+ effective_context_tokens = self.api_max_context_tokens(
382
+ long_context_1m=True, model=model
383
+ )
384
+ if long_context_1m and not use_long_context_1m:
385
+ UserMessage(
386
+ "long_context_1m is only supported for claude-opus-4-6 and claude-sonnet-4-5; "
387
+ f"falling back to {effective_context_tokens} token context."
388
+ )
389
+
390
+ extra_headers = None
391
+ if use_long_context_1m:
392
+ extra_headers = {"anthropic-beta": self.long_context_beta_header()}
393
+
354
394
  stop = kwargs.get("stop", NOT_GIVEN)
355
395
  temperature = kwargs.get("temperature", 1)
356
396
  thinking_arg = kwargs.get("thinking", NOT_GIVEN)
@@ -368,6 +408,8 @@ class ClaudeXReasoningEngine(Engine, AnthropicMixin):
368
408
  tool_choice = kwargs.get("tool_choice", NOT_GIVEN)
369
409
  metadata_anthropic = kwargs.get("metadata", NOT_GIVEN)
370
410
  max_tokens = kwargs.get("max_tokens", self.max_response_tokens)
411
+ response_format = kwargs.get("response_format", argument.prop.response_format)
412
+ output_config = self._build_output_config(response_format)
371
413
 
372
414
  if stop != NOT_GIVEN and not isinstance(stop, list):
373
415
  stop = [stop]
@@ -377,7 +419,7 @@ class ClaudeXReasoningEngine(Engine, AnthropicMixin):
377
419
  if stop != NOT_GIVEN:
378
420
  stop = [r"{s}" for s in stop]
379
421
 
380
- return {
422
+ payload = {
381
423
  "model": model,
382
424
  "max_tokens": max_tokens,
383
425
  "stop_sequences": stop,
@@ -389,7 +431,12 @@ class ClaudeXReasoningEngine(Engine, AnthropicMixin):
389
431
  "metadata": metadata_anthropic,
390
432
  "tools": tools,
391
433
  "tool_choice": tool_choice,
434
+ "output_config": output_config,
392
435
  }
436
+ if extra_headers is not None:
437
+ payload["extra_headers"] = extra_headers
438
+
439
+ return payload
393
440
 
394
441
  def _collect_response(self, res):
395
442
  if isinstance(res, list):
@@ -16,6 +16,7 @@ logging.getLogger("requests").setLevel(logging.ERROR)
16
16
  logging.getLogger("urllib").setLevel(logging.ERROR)
17
17
  logging.getLogger("httpx").setLevel(logging.ERROR)
18
18
  logging.getLogger("httpcore").setLevel(logging.ERROR)
19
+ logging.getLogger("hpack").setLevel(logging.ERROR)
19
20
 
20
21
 
21
22
  _NON_VERBOSE_OUTPUT = (
@@ -10,6 +10,7 @@ SUPPORTED_CHAT_MODELS = [
10
10
  "claude-3-haiku-20240307",
11
11
  ]
12
12
  SUPPORTED_REASONING_MODELS = [
13
+ "claude-opus-4-6",
13
14
  "claude-opus-4-5",
14
15
  "claude-opus-4-1",
15
16
  "claude-opus-4-0",
@@ -19,29 +20,49 @@ SUPPORTED_REASONING_MODELS = [
19
20
  "claude-sonnet-4-5",
20
21
  ]
21
22
 
23
+ LONG_CONTEXT_1M_TOKENS = 1_000_000
24
+ LONG_CONTEXT_1M_BETA_HEADER = "context-1m-2025-08-07"
25
+ LONG_CONTEXT_1M_MODELS = {
26
+ "claude-opus-4-6",
27
+ "claude-sonnet-4-5",
28
+ }
29
+
22
30
 
23
31
  class AnthropicMixin:
24
- def api_max_context_tokens(self):
32
+ def supports_long_context_1m(self, model: str) -> bool:
33
+ return model in LONG_CONTEXT_1M_MODELS
34
+
35
+ def long_context_beta_header(self) -> str:
36
+ return LONG_CONTEXT_1M_BETA_HEADER
37
+
38
+ def api_max_context_tokens(self, long_context_1m: bool = False, model: str | None = None):
39
+ selected_model = self.model if model is None else model
40
+ if long_context_1m and self.supports_long_context_1m(selected_model):
41
+ return LONG_CONTEXT_1M_TOKENS
25
42
  if (
26
- self.model == "claude-opus-4-5"
27
- or self.model == "claude-opus-4-1"
28
- or self.model == "claude-opus-4-0"
29
- or self.model == "claude-sonnet-4-0"
30
- or self.model == "claude-3-7-sonnet-latest"
31
- or self.model == "claude-haiku-4-5"
32
- or self.model == "claude-sonnet-4-5"
33
- or self.model == "claude-3-5-sonnet-latest"
34
- or self.model == "claude-3-5-sonnet-20241022"
35
- or self.model == "claude-3-5-sonnet-20240620"
36
- or self.model == "claude-3-opus-latest"
37
- or self.model == "claude-3-opus-20240229"
38
- or self.model == "claude-3-sonnet-20240229"
39
- or self.model == "claude-3-haiku-20240307"
43
+ selected_model == "claude-opus-4-6"
44
+ or selected_model == "claude-opus-4-5"
45
+ or selected_model == "claude-opus-4-1"
46
+ or selected_model == "claude-opus-4-0"
47
+ or selected_model == "claude-sonnet-4-0"
48
+ or selected_model == "claude-3-7-sonnet-latest"
49
+ or selected_model == "claude-haiku-4-5"
50
+ or selected_model == "claude-sonnet-4-5"
51
+ or selected_model == "claude-3-5-sonnet-latest"
52
+ or selected_model == "claude-3-5-sonnet-20241022"
53
+ or selected_model == "claude-3-5-sonnet-20240620"
54
+ or selected_model == "claude-3-opus-latest"
55
+ or selected_model == "claude-3-opus-20240229"
56
+ or selected_model == "claude-3-sonnet-20240229"
57
+ or selected_model == "claude-3-haiku-20240307"
40
58
  ):
41
59
  return 200_000
42
60
  return None
43
61
 
44
62
  def api_max_response_tokens(self):
63
+ if self.model == "claude-opus-4-6":
64
+ return 128_000
65
+
45
66
  if (
46
67
  self.model == "claude-opus-4-5"
47
68
  or self.model == "claude-sonnet-4-0"
@@ -61,7 +82,7 @@ class AnthropicMixin:
61
82
  if (
62
83
  self.model == "claude-3-5-sonnet-20240620"
63
84
  or self.model == "claude-3-opus-latest"
64
- or self.model == "clade-3-opus-20240229"
85
+ or self.model == "claude-3-opus-20240229"
65
86
  or self.model == "claude-3-sonnet-20240229"
66
87
  or self.model == "claude-3-haiku-20240307"
67
88
  ):
@@ -3,9 +3,11 @@ import logging
3
3
  import time
4
4
  from collections import defaultdict
5
5
  from collections.abc import Callable
6
+ from contextlib import nullcontext
6
7
  from typing import Any, ClassVar
7
8
 
8
9
  import numpy as np
10
+ from anthropic import transform_schema
9
11
  from beartype import beartype
10
12
  from loguru import logger
11
13
  from pydantic import BaseModel, ValidationError
@@ -14,7 +16,9 @@ from rich.markup import escape
14
16
  from rich.panel import Panel
15
17
  from rich.table import Table
16
18
 
19
+ from .backend.settings import SYMAI_CONFIG
17
20
  from .components import Function
21
+ from .context import CURRENT_ENGINE_VAR
18
22
  from .models import LLMDataModel, TypeValidationError, build_dynamic_llm_datamodel
19
23
  from .symbol import Expression
20
24
  from .utils import UserMessage
@@ -182,6 +186,7 @@ class TypeValidationFunction(ValidationFunction):
182
186
  self.output_data_model = None
183
187
  self.accumulate_errors = accumulate_errors
184
188
  self.verbose = verbose
189
+ self.dynamic_engine = self.retry_params.get("dynamic_engine")
185
190
 
186
191
  def register_expected_data_model(
187
192
  self, data_model: LLMDataModel, attach_to: str, override: bool = False
@@ -361,7 +366,8 @@ Important guidelines:
361
366
  if self.verbose:
362
367
  self.display_panel(self.remedy_function.dynamic_context, title="New Context")
363
368
 
364
- json_str = self.remedy_function(seed=remedy_seeds[attempt_index], **kwargs).value
369
+ with (self.dynamic_engine if self.dynamic_engine is not None else nullcontext()):
370
+ json_str = self.remedy_function(seed=remedy_seeds[attempt_index], **kwargs).value
365
371
  logger.info("Applied remedy function with updated context!")
366
372
  return json_str
367
373
 
@@ -418,17 +424,51 @@ Important guidelines:
418
424
  violations=errors,
419
425
  )
420
426
 
427
+ def _build_response_format(self, kwargs: dict) -> dict:
428
+ response_format = kwargs.get("response_format")
429
+ if response_format is None:
430
+ response_format = {"type": "json_object"}
431
+ # Resolve the effective model from the most specific runtime source first.
432
+ # This keeps contracts working when engines are swapped dynamically and no static
433
+ # model is registered in config.
434
+ selected_model = kwargs.get("model")
435
+ if selected_model is None:
436
+ active_engine = CURRENT_ENGINE_VAR.get()
437
+ if active_engine is not None:
438
+ selected_model = getattr(active_engine, "model", None)
439
+ if selected_model is None:
440
+ selected_model = SYMAI_CONFIG.get("NEUROSYMBOLIC_ENGINE_MODEL", "")
441
+
442
+ if "claude-opus" not in selected_model:
443
+ return response_format
444
+
445
+ if response_format.get("type") != "json_object":
446
+ return response_format
447
+
448
+ # At the contract layer, `json_object` stays the generic trigger for structured output.
449
+ # Opus requires a concrete JSON Schema payload, so we derive it from the output model.
450
+ return {"type": "json_schema", "schema": transform_schema(self.output_data_model)}
451
+
421
452
  def forward(
422
453
  self, prompt: str, f_semantic_conditions: list[Callable] | None = None, *args, **kwargs
423
454
  ):
424
455
  self._ensure_output_model()
425
456
  validation_context = kwargs.pop("validation_context", {})
426
- kwargs["response_format"] = {"type": "json_object"}
457
+ kwargs["response_format"] = self._build_response_format(kwargs)
427
458
  logger.info("Initializing validation…")
428
459
  self._display_verbose_panels(prompt)
429
460
 
430
461
  context = self.zero_shot_prompt(prompt=prompt)
431
- json_str = super().forward(context, *args, **kwargs).value
462
+
463
+ # Zero-shot attempt; fall back to dynamic engine on failure
464
+ try:
465
+ json_str = super().forward(context, *args, **kwargs).value
466
+ except Exception:
467
+ if self.dynamic_engine is None:
468
+ raise
469
+ logger.info("Zero-shot failed; retrying with dynamic engine…")
470
+ with self.dynamic_engine:
471
+ json_str = super().forward(context, *args, **kwargs).value
432
472
 
433
473
  remedy_seeds = self.prepare_seeds(self.retry_params["tries"] + 1, **kwargs)
434
474
  logger.info(f"Prepared {len(remedy_seeds)} remedy seeds for validation attempts…")
@@ -468,7 +508,7 @@ class contract:
468
508
  post_remedy: bool = False,
469
509
  accumulate_errors: bool = False,
470
510
  verbose: bool = False,
471
- remedy_retry_params: dict[str, int | float | bool] = _default_remedy_retry_params,
511
+ remedy_retry_params: dict[str, Any] = _default_remedy_retry_params,
472
512
  ):
473
513
  """
474
514
  A contract class decorator inspired by DbC principles. It ensures that the function's input and output
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: symbolicai
3
- Version: 1.6.0
3
+ Version: 1.7.0
4
4
  Summary: A Neurosymbolic Perspective on Large Language Models
5
5
  Author-email: Marius-Constantin Dinu <marius@extensity.ai>, Leoveanu-Condrei Claudiu <leo@extensity.ai>
6
6
  License: BSD 3-Clause License
@@ -52,7 +52,7 @@ Requires-Dist: tqdm>=4.66.3
52
52
  Requires-Dist: python-box>=7.1.1
53
53
  Requires-Dist: pandas>=2.2.2
54
54
  Requires-Dist: scikit-learn>=1.5.0
55
- Requires-Dist: torch>=2.2.2
55
+ Requires-Dist: torch<2.10.0
56
56
  Requires-Dist: torchaudio>=2.2.2
57
57
  Requires-Dist: torchvision>=0.17.2
58
58
  Requires-Dist: PyYAML>=6.0.1
@@ -9,7 +9,7 @@ tqdm>=4.66.3
9
9
  python-box>=7.1.1
10
10
  pandas>=2.2.2
11
11
  scikit-learn>=1.5.0
12
- torch>=2.2.2
12
+ torch<2.10.0
13
13
  torchaudio>=2.2.2
14
14
  torchvision>=0.17.2
15
15
  PyYAML>=6.0.1