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.
- {symbolicai-1.6.0 → symbolicai-1.7.0}/PKG-INFO +2 -2
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/neurosymbolic_engine.md +22 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/FEATURES/contracts.md +38 -1
- {symbolicai-1.6.0 → symbolicai-1.7.0}/pyproject.toml +1 -1
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/__init__.py +1 -1
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_anthropic_claudeX_chat.py +1 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_anthropic_claudeX_reasoning.py +48 -1
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_cerebras.py +1 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/mixin/anthropic.py +37 -16
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/strategy.py +44 -4
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symbolicai.egg-info/PKG-INFO +2 -2
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symbolicai.egg-info/requires.txt +1 -1
- {symbolicai-1.6.0 → symbolicai-1.7.0}/uv.lock +1004 -1057
- {symbolicai-1.6.0 → symbolicai-1.7.0}/.gitbook.yaml +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/.github/FUNDING.yml +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/.gitignore +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/.symai/symsh.config.json +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/AGENTS.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/CITATION.cff +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/Dockerfile +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/LICENSE +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/MANIFEST.in +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/README.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/app.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/banner.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/cat.jpg +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/cat.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/contract_flow.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img1.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img10.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img2.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img3.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img4.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img5.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img6.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img7.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img8.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/img9.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/preview.gif +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/screen1.jpeg +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/symai_logo.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/symsh.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/vid1.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/vid2.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/vid3.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/vid4.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/vid5.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/images/vid6.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/results/news.html +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/results/news.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/assets/results/news_prev.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/bin/install.ps1 +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/bin/install.sh +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/build.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docker-compose.yml +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/clip_engine.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/custom_engine.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/drawing_engine.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/file_engine.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/indexing_engine.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/local_engine.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/ocr_engine.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/scrape_engine.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/search_engine.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/speech_to_text_engine.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/ENGINES/symbolic_engine.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/FEATURES/error_handling.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/FEATURES/expressions.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/FEATURES/import.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/FEATURES/operations.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/FEATURES/primitives.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/INSTALLATION.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/INTRODUCTION.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/QUICKSTART.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/SUMMARY.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/TOOLS/chatbot.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/TOOLS/packages.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/TOOLS/shell.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/TUTORIALS/chatbot.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/TUTORIALS/context.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/TUTORIALS/data_query.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/docs/source/TUTORIALS/video_tutorials.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/environment.yml +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/examples/contracts.ipynb +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/examples/primitives.ipynb +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/icon_converter.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/installer.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/Basics.ipynb +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/ChatBot.ipynb +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/Conversation.ipynb +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/Indexer.ipynb +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/News.ipynb +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/Queries.ipynb +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/TTS_Persona.ipynb +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/Lean engine.png +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/a_star.txt +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/abstract.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/audio.mp3 +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/dbpedia_samples.jsonl +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/dbpedia_samples_prepared_train.jsonl +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/dbpedia_samples_prepared_valid.jsonl +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/demo.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/demo_strategy.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/docs.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/einsteins_puzzle.txt +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/file.json +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/lean.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/news.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/paper.pdf +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/paper.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/legacy/notebooks/examples/sql.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/public/eai.svg +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/pytest.ini +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/ruff.toml +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/setup.cfg +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/setup.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/TERMS_OF_SERVICE.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/__init__.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/base.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/__init__.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/drawing/engine_bfl.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/drawing/engine_gemini_image.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/drawing/engine_gpt_image.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/embedding/engine_llama_cpp.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/embedding/engine_openai.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/execute/engine_python.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/files/engine_io.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/imagecaptioning/engine_blip2.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/imagecaptioning/engine_llavacpp_client.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/index/engine_pinecone.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/index/engine_qdrant.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/index/engine_vectordb.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/lean/engine_lean4.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/__init__.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_deepseekX_reasoning.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_google_geminiX_reasoning.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_groq.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_huggingface.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_llama_cpp.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_openai_gptX_chat.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_openai_gptX_reasoning.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_openai_responses.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_openrouter.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/ocr/engine_apilayer.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/output/engine_stdout.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/scrape/engine_requests.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/search/__init__.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/search/engine_firecrawl.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/search/engine_openai.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/search/engine_parallel.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/search/engine_perplexity.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/search/engine_serpapi.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/speech_to_text/engine_local_whisper.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/symbolic/engine_wolframalpha.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/text_to_speech/engine_openai.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/text_vision/engine_clip.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/userinput/engine_console.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/mixin/__init__.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/mixin/cerebras.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/mixin/deepseek.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/mixin/google.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/mixin/groq.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/mixin/openai.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/mixin/openrouter.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/settings.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/chat.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/components.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/constraints.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/context.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/core.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/core_ext.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/endpoints/__init__py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/endpoints/api.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/exceptions.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/.DS_Store +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/__init__.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/api_builder.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/arxiv_pdf_parser.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/bibtex_parser.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/conversation.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/document.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/file_merger.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/graph.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/html_style_template.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/__init__.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/blip_2.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/clip.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/console.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/dall_e.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/file.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/firecrawl.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/flux.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/gpt_image.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/input.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/llava.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/local_search.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/naive_scrape.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/naive_vectordb.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/nanobanana.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/ocr.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/openai_search.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/parallel.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/perplexity.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/pinecone.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/python.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/serpapi.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/terminal.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/tts.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/whisper.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/interfaces/wolframalpha.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/metrics/__init__.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/metrics/similarity.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/os_command.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/packages/__init__.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/packages/symdev.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/packages/sympkg.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/packages/symrun.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/repo_cloner.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/seo_query_optimizer.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/solver.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/summarizer.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/taypan_interpreter.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/extended/vectordb.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/formatter/__init__.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/formatter/emoji.pytxt +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/formatter/formatter.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/formatter/regex.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/functional.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/imports.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/interfaces.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/memory.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/menu/__init__.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/menu/screen.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/misc/__init__.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/misc/console.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/misc/loader.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/models/__init__.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/models/base.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/models/errors.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/ops/__init__.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/ops/measures.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/ops/primitives.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/post_processors.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/pre_processors.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/processor.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/prompts.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/server/__init__.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/server/huggingface_server.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/server/llama_cpp_server.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/server/qdrant_server.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/shell.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/shellsv.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/symbol.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/symsh.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symai/utils.py +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symbolicai.egg-info/SOURCES.txt +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symbolicai.egg-info/dependency_links.txt +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symbolicai.egg-info/entry_points.txt +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/symbolicai.egg-info/top_level.txt +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/tests/README.md +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/tests/data/audio.mp3 +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/tests/data/pg1727.txt +0 -0
- {symbolicai-1.6.0 → symbolicai-1.7.0}/tests/data/symmetry_breaking.pdf +0 -0
- {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.
|
|
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
|
|
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.
|
|
@@ -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
|
-
|
|
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):
|
{symbolicai-1.6.0 → symbolicai-1.7.0}/symai/backend/engines/neurosymbolic/engine_cerebras.py
RENAMED
|
@@ -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
|
|
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
|
-
|
|
27
|
-
or
|
|
28
|
-
or
|
|
29
|
-
or
|
|
30
|
-
or
|
|
31
|
-
or
|
|
32
|
-
or
|
|
33
|
-
or
|
|
34
|
-
or
|
|
35
|
-
or
|
|
36
|
-
or
|
|
37
|
-
or
|
|
38
|
-
or
|
|
39
|
-
or
|
|
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 == "
|
|
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
|
-
|
|
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"] =
|
|
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
|
-
|
|
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,
|
|
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.
|
|
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
|
|
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
|