symbolicai 1.2.0__tar.gz → 1.3.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.2.0 → symbolicai-1.3.0}/.gitignore +1 -0
- symbolicai-1.3.0/AGENTS.md +76 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/PKG-INFO +1 -1
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/__init__.py +1 -1
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/neurosymbolic/engine_openai_responses.py +3 -1
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/search/engine_parallel.py +92 -53
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/mixin/openai.py +9 -1
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symbolicai.egg-info/PKG-INFO +1 -1
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symbolicai.egg-info/SOURCES.txt +1 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/.gitbook.yaml +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/.github/FUNDING.yml +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/.symai/symsh.config.json +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/CITATION.cff +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/Dockerfile +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/LICENSE +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/MANIFEST.in +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/README.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/app.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/banner.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/cat.jpg +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/cat.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/contract_flow.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/img1.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/img10.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/img2.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/img3.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/img4.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/img5.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/img6.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/img7.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/img8.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/img9.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/preview.gif +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/screen1.jpeg +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/symai_logo.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/symsh.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/vid1.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/vid2.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/vid3.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/vid4.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/vid5.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/images/vid6.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/results/news.html +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/results/news.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/assets/results/news_prev.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/bin/install.ps1 +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/bin/install.sh +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/build.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docker-compose.yml +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/ENGINES/clip_engine.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/ENGINES/custom_engine.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/ENGINES/drawing_engine.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/ENGINES/file_engine.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/ENGINES/indexing_engine.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/ENGINES/local_engine.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/ENGINES/neurosymbolic_engine.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/ENGINES/ocr_engine.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/ENGINES/scrape_engine.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/ENGINES/search_engine.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/ENGINES/speech_to_text_engine.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/ENGINES/symbolic_engine.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/FEATURES/contracts.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/FEATURES/error_handling.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/FEATURES/expressions.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/FEATURES/import.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/FEATURES/operations.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/FEATURES/primitives.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/INSTALLATION.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/INTRODUCTION.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/QUICKSTART.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/SUMMARY.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/TOOLS/chatbot.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/TOOLS/packages.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/TOOLS/shell.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/TUTORIALS/chatbot.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/TUTORIALS/context.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/TUTORIALS/data_query.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/docs/source/TUTORIALS/video_tutorials.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/environment.yml +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/examples/contracts.ipynb +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/examples/primitives.ipynb +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/icon_converter.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/installer.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/Basics.ipynb +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/ChatBot.ipynb +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/Conversation.ipynb +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/Indexer.ipynb +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/News.ipynb +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/Queries.ipynb +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/TTS_Persona.ipynb +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/Lean engine.png +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/a_star.txt +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/abstract.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/audio.mp3 +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/dbpedia_samples.jsonl +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/dbpedia_samples_prepared_train.jsonl +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/dbpedia_samples_prepared_valid.jsonl +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/demo.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/demo_strategy.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/docs.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/einsteins_puzzle.txt +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/file.json +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/lean.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/news.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/paper.pdf +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/paper.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/legacy/notebooks/examples/sql.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/public/eai.svg +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/pyproject.toml +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/pytest.ini +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/ruff.toml +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/setup.cfg +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/setup.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/TERMS_OF_SERVICE.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/__init__.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/base.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/__init__.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/drawing/engine_bfl.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/drawing/engine_gpt_image.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/embedding/engine_llama_cpp.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/embedding/engine_openai.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/execute/engine_python.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/files/engine_io.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/imagecaptioning/engine_blip2.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/imagecaptioning/engine_llavacpp_client.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/index/engine_pinecone.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/index/engine_qdrant.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/index/engine_vectordb.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/lean/engine_lean4.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/neurosymbolic/__init__.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/neurosymbolic/engine_anthropic_claudeX_chat.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/neurosymbolic/engine_anthropic_claudeX_reasoning.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/neurosymbolic/engine_cerebras.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/neurosymbolic/engine_deepseekX_reasoning.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/neurosymbolic/engine_google_geminiX_reasoning.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/neurosymbolic/engine_groq.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/neurosymbolic/engine_huggingface.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/neurosymbolic/engine_llama_cpp.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/neurosymbolic/engine_openai_gptX_chat.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/neurosymbolic/engine_openai_gptX_reasoning.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/ocr/engine_apilayer.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/output/engine_stdout.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/scrape/engine_requests.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/search/engine_openai.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/search/engine_perplexity.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/search/engine_serpapi.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/speech_to_text/engine_local_whisper.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/symbolic/engine_wolframalpha.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/text_to_speech/engine_openai.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/text_vision/engine_clip.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/userinput/engine_console.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/mixin/__init__.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/mixin/anthropic.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/mixin/cerebras.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/mixin/deepseek.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/mixin/google.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/mixin/groq.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/settings.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/chat.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/collect/__init__.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/collect/dynamic.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/collect/pipeline.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/collect/stats.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/components.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/constraints.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/context.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/core.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/core_ext.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/endpoints/__init__py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/endpoints/api.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/exceptions.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/.DS_Store +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/__init__.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/api_builder.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/arxiv_pdf_parser.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/bibtex_parser.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/conversation.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/document.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/file_merger.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/graph.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/html_style_template.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/__init__.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/blip_2.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/clip.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/console.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/dall_e.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/file.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/flux.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/gpt_image.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/input.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/llava.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/naive_scrape.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/naive_vectordb.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/ocr.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/openai_search.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/parallel.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/perplexity.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/pinecone.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/python.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/serpapi.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/terminal.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/tts.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/whisper.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/interfaces/wolframalpha.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/metrics/__init__.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/metrics/similarity.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/os_command.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/packages/__init__.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/packages/symdev.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/packages/sympkg.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/packages/symrun.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/repo_cloner.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/seo_query_optimizer.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/solver.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/summarizer.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/taypan_interpreter.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/extended/vectordb.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/formatter/__init__.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/formatter/emoji.pytxt +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/formatter/formatter.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/formatter/regex.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/functional.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/imports.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/interfaces.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/memory.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/menu/__init__.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/menu/screen.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/misc/__init__.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/misc/console.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/misc/loader.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/models/__init__.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/models/base.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/models/errors.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/ops/__init__.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/ops/measures.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/ops/primitives.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/post_processors.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/pre_processors.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/processor.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/prompts.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/server/__init__.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/server/huggingface_server.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/server/llama_cpp_server.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/server/qdrant_server.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/shell.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/shellsv.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/strategy.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/symbol.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/symsh.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symai/utils.py +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symbolicai.egg-info/dependency_links.txt +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symbolicai.egg-info/entry_points.txt +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symbolicai.egg-info/requires.txt +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/symbolicai.egg-info/top_level.txt +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/tests/README.md +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/tests/data/audio.mp3 +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/tests/data/pg1727.txt +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/trusted_repos.yml +0 -0
- {symbolicai-1.2.0 → symbolicai-1.3.0}/uv.lock +0 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Repository Guidelines
|
|
2
|
+
|
|
3
|
+
Guidance for coding agents and contributors.
|
|
4
|
+
|
|
5
|
+
## Architecture Overview
|
|
6
|
+
SymbolicAI is a neuro-symbolic Python framework. `Symbol`/`Expression` route work to pluggable engines (LLMs, search,
|
|
7
|
+
scrape, vector DBs) configured via `symai.config.json`.
|
|
8
|
+
|
|
9
|
+
### Key Components
|
|
10
|
+
- `symai/symbol.py` — `Symbol` primitive (syntactic vs semantic view).
|
|
11
|
+
- `symai/strategy.py` — contract system (`@contract`) and validation/retry flow.
|
|
12
|
+
- `symai/backend/engines/` — provider implementations (`neurosymbolic/`, `search/`, `scrape/`, `index/`, …).
|
|
13
|
+
- `symai/extended/interfaces/` — higher-level interfaces that select/compose engines.
|
|
14
|
+
- `symai/endpoints/`, `symai/server/` — FastAPI endpoints and optional local servers.
|
|
15
|
+
|
|
16
|
+
## Project Structure
|
|
17
|
+
- `symai/` — library source (import path `symai`).
|
|
18
|
+
- `tests/` — pytest suite.
|
|
19
|
+
- `docs/` — documentation sources; `examples/` — runnable examples.
|
|
20
|
+
- `assets/`, `public/` — static files; `scripts/` — dev utilities (not public API).
|
|
21
|
+
|
|
22
|
+
## Setup, Lint, and Tests
|
|
23
|
+
Environment (Python 3.10+), using `uv`:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
uv sync --python 3.10
|
|
27
|
+
source .venv/bin/activate
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Extras / locked installs:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
uv sync --frozen
|
|
34
|
+
uv sync --extra scrape # or: --extra all
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Lint/format (Ruff; `ruff.toml`):
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
ruff check symai --config ruff.toml
|
|
41
|
+
ruff format symai
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Tests:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
pytest
|
|
48
|
+
pytest -m mandatory
|
|
49
|
+
pytest -q --tb=no tests/test_imports.py
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
CLI entrypoints (after install): `symchat`, `symsh`, `symconfig`, `symserver`.
|
|
53
|
+
|
|
54
|
+
## Configuration & Secrets
|
|
55
|
+
- Config precedence: `./symai.config.json`, `{venv}/.symai/symai.config.json`, then `~/.symai/symai.config.json`.
|
|
56
|
+
- Common keys: `NEUROSYMBOLIC_ENGINE_MODEL`, `NEUROSYMBOLIC_ENGINE_API_KEY`, `SYMAI_WARNINGS=0`, `SUPPORT_COMMUNITY`.
|
|
57
|
+
- Inspect active config with `symconfig`.
|
|
58
|
+
- Never commit API keys, tokens, or generated artifacts (`dist/`, caches, logs).
|
|
59
|
+
|
|
60
|
+
## Style Notes
|
|
61
|
+
- 4-space indentation, 100-char lines, double quotes (`ruff.toml`).
|
|
62
|
+
- Prefer clear names (`snake_case` functions/modules, `CapWords` classes, `UPPER_SNAKE_CASE` constants).
|
|
63
|
+
|
|
64
|
+
## Agent Workflow Rules (Project-Specific)
|
|
65
|
+
- Ask for clarification instead of guessing on ambiguous behavior or invariants.
|
|
66
|
+
- Treat type hints as contracts; do not add runtime type checks except at trust boundaries (CLI/env, JSON/network, disk).
|
|
67
|
+
- Prefer minimal diffs; edit existing code over adding new files unless necessary.
|
|
68
|
+
- Do not add/modify `tests/` or run tests unless explicitly requested; if requested, run the narrowest relevant `pytest` command.
|
|
69
|
+
- When you change Python files: run `ruff check <changed_files> --output-format concise --config ruff.toml` and fix issues.
|
|
70
|
+
- Keep search local-first (`rg`); follow imports instead of repo-wide “random scanning”.
|
|
71
|
+
- If adding a regex, include a short comment explaining what it matches.
|
|
72
|
+
- Update `TODO.md` when tasks are completed, added, or re-scoped.
|
|
73
|
+
|
|
74
|
+
## Commit & PR Notes
|
|
75
|
+
- Commit messages commonly use `(<type>) <summary>`: `(feat)`, `(fix)`, `(chore)`, `(feature)`.
|
|
76
|
+
- PRs: describe intent + user impact, link issues, note config/env var changes, and include validation commands + results.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: symbolicai
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.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
|
{symbolicai-1.2.0 → symbolicai-1.3.0}/symai/backend/engines/neurosymbolic/engine_openai_responses.py
RENAMED
|
@@ -115,8 +115,10 @@ class OpenAIResponsesEngine(Engine, OpenAIMixin):
|
|
|
115
115
|
|
|
116
116
|
def _is_reasoning_model(self) -> bool:
|
|
117
117
|
return self.model in SUPPORTED_REASONING_MODELS or self.model in {
|
|
118
|
+
"gpt-5.2-chat-latest",
|
|
118
119
|
"gpt-5.1-chat-latest",
|
|
119
120
|
"gpt-5-pro",
|
|
121
|
+
"gpt-5.2-pro",
|
|
120
122
|
"o3-pro",
|
|
121
123
|
}
|
|
122
124
|
|
|
@@ -319,7 +321,7 @@ class OpenAIResponsesEngine(Engine, OpenAIMixin):
|
|
|
319
321
|
payload["top_p"] = kwargs["top_p"]
|
|
320
322
|
|
|
321
323
|
if self._is_reasoning_model():
|
|
322
|
-
if self.model
|
|
324
|
+
if self.model in {"gpt-5-pro", "gpt-5.2-pro"}:
|
|
323
325
|
reasoning = {"effort": "high"}
|
|
324
326
|
else:
|
|
325
327
|
reasoning = kwargs.get("reasoning", {"effort": "medium"})
|
|
@@ -74,7 +74,8 @@ class SearchResult(Result):
|
|
|
74
74
|
self._citations: list[Citation] = []
|
|
75
75
|
try:
|
|
76
76
|
results = self._coerce_results(value)
|
|
77
|
-
|
|
77
|
+
task_meta = self._extract_task_metadata(value)
|
|
78
|
+
text, citations = self._build_text_and_citations(results, task_meta=task_meta)
|
|
78
79
|
self._value = text
|
|
79
80
|
self._citations = citations
|
|
80
81
|
except Exception as e:
|
|
@@ -87,13 +88,26 @@ class SearchResult(Result):
|
|
|
87
88
|
results = raw.get("results", []) if isinstance(raw, dict) else getattr(raw, "results", None)
|
|
88
89
|
if not results:
|
|
89
90
|
return []
|
|
90
|
-
coerced
|
|
91
|
+
coerced = []
|
|
91
92
|
for item in results:
|
|
92
93
|
if item is None:
|
|
93
94
|
continue
|
|
94
95
|
coerced.append(_item_to_mapping(item))
|
|
95
96
|
return coerced
|
|
96
97
|
|
|
98
|
+
def _extract_task_metadata(self, raw: Any) -> dict[str, Any] | None:
|
|
99
|
+
if not isinstance(raw, dict):
|
|
100
|
+
return None
|
|
101
|
+
task_output = raw.get("task_output")
|
|
102
|
+
if task_output is None:
|
|
103
|
+
return None
|
|
104
|
+
output_value = task_output.get("output") if isinstance(task_output, dict) else None
|
|
105
|
+
return {
|
|
106
|
+
"reasoning": raw.get("task_reasoning"),
|
|
107
|
+
"answer": output_value,
|
|
108
|
+
"confidence": raw.get("task_confidence"),
|
|
109
|
+
}
|
|
110
|
+
|
|
97
111
|
def _normalize_url(self, url: str) -> str:
|
|
98
112
|
parts = urlsplit(url)
|
|
99
113
|
scheme = parts.scheme.lower() if parts.scheme else "https"
|
|
@@ -139,11 +153,40 @@ class SearchResult(Result):
|
|
|
139
153
|
cleaned = re.sub(r"\n{3,}", "\n\n", cleaned)
|
|
140
154
|
return cleaned.strip()
|
|
141
155
|
|
|
142
|
-
def _build_text_and_citations(
|
|
143
|
-
|
|
144
|
-
|
|
156
|
+
def _build_text_and_citations(
|
|
157
|
+
self, results: list[dict[str, Any]], *, task_meta: dict[str, Any] | None = None
|
|
158
|
+
):
|
|
159
|
+
pieces = []
|
|
160
|
+
citations = []
|
|
145
161
|
cursor = 0
|
|
146
|
-
|
|
162
|
+
|
|
163
|
+
if task_meta:
|
|
164
|
+
reasoning = task_meta.get("reasoning")
|
|
165
|
+
answer = task_meta.get("answer")
|
|
166
|
+
confidence = task_meta.get("confidence")
|
|
167
|
+
|
|
168
|
+
if reasoning:
|
|
169
|
+
block = f"<reasoning>\n{reasoning}\n</reasoning>"
|
|
170
|
+
pieces.append(block)
|
|
171
|
+
cursor += len(block)
|
|
172
|
+
|
|
173
|
+
if answer:
|
|
174
|
+
if pieces:
|
|
175
|
+
pieces.append("\n\n")
|
|
176
|
+
cursor += 2
|
|
177
|
+
block = f"<answer>\n{answer}\n</answer>"
|
|
178
|
+
pieces.append(block)
|
|
179
|
+
cursor += len(block)
|
|
180
|
+
|
|
181
|
+
if confidence:
|
|
182
|
+
if pieces:
|
|
183
|
+
pieces.append("\n\n")
|
|
184
|
+
cursor += 2
|
|
185
|
+
block = f"<answer_confidence>\n{confidence}\n</answer_confidence>"
|
|
186
|
+
pieces.append(block)
|
|
187
|
+
cursor += len(block)
|
|
188
|
+
|
|
189
|
+
seen_urls = set()
|
|
147
190
|
cid = 1
|
|
148
191
|
separator = "\n\n---\n\n"
|
|
149
192
|
|
|
@@ -158,13 +201,8 @@ class SearchResult(Result):
|
|
|
158
201
|
|
|
159
202
|
title = str(item.get("title") or "") or urlsplit(normalized_url).netloc
|
|
160
203
|
excerpts = item.get("excerpts") or []
|
|
161
|
-
excerpt_parts
|
|
162
|
-
for
|
|
163
|
-
if not isinstance(ex, str):
|
|
164
|
-
continue
|
|
165
|
-
sanitized = self._sanitize_excerpt(ex)
|
|
166
|
-
if sanitized:
|
|
167
|
-
excerpt_parts.append(sanitized)
|
|
204
|
+
excerpt_parts = [self._sanitize_excerpt(ex) for ex in excerpts]
|
|
205
|
+
excerpt_parts = [p for p in excerpt_parts if p]
|
|
168
206
|
if not excerpt_parts:
|
|
169
207
|
continue
|
|
170
208
|
|
|
@@ -255,16 +293,14 @@ class ExtractResult(Result):
|
|
|
255
293
|
super().__init__(value, **kwargs)
|
|
256
294
|
try:
|
|
257
295
|
results = self._coerce_results(value)
|
|
258
|
-
content_parts
|
|
296
|
+
content_parts = []
|
|
259
297
|
for r in results:
|
|
260
|
-
excerpts = r.get("excerpts") or []
|
|
261
298
|
full = r.get("full_content")
|
|
262
|
-
if
|
|
299
|
+
if full is not None:
|
|
263
300
|
content_parts.append(full)
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
content_parts.extend([s for s in excerpts if isinstance(s, str)])
|
|
301
|
+
else:
|
|
302
|
+
excerpts = r.get("excerpts") or []
|
|
303
|
+
content_parts.extend(excerpts)
|
|
268
304
|
self._value = "\n\n".join(content_parts)
|
|
269
305
|
except Exception as e:
|
|
270
306
|
self._value = None
|
|
@@ -276,7 +312,7 @@ class ExtractResult(Result):
|
|
|
276
312
|
results = raw.get("results", []) if isinstance(raw, dict) else getattr(raw, "results", None)
|
|
277
313
|
if not results:
|
|
278
314
|
return []
|
|
279
|
-
coerced
|
|
315
|
+
coerced = []
|
|
280
316
|
for item in results:
|
|
281
317
|
if item is None:
|
|
282
318
|
continue
|
|
@@ -344,8 +380,8 @@ class ParallelEngine(Engine):
|
|
|
344
380
|
def _normalize_include_domains(self, domains: list[str] | None) -> list[str]:
|
|
345
381
|
if not isinstance(domains, list):
|
|
346
382
|
return []
|
|
347
|
-
seen
|
|
348
|
-
out
|
|
383
|
+
seen = set()
|
|
384
|
+
out = []
|
|
349
385
|
for d in domains:
|
|
350
386
|
netloc = self._extract_netloc(d)
|
|
351
387
|
if not netloc or netloc in seen:
|
|
@@ -361,8 +397,8 @@ class ParallelEngine(Engine):
|
|
|
361
397
|
def _normalize_exclude_domains(self, domains: list[str] | None) -> list[str]:
|
|
362
398
|
if not isinstance(domains, list):
|
|
363
399
|
return []
|
|
364
|
-
seen
|
|
365
|
-
out
|
|
400
|
+
seen = set()
|
|
401
|
+
out = []
|
|
366
402
|
for d in domains:
|
|
367
403
|
netloc = self._extract_netloc(d)
|
|
368
404
|
if not netloc or netloc in seen:
|
|
@@ -382,7 +418,7 @@ class ParallelEngine(Engine):
|
|
|
382
418
|
text = value.strip()
|
|
383
419
|
return [text] if text else []
|
|
384
420
|
if isinstance(value, list):
|
|
385
|
-
cleaned
|
|
421
|
+
cleaned = []
|
|
386
422
|
for item in value:
|
|
387
423
|
if item is None:
|
|
388
424
|
continue
|
|
@@ -429,7 +465,7 @@ class ParallelEngine(Engine):
|
|
|
429
465
|
excerpts = {"max_chars_per_result": max_chars_per_result}
|
|
430
466
|
include = self._normalize_include_domains(kwargs.get("allowed_domains"))
|
|
431
467
|
exclude = self._normalize_exclude_domains(kwargs.get("excluded_domains"))
|
|
432
|
-
source_policy
|
|
468
|
+
source_policy = None
|
|
433
469
|
if include or exclude:
|
|
434
470
|
source_policy = {}
|
|
435
471
|
if include:
|
|
@@ -457,7 +493,7 @@ class ParallelEngine(Engine):
|
|
|
457
493
|
|
|
458
494
|
include = self._normalize_include_domains(kwargs.get("allowed_domains"))
|
|
459
495
|
exclude = self._normalize_exclude_domains(kwargs.get("excluded_domains"))
|
|
460
|
-
source_policy
|
|
496
|
+
source_policy = None
|
|
461
497
|
if include or exclude:
|
|
462
498
|
source_policy = {}
|
|
463
499
|
if include:
|
|
@@ -542,7 +578,7 @@ class ParallelEngine(Engine):
|
|
|
542
578
|
source_policy: dict[str, Any] | None,
|
|
543
579
|
task_spec: Any,
|
|
544
580
|
):
|
|
545
|
-
task_kwargs
|
|
581
|
+
task_kwargs = {
|
|
546
582
|
"input": task_input,
|
|
547
583
|
"processor": processor,
|
|
548
584
|
}
|
|
@@ -559,7 +595,7 @@ class ParallelEngine(Engine):
|
|
|
559
595
|
UserMessage(f"Failed to create Parallel task: {e}", raise_with=ValueError)
|
|
560
596
|
|
|
561
597
|
def _fetch_task_result(self, run_id: str, *, timeout: Any, api_timeout: int | None):
|
|
562
|
-
result_kwargs
|
|
598
|
+
result_kwargs = {}
|
|
563
599
|
if api_timeout is not None:
|
|
564
600
|
result_kwargs["api_timeout"] = api_timeout
|
|
565
601
|
if timeout is not None:
|
|
@@ -570,36 +606,40 @@ class ParallelEngine(Engine):
|
|
|
570
606
|
UserMessage(f"Failed to fetch Parallel task result: {e}", raise_with=ValueError)
|
|
571
607
|
|
|
572
608
|
def _task_result_to_search_payload(self, task_result: Any) -> dict[str, Any]:
|
|
573
|
-
payload
|
|
574
|
-
output =
|
|
609
|
+
payload = {"results": []}
|
|
610
|
+
output = task_result.output
|
|
575
611
|
if output is None:
|
|
576
612
|
return payload
|
|
577
613
|
|
|
578
|
-
basis_items =
|
|
614
|
+
basis_items = output.basis or []
|
|
579
615
|
for idx, basis in enumerate(basis_items):
|
|
580
616
|
payload["results"].extend(self._basis_to_results(basis, basis_index=idx))
|
|
581
617
|
|
|
582
618
|
if not payload["results"]:
|
|
583
619
|
payload["results"].append(self._task_fallback_result(output, basis_items))
|
|
584
620
|
|
|
585
|
-
payload["task_output"] =
|
|
586
|
-
payload["task_output_type"] =
|
|
621
|
+
payload["task_output"] = output.content
|
|
622
|
+
payload["task_output_type"] = output.type
|
|
623
|
+
|
|
624
|
+
if basis_items:
|
|
625
|
+
first_basis = basis_items[0]
|
|
626
|
+
payload["task_reasoning"] = first_basis.reasoning
|
|
627
|
+
payload["task_confidence"] = first_basis.confidence
|
|
628
|
+
|
|
587
629
|
return payload
|
|
588
630
|
|
|
589
631
|
def _basis_to_results(self, basis: Any, *, basis_index: int) -> list[dict[str, Any]]:
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
raw_field = getattr(basis, "field", "") or ""
|
|
593
|
-
field_title = raw_field if isinstance(raw_field, str) else str(raw_field)
|
|
632
|
+
reasoning = basis.reasoning or ""
|
|
633
|
+
field_title = basis.field or ""
|
|
594
634
|
if not field_title.strip():
|
|
595
635
|
field_title = "Parallel Task Output"
|
|
596
|
-
citations =
|
|
636
|
+
citations = basis.citations or []
|
|
597
637
|
if not citations:
|
|
598
638
|
if not reasoning:
|
|
599
639
|
return []
|
|
600
640
|
citations = [None]
|
|
601
641
|
|
|
602
|
-
results
|
|
642
|
+
results = []
|
|
603
643
|
# Convert field titles to lowercase slugs by swapping non-alphanumerics for hyphens.
|
|
604
644
|
slug = re.sub(r"[^a-z0-9]+", "-", field_title.lower()).strip("-") or "field"
|
|
605
645
|
basis_url = f"parallel://task-output/{basis_index:04d}-{slug}"
|
|
@@ -609,10 +649,9 @@ class ParallelEngine(Engine):
|
|
|
609
649
|
title = field_title
|
|
610
650
|
excerpts = [reasoning]
|
|
611
651
|
else:
|
|
612
|
-
url = str(
|
|
613
|
-
title = str(
|
|
614
|
-
|
|
615
|
-
excerpts = [snippet for snippet in raw_excerpts if isinstance(snippet, str)]
|
|
652
|
+
url = str(citation.url or "")
|
|
653
|
+
title = str(citation.title or field_title)
|
|
654
|
+
excerpts = citation.excerpts or []
|
|
616
655
|
if not excerpts and reasoning:
|
|
617
656
|
excerpts = [reasoning]
|
|
618
657
|
results.append(
|
|
@@ -625,7 +664,7 @@ class ParallelEngine(Engine):
|
|
|
625
664
|
return results
|
|
626
665
|
|
|
627
666
|
def _task_fallback_result(self, output: Any, basis_items: list[Any]) -> dict[str, Any]:
|
|
628
|
-
content =
|
|
667
|
+
content = output.content
|
|
629
668
|
if isinstance(content, str):
|
|
630
669
|
snippet = content
|
|
631
670
|
elif isinstance(content, (dict, list)):
|
|
@@ -633,9 +672,9 @@ class ParallelEngine(Engine):
|
|
|
633
672
|
else:
|
|
634
673
|
snippet = str(content or "")
|
|
635
674
|
if not snippet:
|
|
636
|
-
extra_reasoning
|
|
675
|
+
extra_reasoning = []
|
|
637
676
|
for basis in basis_items:
|
|
638
|
-
raw_value =
|
|
677
|
+
raw_value = basis.reasoning or ""
|
|
639
678
|
if isinstance(raw_value, str):
|
|
640
679
|
extra_reasoning.append(raw_value)
|
|
641
680
|
else:
|
|
@@ -665,13 +704,13 @@ class ParallelEngine(Engine):
|
|
|
665
704
|
def forward(self, argument):
|
|
666
705
|
kwargs = argument.kwargs
|
|
667
706
|
# Route based on presence of URL vs Query
|
|
668
|
-
url =
|
|
707
|
+
url = argument.prop.url or kwargs.get("url")
|
|
669
708
|
if url:
|
|
670
709
|
return self._extract(str(url), kwargs)
|
|
671
710
|
|
|
672
|
-
raw_query =
|
|
711
|
+
raw_query = argument.prop.prepared_input
|
|
673
712
|
if raw_query is None:
|
|
674
|
-
raw_query =
|
|
713
|
+
raw_query = argument.prop.query
|
|
675
714
|
search_queries = self._coerce_search_queries(raw_query)
|
|
676
715
|
if not search_queries:
|
|
677
716
|
UserMessage(
|
|
@@ -685,11 +724,11 @@ class ParallelEngine(Engine):
|
|
|
685
724
|
|
|
686
725
|
def prepare(self, argument):
|
|
687
726
|
# For scraping: store URL directly. For search: pass through query string.
|
|
688
|
-
url = argument.kwargs.get("url") or
|
|
727
|
+
url = argument.kwargs.get("url") or argument.prop.url
|
|
689
728
|
if url:
|
|
690
729
|
argument.prop.prepared_input = str(url)
|
|
691
730
|
return
|
|
692
|
-
query =
|
|
731
|
+
query = argument.prop.query
|
|
693
732
|
if isinstance(query, list):
|
|
694
733
|
argument.prop.prepared_input = self._coerce_search_queries(query)
|
|
695
734
|
return
|
|
@@ -22,6 +22,7 @@ SUPPORTED_CHAT_MODELS = [
|
|
|
22
22
|
"gpt-4.1-nano",
|
|
23
23
|
"gpt-5-chat-latest",
|
|
24
24
|
"gpt-5.1-chat-latest",
|
|
25
|
+
"gpt-5.2-chat-latest",
|
|
25
26
|
]
|
|
26
27
|
SUPPORTED_REASONING_MODELS = [
|
|
27
28
|
"o3-mini",
|
|
@@ -30,6 +31,7 @@ SUPPORTED_REASONING_MODELS = [
|
|
|
30
31
|
"o3",
|
|
31
32
|
"gpt-5",
|
|
32
33
|
"gpt-5.1",
|
|
34
|
+
"gpt-5.2",
|
|
33
35
|
"gpt-5-mini",
|
|
34
36
|
"gpt-5-nano",
|
|
35
37
|
]
|
|
@@ -40,7 +42,7 @@ SUPPORTED_EMBEDDING_MODELS = [
|
|
|
40
42
|
]
|
|
41
43
|
SUPPORTED_RESPONSES_MODELS = [
|
|
42
44
|
f"responses:{m}" for m in SUPPORTED_CHAT_MODELS + SUPPORTED_REASONING_MODELS
|
|
43
|
-
] + ["responses:gpt-5-pro", "responses:o3-pro"]
|
|
45
|
+
] + ["responses:gpt-5-pro", "responses:o3-pro", "responses:gpt-5.2-pro"]
|
|
44
46
|
|
|
45
47
|
|
|
46
48
|
class OpenAIMixin:
|
|
@@ -86,6 +88,7 @@ class OpenAIMixin:
|
|
|
86
88
|
or self.model == "gpt-4o-2024-11-20"
|
|
87
89
|
or self.model == "gpt-4o-mini"
|
|
88
90
|
or self.model == "chatgpt-4o-latest"
|
|
91
|
+
or self.model == "gpt-5.2-chat-latest"
|
|
89
92
|
):
|
|
90
93
|
return 128_000
|
|
91
94
|
if (
|
|
@@ -101,9 +104,11 @@ class OpenAIMixin:
|
|
|
101
104
|
if (
|
|
102
105
|
self.model == "gpt-5"
|
|
103
106
|
or self.model == "gpt-5.1"
|
|
107
|
+
or self.model == "gpt-5.2"
|
|
104
108
|
or self.model == "gpt-5-mini"
|
|
105
109
|
or self.model == "gpt-5-nano"
|
|
106
110
|
or self.model == "gpt-5-pro"
|
|
111
|
+
or self.model == "gpt-5.2-pro"
|
|
107
112
|
):
|
|
108
113
|
return 400_000
|
|
109
114
|
if self.model == "gpt-4.1" or self.model == "gpt-4.1-mini" or self.model == "gpt-4.1-nano":
|
|
@@ -135,6 +140,7 @@ class OpenAIMixin:
|
|
|
135
140
|
or self.model == "chatgpt-4o-latest"
|
|
136
141
|
or self.model == "gpt-5-chat-latest"
|
|
137
142
|
or self.model == "gpt-5.1-chat-latest"
|
|
143
|
+
or self.model == "gpt-5.2-chat-latest"
|
|
138
144
|
):
|
|
139
145
|
return 16_384
|
|
140
146
|
if self.model == "gpt-4.1" or self.model == "gpt-4.1-mini" or self.model == "gpt-4.1-nano":
|
|
@@ -150,8 +156,10 @@ class OpenAIMixin:
|
|
|
150
156
|
if (
|
|
151
157
|
self.model == "gpt-5"
|
|
152
158
|
or self.model == "gpt-5.1"
|
|
159
|
+
or self.model == "gpt-5.2"
|
|
153
160
|
or self.model == "gpt-5-mini"
|
|
154
161
|
or self.model == "gpt-5-nano"
|
|
162
|
+
or self.model == "gpt-5.2-pro"
|
|
155
163
|
):
|
|
156
164
|
return 128_000
|
|
157
165
|
if self.model == "gpt-5-pro":
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: symbolicai
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|