versionhq 1.2.4.13__tar.gz → 1.2.4.15__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.
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/.gitignore +2 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/PKG-INFO +2 -1
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/pyproject.toml +2 -1
- versionhq-1.2.4.15/requirements_tool.txt +4 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/__init__.py +3 -3
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/_prompt/model.py +27 -26
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/_utils/__init__.py +1 -0
- versionhq-1.2.4.15/src/versionhq/_utils/handle_directory.py +15 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/agent/model.py +11 -10
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/llm/llm_vars.py +13 -3
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/llm/model.py +50 -18
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/task/model.py +1 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/tool/gpt/_enum.py +1 -1
- versionhq-1.2.4.15/src/versionhq/tool/gpt/cua.py +449 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq.egg-info/PKG-INFO +2 -1
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq.egg-info/SOURCES.txt +3 -1
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq.egg-info/requires.txt +1 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/llm/llm_connection_test.py +2 -2
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/llm/llm_test.py +2 -2
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/task/task_test.py +9 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/tool/gpt_test.py +13 -19
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/uv.lock +388 -279
- versionhq-1.2.4.13/src/versionhq/tool/gpt/cua.py +0 -295
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/.env.sample +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/.github/workflows/deploy_docs.yml +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/.github/workflows/publish.yml +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/.github/workflows/publish_testpypi.yml +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/.github/workflows/run_tests.yml +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/.github/workflows/security_check.yml +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/.pre-commit-config.yaml +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/.python-version +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/LICENSE +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/README.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/SECURITY.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/db/preprocess.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/CNAME +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/_logos/favicon.ico +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/_logos/logo192.png +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/agent/config.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/agent/index.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/agent/task-handling.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/agent-network/config.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/agent-network/form.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/agent-network/index.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/agent-network/ref.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/knowledge.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/llm/index.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/memory.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/rag-tool.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/task/evaluation.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/task/index.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/task/reference.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/task/response-field.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/task/task-execution.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/task/task-output.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/task/task-strc-response.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/task-graph/index.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/core/tool.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/index.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/quickstart.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/stylesheets/main.css +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/docs/tags.md +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/mkdocs.yml +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/requirements.txt +0 -0
- /versionhq-1.2.4.13/requirements-dev.txt → /versionhq-1.2.4.15/requirements_dev.txt +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/runtime.txt +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/setup.cfg +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/_prompt/auto_feedback.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/_prompt/constants.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/_utils/convert_img_url.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/_utils/i18n.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/_utils/is_valid_enum.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/_utils/is_valid_url.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/_utils/llm_as_a_judge.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/_utils/logger.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/_utils/process_config.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/_utils/usage_metrics.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/_utils/vars.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/agent/TEMPLATES/Backstory.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/agent/TEMPLATES/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/agent/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/agent/inhouse_agents.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/agent/parser.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/agent/rpm_controller.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/agent_network/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/agent_network/formation.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/agent_network/model.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/cli/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/clients/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/clients/customer/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/clients/customer/model.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/clients/product/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/clients/product/model.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/clients/workflow/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/clients/workflow/model.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/knowledge/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/knowledge/_utils.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/knowledge/embedding.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/knowledge/model.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/knowledge/source.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/knowledge/source_docling.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/knowledge/storage.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/llm/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/memory/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/memory/contextual_memory.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/memory/model.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/storage/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/storage/base.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/storage/ltm_sqlite_storage.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/storage/mem0_storage.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/storage/rag_storage.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/storage/task_output_storage.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/storage/utils.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/task/TEMPLATES/Description.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/task/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/task/evaluation.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/task/formatter.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/task/structured_response.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/task_graph/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/task_graph/colors.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/task_graph/draft.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/task_graph/model.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/tool/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/tool/cache_handler.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/tool/composio/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/tool/composio/model.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/tool/composio/params.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/tool/decorator.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/tool/gpt/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/tool/gpt/file_search.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/tool/gpt/web_search.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/tool/model.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/tool/rag_tool.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq/tool/tool_handler.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq.egg-info/dependency_links.txt +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/src/versionhq.egg-info/top_level.txt +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/_prompt/auto_feedback_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/_prompt/prompt_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/_sample/sample.csv +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/_sample/sample.json +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/_sample/sample.mp3 +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/_sample/screenshot.png +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/agent/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/agent/agent_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/agent/doc_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/agent_network/Prompts/Demo_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/agent_network/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/agent_network/agent_network_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/agent_network/doc_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/cli/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/clients/customer_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/clients/product_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/clients/workflow_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/conftest.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/doc_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/formation_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/knowledge/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/knowledge/knowledge_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/knowledge/mock_report_compressed.pdf +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/llm/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/memory/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/memory/memory_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/task/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/task/doc_eval_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/task/doc_taskoutput_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/task/doc_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/task/eval_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/task_graph/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/task_graph/doc_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/task_graph/task_graph_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/tool/__init__.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/tool/composio_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/tool/doc_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/tool/rag_tool_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/tool/tool_test.py +0 -0
- {versionhq-1.2.4.13 → versionhq-1.2.4.15}/tests/usecase_test.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: versionhq
|
3
|
-
Version: 1.2.4.
|
3
|
+
Version: 1.2.4.15
|
4
4
|
Summary: Autonomous agent networks for task automation with multi-step reasoning.
|
5
5
|
Author-email: Kuriko Iwai <kuriko@versi0n.io>
|
6
6
|
License: MIT License
|
@@ -77,6 +77,7 @@ Provides-Extra: tools
|
|
77
77
|
Requires-Dist: html2text>=2024.2.26; extra == "tools"
|
78
78
|
Requires-Dist: sec-api>=1.0.28; extra == "tools"
|
79
79
|
Requires-Dist: pytest-playwright>=0.7.0; extra == "tools"
|
80
|
+
Requires-Dist: selenium>=4.30.0; extra == "tools"
|
80
81
|
Provides-Extra: torch
|
81
82
|
Requires-Dist: torch>=2.6.0; extra == "torch"
|
82
83
|
Requires-Dist: torchvision>=0.21.0; extra == "torch"
|
@@ -15,7 +15,7 @@ exclude = ["test*", "__pycache__", "*.egg-info"]
|
|
15
15
|
|
16
16
|
[project]
|
17
17
|
name = "versionhq"
|
18
|
-
version = "1.2.4.
|
18
|
+
version = "1.2.4.15"
|
19
19
|
authors = [{ name = "Kuriko Iwai", email = "kuriko@versi0n.io" }]
|
20
20
|
description = "Autonomous agent networks for task automation with multi-step reasoning."
|
21
21
|
readme = "README.md"
|
@@ -82,6 +82,7 @@ tools = [
|
|
82
82
|
"html2text>=2024.2.26",
|
83
83
|
"sec-api>=1.0.28",
|
84
84
|
"pytest-playwright>=0.7.0",
|
85
|
+
"selenium>=4.30.0",
|
85
86
|
]
|
86
87
|
torch = [
|
87
88
|
"torch>=2.6.0",
|
@@ -10,7 +10,7 @@ load_dotenv(override=True)
|
|
10
10
|
from versionhq.agent.model import Agent
|
11
11
|
from versionhq.agent_network.model import AgentNetwork, Formation, Member, TaskHandlingProcess
|
12
12
|
from versionhq.llm.model import LLM
|
13
|
-
from versionhq.llm.llm_vars import LLM_CONTEXT_WINDOW_SIZES, MODEL_PARAMS, PROVIDERS,
|
13
|
+
from versionhq.llm.llm_vars import LLM_CONTEXT_WINDOW_SIZES, MODEL_PARAMS, PROVIDERS, MODELS
|
14
14
|
from versionhq.clients.customer.model import Customer
|
15
15
|
from versionhq.clients.product.model import Product, ProductProvider
|
16
16
|
from versionhq.clients.workflow.model import MessagingWorkflow, MessagingComponent
|
@@ -35,7 +35,7 @@ from versionhq.agent_network.formation import form_agent_network
|
|
35
35
|
from versionhq.task_graph.draft import workflow
|
36
36
|
|
37
37
|
|
38
|
-
__version__ = "1.2.4.
|
38
|
+
__version__ = "1.2.4.15"
|
39
39
|
__all__ = [
|
40
40
|
"Agent",
|
41
41
|
|
@@ -48,7 +48,7 @@ __all__ = [
|
|
48
48
|
"LLM_CONTEXT_WINDOW_SIZES",
|
49
49
|
"MODEL_PARAMS",
|
50
50
|
"PROVIDERS",
|
51
|
-
"
|
51
|
+
"MODELS",
|
52
52
|
|
53
53
|
"Customer",
|
54
54
|
"Product",
|
@@ -14,7 +14,6 @@ class Prompt:
|
|
14
14
|
agent: Any = None
|
15
15
|
context: Any = None
|
16
16
|
|
17
|
-
|
18
17
|
def __init__(self, task, agent, context):
|
19
18
|
from versionhq.agent.model import Agent
|
20
19
|
from versionhq.task.model import Task
|
@@ -32,22 +31,24 @@ class Prompt:
|
|
32
31
|
output_prompt = ""
|
33
32
|
output_formats_to_follow = dict()
|
34
33
|
|
35
|
-
if self.task.
|
36
|
-
if
|
37
|
-
|
38
|
-
|
39
|
-
|
34
|
+
if self.task.is_multimodal == False:
|
35
|
+
if self.task.response_schema:
|
36
|
+
if isinstance(self.task.response_schema, list):
|
37
|
+
for item in self.task.response_schema:
|
38
|
+
if isinstance(item, ResponseField):
|
39
|
+
output_formats_to_follow[item.title] = f"<Return your answer in {item.data_type.__name__}>"
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
elif issubclass(self.task.response_schema, BaseModel):
|
42
|
+
for k, v in self.task.response_schema.model_fields.items():
|
43
|
+
output_formats_to_follow[k] = f"<Return your answer in {v.annotation}>"
|
44
44
|
|
45
|
-
|
46
|
-
Ref. Output image: {output_formats_to_follow}
|
47
|
-
|
48
|
-
|
49
|
-
output_prompt = "You MUST return your response as a valid JSON serializable string, enclosed in double quotes. Use double quotes for all keys and string values. Do NOT use single quotes, trailing commas, or other non-standard JSON syntax."
|
45
|
+
output_prompt = f"""Your response MUST be a valid JSON string that strictly follows the response format. Use double quotes for all keys and string values. Do not use single quotes, trailing commas, or any other non-standard JSON syntax.
|
46
|
+
Ref. Output image: {output_formats_to_follow}"""
|
47
|
+
else:
|
48
|
+
output_prompt = "You MUST return your response as a valid JSON serializable string, enclosed in double quotes. Use double quotes for all keys and string values. Do NOT use single quotes, trailing commas, or other non-standard JSON syntax."
|
50
49
|
|
50
|
+
else:
|
51
|
+
output_prompt = "Return your response in concise manner."
|
51
52
|
return dedent(output_prompt)
|
52
53
|
|
53
54
|
|
@@ -98,19 +99,20 @@ Ref. Output image: {output_formats_to_follow}
|
|
98
99
|
|
99
100
|
content_messages = {}
|
100
101
|
|
101
|
-
if self.task.
|
102
|
-
|
103
|
-
|
104
|
-
|
102
|
+
if self.task.is_multimodal == False:
|
103
|
+
if self.task.image:
|
104
|
+
img_url = convert_img_url(self.task.image)
|
105
|
+
if img_url:
|
106
|
+
content_messages.update({ "type": "image_url", "image_url": { "url": img_url }})
|
105
107
|
|
106
|
-
|
107
|
-
|
108
|
-
|
108
|
+
if self.task.file:
|
109
|
+
if is_valid_url(self.task.file):
|
110
|
+
content_messages.update({ "type": "image_url", "image_url": self.file })
|
109
111
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
112
|
+
if self.task.audio and self.agent.llm.provider == "gemini":
|
113
|
+
audio_bytes = Path(self.task.audio).read_bytes()
|
114
|
+
encoded_data = base64.b64encode(audio_bytes).decode("utf-8")
|
115
|
+
content_messages.update({ "type": "image_url", "image_url": "data:audio/mp3;base64,{}".format(encoded_data)})
|
114
116
|
|
115
117
|
return content_messages
|
116
118
|
|
@@ -188,7 +190,6 @@ Ref. Output image: {output_formats_to_follow}
|
|
188
190
|
# else:
|
189
191
|
# user_prompt = self.agent._use_trained_data(user_prompt=user_prompt)
|
190
192
|
|
191
|
-
|
192
193
|
content_prompt = self._format_content_prompt()
|
193
194
|
|
194
195
|
messages = []
|
@@ -5,3 +5,4 @@ from versionhq._utils.is_valid_url import is_valid_url
|
|
5
5
|
from versionhq._utils.usage_metrics import UsageMetrics, ErrorType
|
6
6
|
from versionhq._utils.convert_img_url import convert_img_url
|
7
7
|
from versionhq._utils.is_valid_enum import is_valid_enum
|
8
|
+
from versionhq._utils.handle_directory import handle_directory
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import os
|
2
|
+
import datetime
|
3
|
+
from pathlib import Path
|
4
|
+
|
5
|
+
|
6
|
+
def handle_directory(directory_name: str = None, filename: str = None, ext: str = 'png') -> Path:
|
7
|
+
"""Creates and returns the absolute file path"""
|
8
|
+
|
9
|
+
os.makedirs(directory_name, exist_ok=True)
|
10
|
+
|
11
|
+
date = str(datetime.datetime.now().strftime('%j'))
|
12
|
+
cwd = Path.cwd()
|
13
|
+
DIRECTORY = cwd / f'{directory_name}/{filename}_{date}.{ext}'
|
14
|
+
|
15
|
+
return DIRECTORY
|
@@ -356,12 +356,9 @@ class Agent(BaseModel):
|
|
356
356
|
response_format: Optional[Dict[str, Any]] = None,
|
357
357
|
tools: Optional[List[InstanceOf[Tool]| InstanceOf[ToolSet] | Type[Tool]]] = None,
|
358
358
|
tool_res_as_final: bool = False,
|
359
|
+
file: str = None, # absolute path to the content file (for multimodal use)
|
359
360
|
) -> Tuple[str, UsageMetrics]:
|
360
|
-
"""
|
361
|
-
Create formatted prompts using the developer prompt and the agent's backstory, then call the base model.
|
362
|
-
- Execute the task up to `self.max_retry_limit` times in case of receiving an error or empty response.
|
363
|
-
- Pass the task_tools to the model to let them execute.
|
364
|
-
"""
|
361
|
+
"""Calls LLM."""
|
365
362
|
|
366
363
|
task_execution_counter = 0
|
367
364
|
iterations = 0
|
@@ -375,10 +372,10 @@ class Agent(BaseModel):
|
|
375
372
|
Logger(**self._logger_config, filename=self.key).log(level="info", message=f"Messages sent to the model: {messages}", color="blue")
|
376
373
|
|
377
374
|
if tool_res_as_final:
|
378
|
-
raw_response = self.func_calling_llm.call(messages=messages, tools=tools, tool_res_as_final=True)
|
375
|
+
raw_response = self.func_calling_llm.call(messages=messages, tools=tools, tool_res_as_final=True, file=file)
|
379
376
|
usage.record_token_usage(*self.func_calling_llm._usages)
|
380
377
|
else:
|
381
|
-
raw_response = self.llm.call(messages=messages, response_format=response_format, tools=tools)
|
378
|
+
raw_response = self.llm.call(messages=messages, response_format=response_format, tools=tools, file=file)
|
382
379
|
usage.record_token_usage(*self.llm._usages)
|
383
380
|
|
384
381
|
task_execution_counter += 1
|
@@ -454,14 +451,14 @@ class Agent(BaseModel):
|
|
454
451
|
return rag_tools, gpt_tools, tools
|
455
452
|
|
456
453
|
|
457
|
-
def _handle_gpt_tools(self, gpt_tools: list[Any] = None) -> Any: # TaskOutput
|
454
|
+
def _handle_gpt_tools(self, gpt_tools: list[Any] = None) -> Any: # TaskOutput or None
|
458
455
|
"""Generates k, v pairs from multiple GPT tool results and stores them in TaskOutput class."""
|
459
456
|
|
460
457
|
from versionhq.task.model import TaskOutput
|
461
458
|
from versionhq._utils import UsageMetrics
|
462
459
|
|
463
460
|
if not gpt_tools:
|
464
|
-
return
|
461
|
+
return None
|
465
462
|
|
466
463
|
tool_res = dict()
|
467
464
|
annotation_set = dict()
|
@@ -470,7 +467,9 @@ class Agent(BaseModel):
|
|
470
467
|
for i, item in enumerate(gpt_tools):
|
471
468
|
raw, annotations, usage = item.run()
|
472
469
|
tool_res.update({ str(i): raw })
|
473
|
-
|
470
|
+
|
471
|
+
if annotations:
|
472
|
+
annotation_set.update({ str(i): annotations })
|
474
473
|
total_usage.aggregate(metrics=usage)
|
475
474
|
|
476
475
|
res = TaskOutput(raw=str(tool_res), tool_output=tool_res, usage=total_usage, annotations=annotation_set)
|
@@ -580,6 +579,7 @@ class Agent(BaseModel):
|
|
580
579
|
raw_response = ""
|
581
580
|
user_prompt, dev_prompt = "", ""
|
582
581
|
usage = UsageMetrics(id=task.id)
|
582
|
+
file = task.audio if task.is_multimodal and task.audio else task.image if task.is_multimodal and task.image else task.file if task.is_multimodal and task.file else None
|
583
583
|
|
584
584
|
if self.max_rpm and self._rpm_controller:
|
585
585
|
self._rpm_controller._reset_request_count()
|
@@ -598,6 +598,7 @@ class Agent(BaseModel):
|
|
598
598
|
response_format=task._structure_response_format(model_provider=self.llm.provider),
|
599
599
|
tools=tools,
|
600
600
|
tool_res_as_final=task.tool_res_as_final,
|
601
|
+
file=file,
|
601
602
|
)
|
602
603
|
|
603
604
|
except Exception as e:
|
@@ -28,14 +28,13 @@ PROVIDERS = {
|
|
28
28
|
"HF_ENDPOINT": "HF_ENDPOINT",
|
29
29
|
},
|
30
30
|
"azure": {
|
31
|
-
"api_base": "
|
31
|
+
"api_base": "AZURE_OPENAI_ENDPOINT_MODEL_NAME",
|
32
32
|
"api_key": "AZURE_OPENAI_API_KEY",
|
33
33
|
"api_version": "AZURE_OPENAI_API_VERSION",
|
34
34
|
},
|
35
35
|
"azure_ai": {
|
36
36
|
"api_key": "AZURE_AI_API_KEY",
|
37
37
|
"base_url": "AZURE_AI_API_BASE",
|
38
|
-
|
39
38
|
}
|
40
39
|
}
|
41
40
|
|
@@ -47,7 +46,7 @@ ENDPOINTS = [
|
|
47
46
|
|
48
47
|
|
49
48
|
# Resaoning and text generation models
|
50
|
-
|
49
|
+
MODELS = {
|
51
50
|
"openai": [
|
52
51
|
"gpt-4.5-preview-2025-02-27",
|
53
52
|
"gpt-4",
|
@@ -96,6 +95,10 @@ TEXT_MODELS = {
|
|
96
95
|
"bedrock/cohere.command-light-text-v14",
|
97
96
|
],
|
98
97
|
"azure": [
|
98
|
+
"azure/whisper",
|
99
|
+
"azure/whisper-2",
|
100
|
+
"azure/gpt-4o-mini-audio-preview",
|
101
|
+
|
99
102
|
"azure/DeepSeek-V3",
|
100
103
|
"azure/DeepSeek-R1",
|
101
104
|
"azure/Llama-3.3-70B-Instruct",
|
@@ -163,6 +166,13 @@ TEXT_MODELS = {
|
|
163
166
|
}
|
164
167
|
|
165
168
|
|
169
|
+
AUDIO_TO_TEXT_MODELS = [
|
170
|
+
"azure/whisper",
|
171
|
+
"azure/whisper-2",
|
172
|
+
"azure/gpt-4o-mini-audio-preview",
|
173
|
+
]
|
174
|
+
|
175
|
+
|
166
176
|
"""
|
167
177
|
Max input token size by the model.
|
168
178
|
"""
|
@@ -12,9 +12,9 @@ import litellm
|
|
12
12
|
from litellm import JSONSchemaValidationError, get_supported_openai_params, supports_response_schema
|
13
13
|
from pydantic import BaseModel, Field, PrivateAttr, model_validator, ConfigDict
|
14
14
|
|
15
|
-
from versionhq.llm.llm_vars import LLM_CONTEXT_WINDOW_SIZES,
|
15
|
+
from versionhq.llm.llm_vars import LLM_CONTEXT_WINDOW_SIZES, MODELS, AUDIO_TO_TEXT_MODELS, MODEL_PARAMS, PROVIDERS, ENDPOINTS
|
16
16
|
from versionhq.tool.model import Tool, ToolSet
|
17
|
-
from versionhq._utils import Logger
|
17
|
+
from versionhq._utils import Logger, UsageMetrics, ErrorType
|
18
18
|
|
19
19
|
|
20
20
|
load_dotenv(override=True)
|
@@ -115,7 +115,7 @@ class LLM(BaseModel):
|
|
115
115
|
self.provider = DEFAULT_MODEL_PROVIDER_NAME
|
116
116
|
|
117
117
|
else:
|
118
|
-
provider_model_list =
|
118
|
+
provider_model_list = MODELS.get(self.provider)
|
119
119
|
if provider_model_list:
|
120
120
|
self.model = provider_model_list[0]
|
121
121
|
self.provider = self.provider
|
@@ -127,29 +127,29 @@ class LLM(BaseModel):
|
|
127
127
|
elif self.model and self.provider is None:
|
128
128
|
model_match = [
|
129
129
|
item for item in [
|
130
|
-
[val for val in v if val == self.model][0] for k, v in
|
130
|
+
[val for val in v if val == self.model][0] for k, v in MODELS.items() if [val for val in v if val == self.model]
|
131
131
|
] if item
|
132
132
|
]
|
133
133
|
model_partial_match = [
|
134
134
|
item for item in [
|
135
|
-
[val for val in v if val.find(self.model) != -1][0] for k, v in
|
135
|
+
[val for val in v if val.find(self.model) != -1][0] for k, v in MODELS.items() if [val for val in v if val.find(self.model) != -1]
|
136
136
|
] if item
|
137
137
|
]
|
138
|
-
provider_match = [k for k, v in
|
138
|
+
provider_match = [k for k, v in MODELS.items() if k == self.model]
|
139
139
|
|
140
140
|
if model_match:
|
141
141
|
self.model = model_match[0]
|
142
|
-
self.provider = [k for k, v in
|
142
|
+
self.provider = [k for k, v in MODELS.items() if self.model in v][0]
|
143
143
|
|
144
144
|
elif model_partial_match:
|
145
145
|
self.model = model_partial_match[0]
|
146
|
-
self.provider = [k for k, v in
|
146
|
+
self.provider = [k for k, v in MODELS.items() if [item for item in v if item.find(self.model) != -1]][0]
|
147
147
|
|
148
148
|
elif provider_match:
|
149
149
|
provider = provider_match[0]
|
150
|
-
if self.
|
150
|
+
if self.MODELS.get(provider):
|
151
151
|
self.provider = provider
|
152
|
-
self.model = self.
|
152
|
+
self.model = self.MODELS.get(provider)[0]
|
153
153
|
else:
|
154
154
|
self.provider = DEFAULT_MODEL_PROVIDER_NAME
|
155
155
|
self.model = DEFAULT_MODEL_NAME
|
@@ -159,7 +159,7 @@ class LLM(BaseModel):
|
|
159
159
|
self.provider = DEFAULT_MODEL_PROVIDER_NAME
|
160
160
|
|
161
161
|
else:
|
162
|
-
provider_model_list =
|
162
|
+
provider_model_list = MODELS.get(self.provider)
|
163
163
|
if self.model not in provider_model_list:
|
164
164
|
self._logger.log(level="warning", message=f"The provided model: {self._init_model_name} is not in the list. We will assign a default model.", color="yellow")
|
165
165
|
self.model = DEFAULT_MODEL_NAME
|
@@ -232,7 +232,16 @@ class LLM(BaseModel):
|
|
232
232
|
|
233
233
|
valid_cred = {}
|
234
234
|
for k, v in cred.items():
|
235
|
-
val =
|
235
|
+
val = None
|
236
|
+
if '_MODEL_NAME' in v:
|
237
|
+
model_name = self.model.split('/')[-1] if self.model.split('/') else self.model
|
238
|
+
key = v.replace('_MODEL_NAME', f'_{model_name.replace("-", '_').replace(' ', '_').upper()}')
|
239
|
+
val = os.environ.get(key, None)
|
240
|
+
if not val:
|
241
|
+
val = os.environ.get(v.replace('_MODEL_NAME', ''), None)
|
242
|
+
else:
|
243
|
+
val = os.environ.get(v, None)
|
244
|
+
|
236
245
|
if val:
|
237
246
|
valid_cred[str(k)] = val
|
238
247
|
|
@@ -288,12 +297,12 @@ class LLM(BaseModel):
|
|
288
297
|
messages: List[Dict[str, str]],
|
289
298
|
response_format: Optional[Dict[str, Any]] = None,
|
290
299
|
tools: Optional[List[Tool | ToolSet | Any ]] = None,
|
291
|
-
config: Optional[Dict[str, Any]] =
|
292
|
-
tool_res_as_final: bool = False
|
300
|
+
config: Optional[Dict[str, Any]] = dict(),
|
301
|
+
tool_res_as_final: bool = False,
|
302
|
+
file: str = None
|
293
303
|
) -> str:
|
294
|
-
"""
|
295
|
-
|
296
|
-
"""
|
304
|
+
"""Configures and calls the LLM (chat, text generation, reasoning models)."""
|
305
|
+
|
297
306
|
litellm.drop_params = True
|
298
307
|
litellm.set_verbose = True
|
299
308
|
|
@@ -302,9 +311,32 @@ class LLM(BaseModel):
|
|
302
311
|
self._set_callbacks(self.callbacks)
|
303
312
|
|
304
313
|
try:
|
305
|
-
res
|
314
|
+
res = None
|
315
|
+
tool_res = ""
|
306
316
|
cred = self._set_credentials()
|
307
317
|
|
318
|
+
if file and self.model in AUDIO_TO_TEXT_MODELS:
|
319
|
+
params = self._create_valid_params(config=config)
|
320
|
+
audio_file = open(file, 'rb')
|
321
|
+
res = litellm.transcription(
|
322
|
+
model=self.model,
|
323
|
+
file=audio_file,
|
324
|
+
rompt=messages,
|
325
|
+
ustom_llm_provider=self.endpoint_provider,
|
326
|
+
response_format="json",
|
327
|
+
**cred
|
328
|
+
)
|
329
|
+
usage = UsageMetrics()
|
330
|
+
if res:
|
331
|
+
usage.latency = res._response_ms if hasattr(res, '_response_ms') else 0
|
332
|
+
self._usages.append(usage)
|
333
|
+
return res.text
|
334
|
+
else:
|
335
|
+
usage.record_errors(type=ErrorType.API)
|
336
|
+
self._usages.append(usage)
|
337
|
+
return None
|
338
|
+
|
339
|
+
|
308
340
|
if self.provider == "gemini":
|
309
341
|
self.response_format = { "type": "json_object" } if not tools and self.model != "gemini/gemini-2.0-flash-thinking-exp" else None
|
310
342
|
elif response_format and "json_schema" in response_format:
|
@@ -314,6 +314,7 @@ class Task(BaseModel):
|
|
314
314
|
name: Optional[str] = Field(default=None)
|
315
315
|
description: str = Field(description="Description of the actual task")
|
316
316
|
response_schema: Optional[Type[BaseModel] | List[ResponseField]] = Field(default=None, description="stores response format")
|
317
|
+
is_multimodal: bool = False
|
317
318
|
|
318
319
|
# tool usage
|
319
320
|
tools: Optional[List[Any]] = Field(default_factory=list, description="tools that the agent can use aside from their tools")
|