symbolicai 0.17.4__tar.gz → 0.17.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {symbolicai-0.17.4 → symbolicai-0.17.6}/PKG-INFO +1 -1
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/__init__.py +1 -1
- symbolicai-0.17.6/symai/backend/engines/search/engine_openai.py +238 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/models/base.py +58 -18
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symbolicai.egg-info/PKG-INFO +1 -1
- symbolicai-0.17.4/symai/backend/engines/search/engine_openai.py +0 -154
- {symbolicai-0.17.4 → symbolicai-0.17.6}/.gitbook.yaml +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/.github/FUNDING.yml +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/.gitignore +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/.symai/symsh.config.json +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/CITATION.cff +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/Dockerfile +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/MANIFEST.in +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/README.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/app.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/banner.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/cat.jpg +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/cat.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/contract_flow.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/img1.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/img10.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/img2.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/img3.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/img4.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/img5.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/img6.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/img7.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/img8.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/img9.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/preview.gif +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/screen1.jpeg +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/symai_logo.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/symsh.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/vid1.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/vid2.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/vid3.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/vid4.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/vid5.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/images/vid6.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/results/news.html +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/results/news.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/assets/results/news_prev.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/bin/install.ps1 +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/bin/install.sh +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/build.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docker-compose.yml +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/ENGINES/clip_engine.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/ENGINES/custom_engine.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/ENGINES/drawing_engine.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/ENGINES/file_engine.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/ENGINES/indexing_engine.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/ENGINES/local_engine.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/ENGINES/neurosymbolic_engine.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/ENGINES/ocr_engine.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/ENGINES/search_engine.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/ENGINES/speech_to_text_engine.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/ENGINES/symbolic_engine.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/ENGINES/webscraping_engine.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/FEATURES/contracts.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/FEATURES/error_handling.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/FEATURES/expressions.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/FEATURES/import.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/FEATURES/operations.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/FEATURES/primitives.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/INSTALLATION.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/INTRODUCTION.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/LICENSE +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/QUICKSTART.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/SUMMARY.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/TOOLS/chatbot.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/TOOLS/packages.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/TOOLS/shell.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/TUTORIALS/chatbot.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/TUTORIALS/context.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/TUTORIALS/data_query.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/docs/source/TUTORIALS/video_tutorials.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/environment.yml +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/examples/contracts.ipynb +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/examples/primitives.ipynb +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/icon_converter.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/installer.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/Basics.ipynb +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/ChatBot.ipynb +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/Conversation.ipynb +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/Indexer.ipynb +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/News.ipynb +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/Queries.ipynb +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/TTS_Persona.ipynb +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/Lean engine.png +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/a_star.txt +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/abstract.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/audio.mp3 +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/dbpedia_samples.jsonl +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/dbpedia_samples_prepared_train.jsonl +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/dbpedia_samples_prepared_valid.jsonl +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/demo.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/demo_strategy.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/docs.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/einsteins_puzzle.txt +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/file.json +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/lean.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/news.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/paper.pdf +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/paper.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/legacy/notebooks/examples/sql.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/public/eai.svg +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/pyproject.toml +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/pytest.ini +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/setup.cfg +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/setup.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/TERMS_OF_SERVICE.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/base.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/driver/webclient.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/drawing/engine_bfl.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/drawing/engine_gpt_image.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/embedding/engine_llama_cpp.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/embedding/engine_openai.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/embedding/engine_plugin_embeddings.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/execute/engine_python.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/files/engine_io.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/imagecaptioning/engine_blip2.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/imagecaptioning/engine_llavacpp_client.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/index/engine_pinecone.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/index/engine_vectordb.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/lean/engine_lean4.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/neurosymbolic/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/neurosymbolic/engine_anthropic_claudeX_chat.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/neurosymbolic/engine_anthropic_claudeX_reasoning.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/neurosymbolic/engine_deepseekX_reasoning.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/neurosymbolic/engine_google_geminiX_reasoning.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/neurosymbolic/engine_groq.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/neurosymbolic/engine_huggingface.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/neurosymbolic/engine_llama_cpp.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/neurosymbolic/engine_openai_gptX_chat.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/neurosymbolic/engine_openai_gptX_reasoning.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/ocr/engine_apilayer.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/output/engine_stdout.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/search/engine_perplexity.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/search/engine_serpapi.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/speech_to_text/engine_local_whisper.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/symbolic/engine_wolframalpha.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/text_to_speech/engine_openai.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/text_vision/engine_clip.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/userinput/engine_console.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/engines/webscraping/engine_requests.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/mixin/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/mixin/anthropic.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/mixin/deepseek.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/mixin/google.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/mixin/openai.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/backend/settings.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/chat.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/collect/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/collect/dynamic.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/collect/pipeline.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/collect/stats.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/components.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/constraints.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/core.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/core_ext.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/endpoints/__init__py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/endpoints/api.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/exceptions.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/api_builder.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/arxiv_pdf_parser.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/bibtex_parser.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/conversation.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/document.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/file_merger.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/graph.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/html_style_template.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/blip_2.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/clip.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/console.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/dall_e.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/file.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/flux.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/gpt_image.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/input.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/llava.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/naive_vectordb.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/naive_webscraping.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/ocr.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/openai_search.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/perplexity.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/pinecone.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/python.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/serpapi.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/terminal.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/tts.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/whisper.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/interfaces/wolframalpha.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/metrics/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/metrics/similarity.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/os_command.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/packages/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/packages/symdev.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/packages/sympkg.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/packages/symrun.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/personas/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/personas/builder.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/personas/dialogue.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/personas/persona.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/personas/research/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/personas/research/yann_lecun.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/personas/sales/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/personas/sales/erik_james.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/personas/student/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/personas/student/max_tenner.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/repo_cloner.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/seo_query_optimizer.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/solver.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/strategies/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/strategies/cot.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/summarizer.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/taypan_interpreter.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/extended/vectordb.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/formatter/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/formatter/emoji.pytxt +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/formatter/formatter.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/formatter/regex.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/functional.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/imports.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/interfaces.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/memory.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/menu/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/menu/screen.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/misc/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/misc/console.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/misc/loader.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/models/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/models/errors.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/ops/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/ops/measures.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/ops/primitives.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/post_processors.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/pre_processors.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/processor.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/prompts.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/server/__init__.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/server/huggingface_server.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/server/llama_cpp_server.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/shell.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/shellsv.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/strategy.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/symbol.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/symsh.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symai/utils.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symbolicai.egg-info/SOURCES.txt +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symbolicai.egg-info/dependency_links.txt +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symbolicai.egg-info/entry_points.txt +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symbolicai.egg-info/requires.txt +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/symbolicai.egg-info/top_level.txt +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/tests/README.md +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/tests/data/audio.mp3 +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/tests/data/pg1727.txt +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/tests/engines/search/openai_engine.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/tests/engines/search/perplexity_engine.py +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/trusted_repos.yml +0 -0
- {symbolicai-0.17.4 → symbolicai-0.17.6}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: symbolicai
|
|
3
|
-
Version: 0.17.
|
|
3
|
+
Version: 0.17.6
|
|
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
|
Project-URL: Homepage, https://extensity.ai
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import hashlib
|
|
2
|
+
import json
|
|
3
|
+
import logging
|
|
4
|
+
import re
|
|
5
|
+
from copy import deepcopy
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from urllib.parse import parse_qsl, urlencode, urlsplit, urlunsplit
|
|
8
|
+
|
|
9
|
+
from openai import OpenAI
|
|
10
|
+
|
|
11
|
+
from ....symbol import Result
|
|
12
|
+
from ....utils import CustomUserWarning
|
|
13
|
+
from ...base import Engine
|
|
14
|
+
from ...mixin import OPENAI_CHAT_MODELS, OPENAI_REASONING_MODELS
|
|
15
|
+
from ...settings import SYMAI_CONFIG
|
|
16
|
+
|
|
17
|
+
logging.getLogger("requests").setLevel(logging.ERROR)
|
|
18
|
+
logging.getLogger("urllib3").setLevel(logging.ERROR)
|
|
19
|
+
logging.getLogger("httpx").setLevel(logging.ERROR)
|
|
20
|
+
logging.getLogger("httpcore").setLevel(logging.ERROR)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
TRACKING_KEYS = {
|
|
24
|
+
"utm_source" # so far I've only seen this one
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@dataclass
|
|
28
|
+
class Citation:
|
|
29
|
+
id: str
|
|
30
|
+
title: str
|
|
31
|
+
url: str
|
|
32
|
+
start: int
|
|
33
|
+
end: int
|
|
34
|
+
|
|
35
|
+
def __hash__(self):
|
|
36
|
+
return hash((self.url, ))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class SearchResult(Result):
|
|
40
|
+
def __init__(self, value, **kwargs) -> None:
|
|
41
|
+
super().__init__(value, **kwargs)
|
|
42
|
+
if value.get('error'):
|
|
43
|
+
CustomUserWarning(value['error'], raise_with=ValueError)
|
|
44
|
+
try:
|
|
45
|
+
text, annotations = self._extract_text_and_annotations(value)
|
|
46
|
+
if text is None:
|
|
47
|
+
self._value = None
|
|
48
|
+
self._citations = []
|
|
49
|
+
return
|
|
50
|
+
replaced_text, ordered = self._replace_links_with_citations(text, annotations, id_mode="sequential")
|
|
51
|
+
self._value = replaced_text
|
|
52
|
+
self._citations = [
|
|
53
|
+
Citation(id=cid, title=title, url=url, start=0, end=0)
|
|
54
|
+
for cid, title, url in ordered
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
except Exception as e:
|
|
58
|
+
self._value = None
|
|
59
|
+
CustomUserWarning(f"Failed to parse response: {e}", raise_with=ValueError)
|
|
60
|
+
|
|
61
|
+
def _extract_text(self, value) -> str | None:
|
|
62
|
+
text = None
|
|
63
|
+
for output in value.get('output', []):
|
|
64
|
+
if output.get('type') == 'message' and output.get('content'):
|
|
65
|
+
content0 = output['content'][0]
|
|
66
|
+
if 'text' in content0 and content0['text']:
|
|
67
|
+
text = content0['text']
|
|
68
|
+
return text
|
|
69
|
+
|
|
70
|
+
def _extract_text_and_annotations(self, value):
|
|
71
|
+
text = None
|
|
72
|
+
annotations = []
|
|
73
|
+
for output in value.get('output', []):
|
|
74
|
+
if output.get('type') != 'message' or not output.get('content'):
|
|
75
|
+
continue
|
|
76
|
+
for content in output.get('content', []) or []:
|
|
77
|
+
if 'text' in content and content['text']:
|
|
78
|
+
text = content['text']
|
|
79
|
+
anns = content.get('annotations', []) or []
|
|
80
|
+
for ann in anns:
|
|
81
|
+
if ann.get('type') == 'url_citation':
|
|
82
|
+
annotations.append(ann)
|
|
83
|
+
return text, annotations
|
|
84
|
+
|
|
85
|
+
def _normalize_url(self, u: str) -> str:
|
|
86
|
+
parts = urlsplit(u)
|
|
87
|
+
scheme = parts.scheme.lower()
|
|
88
|
+
netloc = parts.netloc.lower()
|
|
89
|
+
path = parts.path.rstrip('/') or '/'
|
|
90
|
+
q = []
|
|
91
|
+
for k, v in parse_qsl(parts.query, keep_blank_values=True):
|
|
92
|
+
kl = k.lower()
|
|
93
|
+
if kl in TRACKING_KEYS or kl.startswith('utm_'):
|
|
94
|
+
continue
|
|
95
|
+
q.append((k, v))
|
|
96
|
+
query = urlencode(q, doseq=True)
|
|
97
|
+
fragment = ''
|
|
98
|
+
return urlunsplit((scheme, netloc, path, query, fragment))
|
|
99
|
+
|
|
100
|
+
def _make_title_map(self, annotations):
|
|
101
|
+
m = {}
|
|
102
|
+
for a in annotations or []:
|
|
103
|
+
url = a.get('url')
|
|
104
|
+
if not url:
|
|
105
|
+
continue
|
|
106
|
+
nu = self._normalize_url(url)
|
|
107
|
+
title = (a.get('title') or '').strip()
|
|
108
|
+
if nu not in m and title:
|
|
109
|
+
m[nu] = title
|
|
110
|
+
return m
|
|
111
|
+
|
|
112
|
+
def _hostname(self, u: str) -> str:
|
|
113
|
+
return urlsplit(u).netloc
|
|
114
|
+
|
|
115
|
+
def _short_hash_id(self, nu: str, length=6) -> str:
|
|
116
|
+
return hashlib.sha1(nu.encode('utf-8')).hexdigest()[:length]
|
|
117
|
+
|
|
118
|
+
def _replace_links_with_citations(self, text: str, annotations, id_mode: str = 'sequential'):
|
|
119
|
+
title_map = self._make_title_map(annotations)
|
|
120
|
+
id_map = {}
|
|
121
|
+
ordered = [] # list of ("[n]", title, normalized_url)
|
|
122
|
+
next_id = 1
|
|
123
|
+
|
|
124
|
+
pattern = re.compile(r"\[([^\]]*?)\]\((https?://[^\s)]+)\)")
|
|
125
|
+
|
|
126
|
+
def _get_id(nu: str) -> str:
|
|
127
|
+
nonlocal next_id
|
|
128
|
+
if id_mode == 'hash':
|
|
129
|
+
return self._short_hash_id(nu)
|
|
130
|
+
if nu not in id_map:
|
|
131
|
+
id_map[nu] = str(next_id)
|
|
132
|
+
t = title_map.get(nu) or self._hostname(nu)
|
|
133
|
+
ordered.append((f"[{id_map[nu]}]", t, nu))
|
|
134
|
+
next_id += 1
|
|
135
|
+
return id_map[nu]
|
|
136
|
+
|
|
137
|
+
def _repl(m):
|
|
138
|
+
link_text, url = m.group(1), m.group(2)
|
|
139
|
+
nu = self._normalize_url(url)
|
|
140
|
+
cid = _get_id(nu)
|
|
141
|
+
title = title_map.get(nu)
|
|
142
|
+
if not title:
|
|
143
|
+
lt = (link_text or '').strip()
|
|
144
|
+
title = lt if (' ' in lt) else self._hostname(nu)
|
|
145
|
+
return f"[{cid}] ({title})"
|
|
146
|
+
|
|
147
|
+
replaced = pattern.sub(_repl, text)
|
|
148
|
+
return replaced, ordered
|
|
149
|
+
|
|
150
|
+
def __str__(self) -> str:
|
|
151
|
+
try:
|
|
152
|
+
return json.dumps(self.raw, indent=2)
|
|
153
|
+
except TypeError:
|
|
154
|
+
return str(self.raw)
|
|
155
|
+
|
|
156
|
+
def _repr_html_(self) -> str:
|
|
157
|
+
try:
|
|
158
|
+
return f"<pre>{json.dumps(self.raw, indent=2)}</pre>"
|
|
159
|
+
except Exception as e:
|
|
160
|
+
return f"<pre>{str(self.raw)}</pre>"
|
|
161
|
+
|
|
162
|
+
def get_citations(self) -> list[Citation]:
|
|
163
|
+
return self._citations
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
class GPTXSearchEngine(Engine):
|
|
167
|
+
def __init__(self, api_key: str | None = None, model: str | None = None):
|
|
168
|
+
super().__init__()
|
|
169
|
+
self.config = deepcopy(SYMAI_CONFIG)
|
|
170
|
+
if api_key is not None and model is not None:
|
|
171
|
+
self.config['SEARCH_ENGINE_API_KEY'] = api_key
|
|
172
|
+
self.config['SEARCH_ENGINE_MODEL'] = model
|
|
173
|
+
self.api_key = self.config.get('SEARCH_ENGINE_API_KEY')
|
|
174
|
+
self.model = self.config.get('SEARCH_ENGINE_MODEL', 'gpt-4.1') # Default to gpt-4.1 as per docs
|
|
175
|
+
self.name = self.__class__.__name__
|
|
176
|
+
try:
|
|
177
|
+
self.client = OpenAI(api_key=self.api_key)
|
|
178
|
+
except Exception as e:
|
|
179
|
+
CustomUserWarning(f"Failed to initialize OpenAI client: {e}", raise_with=ValueError)
|
|
180
|
+
|
|
181
|
+
def id(self) -> str:
|
|
182
|
+
if self.config.get('SEARCH_ENGINE_API_KEY') and \
|
|
183
|
+
self.config.get('SEARCH_ENGINE_MODEL') in OPENAI_CHAT_MODELS + OPENAI_REASONING_MODELS:
|
|
184
|
+
return 'search'
|
|
185
|
+
return super().id() # default to unregistered
|
|
186
|
+
|
|
187
|
+
def command(self, *args, **kwargs):
|
|
188
|
+
super().command(*args, **kwargs)
|
|
189
|
+
if 'SEARCH_ENGINE_API_KEY' in kwargs:
|
|
190
|
+
self.api_key = kwargs['SEARCH_ENGINE_API_KEY']
|
|
191
|
+
if 'SEARCH_ENGINE_MODEL' in kwargs:
|
|
192
|
+
self.model = kwargs['SEARCH_ENGINE_MODEL']
|
|
193
|
+
|
|
194
|
+
def forward(self, argument):
|
|
195
|
+
messages = argument.prop.prepared_input
|
|
196
|
+
kwargs = argument.kwargs
|
|
197
|
+
|
|
198
|
+
tool_definition = {"type": "web_search_preview"}
|
|
199
|
+
user_location = kwargs.get('user_location')
|
|
200
|
+
if user_location:
|
|
201
|
+
tool_definition['user_location'] = user_location
|
|
202
|
+
search_context_size = kwargs.get('search_context_size')
|
|
203
|
+
if search_context_size:
|
|
204
|
+
tool_definition['search_context_size'] = search_context_size
|
|
205
|
+
|
|
206
|
+
self.model = kwargs.get('model', self.model) # Important for MetadataTracker to work correctly
|
|
207
|
+
payload = {
|
|
208
|
+
"model": self.model,
|
|
209
|
+
"input": messages,
|
|
210
|
+
"tools": [tool_definition],
|
|
211
|
+
"tool_choice": {"type": "web_search_preview"} if self.model not in OPENAI_REASONING_MODELS else "auto" # force the use of web search tool for non-reasoning models
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
try:
|
|
215
|
+
res = self.client.responses.create(**payload)
|
|
216
|
+
res = SearchResult(res.dict())
|
|
217
|
+
except Exception as e:
|
|
218
|
+
CustomUserWarning(f"Failed to make request: {e}", raise_with=ValueError)
|
|
219
|
+
|
|
220
|
+
metadata = {"raw_output": res.raw}
|
|
221
|
+
output = [res]
|
|
222
|
+
|
|
223
|
+
return output, metadata
|
|
224
|
+
|
|
225
|
+
def prepare(self, argument):
|
|
226
|
+
system_message = "You are a helpful AI assistant. Be precise and informative." if argument.kwargs.get('system_message') is None else argument.kwargs.get('system_message')
|
|
227
|
+
|
|
228
|
+
res = [
|
|
229
|
+
{
|
|
230
|
+
"role": "system",
|
|
231
|
+
"content": system_message
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"role": "user",
|
|
235
|
+
"content": f"{argument.prop.query}"
|
|
236
|
+
}
|
|
237
|
+
]
|
|
238
|
+
argument.prop.prepared_input = res
|
|
@@ -74,8 +74,6 @@ class LLMDataModel(BaseModel):
|
|
|
74
74
|
origin = get_origin(field_type)
|
|
75
75
|
return origin in (list, set, frozenset, tuple, dict) or field_type in (list, set, frozenset, tuple, dict)
|
|
76
76
|
|
|
77
|
-
|
|
78
|
-
|
|
79
77
|
@staticmethod
|
|
80
78
|
def _is_const_field(field_info) -> bool:
|
|
81
79
|
"""Check if a field is a const field."""
|
|
@@ -94,8 +92,6 @@ class LLMDataModel(BaseModel):
|
|
|
94
92
|
"""Check if a field has a default value."""
|
|
95
93
|
return field_info.default != ... and field_info.default != PydanticUndefined
|
|
96
94
|
|
|
97
|
-
|
|
98
|
-
|
|
99
95
|
def format_field(self, key: str, value: Any, indent: int = 0, visited: set = None, depth: int = 0) -> str:
|
|
100
96
|
"""Formats a field value for string representation, handling nested structures."""
|
|
101
97
|
visited = visited or set()
|
|
@@ -247,7 +243,7 @@ class LLMDataModel(BaseModel):
|
|
|
247
243
|
definitions = cls._extract_schema_definitions(schema)
|
|
248
244
|
|
|
249
245
|
main_schema = cls._format_schema_fields(properties, schema, definitions, 0)
|
|
250
|
-
definitions_schema = cls._format_schema_definitions(definitions)
|
|
246
|
+
definitions_schema = cls._format_schema_definitions(definitions, schema)
|
|
251
247
|
|
|
252
248
|
return cls._compose_schema_output(main_schema, definitions_schema)
|
|
253
249
|
|
|
@@ -458,11 +454,65 @@ class LLMDataModel(BaseModel):
|
|
|
458
454
|
return f"nested object ({ref_name})"
|
|
459
455
|
|
|
460
456
|
@classmethod
|
|
461
|
-
def _format_schema_definitions(cls, definitions: dict) -> str:
|
|
462
|
-
"""Format schema definitions using descriptions
|
|
457
|
+
def _format_schema_definitions(cls, definitions: dict, root_schema: dict | None = None) -> str:
|
|
458
|
+
"""Format schema definitions using descriptions and examples; omit redundant types.
|
|
459
|
+
|
|
460
|
+
Also includes the root model's fields (from root_schema) so their descriptions/examples
|
|
461
|
+
are visible, not just $defs.
|
|
462
|
+
"""
|
|
463
463
|
lines = []
|
|
464
464
|
visited_defs = set()
|
|
465
465
|
|
|
466
|
+
def _format_definition_properties(props: dict) -> list[str]:
|
|
467
|
+
"""Render property lines using only Field(description=...), with const/excerpts.
|
|
468
|
+
|
|
469
|
+
Always lists properties; if description is missing, emit a generic guidance message.
|
|
470
|
+
"""
|
|
471
|
+
out: list[str] = []
|
|
472
|
+
def _fmt_example_value(val):
|
|
473
|
+
if isinstance(val, str):
|
|
474
|
+
return val
|
|
475
|
+
try:
|
|
476
|
+
return json.dumps(val, ensure_ascii=False)
|
|
477
|
+
except Exception:
|
|
478
|
+
return str(val)
|
|
479
|
+
for prop_name, prop_schema in props.items():
|
|
480
|
+
if prop_name == "section_header":
|
|
481
|
+
continue
|
|
482
|
+
desc = prop_schema.get("description")
|
|
483
|
+
const_note = ""
|
|
484
|
+
if "const_value" in prop_schema:
|
|
485
|
+
const_note = f' (const value: "{prop_schema["const_value"]}")'
|
|
486
|
+
if not desc:
|
|
487
|
+
out.append(
|
|
488
|
+
f' - "{prop_name}": '
|
|
489
|
+
'No definition provided. Focus on the [[Schema]] and the prompt to infer '
|
|
490
|
+
'the expected structure and constraints.'
|
|
491
|
+
)
|
|
492
|
+
else:
|
|
493
|
+
out.append(f' - "{prop_name}": {desc}{const_note}')
|
|
494
|
+
|
|
495
|
+
examples = prop_schema.get("examples")
|
|
496
|
+
if examples is None and "example" in prop_schema:
|
|
497
|
+
examples = prop_schema.get("example")
|
|
498
|
+
|
|
499
|
+
if isinstance(examples, (list, tuple)):
|
|
500
|
+
if len(examples) > 0:
|
|
501
|
+
out.append(" - Examples:")
|
|
502
|
+
for ex in examples:
|
|
503
|
+
out.append(f" - {_fmt_example_value(ex)}")
|
|
504
|
+
elif examples is not None:
|
|
505
|
+
out.append(f" - Example: {_fmt_example_value(examples)}")
|
|
506
|
+
return out
|
|
507
|
+
|
|
508
|
+
# Include root model's fields in Definitions (for descriptions/examples)
|
|
509
|
+
if root_schema and isinstance(root_schema, dict):
|
|
510
|
+
root_title = root_schema.get("title", "Root")
|
|
511
|
+
root_props = cls._extract_schema_properties(root_schema)
|
|
512
|
+
if root_props:
|
|
513
|
+
lines.append(f"- {root_title}:")
|
|
514
|
+
lines.extend(_format_definition_properties(root_props))
|
|
515
|
+
|
|
466
516
|
for name, definition in definitions.items():
|
|
467
517
|
if name in visited_defs:
|
|
468
518
|
continue
|
|
@@ -475,17 +525,7 @@ class LLMDataModel(BaseModel):
|
|
|
475
525
|
continue
|
|
476
526
|
|
|
477
527
|
props = definition.get("properties", {})
|
|
478
|
-
|
|
479
|
-
if prop_name == "section_header":
|
|
480
|
-
continue
|
|
481
|
-
desc = prop_schema.get("description") or prop_schema.get("title")
|
|
482
|
-
if "const_value" in prop_schema:
|
|
483
|
-
const_value = prop_schema["const_value"]
|
|
484
|
-
const_note = f' (const value: "{const_value}")'
|
|
485
|
-
else:
|
|
486
|
-
const_note = ""
|
|
487
|
-
if desc:
|
|
488
|
-
lines.append(f' - "{prop_name}": {desc}{const_note}')
|
|
528
|
+
lines.extend(_format_definition_properties(props))
|
|
489
529
|
|
|
490
530
|
return "\n".join(lines)
|
|
491
531
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: symbolicai
|
|
3
|
-
Version: 0.17.
|
|
3
|
+
Version: 0.17.6
|
|
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
|
Project-URL: Homepage, https://extensity.ai
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
import logging
|
|
3
|
-
import requests
|
|
4
|
-
from copy import deepcopy
|
|
5
|
-
from dataclasses import dataclass
|
|
6
|
-
|
|
7
|
-
from ....symbol import Result
|
|
8
|
-
from ....utils import CustomUserWarning
|
|
9
|
-
from ...base import Engine
|
|
10
|
-
from ...settings import SYMAI_CONFIG
|
|
11
|
-
from ...mixin import OPENAI_CHAT_MODELS, OPENAI_REASONING_MODELS
|
|
12
|
-
|
|
13
|
-
logging.getLogger("requests").setLevel(logging.ERROR)
|
|
14
|
-
logging.getLogger("urllib3").setLevel(logging.ERROR)
|
|
15
|
-
logging.getLogger("httpx").setLevel(logging.ERROR)
|
|
16
|
-
logging.getLogger("httpcore").setLevel(logging.ERROR)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
@dataclass
|
|
20
|
-
class Citation:
|
|
21
|
-
id: str
|
|
22
|
-
title: str
|
|
23
|
-
url: str
|
|
24
|
-
start: int
|
|
25
|
-
end: int
|
|
26
|
-
|
|
27
|
-
def __hash__(self):
|
|
28
|
-
return hash((self.url, ))
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
class SearchResult(Result):
|
|
32
|
-
def __init__(self, value, **kwargs) -> None:
|
|
33
|
-
super().__init__(value, **kwargs)
|
|
34
|
-
if value.get('error'):
|
|
35
|
-
CustomUserWarning(value['error'], raise_with=ValueError)
|
|
36
|
-
try:
|
|
37
|
-
for output in value.get('output', []):
|
|
38
|
-
if output.get('type') == 'message' and output.get('content'):
|
|
39
|
-
annotations = output['content'][0].get('annotations', [])
|
|
40
|
-
citations = []
|
|
41
|
-
for n, annotation in enumerate(annotations):
|
|
42
|
-
if annotation.get('type') == 'url_citation':
|
|
43
|
-
citation = Citation(
|
|
44
|
-
id=f'[{n + 1}]',
|
|
45
|
-
start=annotation.get('start_index'),
|
|
46
|
-
end=annotation.get('end_index'),
|
|
47
|
-
title=annotation.get('title', ''),
|
|
48
|
-
url=annotation.get('url', ''),
|
|
49
|
-
)
|
|
50
|
-
if citation not in citations:
|
|
51
|
-
citations.append(citation)
|
|
52
|
-
self._value = output['content'][0]['text']
|
|
53
|
-
delta = 0
|
|
54
|
-
for citation in citations:
|
|
55
|
-
self._value = self._value[:citation.start - delta] + citation.id + self._value[citation.end - delta:]
|
|
56
|
-
delta += (citation.end - citation.start) - len(citation.id)
|
|
57
|
-
self._citations = citations
|
|
58
|
-
|
|
59
|
-
except Exception as e:
|
|
60
|
-
self._value = None
|
|
61
|
-
CustomUserWarning(f"Failed to parse response: {e}", raise_with=ValueError)
|
|
62
|
-
|
|
63
|
-
def __str__(self) -> str:
|
|
64
|
-
try:
|
|
65
|
-
return json.dumps(self.raw, indent=2)
|
|
66
|
-
except TypeError:
|
|
67
|
-
return str(self.raw)
|
|
68
|
-
|
|
69
|
-
def _repr_html_(self) -> str:
|
|
70
|
-
try:
|
|
71
|
-
return f"<pre>{json.dumps(self.raw, indent=2)}</pre>"
|
|
72
|
-
except Exception as e:
|
|
73
|
-
return f"<pre>{str(self.raw)}</pre>"
|
|
74
|
-
|
|
75
|
-
def get_citations(self) -> list[Citation]:
|
|
76
|
-
return self._citations
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
class GPTXSearchEngine(Engine):
|
|
80
|
-
def __init__(self, api_key: str | None = None, model: str | None = None):
|
|
81
|
-
super().__init__()
|
|
82
|
-
self.config = deepcopy(SYMAI_CONFIG)
|
|
83
|
-
if api_key is not None and model is not None:
|
|
84
|
-
self.config['SEARCH_ENGINE_API_KEY'] = api_key
|
|
85
|
-
self.config['SEARCH_ENGINE_MODEL'] = model
|
|
86
|
-
self.api_key = self.config.get('SEARCH_ENGINE_API_KEY')
|
|
87
|
-
self.model = self.config.get('SEARCH_ENGINE_MODEL', 'gpt-4.1') # Default to gpt-4.1 as per docs
|
|
88
|
-
self.name = self.__class__.__name__
|
|
89
|
-
|
|
90
|
-
def id(self) -> str:
|
|
91
|
-
if self.config.get('SEARCH_ENGINE_API_KEY') and \
|
|
92
|
-
self.config.get('SEARCH_ENGINE_MODEL') in OPENAI_CHAT_MODELS + OPENAI_REASONING_MODELS:
|
|
93
|
-
return 'search'
|
|
94
|
-
return super().id() # default to unregistered
|
|
95
|
-
|
|
96
|
-
def command(self, *args, **kwargs):
|
|
97
|
-
super().command(*args, **kwargs)
|
|
98
|
-
if 'SEARCH_ENGINE_API_KEY' in kwargs:
|
|
99
|
-
self.api_key = kwargs['SEARCH_ENGINE_API_KEY']
|
|
100
|
-
if 'SEARCH_ENGINE_MODEL' in kwargs:
|
|
101
|
-
self.model = kwargs['SEARCH_ENGINE_MODEL']
|
|
102
|
-
|
|
103
|
-
def forward(self, argument):
|
|
104
|
-
messages = argument.prop.prepared_input
|
|
105
|
-
kwargs = argument.kwargs
|
|
106
|
-
|
|
107
|
-
tool_definition = {"type": "web_search_preview"}
|
|
108
|
-
user_location = kwargs.get('user_location')
|
|
109
|
-
if user_location:
|
|
110
|
-
tool_definition['user_location'] = user_location
|
|
111
|
-
search_context_size = kwargs.get('search_context_size')
|
|
112
|
-
if search_context_size:
|
|
113
|
-
tool_definition['search_context_size'] = search_context_size
|
|
114
|
-
|
|
115
|
-
self.model = kwargs.get('model', self.model) # Important for MetadataTracker to work correctly
|
|
116
|
-
payload = {
|
|
117
|
-
"model": self.model,
|
|
118
|
-
"input": messages,
|
|
119
|
-
"tools": [tool_definition],
|
|
120
|
-
"tool_choice": {"type": "web_search_preview"} # force the use of web search tool
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
headers = {
|
|
124
|
-
"Authorization": f"Bearer {self.api_key}",
|
|
125
|
-
"Content-Type": "application/json",
|
|
126
|
-
"OpenAI-Beta": "assistants=v1" # Required for some beta features, might be useful
|
|
127
|
-
}
|
|
128
|
-
api_url = "https://api.openai.com/v1/responses"
|
|
129
|
-
|
|
130
|
-
try:
|
|
131
|
-
res = requests.post(api_url, json=payload, headers=headers)
|
|
132
|
-
res = SearchResult(res.json())
|
|
133
|
-
except Exception as e:
|
|
134
|
-
CustomUserWarning(f"Failed to make request: {e}", raise_with=ValueError)
|
|
135
|
-
|
|
136
|
-
metadata = {"raw_output": res.raw}
|
|
137
|
-
output = [res]
|
|
138
|
-
|
|
139
|
-
return output, metadata
|
|
140
|
-
|
|
141
|
-
def prepare(self, argument):
|
|
142
|
-
system_message = "You are a helpful AI assistant. Be precise and informative." if argument.kwargs.get('system_message') is None else argument.kwargs.get('system_message')
|
|
143
|
-
|
|
144
|
-
res = [
|
|
145
|
-
{
|
|
146
|
-
"role": "system",
|
|
147
|
-
"content": system_message
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
"role": "user",
|
|
151
|
-
"content": f"{argument.prop.query}"
|
|
152
|
-
}
|
|
153
|
-
]
|
|
154
|
-
argument.prop.prepared_input = res
|
|
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
|