veadk-python 0.2.4__tar.gz → 0.2.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.
Potentially problematic release.
This version of veadk-python might be problematic. Click here for more details.
- {veadk_python-0.2.4 → veadk_python-0.2.6}/PKG-INFO +1 -1
- {veadk_python-0.2.4 → veadk_python-0.2.6}/pyproject.toml +3 -2
- {veadk_python-0.2.4 → veadk_python-0.2.6}/tests/test_agent.py +13 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/tests/test_cloud.py +6 -3
- {veadk_python-0.2.4 → veadk_python-0.2.6}/tests/test_runner.py +6 -2
- veadk_python-0.2.6/tests/test_tos.py +169 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/agent.py +40 -8
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/cli/cli_deploy.py +5 -1
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/cli/cli_init.py +25 -6
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/cloud/cloud_app.py +21 -6
- veadk_python-0.2.6/veadk/consts.py +49 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/database/database_adapter.py +88 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/database/kv/redis_database.py +47 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/database/local_database.py +22 -4
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/database/relational/mysql_database.py +58 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/database/vector/opensearch_vector_database.py +6 -3
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/database/viking/viking_database.py +72 -3
- veadk_python-0.2.6/veadk/integrations/ve_cr/ve_cr.py +205 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/cookiecutter.json +2 -1
- veadk_python-0.2.6/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/clean.py +23 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/app.py +28 -2
- veadk_python-0.2.6/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/requirements.txt +3 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/run.sh +5 -2
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/integrations/ve_faas/ve_faas.py +2 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/cookiecutter.json +17 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/clean.py +23 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/config.yaml.example +2 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/deploy.py +41 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/Dockerfile +23 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/app.py +123 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/init_db.py +46 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/models.py +36 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/requirements.txt +4 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/run.sh +21 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/css/style.css +368 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/js/admin.js +0 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/dashboard.html +21 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/edit_post.html +24 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/login.html +21 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/posts.html +53 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/base.html +45 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/index.html +29 -0
- veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/post.html +14 -0
- veadk_python-0.2.6/veadk/integrations/ve_tos/ve_tos.py +238 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/knowledgebase/knowledgebase.py +8 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/runner.py +140 -34
- veadk_python-0.2.6/veadk/tools/builtin_tools/image_edit.py +236 -0
- veadk_python-0.2.6/veadk/tools/builtin_tools/image_generate.py +236 -0
- veadk_python-0.2.6/veadk/tools/builtin_tools/video_generate.py +326 -0
- veadk_python-0.2.6/veadk/tools/sandbox/browser_sandbox.py +37 -0
- veadk_python-0.2.6/veadk/tools/sandbox/code_sandbox.py +40 -0
- veadk_python-0.2.4/veadk/tools/sandbox/code_sandbox.py → veadk_python-0.2.6/veadk/tools/sandbox/computer_sandbox.py +15 -11
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tracing/base_tracer.py +0 -19
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tracing/telemetry/attributes/extractors/common_attributes_extractors.py +5 -0
- veadk_python-0.2.6/veadk/tracing/telemetry/attributes/extractors/llm_attributes_extractors.py +575 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tracing/telemetry/attributes/extractors/tool_attributes_extractors.py +20 -14
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tracing/telemetry/attributes/extractors/types.py +15 -4
- veadk_python-0.2.6/veadk/tracing/telemetry/exporters/__init__.py +13 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tracing/telemetry/exporters/inmemory_exporter.py +3 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tracing/telemetry/opentelemetry_tracer.py +15 -6
- veadk_python-0.2.6/veadk/tracing/telemetry/telemetry.py +253 -0
- veadk_python-0.2.6/veadk/utils/__init__.py +13 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/utils/misc.py +40 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/version.py +1 -1
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk_python.egg-info/PKG-INFO +1 -1
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk_python.egg-info/SOURCES.txt +28 -0
- veadk_python-0.2.4/veadk/consts.py +0 -17
- veadk_python-0.2.4/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/requirements.txt +0 -1
- veadk_python-0.2.4/veadk/tools/sandbox/browser_sandbox.py +0 -27
- veadk_python-0.2.4/veadk/tools/sandbox/computer_sandbox.py +0 -27
- veadk_python-0.2.4/veadk/tracing/telemetry/attributes/extractors/llm_attributes_extractors.py +0 -392
- veadk_python-0.2.4/veadk/tracing/telemetry/telemetry.py +0 -149
- {veadk_python-0.2.4 → veadk_python-0.2.6}/LICENSE +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/README.md +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/setup.cfg +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/tests/test_agent_card.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/tests/test_evaluator.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/tests/test_knowledgebase.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/tests/test_long_term_memory.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/tests/test_multiple_agents.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/tests/test_runtime_data_collecting.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/tests/test_short_term_memory.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/tests/test_tracing.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/a2a/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/a2a/agent_card.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/a2a/remote_ve_agent.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/a2a/ve_a2a_server.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/a2a/ve_agent_executor.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/a2a/ve_task_store.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/agents/loop_agent.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/agents/parallel_agent.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/agents/sequential_agent.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/cli/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/cli/cli.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/cli/cli_prompt.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/cli/cli_web.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/cloud/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/cloud/cloud_agent_engine.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/config.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/database/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/database/base_database.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/database/database_factory.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/database/kv/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/database/relational/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/database/vector/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/database/vector/type.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/database/viking/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/database/viking/viking_memory_db.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/evaluation/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/evaluation/adk_evaluator/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/evaluation/adk_evaluator/adk_evaluator.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/evaluation/base_evaluator.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/evaluation/deepeval_evaluator/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/evaluation/deepeval_evaluator/deepeval_evaluator.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/evaluation/eval_set_file_loader.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/evaluation/eval_set_recorder.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/evaluation/types.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/evaluation/utils/prometheus.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/integrations/ve_apig/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/integrations/ve_apig/ve_apig.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/integrations/ve_apig/ve_apig_utils.py +0 -0
- {veadk_python-0.2.4/veadk/integrations/ve_faas → veadk_python-0.2.6/veadk/integrations/ve_cr}/__init__.py +0 -0
- {veadk_python-0.2.4/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}} → veadk_python-0.2.6/veadk/integrations/ve_faas}/__init__.py +0 -0
- {veadk_python-0.2.4/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src → veadk_python-0.2.6/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}}/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/config.yaml.example +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/deploy.py +0 -0
- {veadk_python-0.2.4/veadk/integrations/ve_prompt_pilot → veadk_python-0.2.6/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src}/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/agent.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{ cookiecutter.app_name|replace('-', '_') }}/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{ cookiecutter.app_name|replace('-', '_') }}/agent.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/integrations/ve_faas/ve_faas_utils.py +0 -0
- {veadk_python-0.2.4/veadk/memory → veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}}/__init__.py +0 -0
- {veadk_python-0.2.4/veadk/prompts → veadk_python-0.2.6/veadk/integrations/ve_prompt_pilot}/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/integrations/ve_prompt_pilot/ve_prompt_pilot.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/knowledgebase/__init__.py +0 -0
- {veadk_python-0.2.4/veadk/tools → veadk_python-0.2.6/veadk/memory}/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/memory/long_term_memory.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/memory/short_term_memory.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/memory/short_term_memory_processor.py +0 -0
- {veadk_python-0.2.4/veadk/tools/builtin_tools → veadk_python-0.2.6/veadk/prompts}/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/prompts/agent_default_prompt.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/prompts/prompt_evaluator.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/prompts/prompt_memory_processor.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/prompts/prompt_optimization.py +0 -0
- {veadk_python-0.2.4/veadk/tools/sandbox → veadk_python-0.2.6/veadk/tools}/__init__.py +0 -0
- {veadk_python-0.2.4/veadk/tracing → veadk_python-0.2.6/veadk/tools/builtin_tools}/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tools/builtin_tools/lark.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tools/builtin_tools/las.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tools/builtin_tools/mcp_router.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tools/builtin_tools/vesearch.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tools/builtin_tools/web_scraper.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tools/builtin_tools/web_search.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tools/demo_tools.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tools/load_knowledgebase_tool.py +0 -0
- {veadk_python-0.2.4/veadk/tracing/telemetry → veadk_python-0.2.6/veadk/tools/sandbox}/__init__.py +0 -0
- {veadk_python-0.2.4/veadk/tracing/telemetry/exporters → veadk_python-0.2.6/veadk/tracing}/__init__.py +0 -0
- {veadk_python-0.2.4/veadk/utils → veadk_python-0.2.6/veadk/tracing/telemetry}/__init__.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tracing/telemetry/attributes/attributes.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tracing/telemetry/exporters/apmplus_exporter.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tracing/telemetry/exporters/base_exporter.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tracing/telemetry/exporters/cozeloop_exporter.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/tracing/telemetry/exporters/tls_exporter.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/types.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/utils/logger.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/utils/mcp_utils.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/utils/patches.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk/utils/volcengine_sign.py +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk_python.egg-info/dependency_links.txt +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk_python.egg-info/entry_points.txt +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk_python.egg-info/requires.txt +0 -0
- {veadk_python-0.2.4 → veadk_python-0.2.6}/veadk_python.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: veadk-python
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.6
|
|
4
4
|
Summary: Volcengine agent development kit, integrations with Volcengine cloud services.
|
|
5
5
|
Author-email: Yaozheng Fang <fangyozheng@gmail.com>, Guodong Li <cu.eric.lee@gmail.com>, Zhi Han <sliverydayday@gmail.com>, Meng Wang <mengwangwm@gmail.com>
|
|
6
6
|
License: Apache License
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "veadk-python"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.6"
|
|
4
4
|
description = "Volcengine agent development kit, integrations with Volcengine cloud services."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -74,5 +74,6 @@ include-package-data = true
|
|
|
74
74
|
|
|
75
75
|
[tool.ruff]
|
|
76
76
|
exclude = [
|
|
77
|
-
"veadk/integrations/ve_faas/template/*"
|
|
77
|
+
"veadk/integrations/ve_faas/template/*",
|
|
78
|
+
"veadk/integrations/ve_faas/web_template/*"
|
|
78
79
|
]
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
from google.adk.tools import load_memory
|
|
16
16
|
|
|
17
17
|
from veadk import Agent
|
|
18
|
+
from veadk.consts import DEFAULT_MODEL_EXTRA_CONFIG
|
|
18
19
|
from veadk.knowledgebase import KnowledgeBase
|
|
19
20
|
from veadk.memory.long_term_memory import LongTermMemory
|
|
20
21
|
from veadk.tools import load_knowledgebase_tool
|
|
@@ -26,11 +27,17 @@ def test_agent():
|
|
|
26
27
|
long_term_memory = LongTermMemory(backend="local")
|
|
27
28
|
tracer = OpentelemetryTracer()
|
|
28
29
|
|
|
30
|
+
extra_config = {
|
|
31
|
+
"extra_headers": {"thinking": "test"},
|
|
32
|
+
"extra_body": {"content": "test"},
|
|
33
|
+
}
|
|
34
|
+
|
|
29
35
|
agent = Agent(
|
|
30
36
|
model_name="test_model_name",
|
|
31
37
|
model_provider="test_model_provider",
|
|
32
38
|
model_api_key="test_model_api_key",
|
|
33
39
|
model_api_base="test_model_api_base",
|
|
40
|
+
model_extra_config=extra_config,
|
|
34
41
|
tools=[],
|
|
35
42
|
sub_agents=[],
|
|
36
43
|
knowledgebase=knowledgebase,
|
|
@@ -41,6 +48,12 @@ def test_agent():
|
|
|
41
48
|
|
|
42
49
|
assert agent.model.model == f"{agent.model_provider}/{agent.model_name}"
|
|
43
50
|
|
|
51
|
+
expected_config = DEFAULT_MODEL_EXTRA_CONFIG.copy()
|
|
52
|
+
expected_config["extra_headers"] |= extra_config["extra_headers"]
|
|
53
|
+
expected_config["extra_body"] |= extra_config["extra_body"]
|
|
54
|
+
|
|
55
|
+
assert agent.model_extra_config == expected_config
|
|
56
|
+
|
|
44
57
|
assert agent.knowledgebase == knowledgebase
|
|
45
58
|
assert agent.knowledgebase.backend == "local"
|
|
46
59
|
assert load_knowledgebase_tool.knowledgebase == agent.knowledgebase
|
|
@@ -115,9 +115,12 @@ async def test_cloud():
|
|
|
115
115
|
mock_vefaas_client = Mock()
|
|
116
116
|
mock_vefaas_in_app.return_value = mock_vefaas_client
|
|
117
117
|
mock_vefaas_client.delete.return_value = None
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
118
|
+
with patch.object(
|
|
119
|
+
cloud_app, "_get_vefaas_application_id_by_name"
|
|
120
|
+
) as mock_get_id_by_name:
|
|
121
|
+
mock_get_id_by_name.return_value = None
|
|
122
|
+
cloud_app.delete_self()
|
|
123
|
+
mock_vefaas_client.delete.assert_called_with("app-123")
|
|
121
124
|
|
|
122
125
|
# Verify all mocks were called as expected
|
|
123
126
|
mock_vefaas_service.deploy.assert_called_once()
|
|
@@ -28,7 +28,9 @@ def _test_convert_messages(runner):
|
|
|
28
28
|
role="user",
|
|
29
29
|
)
|
|
30
30
|
]
|
|
31
|
-
actual_message = runner._convert_messages(
|
|
31
|
+
actual_message = runner._convert_messages(
|
|
32
|
+
message, session_id="test_session_id", upload_inline_data_to_tos=True
|
|
33
|
+
)
|
|
32
34
|
assert actual_message == expected_message
|
|
33
35
|
|
|
34
36
|
message = ["test message 1", "test message 2"]
|
|
@@ -42,7 +44,9 @@ def _test_convert_messages(runner):
|
|
|
42
44
|
role="user",
|
|
43
45
|
),
|
|
44
46
|
]
|
|
45
|
-
actual_message = runner._convert_messages(
|
|
47
|
+
actual_message = runner._convert_messages(
|
|
48
|
+
message, session_id="test_session_id", upload_inline_data_to_tos=True
|
|
49
|
+
)
|
|
46
50
|
assert actual_message == expected_message
|
|
47
51
|
|
|
48
52
|
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# Copyright (c) 2025 Beijing Volcano Engine Technology Co., Ltd. and/or its affiliates.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import pytest
|
|
16
|
+
from unittest import mock
|
|
17
|
+
|
|
18
|
+
# Check if tos module is available
|
|
19
|
+
import importlib
|
|
20
|
+
|
|
21
|
+
TOS_AVAILABLE = False
|
|
22
|
+
try:
|
|
23
|
+
importlib.import_module("veadk.integrations.ve_tos.ve_tos")
|
|
24
|
+
TOS_AVAILABLE = True
|
|
25
|
+
except ImportError:
|
|
26
|
+
pass
|
|
27
|
+
|
|
28
|
+
# Skip tests that require tos module if it's not available
|
|
29
|
+
require_tos = pytest.mark.skipif(not TOS_AVAILABLE, reason="tos module not available")
|
|
30
|
+
|
|
31
|
+
# 使用 pytest-asyncio
|
|
32
|
+
pytest_plugins = ("pytest_asyncio",)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@pytest.fixture
|
|
36
|
+
@require_tos
|
|
37
|
+
def mock_client(monkeypatch):
|
|
38
|
+
import veadk.integrations.ve_tos.ve_tos as tos_mod
|
|
39
|
+
|
|
40
|
+
fake_client = mock.Mock()
|
|
41
|
+
|
|
42
|
+
monkeypatch.setenv("DATABASE_TOS_REGION", "test-region")
|
|
43
|
+
monkeypatch.setenv("VOLCENGINE_ACCESS_KEY", "test-access-key")
|
|
44
|
+
monkeypatch.setenv("VOLCENGINE_SECRET_KEY", "test-secret-key")
|
|
45
|
+
monkeypatch.setenv("DATABASE_TOS_BUCKET", "test-bucket")
|
|
46
|
+
|
|
47
|
+
monkeypatch.setattr(tos_mod.tos, "TosClientV2", lambda *a, **k: fake_client)
|
|
48
|
+
|
|
49
|
+
class FakeExceptions:
|
|
50
|
+
class TosServerError(Exception):
|
|
51
|
+
def __init__(
|
|
52
|
+
self,
|
|
53
|
+
msg: str,
|
|
54
|
+
code: int = 0,
|
|
55
|
+
host_id: str = "",
|
|
56
|
+
resource: str = "",
|
|
57
|
+
request_id: str = "",
|
|
58
|
+
header=None,
|
|
59
|
+
):
|
|
60
|
+
super().__init__(msg)
|
|
61
|
+
self.status_code = code
|
|
62
|
+
|
|
63
|
+
monkeypatch.setattr(tos_mod.tos, "exceptions", FakeExceptions)
|
|
64
|
+
monkeypatch.setattr(
|
|
65
|
+
tos_mod.tos,
|
|
66
|
+
"StorageClassType",
|
|
67
|
+
type("S", (), {"Storage_Class_Standard": "STANDARD"}),
|
|
68
|
+
)
|
|
69
|
+
monkeypatch.setattr(
|
|
70
|
+
tos_mod.tos,
|
|
71
|
+
"ACLType",
|
|
72
|
+
type("A", (), {"ACL_Private": "private", "ACL_Public_Read": "public-read"}),
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
return fake_client
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
@pytest.fixture
|
|
79
|
+
@require_tos
|
|
80
|
+
def tos_client(mock_client):
|
|
81
|
+
import veadk.integrations.ve_tos.ve_tos as tos_mod
|
|
82
|
+
|
|
83
|
+
return tos_mod.VeTOS()
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@require_tos
|
|
87
|
+
def test_create_bucket_exists(tos_client, mock_client):
|
|
88
|
+
mock_client.head_bucket.return_value = None # head_bucket 正常返回表示存在
|
|
89
|
+
result = tos_client.create_bucket()
|
|
90
|
+
assert result is True
|
|
91
|
+
mock_client.create_bucket.assert_not_called()
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@require_tos
|
|
95
|
+
def test_create_bucket_not_exists(tos_client, mock_client):
|
|
96
|
+
import veadk.integrations.ve_tos.ve_tos as tos_mod
|
|
97
|
+
|
|
98
|
+
exc = tos_mod.tos.exceptions.TosServerError(msg="not found", code=404)
|
|
99
|
+
mock_client.head_bucket.side_effect = exc
|
|
100
|
+
|
|
101
|
+
result = tos_client.create_bucket()
|
|
102
|
+
assert result is True
|
|
103
|
+
mock_client.create_bucket.assert_called_once()
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@require_tos
|
|
107
|
+
@pytest.mark.asyncio
|
|
108
|
+
async def test_upload_bytes_success(tos_client, mock_client):
|
|
109
|
+
mock_client.head_bucket.return_value = True
|
|
110
|
+
data = b"hello world"
|
|
111
|
+
|
|
112
|
+
result = await tos_client.upload("obj-key", data)
|
|
113
|
+
assert result is None
|
|
114
|
+
mock_client.put_object.assert_called_once()
|
|
115
|
+
mock_client.close.assert_called_once()
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@require_tos
|
|
119
|
+
@pytest.mark.asyncio
|
|
120
|
+
async def test_upload_file_success(tmp_path, tos_client, mock_client):
|
|
121
|
+
mock_client.head_bucket.return_value = True
|
|
122
|
+
file_path = tmp_path / "file.txt"
|
|
123
|
+
file_path.write_text("hello file")
|
|
124
|
+
|
|
125
|
+
result = await tos_client.upload("obj-key", str(file_path))
|
|
126
|
+
assert result is None
|
|
127
|
+
mock_client.put_object_from_file.assert_called_once()
|
|
128
|
+
mock_client.close.assert_called_once()
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
@require_tos
|
|
132
|
+
def test_download_success(tmp_path, tos_client, mock_client):
|
|
133
|
+
save_path = tmp_path / "out.txt"
|
|
134
|
+
mock_client.get_object.return_value = [b"abc", b"def"]
|
|
135
|
+
|
|
136
|
+
result = tos_client.download("obj-key", str(save_path))
|
|
137
|
+
assert result is True
|
|
138
|
+
assert save_path.read_bytes() == b"abcdef"
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@require_tos
|
|
142
|
+
def test_download_fail(tos_client, mock_client):
|
|
143
|
+
mock_client.get_object.side_effect = Exception("boom")
|
|
144
|
+
result = tos_client.download("obj-key", "somewhere.txt")
|
|
145
|
+
assert result is False
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
@require_tos
|
|
149
|
+
@pytest.mark.skipif(TOS_AVAILABLE, reason="tos module is available")
|
|
150
|
+
def test_tos_import_error():
|
|
151
|
+
"""Test VeTOS behavior when tos module is not installed"""
|
|
152
|
+
# Remove tos from sys.modules to simulate it's not installed
|
|
153
|
+
import sys
|
|
154
|
+
|
|
155
|
+
original_tos = sys.modules.get("tos")
|
|
156
|
+
if "tos" in sys.modules:
|
|
157
|
+
del sys.modules["tos"]
|
|
158
|
+
|
|
159
|
+
try:
|
|
160
|
+
# Try to import ve_tos module, which should raise ImportError
|
|
161
|
+
with pytest.raises(ImportError) as exc_info:
|
|
162
|
+
pass
|
|
163
|
+
|
|
164
|
+
# Check that the error message contains installation instructions
|
|
165
|
+
assert "pip install tos" in str(exc_info.value)
|
|
166
|
+
finally:
|
|
167
|
+
# Restore original state
|
|
168
|
+
if original_tos is not None:
|
|
169
|
+
sys.modules["tos"] = original_tos
|
|
@@ -28,9 +28,10 @@ from typing_extensions import Any
|
|
|
28
28
|
|
|
29
29
|
from veadk.config import getenv
|
|
30
30
|
from veadk.consts import (
|
|
31
|
-
DEFALUT_MODEL_AGENT_PROVIDER,
|
|
32
31
|
DEFAULT_MODEL_AGENT_API_BASE,
|
|
33
32
|
DEFAULT_MODEL_AGENT_NAME,
|
|
33
|
+
DEFAULT_MODEL_AGENT_PROVIDER,
|
|
34
|
+
DEFAULT_MODEL_EXTRA_CONFIG,
|
|
34
35
|
)
|
|
35
36
|
from veadk.evaluation import EvalSetRecorder
|
|
36
37
|
from veadk.knowledgebase import KnowledgeBase
|
|
@@ -64,7 +65,7 @@ class Agent(LlmAgent):
|
|
|
64
65
|
model_name: str = getenv("MODEL_AGENT_NAME", DEFAULT_MODEL_AGENT_NAME)
|
|
65
66
|
"""The name of the model for agent running."""
|
|
66
67
|
|
|
67
|
-
model_provider: str = getenv("MODEL_AGENT_PROVIDER",
|
|
68
|
+
model_provider: str = getenv("MODEL_AGENT_PROVIDER", DEFAULT_MODEL_AGENT_PROVIDER)
|
|
68
69
|
"""The provider of the model for agent running."""
|
|
69
70
|
|
|
70
71
|
model_api_base: str = getenv("MODEL_AGENT_API_BASE", DEFAULT_MODEL_AGENT_API_BASE)
|
|
@@ -73,6 +74,9 @@ class Agent(LlmAgent):
|
|
|
73
74
|
model_api_key: str = Field(default_factory=lambda: getenv("MODEL_AGENT_API_KEY"))
|
|
74
75
|
"""The api key of the model for agent running."""
|
|
75
76
|
|
|
77
|
+
model_extra_config: dict = Field(default_factory=dict)
|
|
78
|
+
"""The extra config to include in the model requests."""
|
|
79
|
+
|
|
76
80
|
tools: list[ToolUnion] = []
|
|
77
81
|
"""The tools provided to agent."""
|
|
78
82
|
|
|
@@ -96,11 +100,39 @@ class Agent(LlmAgent):
|
|
|
96
100
|
|
|
97
101
|
def model_post_init(self, __context: Any) -> None:
|
|
98
102
|
super().model_post_init(None) # for sub_agents init
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
103
|
+
|
|
104
|
+
# combine user model config with VeADK defaults
|
|
105
|
+
headers = DEFAULT_MODEL_EXTRA_CONFIG["extra_headers"].copy()
|
|
106
|
+
body = DEFAULT_MODEL_EXTRA_CONFIG["extra_body"].copy()
|
|
107
|
+
|
|
108
|
+
if self.model_extra_config:
|
|
109
|
+
user_headers = self.model_extra_config.get("extra_headers", {})
|
|
110
|
+
user_body = self.model_extra_config.get("extra_body", {})
|
|
111
|
+
|
|
112
|
+
headers |= user_headers
|
|
113
|
+
body |= user_body
|
|
114
|
+
|
|
115
|
+
self.model_extra_config |= {
|
|
116
|
+
"extra_headers": headers,
|
|
117
|
+
"extra_body": body,
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
logger.info(f"Model extra config: {self.model_extra_config}")
|
|
121
|
+
|
|
122
|
+
if not self.model:
|
|
123
|
+
self.model = LiteLlm(
|
|
124
|
+
model=f"{self.model_provider}/{self.model_name}",
|
|
125
|
+
api_key=self.model_api_key,
|
|
126
|
+
api_base=self.model_api_base,
|
|
127
|
+
**self.model_extra_config,
|
|
128
|
+
)
|
|
129
|
+
logger.debug(
|
|
130
|
+
f"LiteLLM client created with config: {self.model_extra_config}"
|
|
131
|
+
)
|
|
132
|
+
else:
|
|
133
|
+
logger.warning(
|
|
134
|
+
"You are trying to use your own LiteLLM client, some default request headers may be missing."
|
|
135
|
+
)
|
|
104
136
|
|
|
105
137
|
if self.knowledgebase:
|
|
106
138
|
from veadk.tools import load_knowledgebase_tool
|
|
@@ -117,7 +149,7 @@ class Agent(LlmAgent):
|
|
|
117
149
|
|
|
118
150
|
logger.info(f"{self.__class__.__name__} `{self.name}` init done.")
|
|
119
151
|
logger.debug(
|
|
120
|
-
f"Agent: {self.model_dump(include={'name', 'model_name', 'model_api_base', 'tools'
|
|
152
|
+
f"Agent: {self.model_dump(include={'name', 'model_name', 'model_api_base', 'tools'})}"
|
|
121
153
|
)
|
|
122
154
|
|
|
123
155
|
async def _run(
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
import click
|
|
17
|
+
from veadk.version import VERSION
|
|
17
18
|
|
|
18
19
|
TEMP_PATH = "/tmp"
|
|
19
20
|
|
|
@@ -29,7 +30,9 @@ TEMP_PATH = "/tmp"
|
|
|
29
30
|
default=None,
|
|
30
31
|
help="Volcengine secret key",
|
|
31
32
|
)
|
|
32
|
-
@click.option(
|
|
33
|
+
@click.option(
|
|
34
|
+
"--vefaas-app-name", required=True, help="Expected Volcengine FaaS application name"
|
|
35
|
+
)
|
|
33
36
|
@click.option(
|
|
34
37
|
"--veapig-instance-name", default="", help="Expected Volcengine APIG instance name"
|
|
35
38
|
)
|
|
@@ -92,6 +95,7 @@ def deploy(
|
|
|
92
95
|
"veapig_service_name": veapig_service_name,
|
|
93
96
|
"veapig_upstream_name": veapig_upstream_name,
|
|
94
97
|
"use_adk_web": use_adk_web,
|
|
98
|
+
"veadk_version": VERSION,
|
|
95
99
|
}
|
|
96
100
|
|
|
97
101
|
cookiecutter(
|
|
@@ -16,6 +16,8 @@ import warnings
|
|
|
16
16
|
from typing import Any
|
|
17
17
|
|
|
18
18
|
import click
|
|
19
|
+
from veadk.version import VERSION
|
|
20
|
+
|
|
19
21
|
|
|
20
22
|
warnings.filterwarnings(
|
|
21
23
|
"ignore", category=UserWarning, module="pydantic._internal._fields"
|
|
@@ -58,12 +60,21 @@ def _render_prompts() -> dict[str, Any]:
|
|
|
58
60
|
"veapig_service_name": veapig_service_name,
|
|
59
61
|
"veapig_upstream_name": veapig_upstream_name,
|
|
60
62
|
"use_adk_web": deploy_mode == "2",
|
|
63
|
+
"veadk_version": VERSION,
|
|
61
64
|
}
|
|
62
65
|
|
|
63
66
|
|
|
64
67
|
@click.command()
|
|
65
|
-
|
|
66
|
-
"""
|
|
68
|
+
@click.option(
|
|
69
|
+
"--vefaas-template-type", default="template", help="Expected template type"
|
|
70
|
+
)
|
|
71
|
+
def init(
|
|
72
|
+
vefaas_template_type: str,
|
|
73
|
+
) -> None:
|
|
74
|
+
"""Init a veadk project that can be deployed to Volcengine VeFaaS.
|
|
75
|
+
|
|
76
|
+
`template` is A2A/MCP/Web server template, `web_template` is for web applications (i.e., a simple blog).
|
|
77
|
+
"""
|
|
67
78
|
import shutil
|
|
68
79
|
from pathlib import Path
|
|
69
80
|
|
|
@@ -71,9 +82,14 @@ def init() -> None:
|
|
|
71
82
|
|
|
72
83
|
import veadk.integrations.ve_faas as vefaas
|
|
73
84
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
85
|
+
if vefaas_template_type == "web_template":
|
|
86
|
+
click.echo(
|
|
87
|
+
"Welcome use VeADK to create your project. We will generate a `simple-blog` web application for you."
|
|
88
|
+
)
|
|
89
|
+
else:
|
|
90
|
+
click.echo(
|
|
91
|
+
"Welcome use VeADK to create your project. We will generate a `weather-reporter` application for you."
|
|
92
|
+
)
|
|
77
93
|
|
|
78
94
|
cwd = Path.cwd()
|
|
79
95
|
local_dir_name = click.prompt("Local directory name", default="veadk-cloud-proj")
|
|
@@ -89,7 +105,10 @@ def init() -> None:
|
|
|
89
105
|
settings = _render_prompts()
|
|
90
106
|
settings["local_dir_name"] = local_dir_name
|
|
91
107
|
|
|
92
|
-
|
|
108
|
+
if not vefaas_template_type:
|
|
109
|
+
vefaas_template_type = "template"
|
|
110
|
+
|
|
111
|
+
template_dir_path = Path(vefaas.__file__).parent / vefaas_template_type
|
|
93
112
|
|
|
94
113
|
cookiecutter(
|
|
95
114
|
template=str(template_dir_path),
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
import json
|
|
16
|
+
import time
|
|
16
17
|
from typing import Any
|
|
17
18
|
from uuid import uuid4
|
|
18
19
|
|
|
@@ -60,9 +61,11 @@ class CloudApp:
|
|
|
60
61
|
if not vefaas_endpoint:
|
|
61
62
|
self.vefaas_endpoint = self._get_vefaas_endpoint()
|
|
62
63
|
|
|
63
|
-
if
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
if (
|
|
65
|
+
self.vefaas_endpoint
|
|
66
|
+
and not self.vefaas_endpoint.startswith("http")
|
|
67
|
+
and not self.vefaas_endpoint.startswith("https")
|
|
68
|
+
):
|
|
66
69
|
raise ValueError(
|
|
67
70
|
f"Invalid endpoint: {vefaas_endpoint}. The endpoint must start with `http` or `https`."
|
|
68
71
|
)
|
|
@@ -92,12 +95,13 @@ class CloudApp:
|
|
|
92
95
|
raise ValueError(
|
|
93
96
|
f"VeFaaS CloudAPP with application_id `{self.vefaas_application_id}` or application_name `{self.vefaas_application_name}` not found."
|
|
94
97
|
)
|
|
95
|
-
cloud_resource = json.loads(app["CloudResource"])
|
|
96
98
|
|
|
97
99
|
try:
|
|
100
|
+
cloud_resource = json.loads(app["CloudResource"])
|
|
98
101
|
vefaas_endpoint = cloud_resource["framework"]["url"]["system_url"]
|
|
99
102
|
except Exception as e:
|
|
100
|
-
|
|
103
|
+
logger.warning(f"VeFaaS cloudAPP could not get endpoint. Error: {e}")
|
|
104
|
+
vefaas_endpoint = ""
|
|
101
105
|
return vefaas_endpoint
|
|
102
106
|
|
|
103
107
|
def _get_vefaas_application_id_by_name(self) -> str:
|
|
@@ -167,7 +171,18 @@ class CloudApp:
|
|
|
167
171
|
|
|
168
172
|
vefaas_client = VeFaaS(access_key=volcengine_ak, secret_key=volcengine_sk)
|
|
169
173
|
vefaas_client.delete(self.vefaas_application_id)
|
|
170
|
-
print(
|
|
174
|
+
print(
|
|
175
|
+
f"Cloud app {self.vefaas_application_id} delete request has been sent to VeFaaS"
|
|
176
|
+
)
|
|
177
|
+
while True:
|
|
178
|
+
try:
|
|
179
|
+
id = self._get_vefaas_application_id_by_name()
|
|
180
|
+
if not id:
|
|
181
|
+
break
|
|
182
|
+
time.sleep(3)
|
|
183
|
+
except Exception as _:
|
|
184
|
+
break
|
|
185
|
+
print("Delete application done.")
|
|
171
186
|
|
|
172
187
|
async def message_send(
|
|
173
188
|
self, message: str, session_id: str, user_id: str, timeout: float = 600.0
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Copyright (c) 2025 Beijing Volcano Engine Technology Co., Ltd. and/or its affiliates.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import time
|
|
16
|
+
|
|
17
|
+
from veadk.config import getenv
|
|
18
|
+
from veadk.version import VERSION
|
|
19
|
+
|
|
20
|
+
DEFAULT_MODEL_AGENT_NAME = "doubao-seed-1-6-250615"
|
|
21
|
+
DEFAULT_MODEL_AGENT_PROVIDER = "openai"
|
|
22
|
+
DEFAULT_MODEL_AGENT_API_BASE = "https://ark.cn-beijing.volces.com/api/v3/"
|
|
23
|
+
DEFAULT_MODEL_EXTRA_CONFIG = {
|
|
24
|
+
"extra_headers": {
|
|
25
|
+
"x-is-encrypted": getenv("MODEL_AGENT_ENCRYPTED", "true"),
|
|
26
|
+
"veadk-source": "veadk",
|
|
27
|
+
"veadk-version": VERSION,
|
|
28
|
+
},
|
|
29
|
+
"extra_body": {
|
|
30
|
+
"caching": {
|
|
31
|
+
"type": getenv("MODEL_AGENT_CACHING", "enabled"),
|
|
32
|
+
},
|
|
33
|
+
"expire_at": int(time.time()) + 3600, # expire after 1 hour
|
|
34
|
+
},
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
DEFAULT_APMPLUS_OTEL_EXPORTER_ENDPOINT = "http://apmplus-cn-beijing.volces.com:4317"
|
|
38
|
+
DEFAULT_APMPLUS_OTEL_EXPORTER_SERVICE_NAME = "veadk_tracing"
|
|
39
|
+
|
|
40
|
+
DEFAULT_COZELOOP_OTEL_EXPORTER_ENDPOINT = (
|
|
41
|
+
"https://api.coze.cn/v1/loop/opentelemetry/v1/traces"
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
DEFAULT_TLS_OTEL_EXPORTER_ENDPOINT = "https://tls-cn-beijing.volces.com:4318/v1/traces"
|
|
45
|
+
DEFAULT_TLS_OTEL_EXPORTER_REGION = "cn-beijing"
|
|
46
|
+
|
|
47
|
+
DEFAULT_CR_INSTANCE_NAME = "veadk-user-instance"
|
|
48
|
+
DEFAULT_CR_NAMESPACE_NAME = "veadk-user-namespace"
|
|
49
|
+
DEFAULT_CR_REPO_NAME = "veadk-user-repo"
|
|
@@ -54,6 +54,33 @@ class KVDatabaseAdapter:
|
|
|
54
54
|
logger.error(f"Failed to search from Redis: index={index} error={e}")
|
|
55
55
|
raise e
|
|
56
56
|
|
|
57
|
+
def delete_doc(self, index: str, id: str) -> bool:
|
|
58
|
+
logger.debug(f"Deleting document from Redis database: index={index} id={id}")
|
|
59
|
+
try:
|
|
60
|
+
# For Redis, we need to handle deletion differently since RedisDatabase.delete_doc
|
|
61
|
+
# takes a key and a single id
|
|
62
|
+
result = self.client.delete_doc(key=index, id=id)
|
|
63
|
+
return result
|
|
64
|
+
except Exception as e:
|
|
65
|
+
logger.error(
|
|
66
|
+
f"Failed to delete document from Redis database: index={index} id={id} error={e}"
|
|
67
|
+
)
|
|
68
|
+
return False
|
|
69
|
+
|
|
70
|
+
def list_docs(self, index: str, offset: int = 0, limit: int = 100) -> list[dict]:
|
|
71
|
+
logger.debug(f"Listing documents from Redis database: index={index}")
|
|
72
|
+
try:
|
|
73
|
+
# Get all documents from Redis
|
|
74
|
+
docs = self.client.list_docs(key=index)
|
|
75
|
+
|
|
76
|
+
# Apply offset and limit for pagination
|
|
77
|
+
return docs[offset : offset + limit]
|
|
78
|
+
except Exception as e:
|
|
79
|
+
logger.error(
|
|
80
|
+
f"Failed to list documents from Redis database: index={index} error={e}"
|
|
81
|
+
)
|
|
82
|
+
return []
|
|
83
|
+
|
|
57
84
|
|
|
58
85
|
class RelationalDatabaseAdapter:
|
|
59
86
|
def __init__(self, client):
|
|
@@ -108,6 +135,28 @@ class RelationalDatabaseAdapter:
|
|
|
108
135
|
|
|
109
136
|
return [item["data"] for item in results]
|
|
110
137
|
|
|
138
|
+
def delete_doc(self, index: str, id: str) -> bool:
|
|
139
|
+
logger.debug(f"Deleting document from SQL database: table_name={index} id={id}")
|
|
140
|
+
try:
|
|
141
|
+
# Convert single id to list for the client method
|
|
142
|
+
result = self.client.delete_doc(table=index, ids=[int(id)])
|
|
143
|
+
return result
|
|
144
|
+
except Exception as e:
|
|
145
|
+
logger.error(
|
|
146
|
+
f"Failed to delete document from SQL database: table_name={index} id={id} error={e}"
|
|
147
|
+
)
|
|
148
|
+
return False
|
|
149
|
+
|
|
150
|
+
def list_docs(self, index: str, offset: int = 0, limit: int = 100) -> list[dict]:
|
|
151
|
+
logger.debug(f"Listing documents from SQL database: table_name={index}")
|
|
152
|
+
try:
|
|
153
|
+
return self.client.list_docs(table=index, offset=offset, limit=limit)
|
|
154
|
+
except Exception as e:
|
|
155
|
+
logger.error(
|
|
156
|
+
f"Failed to list documents from SQL database: table_name={index} error={e}"
|
|
157
|
+
)
|
|
158
|
+
return []
|
|
159
|
+
|
|
111
160
|
|
|
112
161
|
class VectorDatabaseAdapter:
|
|
113
162
|
def __init__(self, client):
|
|
@@ -152,6 +201,23 @@ class VectorDatabaseAdapter:
|
|
|
152
201
|
top_k=top_k,
|
|
153
202
|
)
|
|
154
203
|
|
|
204
|
+
def delete_doc(self, index: str, id: str) -> bool:
|
|
205
|
+
self._validate_index(index)
|
|
206
|
+
logger.debug(f"Deleting documents from vector database: index={index} id={id}")
|
|
207
|
+
try:
|
|
208
|
+
self.client.delete_by_id(collection_name=index, id=id)
|
|
209
|
+
return True
|
|
210
|
+
except Exception as e:
|
|
211
|
+
logger.error(
|
|
212
|
+
f"Failed to delete document from vector database: index={index} id={id} error={e}"
|
|
213
|
+
)
|
|
214
|
+
return False
|
|
215
|
+
|
|
216
|
+
def list_docs(self, index: str, offset: int = 0, limit: int = 1000) -> list[dict]:
|
|
217
|
+
self._validate_index(index)
|
|
218
|
+
logger.debug(f"Listing documents from vector database: index={index}")
|
|
219
|
+
return self.client.list_docs(collection_name=index, offset=offset, limit=limit)
|
|
220
|
+
|
|
155
221
|
|
|
156
222
|
class VikingDatabaseAdapter:
|
|
157
223
|
def __init__(self, client):
|
|
@@ -212,6 +278,16 @@ class VikingDatabaseAdapter:
|
|
|
212
278
|
|
|
213
279
|
return self.client.query(query, collection_name=index, top_k=top_k)
|
|
214
280
|
|
|
281
|
+
def delete_doc(self, index: str, id: str) -> bool:
|
|
282
|
+
self._validate_index(index)
|
|
283
|
+
logger.debug(f"Deleting documents from vector database: index={index} id={id}")
|
|
284
|
+
return self.client.delete_by_id(collection_name=index, id=id)
|
|
285
|
+
|
|
286
|
+
def list_docs(self, index: str, offset: int, limit: int) -> list[dict]:
|
|
287
|
+
self._validate_index(index)
|
|
288
|
+
logger.debug(f"Listing documents from vector database: index={index}")
|
|
289
|
+
return self.client.list_docs(collection_name=index, offset=offset, limit=limit)
|
|
290
|
+
|
|
215
291
|
|
|
216
292
|
class VikingMemoryDatabaseAdapter:
|
|
217
293
|
def __init__(self, client):
|
|
@@ -248,6 +324,12 @@ class VikingMemoryDatabaseAdapter:
|
|
|
248
324
|
result = self.client.query(query, collection_name=index, top_k=top_k, **kwargs)
|
|
249
325
|
return result
|
|
250
326
|
|
|
327
|
+
def delete_docs(self, index: str, ids: list[int]):
|
|
328
|
+
raise NotImplementedError("VikingMemoryDatabase does not support delete_docs")
|
|
329
|
+
|
|
330
|
+
def list_docs(self, index: str):
|
|
331
|
+
raise NotImplementedError("VikingMemoryDatabase does not support list_docs")
|
|
332
|
+
|
|
251
333
|
|
|
252
334
|
class LocalDatabaseAdapter:
|
|
253
335
|
def __init__(self, client):
|
|
@@ -261,6 +343,12 @@ class LocalDatabaseAdapter:
|
|
|
261
343
|
def query(self, query: str, **kwargs):
|
|
262
344
|
return self.client.query(query, **kwargs)
|
|
263
345
|
|
|
346
|
+
def delete_doc(self, index: str, id: str) -> bool:
|
|
347
|
+
return self.client.delete_doc(id)
|
|
348
|
+
|
|
349
|
+
def list_docs(self, index: str, offset: int = 0, limit: int = 100) -> list[dict]:
|
|
350
|
+
return self.client.list_docs(offset=offset, limit=limit)
|
|
351
|
+
|
|
264
352
|
|
|
265
353
|
MAPPING = {
|
|
266
354
|
"RedisDatabase": KVDatabaseAdapter,
|