veadk-python 0.2.5__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.5 → veadk_python-0.2.6}/PKG-INFO +1 -1
- {veadk_python-0.2.5 → veadk_python-0.2.6}/pyproject.toml +3 -2
- {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_agent.py +12 -6
- {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_runner.py +6 -2
- {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_tos.py +67 -8
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/agent.py +19 -7
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cli/cli_deploy.py +2 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cli/cli_init.py +25 -6
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/consts.py +20 -1
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/database_adapter.py +88 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/kv/redis_database.py +47 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/local_database.py +22 -4
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/relational/mysql_database.py +58 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/vector/opensearch_vector_database.py +6 -3
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/viking/viking_database.py +69 -0
- veadk_python-0.2.6/veadk/integrations/ve_cr/ve_cr.py +205 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/cookiecutter.json +2 -1
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/app.py +24 -1
- veadk_python-0.2.6/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/requirements.txt +3 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/run.sh +0 -7
- {veadk_python-0.2.5 → 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.5 → veadk_python-0.2.6}/veadk/integrations/ve_tos/ve_tos.py +92 -30
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/knowledgebase/knowledgebase.py +8 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/runner.py +49 -16
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/attributes/extractors/common_attributes_extractors.py +5 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/attributes/extractors/llm_attributes_extractors.py +253 -129
- {veadk_python-0.2.5 → 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.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/opentelemetry_tracer.py +11 -5
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/telemetry.py +19 -4
- veadk_python-0.2.6/veadk/utils/__init__.py +13 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/version.py +1 -1
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk_python.egg-info/PKG-INFO +1 -1
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk_python.egg-info/SOURCES.txt +22 -0
- veadk_python-0.2.5/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/requirements.txt +0 -1
- {veadk_python-0.2.5 → veadk_python-0.2.6}/LICENSE +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/README.md +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/setup.cfg +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_agent_card.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_cloud.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_evaluator.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_knowledgebase.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_long_term_memory.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_multiple_agents.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_runtime_data_collecting.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_short_term_memory.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_tracing.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/a2a/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/a2a/agent_card.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/a2a/remote_ve_agent.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/a2a/ve_a2a_server.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/a2a/ve_agent_executor.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/a2a/ve_task_store.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/agents/loop_agent.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/agents/parallel_agent.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/agents/sequential_agent.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cli/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cli/cli.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cli/cli_prompt.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cli/cli_web.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cloud/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cloud/cloud_agent_engine.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cloud/cloud_app.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/config.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/base_database.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/database_factory.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/kv/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/relational/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/vector/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/vector/type.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/viking/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/viking/viking_memory_db.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/adk_evaluator/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/adk_evaluator/adk_evaluator.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/base_evaluator.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/deepeval_evaluator/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/deepeval_evaluator/deepeval_evaluator.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/eval_set_file_loader.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/eval_set_recorder.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/types.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/utils/prometheus.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_apig/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_apig/ve_apig.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_apig/ve_apig_utils.py +0 -0
- {veadk_python-0.2.5/veadk/integrations/ve_faas → veadk_python-0.2.6/veadk/integrations/ve_cr}/__init__.py +0 -0
- {veadk_python-0.2.5/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.5/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.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/clean.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/config.yaml.example +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/deploy.py +0 -0
- {veadk_python-0.2.5/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.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/agent.py +0 -0
- {veadk_python-0.2.5 → 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.5 → 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.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/ve_faas_utils.py +0 -0
- {veadk_python-0.2.5/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.5/veadk/prompts → veadk_python-0.2.6/veadk/integrations/ve_prompt_pilot}/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_prompt_pilot/ve_prompt_pilot.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/knowledgebase/__init__.py +0 -0
- {veadk_python-0.2.5/veadk/tools → veadk_python-0.2.6/veadk/memory}/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/memory/long_term_memory.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/memory/short_term_memory.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/memory/short_term_memory_processor.py +0 -0
- {veadk_python-0.2.5/veadk/tools/builtin_tools → veadk_python-0.2.6/veadk/prompts}/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/prompts/agent_default_prompt.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/prompts/prompt_evaluator.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/prompts/prompt_memory_processor.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/prompts/prompt_optimization.py +0 -0
- {veadk_python-0.2.5/veadk/tools/sandbox → veadk_python-0.2.6/veadk/tools}/__init__.py +0 -0
- {veadk_python-0.2.5/veadk/tracing → veadk_python-0.2.6/veadk/tools/builtin_tools}/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/image_edit.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/image_generate.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/lark.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/las.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/mcp_router.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/vesearch.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/video_generate.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/web_scraper.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/web_search.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/demo_tools.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/load_knowledgebase_tool.py +0 -0
- {veadk_python-0.2.5/veadk/tracing/telemetry → veadk_python-0.2.6/veadk/tools/sandbox}/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/sandbox/browser_sandbox.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/sandbox/code_sandbox.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/sandbox/computer_sandbox.py +0 -0
- {veadk_python-0.2.5/veadk/tracing/telemetry/exporters → veadk_python-0.2.6/veadk/tracing}/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/base_tracer.py +0 -0
- {veadk_python-0.2.5/veadk/utils → veadk_python-0.2.6/veadk/tracing/telemetry}/__init__.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/attributes/attributes.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/attributes/extractors/tool_attributes_extractors.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/exporters/apmplus_exporter.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/exporters/base_exporter.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/exporters/cozeloop_exporter.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/exporters/inmemory_exporter.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/exporters/tls_exporter.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/types.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/utils/logger.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/utils/mcp_utils.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/utils/misc.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/utils/patches.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/utils/volcengine_sign.py +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk_python.egg-info/dependency_links.txt +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk_python.egg-info/entry_points.txt +0 -0
- {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk_python.egg-info/requires.txt +0 -0
- {veadk_python-0.2.5 → 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,7 +15,7 @@
|
|
|
15
15
|
from google.adk.tools import load_memory
|
|
16
16
|
|
|
17
17
|
from veadk import Agent
|
|
18
|
-
from veadk.consts import
|
|
18
|
+
from veadk.consts import DEFAULT_MODEL_EXTRA_CONFIG
|
|
19
19
|
from veadk.knowledgebase import KnowledgeBase
|
|
20
20
|
from veadk.memory.long_term_memory import LongTermMemory
|
|
21
21
|
from veadk.tools import load_knowledgebase_tool
|
|
@@ -27,14 +27,17 @@ def test_agent():
|
|
|
27
27
|
long_term_memory = LongTermMemory(backend="local")
|
|
28
28
|
tracer = OpentelemetryTracer()
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
extra_config = {
|
|
31
|
+
"extra_headers": {"thinking": "test"},
|
|
32
|
+
"extra_body": {"content": "test"},
|
|
33
|
+
}
|
|
31
34
|
|
|
32
35
|
agent = Agent(
|
|
33
36
|
model_name="test_model_name",
|
|
34
37
|
model_provider="test_model_provider",
|
|
35
38
|
model_api_key="test_model_api_key",
|
|
36
39
|
model_api_base="test_model_api_base",
|
|
37
|
-
|
|
40
|
+
model_extra_config=extra_config,
|
|
38
41
|
tools=[],
|
|
39
42
|
sub_agents=[],
|
|
40
43
|
knowledgebase=knowledgebase,
|
|
@@ -43,10 +46,13 @@ def test_agent():
|
|
|
43
46
|
serve_url="",
|
|
44
47
|
)
|
|
45
48
|
|
|
46
|
-
model_extra_headers |= DEFAULT_MODEL_EXTRA_HEADERS
|
|
47
|
-
|
|
48
49
|
assert agent.model.model == f"{agent.model_provider}/{agent.model_name}"
|
|
49
|
-
|
|
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
|
|
50
56
|
|
|
51
57
|
assert agent.knowledgebase == knowledgebase
|
|
52
58
|
assert agent.knowledgebase.backend == "local"
|
|
@@ -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
|
|
|
@@ -14,14 +14,29 @@
|
|
|
14
14
|
|
|
15
15
|
import pytest
|
|
16
16
|
from unittest import mock
|
|
17
|
-
|
|
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")
|
|
18
30
|
|
|
19
31
|
# 使用 pytest-asyncio
|
|
20
32
|
pytest_plugins = ("pytest_asyncio",)
|
|
21
33
|
|
|
22
34
|
|
|
23
35
|
@pytest.fixture
|
|
36
|
+
@require_tos
|
|
24
37
|
def mock_client(monkeypatch):
|
|
38
|
+
import veadk.integrations.ve_tos.ve_tos as tos_mod
|
|
39
|
+
|
|
25
40
|
fake_client = mock.Mock()
|
|
26
41
|
|
|
27
42
|
monkeypatch.setenv("DATABASE_TOS_REGION", "test-region")
|
|
@@ -33,9 +48,17 @@ def mock_client(monkeypatch):
|
|
|
33
48
|
|
|
34
49
|
class FakeExceptions:
|
|
35
50
|
class TosServerError(Exception):
|
|
36
|
-
def __init__(
|
|
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
|
+
):
|
|
37
60
|
super().__init__(msg)
|
|
38
|
-
self.status_code =
|
|
61
|
+
self.status_code = code
|
|
39
62
|
|
|
40
63
|
monkeypatch.setattr(tos_mod.tos, "exceptions", FakeExceptions)
|
|
41
64
|
monkeypatch.setattr(
|
|
@@ -44,17 +67,23 @@ def mock_client(monkeypatch):
|
|
|
44
67
|
type("S", (), {"Storage_Class_Standard": "STANDARD"}),
|
|
45
68
|
)
|
|
46
69
|
monkeypatch.setattr(
|
|
47
|
-
tos_mod.tos,
|
|
70
|
+
tos_mod.tos,
|
|
71
|
+
"ACLType",
|
|
72
|
+
type("A", (), {"ACL_Private": "private", "ACL_Public_Read": "public-read"}),
|
|
48
73
|
)
|
|
49
74
|
|
|
50
75
|
return fake_client
|
|
51
76
|
|
|
52
77
|
|
|
53
78
|
@pytest.fixture
|
|
79
|
+
@require_tos
|
|
54
80
|
def tos_client(mock_client):
|
|
81
|
+
import veadk.integrations.ve_tos.ve_tos as tos_mod
|
|
82
|
+
|
|
55
83
|
return tos_mod.VeTOS()
|
|
56
84
|
|
|
57
85
|
|
|
86
|
+
@require_tos
|
|
58
87
|
def test_create_bucket_exists(tos_client, mock_client):
|
|
59
88
|
mock_client.head_bucket.return_value = None # head_bucket 正常返回表示存在
|
|
60
89
|
result = tos_client.create_bucket()
|
|
@@ -62,9 +91,11 @@ def test_create_bucket_exists(tos_client, mock_client):
|
|
|
62
91
|
mock_client.create_bucket.assert_not_called()
|
|
63
92
|
|
|
64
93
|
|
|
94
|
+
@require_tos
|
|
65
95
|
def test_create_bucket_not_exists(tos_client, mock_client):
|
|
66
|
-
|
|
67
|
-
|
|
96
|
+
import veadk.integrations.ve_tos.ve_tos as tos_mod
|
|
97
|
+
|
|
98
|
+
exc = tos_mod.tos.exceptions.TosServerError(msg="not found", code=404)
|
|
68
99
|
mock_client.head_bucket.side_effect = exc
|
|
69
100
|
|
|
70
101
|
result = tos_client.create_bucket()
|
|
@@ -72,17 +103,19 @@ def test_create_bucket_not_exists(tos_client, mock_client):
|
|
|
72
103
|
mock_client.create_bucket.assert_called_once()
|
|
73
104
|
|
|
74
105
|
|
|
106
|
+
@require_tos
|
|
75
107
|
@pytest.mark.asyncio
|
|
76
108
|
async def test_upload_bytes_success(tos_client, mock_client):
|
|
77
109
|
mock_client.head_bucket.return_value = True
|
|
78
110
|
data = b"hello world"
|
|
79
111
|
|
|
80
112
|
result = await tos_client.upload("obj-key", data)
|
|
81
|
-
assert result is
|
|
113
|
+
assert result is None
|
|
82
114
|
mock_client.put_object.assert_called_once()
|
|
83
115
|
mock_client.close.assert_called_once()
|
|
84
116
|
|
|
85
117
|
|
|
118
|
+
@require_tos
|
|
86
119
|
@pytest.mark.asyncio
|
|
87
120
|
async def test_upload_file_success(tmp_path, tos_client, mock_client):
|
|
88
121
|
mock_client.head_bucket.return_value = True
|
|
@@ -90,11 +123,12 @@ async def test_upload_file_success(tmp_path, tos_client, mock_client):
|
|
|
90
123
|
file_path.write_text("hello file")
|
|
91
124
|
|
|
92
125
|
result = await tos_client.upload("obj-key", str(file_path))
|
|
93
|
-
assert result is
|
|
126
|
+
assert result is None
|
|
94
127
|
mock_client.put_object_from_file.assert_called_once()
|
|
95
128
|
mock_client.close.assert_called_once()
|
|
96
129
|
|
|
97
130
|
|
|
131
|
+
@require_tos
|
|
98
132
|
def test_download_success(tmp_path, tos_client, mock_client):
|
|
99
133
|
save_path = tmp_path / "out.txt"
|
|
100
134
|
mock_client.get_object.return_value = [b"abc", b"def"]
|
|
@@ -104,7 +138,32 @@ def test_download_success(tmp_path, tos_client, mock_client):
|
|
|
104
138
|
assert save_path.read_bytes() == b"abcdef"
|
|
105
139
|
|
|
106
140
|
|
|
141
|
+
@require_tos
|
|
107
142
|
def test_download_fail(tos_client, mock_client):
|
|
108
143
|
mock_client.get_object.side_effect = Exception("boom")
|
|
109
144
|
result = tos_client.download("obj-key", "somewhere.txt")
|
|
110
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,10 +28,10 @@ from typing_extensions import Any
|
|
|
28
28
|
|
|
29
29
|
from veadk.config import getenv
|
|
30
30
|
from veadk.consts import (
|
|
31
|
-
DEFAULT_MODEL_AGENT_PROVIDER,
|
|
32
31
|
DEFAULT_MODEL_AGENT_API_BASE,
|
|
33
32
|
DEFAULT_MODEL_AGENT_NAME,
|
|
34
|
-
|
|
33
|
+
DEFAULT_MODEL_AGENT_PROVIDER,
|
|
34
|
+
DEFAULT_MODEL_EXTRA_CONFIG,
|
|
35
35
|
)
|
|
36
36
|
from veadk.evaluation import EvalSetRecorder
|
|
37
37
|
from veadk.knowledgebase import KnowledgeBase
|
|
@@ -101,11 +101,23 @@ class Agent(LlmAgent):
|
|
|
101
101
|
def model_post_init(self, __context: Any) -> None:
|
|
102
102
|
super().model_post_init(None) # for sub_agents init
|
|
103
103
|
|
|
104
|
-
#
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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}")
|
|
109
121
|
|
|
110
122
|
if not self.model:
|
|
111
123
|
self.model = LiteLlm(
|
|
@@ -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
|
|
|
@@ -94,6 +95,7 @@ def deploy(
|
|
|
94
95
|
"veapig_service_name": veapig_service_name,
|
|
95
96
|
"veapig_upstream_name": veapig_upstream_name,
|
|
96
97
|
"use_adk_web": use_adk_web,
|
|
98
|
+
"veadk_version": VERSION,
|
|
97
99
|
}
|
|
98
100
|
|
|
99
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),
|
|
@@ -12,12 +12,27 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
import time
|
|
16
|
+
|
|
17
|
+
from veadk.config import getenv
|
|
15
18
|
from veadk.version import VERSION
|
|
16
19
|
|
|
17
20
|
DEFAULT_MODEL_AGENT_NAME = "doubao-seed-1-6-250615"
|
|
18
21
|
DEFAULT_MODEL_AGENT_PROVIDER = "openai"
|
|
19
22
|
DEFAULT_MODEL_AGENT_API_BASE = "https://ark.cn-beijing.volces.com/api/v3/"
|
|
20
|
-
|
|
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
|
+
}
|
|
21
36
|
|
|
22
37
|
DEFAULT_APMPLUS_OTEL_EXPORTER_ENDPOINT = "http://apmplus-cn-beijing.volces.com:4317"
|
|
23
38
|
DEFAULT_APMPLUS_OTEL_EXPORTER_SERVICE_NAME = "veadk_tracing"
|
|
@@ -28,3 +43,7 @@ DEFAULT_COZELOOP_OTEL_EXPORTER_ENDPOINT = (
|
|
|
28
43
|
|
|
29
44
|
DEFAULT_TLS_OTEL_EXPORTER_ENDPOINT = "https://tls-cn-beijing.volces.com:4318/v1/traces"
|
|
30
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,
|
|
@@ -110,3 +110,50 @@ class RedisDatabase(BaseModel, BaseDatabase):
|
|
|
110
110
|
except Exception as e:
|
|
111
111
|
logger.error(f"Failed to delete key `{key}`: {e}")
|
|
112
112
|
raise e
|
|
113
|
+
|
|
114
|
+
def delete_doc(self, key: str, id: str) -> bool:
|
|
115
|
+
"""Delete a specific document by ID from a Redis list.
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
key: The Redis key (list) to delete from
|
|
119
|
+
id: The ID of the document to delete
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
bool: True if deletion was successful, False otherwise
|
|
123
|
+
"""
|
|
124
|
+
try:
|
|
125
|
+
# Get all items in the list
|
|
126
|
+
items = self._client.lrange(key, 0, -1)
|
|
127
|
+
|
|
128
|
+
# Find the index of the item to delete
|
|
129
|
+
for i, item in enumerate(items):
|
|
130
|
+
# Assuming the item is stored as a JSON string with an 'id' field
|
|
131
|
+
# If it's just the content, we'll use the list index as ID
|
|
132
|
+
if str(i) == id:
|
|
133
|
+
self._client.lrem(key, 1, item)
|
|
134
|
+
return True
|
|
135
|
+
|
|
136
|
+
logger.warning(f"Document with id {id} not found in key {key}")
|
|
137
|
+
return False
|
|
138
|
+
except Exception as e:
|
|
139
|
+
logger.error(f"Failed to delete document with id {id} from key {key}: {e}")
|
|
140
|
+
return False
|
|
141
|
+
|
|
142
|
+
def list_docs(self, key: str) -> list[dict]:
|
|
143
|
+
"""List all documents in a Redis list.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
key: The Redis key (list) to list documents from
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
list[dict]: List of documents with id and content
|
|
150
|
+
"""
|
|
151
|
+
try:
|
|
152
|
+
items = self._client.lrange(key, 0, -1)
|
|
153
|
+
return [
|
|
154
|
+
{"id": str(i), "content": item, "metadata": {}}
|
|
155
|
+
for i, item in enumerate(items)
|
|
156
|
+
]
|
|
157
|
+
except Exception as e:
|
|
158
|
+
logger.error(f"Failed to list documents from key {key}: {e}")
|
|
159
|
+
return []
|
|
@@ -24,20 +24,38 @@ class LocalDataBase(BaseDatabase):
|
|
|
24
24
|
|
|
25
25
|
def __init__(self, **kwargs):
|
|
26
26
|
super().__init__()
|
|
27
|
-
self.data =
|
|
27
|
+
self.data = {}
|
|
28
28
|
self._type = "local"
|
|
29
|
+
self._next_id = 0 # Used to generate unique IDs
|
|
29
30
|
|
|
30
31
|
def add_texts(self, texts: list[str], **kwargs):
|
|
31
|
-
|
|
32
|
+
for text in texts:
|
|
33
|
+
self.data[str(self._next_id)] = text
|
|
34
|
+
self._next_id += 1
|
|
32
35
|
|
|
33
36
|
def is_empty(self):
|
|
34
37
|
return len(self.data) == 0
|
|
35
38
|
|
|
36
39
|
def query(self, query: str, **kwargs: Any) -> list[str]:
|
|
37
|
-
return self.data
|
|
40
|
+
return list(self.data.values())
|
|
38
41
|
|
|
39
42
|
def delete(self, **kwargs: Any):
|
|
40
|
-
self.data =
|
|
43
|
+
self.data = {}
|
|
41
44
|
|
|
42
45
|
def add(self, texts: list[str], **kwargs: Any):
|
|
43
46
|
return self.add_texts(texts)
|
|
47
|
+
|
|
48
|
+
def list_docs(self, **kwargs: Any) -> list[dict]:
|
|
49
|
+
return [
|
|
50
|
+
{"id": id, "content": content, "metadata": {}}
|
|
51
|
+
for id, content in self.data.items()
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
def delete_doc(self, id: str, **kwargs: Any):
|
|
55
|
+
if id not in self.data:
|
|
56
|
+
raise ValueError(f"id {id} not found")
|
|
57
|
+
try:
|
|
58
|
+
del self.data[id]
|
|
59
|
+
return True
|
|
60
|
+
except Exception:
|
|
61
|
+
return False
|