veadk-python 0.5.22__tar.gz → 0.5.23__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.
- {veadk_python-0.5.22/veadk_python.egg-info → veadk_python-0.5.23}/PKG-INFO +1 -1
- {veadk_python-0.5.22 → veadk_python-0.5.23}/pyproject.toml +1 -1
- veadk_python-0.5.23/veadk/knowledgebase/backends/context_search_backend.py +639 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/knowledgebase/knowledgebase.py +9 -1
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/skills/skill.py +1 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/skills/utils.py +13 -15
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/toolkits/apps/reverse_mcp/server_with_reverse_mcp.py +17 -2
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/execute_skills.py +1 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/skills_tools/skills_tool.py +83 -1
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tracing/telemetry/exporters/apmplus_exporter.py +8 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/version.py +1 -1
- {veadk_python-0.5.22 → veadk_python-0.5.23/veadk_python.egg-info}/PKG-INFO +1 -1
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk_python.egg-info/SOURCES.txt +1 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/LICENSE +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/README.md +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/setup.cfg +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/tests/test_agent.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/tests/test_cloud.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/tests/test_evaluator.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/tests/test_knowledgebase.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/tests/test_long_term_memory.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/tests/test_misc.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/tests/test_multiple_agents.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/tests/test_runner.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/tests/test_runtime_data_collecting.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/tests/test_short_term_memory.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/tests/test_tracing.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/tests/test_ve_a2a_middlewares.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/tests/test_ve_identity_auth_config.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/tests/test_ve_identity_function_tool.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/tests/test_ve_identity_mcp_tool.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/tests/test_ve_identity_mcp_toolset.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/a2a/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/a2a/agent_card.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/a2a/hub/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/a2a/hub/a2a_hub_client.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/a2a/hub/a2a_hub_server.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/a2a/hub/models.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/a2a/hub/rocketmq_middleware.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/a2a/remote_ve_agent.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/a2a/utils/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/a2a/utils/agent_to_a2a.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/a2a/ve_a2a_server.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/a2a/ve_agent_executor.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/a2a/ve_middlewares.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/a2a/ve_task_store.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/agent.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/agent_builder.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/agents/loop_agent.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/agents/parallel_agent.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/agents/sequential_agent.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/agents/supervise_agent.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/base_auth.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/middleware/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/middleware/oauth2_auth.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/ve_credential_service.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/veauth/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/veauth/apmplus_veauth.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/veauth/ark_veauth.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/veauth/base_veauth.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/veauth/cozeloop_veauth.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/veauth/mse_veauth.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/veauth/opensearch_veauth.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/veauth/postgresql_veauth.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/veauth/prompt_pilot_veauth.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/veauth/speech_veauth.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/veauth/utils.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/veauth/vesearch_veauth.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/auth/veauth/viking_mem0_veauth.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/cli.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/cli_agentkit.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/cli_clean.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/cli_create.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/cli_deploy.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/cli_eval.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/cli_init.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/cli_kb.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/cli_pipeline.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/cli_prompt.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/cli_rl.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/cli_update.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/cli_uploadevalset.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/cli_web.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/templates/rl/ark/README.md +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/templates/rl/ark/arkworkspace.toml +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/templates/rl/ark/data/demo_dataset.jsonl +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/templates/rl/ark/job.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/templates/rl/ark/job.yaml +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/templates/rl/ark/plugins/random_reward.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/templates/rl/ark/plugins/raw_async_veadk_rollout.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/templates/rl/ark/plugins/test_utils.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/templates/rl/ark/requirements.txt +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/templates/rl/ark/test_faas.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/templates/rl/lightning/README.md +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/templates/rl/lightning/data/demo_test.parquet +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/templates/rl/lightning/data/demo_train.parquet +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/templates/rl/lightning/demo_calculate_agent.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/templates/rl/lightning/restart_ray.sh +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cli/templates/rl/lightning/train.sh +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cloud/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cloud/cloud_agent_engine.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/cloud/cloud_app.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/community/langchain_ai/checkpoint/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/community/langchain_ai/checkpoint/memory/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/community/langchain_ai/middlewares/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/community/langchain_ai/middlewares/save_session.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/community/langchain_ai/models/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/community/langchain_ai/models/ark_model.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/community/langchain_ai/store/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/community/langchain_ai/store/memory/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/community/langchain_ai/store/memory/viking_memory.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/community/langchain_ai/tools/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/community/langchain_ai/tools/execute_skills.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/community/langchain_ai/tools/load_knowledgebase.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/community/langchain_ai/tools/load_memory.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/community/langchain_ai/tools/run_code.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/community/langchain_ai/tools/web_search.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/config.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/configs/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/configs/auth_configs.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/configs/database_configs.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/configs/dynamic_config_manager.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/configs/model_configs.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/configs/tool_configs.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/configs/tracing_configs.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/consts.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/evaluation/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/evaluation/adk_evaluator/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/evaluation/adk_evaluator/adk_evaluator.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/evaluation/base_evaluator.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/evaluation/deepeval_evaluator/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/evaluation/deepeval_evaluator/deepeval_evaluator.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/evaluation/eval_set_file_loader.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/evaluation/eval_set_recorder.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/evaluation/types.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/evaluation/utils/prometheus.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/examples/in_memory_example_store.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/examples/types.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/flows/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/flows/supervise_auto_flow.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/flows/supervise_single_flow.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_apig/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_apig/ve_apig.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_apig/ve_apig_utils.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_code_pipeline/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_code_pipeline/ve_code_pipeline.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_cozeloop/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_cozeloop/ve_cozeloop.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_cr/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_cr/ve_cr.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/template/cookiecutter.json +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/clean.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/config.yaml.example +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/deploy.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/agent.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/app.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/requirements.txt +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/run.sh +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{ cookiecutter.app_name }}/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{ cookiecutter.app_name }}/agent.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/ve_faas.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/ve_faas_utils.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/cookiecutter.json +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/clean.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/config.yaml.example +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/deploy.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/Dockerfile +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/app.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/init_db.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/models.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/requirements.txt +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/run.sh +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/css/style.css +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/js/admin.js +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/dashboard.html +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/edit_post.html +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/login.html +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/posts.html +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/base.html +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/index.html +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/post.html +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_identity/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_identity/auth_config.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_identity/auth_mixins.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_identity/auth_processor.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_identity/function_tool.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_identity/identity_client.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_identity/mcp_tool.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_identity/mcp_toolset.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_identity/models.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_identity/token_manager.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_identity/utils.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_prompt_pilot/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_prompt_pilot/ve_prompt_pilot.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_tls/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_tls/utils.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_tls/ve_tls.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_tos/ve_tos.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_viking_db_memory/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/integrations/ve_viking_db_memory/ve_viking_db_memory.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/knowledgebase/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/knowledgebase/backends/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/knowledgebase/backends/base_backend.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/knowledgebase/backends/in_memory_backend.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/knowledgebase/backends/opensearch_backend.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/knowledgebase/backends/redis_backend.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/knowledgebase/backends/tos_vector_backend.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/knowledgebase/backends/utils.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/knowledgebase/backends/vikingdb_knowledge_backend.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/knowledgebase/entry.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/knowledgebase/types.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/long_term_memory.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/long_term_memory_backends/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/long_term_memory_backends/base_backend.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/long_term_memory_backends/in_memory_backend.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/long_term_memory_backends/mem0_backend.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/long_term_memory_backends/opensearch_backend.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/long_term_memory_backends/redis_backend.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/long_term_memory_backends/vikingdb_memory_backend.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/save_session_callback.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/short_term_memory.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/short_term_memory_backends/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/short_term_memory_backends/base_backend.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/short_term_memory_backends/mysql_backend.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/short_term_memory_backends/postgresql_backend.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/short_term_memory_backends/sqlite_backend.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/short_term_memory_processor.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/memory/types.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/models/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/models/ark_embedding.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/models/ark_llm.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/processors/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/processors/base_run_processor.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/prompts/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/prompts/agent_default_prompt.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/prompts/prompt_evaluator.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/prompts/prompt_manager.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/prompts/prompt_memory_processor.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/prompts/prompt_optimization.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/realtime/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/realtime/client.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/realtime/doubao_realtime_voice_llm.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/realtime/doubao_realtime_voice_llm_connection.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/realtime/live.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/realtime/protocol.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/reflector/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/reflector/base_reflector.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/reflector/local_reflector.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/runner.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/skills/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/skills/check_skills_callback.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/toolkits/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/toolkits/apps/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/toolkits/apps/reverse_mcp/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/toolkits/apps/reverse_mcp/client_with_reverse_mcp.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/toolkits/audio/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/toolkits/audio/asr/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/toolkits/audio/asr/asr_client.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/toolkits/audio/tts/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/toolkits/audio/tts/protocols.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/toolkits/audio/tts/tts_client.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/toolkits/dataset_auto_gen_callback.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/agent_authorization.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/generate_image.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/image_edit.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/image_generate.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/lark.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/las.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/link_reader.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/llm_shield.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/load_kb_queries.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/load_knowledgebase.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/mcp_router.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/mobile_run.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/parallel_web_search.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/playwright.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/run_code.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/supabase_toolset.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/tts.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/vesearch.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/video_generate.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/vod.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/web_scraper.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/builtin_tools/web_search.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/demo_tools.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/ghost_char.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/load_history_events.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/load_knowledgebase_tool.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/mcp_tool/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/mcp_tool/trusted_mcp_session_manager.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/mcp_tool/trusted_mcp_toolset.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/sandbox/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/sandbox/browser_sandbox.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/sandbox/code_sandbox.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/sandbox/computer_sandbox.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/skills_tools/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/skills_tools/bash_tool.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/skills_tools/download_skills_tool.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/skills_tools/file_tool.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/skills_tools/register_skills_tool.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/skills_tools/session_path.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tools/skills_tools/skills_toolset.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tracing/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tracing/base_tracer.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tracing/telemetry/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tracing/telemetry/attributes/attributes.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tracing/telemetry/attributes/extractors/common_attributes_extractors.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tracing/telemetry/attributes/extractors/llm_attributes_extractors.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tracing/telemetry/attributes/extractors/tool_attributes_extractors.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tracing/telemetry/attributes/extractors/types.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tracing/telemetry/exporters/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tracing/telemetry/exporters/base_exporter.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tracing/telemetry/exporters/cozeloop_exporter.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tracing/telemetry/exporters/inmemory_exporter.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tracing/telemetry/exporters/tls_exporter.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tracing/telemetry/opentelemetry_tracer.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/tracing/telemetry/telemetry.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/types.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/utils/__init__.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/utils/audio_manager.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/utils/auth.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/utils/logger.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/utils/mcp_utils.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/utils/misc.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/utils/patches.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk/utils/volcengine_sign.py +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk_python.egg-info/dependency_links.txt +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk_python.egg-info/entry_points.txt +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/veadk_python.egg-info/requires.txt +0 -0
- {veadk_python-0.5.22 → veadk_python-0.5.23}/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.5.
|
|
3
|
+
Version: 0.5.23
|
|
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
|
|
@@ -0,0 +1,639 @@
|
|
|
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 json
|
|
16
|
+
import os
|
|
17
|
+
import uuid
|
|
18
|
+
import tempfile
|
|
19
|
+
import shutil
|
|
20
|
+
from typing import Any
|
|
21
|
+
from urllib.parse import urlparse
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
from pydantic import Field
|
|
24
|
+
from typing_extensions import override
|
|
25
|
+
|
|
26
|
+
import veadk.config # noqa E401
|
|
27
|
+
from veadk.knowledgebase.backends.base_backend import BaseKnowledgebaseBackend
|
|
28
|
+
from veadk.utils.logger import get_logger
|
|
29
|
+
from veadk.utils.volcengine_sign import ve_request
|
|
30
|
+
import requests
|
|
31
|
+
|
|
32
|
+
logger = get_logger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class ContextSearchBackend(BaseKnowledgebaseBackend):
|
|
36
|
+
"""Context Search backend implementation for knowledge base operations.
|
|
37
|
+
|
|
38
|
+
This backend integrates with Volcengine Context Search service to provide
|
|
39
|
+
document indexing, storage, and semantic search capabilities. It supports
|
|
40
|
+
multiple data sources including files, directories, and raw text.
|
|
41
|
+
|
|
42
|
+
Attributes:
|
|
43
|
+
volcengine_access_key: Volcengine access key for API authentication.
|
|
44
|
+
volcengine_secret_key: Volcengine secret key for API authentication.
|
|
45
|
+
volcengine_session_token: Optional session token for temporary credentials.
|
|
46
|
+
context_search_region: Region where the Context Search service is deployed.
|
|
47
|
+
context_search_project: Project name in Context Search.
|
|
48
|
+
context_search_engine_id: Engine ID for the search endpoint.
|
|
49
|
+
context_search_engine_endpoint: Full URL of the search endpoint.
|
|
50
|
+
context_search_engine_apikey: API key for search operations.
|
|
51
|
+
context_search_service: Service identifier for API requests.
|
|
52
|
+
context_search_version: API version string.
|
|
53
|
+
context_search_host: Hostname for the Context Search API.
|
|
54
|
+
context_search_scheme: Protocol scheme (http or https).
|
|
55
|
+
|
|
56
|
+
Example:
|
|
57
|
+
>>> backend = ContextSearchBackend(
|
|
58
|
+
... index="123456789",
|
|
59
|
+
... volcengine_access_key="your-ak",
|
|
60
|
+
... volcengine_secret_key="your-sk",
|
|
61
|
+
... )
|
|
62
|
+
>>> backend.add_from_text("Sample document content")
|
|
63
|
+
>>> results = backend.search("query", top_k=5)
|
|
64
|
+
|
|
65
|
+
Note:
|
|
66
|
+
Configuration can be provided via constructor parameters or environment
|
|
67
|
+
variables. Environment variables take precedence over config file values.
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
volcengine_access_key: str | None = Field(
|
|
71
|
+
default_factory=lambda: os.getenv("VOLCENGINE_ACCESS_KEY")
|
|
72
|
+
)
|
|
73
|
+
volcengine_secret_key: str | None = Field(
|
|
74
|
+
default_factory=lambda: os.getenv("VOLCENGINE_SECRET_KEY")
|
|
75
|
+
)
|
|
76
|
+
volcengine_session_token: str | None = Field(
|
|
77
|
+
default_factory=lambda: os.getenv("VOLCENGINE_SESSION_TOKEN")
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
context_search_region: str | None = Field(
|
|
81
|
+
default_factory=lambda: os.getenv("DATABASE_CONTEXT_SEARCH_REGION")
|
|
82
|
+
)
|
|
83
|
+
context_search_project: str | None = Field(
|
|
84
|
+
default_factory=lambda: os.getenv("DATABASE_CONTEXT_SEARCH_PROJECT")
|
|
85
|
+
)
|
|
86
|
+
context_search_engine_id: str | None = Field(
|
|
87
|
+
default_factory=lambda: os.getenv("DATABASE_CONTEXT_SEARCH_ENGINE_ID")
|
|
88
|
+
)
|
|
89
|
+
context_search_engine_endpoint: str | None = Field(
|
|
90
|
+
default_factory=lambda: os.getenv("DATABASE_CONTEXT_SEARCH_ENGINE_ENDPOINT")
|
|
91
|
+
)
|
|
92
|
+
context_search_engine_apikey: str | None = Field(
|
|
93
|
+
default_factory=lambda: os.getenv("DATABASE_CONTEXT_SEARCH_ENGINE_APIKEY")
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
context_search_service: str = "ctxsearch"
|
|
97
|
+
context_search_version: str = "2025-09-01"
|
|
98
|
+
context_search_host: str = "ctxsearch.volcengineapi.com"
|
|
99
|
+
context_search_scheme: str = "https"
|
|
100
|
+
|
|
101
|
+
def model_post_init(self, __context: Any) -> None:
|
|
102
|
+
"""Initialize additional attributes after model instantiation.
|
|
103
|
+
|
|
104
|
+
This method is automatically called after the model is initialized.
|
|
105
|
+
It handles cloud provider-specific configurations and sets default
|
|
106
|
+
values for region and project if not provided.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
__context: Pydantic internal context (unused).
|
|
110
|
+
"""
|
|
111
|
+
provider = (os.getenv("CLOUD_PROVIDER") or "").lower()
|
|
112
|
+
is_byteplus = provider == "byteplus"
|
|
113
|
+
if is_byteplus and "volcengineapi.com" in self.context_search_host:
|
|
114
|
+
self.context_search_host = self.context_search_host.replace(
|
|
115
|
+
"volcengineapi.com",
|
|
116
|
+
"byteplusapi.com",
|
|
117
|
+
)
|
|
118
|
+
if not self.context_search_region:
|
|
119
|
+
self.context_search_region = (
|
|
120
|
+
"ap-southeast-1" if is_byteplus else "cn-beijing"
|
|
121
|
+
)
|
|
122
|
+
if not self.context_search_project:
|
|
123
|
+
self.context_search_project = "default"
|
|
124
|
+
|
|
125
|
+
def _get_scene_id(self) -> str:
|
|
126
|
+
"""Retrieve the scene ID for Context Search operations.
|
|
127
|
+
|
|
128
|
+
Returns the scene identifier used for API requests. Prefers
|
|
129
|
+
context_search_engine_id if set, otherwise falls back to index.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
str: The scene ID as a numeric string.
|
|
133
|
+
"""
|
|
134
|
+
return self.context_search_engine_id or self.index
|
|
135
|
+
|
|
136
|
+
def _do_request(
|
|
137
|
+
self,
|
|
138
|
+
action: str,
|
|
139
|
+
method: str = "POST",
|
|
140
|
+
query: dict | None = None,
|
|
141
|
+
request_body: dict | None = None,
|
|
142
|
+
) -> dict:
|
|
143
|
+
"""Execute a signed request to the Context Search API.
|
|
144
|
+
|
|
145
|
+
This internal method handles the authentication and communication
|
|
146
|
+
with the Context Search service. It automatically signs requests
|
|
147
|
+
using Volcengine credentials and handles error responses.
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
action: The API action/operation name (e.g., "GetScene", "AddSceneData").
|
|
151
|
+
method: HTTP method for the request. Defaults to "POST".
|
|
152
|
+
query: Optional query parameters for GET requests.
|
|
153
|
+
request_body: Optional JSON body for POST/PUT requests.
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
dict: The "Result" field from the API response.
|
|
157
|
+
|
|
158
|
+
Raises:
|
|
159
|
+
ValueError: If the API returns an error response.
|
|
160
|
+
|
|
161
|
+
Example:
|
|
162
|
+
>>> result = self._do_request(
|
|
163
|
+
... action="GetScene",
|
|
164
|
+
... method="GET",
|
|
165
|
+
... query={"Project": "default", "Id": "12345"}
|
|
166
|
+
... )
|
|
167
|
+
"""
|
|
168
|
+
header = {}
|
|
169
|
+
if self.volcengine_session_token:
|
|
170
|
+
header["X-Security-Token"] = self.volcengine_session_token
|
|
171
|
+
|
|
172
|
+
res = ve_request(
|
|
173
|
+
request_body=request_body or {},
|
|
174
|
+
action=action,
|
|
175
|
+
ak=self.volcengine_access_key,
|
|
176
|
+
sk=self.volcengine_secret_key,
|
|
177
|
+
service=self.context_search_service,
|
|
178
|
+
version=self.context_search_version,
|
|
179
|
+
region=self.context_search_region,
|
|
180
|
+
host=self.context_search_host,
|
|
181
|
+
scheme=self.context_search_scheme,
|
|
182
|
+
query=query or {},
|
|
183
|
+
header=header,
|
|
184
|
+
method=method,
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
if res.get("ResponseMetadata", {}).get("Error"):
|
|
188
|
+
error = res["ResponseMetadata"]["Error"]
|
|
189
|
+
raise ValueError(
|
|
190
|
+
f"Context Search API Error (Action: {action}): {error.get('Message')} (Code: {error.get('Code')})"
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
return res.get("Result")
|
|
194
|
+
|
|
195
|
+
@override
|
|
196
|
+
def precheck_index_naming(self) -> None:
|
|
197
|
+
"""Validate the index format and verify its existence in Context Search.
|
|
198
|
+
|
|
199
|
+
This method performs two checks:
|
|
200
|
+
1. Validates that the scene ID is a numeric string (required by Context Search)
|
|
201
|
+
2. Makes an API call to verify the scene exists and is accessible
|
|
202
|
+
|
|
203
|
+
Raises:
|
|
204
|
+
ValueError: If the scene ID is not a numeric string or if the scene
|
|
205
|
+
does not exist in Context Search.
|
|
206
|
+
|
|
207
|
+
Example:
|
|
208
|
+
>>> backend = ContextSearchBackend(index="123456789", ...)
|
|
209
|
+
>>> backend.precheck_index_naming() # Validates and verifies the scene
|
|
210
|
+
# Logs: Successfully verified index '123456789' via GetScene.
|
|
211
|
+
"""
|
|
212
|
+
scene_id = self._get_scene_id()
|
|
213
|
+
if not (isinstance(scene_id, str) and scene_id.isdigit()):
|
|
214
|
+
raise ValueError(
|
|
215
|
+
f"The index name (Scene Id) must be a numeric string (long), got: {scene_id}"
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
self._do_request(
|
|
219
|
+
action="GetScene",
|
|
220
|
+
method="GET",
|
|
221
|
+
query={
|
|
222
|
+
"Project": self.context_search_project,
|
|
223
|
+
"SceneType": "RAG",
|
|
224
|
+
"Id": scene_id,
|
|
225
|
+
},
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
logger.info(f"Successfully verified index '{scene_id}' via GetScene.")
|
|
229
|
+
|
|
230
|
+
@override
|
|
231
|
+
def add_from_directory(self, directory: str, *args, **kwargs) -> bool:
|
|
232
|
+
"""Index all files from a directory into the knowledge base.
|
|
233
|
+
|
|
234
|
+
Recursively scans the specified directory and indexes all files found.
|
|
235
|
+
The files are uploaded to Context Search for processing and embedding.
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
directory: Path to the directory containing files to index.
|
|
239
|
+
*args: Additional positional arguments passed to add_from_files.
|
|
240
|
+
**kwargs: Additional keyword arguments passed to add_from_files.
|
|
241
|
+
|
|
242
|
+
Returns:
|
|
243
|
+
bool: True if all files were successfully queued for indexing.
|
|
244
|
+
|
|
245
|
+
Raises:
|
|
246
|
+
ValueError: If the directory does not exist, is not a directory,
|
|
247
|
+
or contains no files.
|
|
248
|
+
|
|
249
|
+
Example:
|
|
250
|
+
>>> backend.add_from_directory("/path/to/documents")
|
|
251
|
+
# Indexes all files in the directory recursively
|
|
252
|
+
"""
|
|
253
|
+
logger.info(f"Adding from directory: {directory}")
|
|
254
|
+
dir_path = Path(directory)
|
|
255
|
+
if not dir_path.exists() or not dir_path.is_dir():
|
|
256
|
+
raise ValueError(f"Directory not found: {directory}")
|
|
257
|
+
files = [str(path) for path in dir_path.rglob("*") if path.is_file()]
|
|
258
|
+
if not files:
|
|
259
|
+
raise ValueError(f"No files found in directory: {directory}")
|
|
260
|
+
return self.add_from_files(files, *args, **kwargs)
|
|
261
|
+
|
|
262
|
+
@override
|
|
263
|
+
def add_from_files(self, files: list[str], *args, **kwargs) -> bool:
|
|
264
|
+
"""Index a list of files into the knowledge base.
|
|
265
|
+
|
|
266
|
+
Uploads files to Context Search for processing and embedding generation.
|
|
267
|
+
The upload process involves:
|
|
268
|
+
1. Validating all files exist
|
|
269
|
+
2. Obtaining pre-signed upload URLs from Context Search
|
|
270
|
+
3. Uploading files directly to TOS (Volcengine Object Storage)
|
|
271
|
+
4. Registering the uploaded files with Context Search for indexing
|
|
272
|
+
|
|
273
|
+
Note:
|
|
274
|
+
This operation is asynchronous. Files are queued for indexing and
|
|
275
|
+
may not be immediately searchable. Use search() after a reasonable
|
|
276
|
+
delay to allow indexing to complete.
|
|
277
|
+
|
|
278
|
+
Args:
|
|
279
|
+
files: List of file paths to index.
|
|
280
|
+
*args: Additional positional arguments (reserved for future use).
|
|
281
|
+
**kwargs: Additional keyword arguments (reserved for future use).
|
|
282
|
+
|
|
283
|
+
Returns:
|
|
284
|
+
bool: True if files were successfully uploaded and queued for indexing.
|
|
285
|
+
|
|
286
|
+
Raises:
|
|
287
|
+
ValueError: If any file does not exist or if the upload fails.
|
|
288
|
+
|
|
289
|
+
Example:
|
|
290
|
+
>>> files = ["/docs/doc1.pdf", "/docs/doc2.txt"]
|
|
291
|
+
>>> backend.add_from_files(files)
|
|
292
|
+
# Files uploaded asynchronously. Wait for Context Search indexing...
|
|
293
|
+
"""
|
|
294
|
+
logger.info(f"Adding from files: {files}")
|
|
295
|
+
self._validate_files(files)
|
|
296
|
+
|
|
297
|
+
uuid_prefix, upload_infos = self._get_upload_url(files)
|
|
298
|
+
file_info_list = []
|
|
299
|
+
for upload in upload_infos:
|
|
300
|
+
file_path = upload.get("file_path")
|
|
301
|
+
tos_path = upload.get("tos_path")
|
|
302
|
+
upload_url = upload.get("upload_url")
|
|
303
|
+
headers = upload.get("headers") or {}
|
|
304
|
+
self._upload_file(file_path, upload_url, headers)
|
|
305
|
+
file_info_list.append(
|
|
306
|
+
json.dumps(
|
|
307
|
+
{
|
|
308
|
+
"file_path": tos_path,
|
|
309
|
+
}
|
|
310
|
+
)
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
self._do_request(
|
|
314
|
+
action="AddSceneData",
|
|
315
|
+
method="POST",
|
|
316
|
+
request_body={
|
|
317
|
+
"Project": self.context_search_project,
|
|
318
|
+
"SceneType": "RAG",
|
|
319
|
+
"SceneId": self._get_scene_id(),
|
|
320
|
+
"Type": "LOCAL",
|
|
321
|
+
"FileInfoList": file_info_list,
|
|
322
|
+
"TosConfig": {
|
|
323
|
+
"Prefix": uuid_prefix,
|
|
324
|
+
},
|
|
325
|
+
},
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
logger.info(
|
|
329
|
+
f"Files uploaded asynchronously. Wait for Context Search indexing to complete before searching. files={files}"
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
return True
|
|
333
|
+
|
|
334
|
+
@override
|
|
335
|
+
def add_from_text(self, text: str | list[str], *args, **kwargs) -> bool:
|
|
336
|
+
"""Index raw text content into the knowledge base.
|
|
337
|
+
|
|
338
|
+
Converts text content into temporary files and indexes them. This is useful
|
|
339
|
+
for indexing content that is generated dynamically or retrieved from
|
|
340
|
+
external sources without persisting to disk first.
|
|
341
|
+
|
|
342
|
+
Note:
|
|
343
|
+
Temporary files are created in a system temp directory and are
|
|
344
|
+
automatically cleaned up after indexing, regardless of success or failure.
|
|
345
|
+
|
|
346
|
+
Args:
|
|
347
|
+
text: Single text string or list of text strings to index.
|
|
348
|
+
*args: Additional positional arguments passed to add_from_files.
|
|
349
|
+
**kwargs: Additional keyword arguments passed to add_from_files.
|
|
350
|
+
|
|
351
|
+
Returns:
|
|
352
|
+
bool: True if text was successfully queued for indexing.
|
|
353
|
+
|
|
354
|
+
Raises:
|
|
355
|
+
ValueError: If text is empty or if file operations fail.
|
|
356
|
+
|
|
357
|
+
Example:
|
|
358
|
+
>>> backend.add_from_text("This is a sample document.")
|
|
359
|
+
>>> backend.add_from_text(["Doc 1 content", "Doc 2 content"])
|
|
360
|
+
"""
|
|
361
|
+
if isinstance(text, str):
|
|
362
|
+
texts = [text]
|
|
363
|
+
else:
|
|
364
|
+
texts = text
|
|
365
|
+
|
|
366
|
+
file_paths = []
|
|
367
|
+
temp_dir = tempfile.mkdtemp()
|
|
368
|
+
try:
|
|
369
|
+
for i, t in enumerate(texts):
|
|
370
|
+
file_path = Path(temp_dir) / f"text_{uuid.uuid4().hex}_{i}.txt"
|
|
371
|
+
with open(file_path, "w", encoding="utf-8") as f:
|
|
372
|
+
f.write(t)
|
|
373
|
+
file_paths.append(str(file_path))
|
|
374
|
+
|
|
375
|
+
return self.add_from_files(file_paths, *args, **kwargs)
|
|
376
|
+
finally:
|
|
377
|
+
shutil.rmtree(temp_dir)
|
|
378
|
+
|
|
379
|
+
@override
|
|
380
|
+
def search(self, query: str, top_k: int = 5) -> list[str]:
|
|
381
|
+
"""Perform semantic search against the indexed knowledge base.
|
|
382
|
+
|
|
383
|
+
Sends a search query to the Context Search engine and returns relevant
|
|
384
|
+
document chunks based on semantic similarity. The search uses the
|
|
385
|
+
configured engine endpoint and API key for authentication.
|
|
386
|
+
|
|
387
|
+
Args:
|
|
388
|
+
query: The search query string.
|
|
389
|
+
top_k: Maximum number of results to return. Defaults to 5.
|
|
390
|
+
|
|
391
|
+
Returns:
|
|
392
|
+
list[str]: List of document content strings matching the query,
|
|
393
|
+
ordered by relevance (most relevant first).
|
|
394
|
+
|
|
395
|
+
Raises:
|
|
396
|
+
ValueError: If the engine endpoint or API key is not configured,
|
|
397
|
+
if the API returns an error, or if the response is invalid.
|
|
398
|
+
|
|
399
|
+
Example:
|
|
400
|
+
>>> results = backend.search("machine learning", top_k=3)
|
|
401
|
+
>>> for doc in results:
|
|
402
|
+
... print(doc)
|
|
403
|
+
"""
|
|
404
|
+
if not self.context_search_engine_endpoint:
|
|
405
|
+
raise ValueError("Context Search engine endpoint is not set.")
|
|
406
|
+
if not self.context_search_engine_apikey:
|
|
407
|
+
raise ValueError("Context Search engine apikey is not set.")
|
|
408
|
+
|
|
409
|
+
headers = {
|
|
410
|
+
"Content-Type": "application/json",
|
|
411
|
+
"Authorization": f"Bearer {self.context_search_engine_apikey}",
|
|
412
|
+
}
|
|
413
|
+
url = f"{self.context_search_engine_endpoint}/v2/search"
|
|
414
|
+
json_data = {"text": query, "size": top_k}
|
|
415
|
+
response = requests.post(url, json=json_data, headers=headers)
|
|
416
|
+
try:
|
|
417
|
+
result = response.json()
|
|
418
|
+
except ValueError:
|
|
419
|
+
text = response.text.strip()
|
|
420
|
+
raise ValueError(
|
|
421
|
+
f"Context Search response is not JSON. status={response.status_code}, body={text[:500]}"
|
|
422
|
+
)
|
|
423
|
+
if result.get("error"):
|
|
424
|
+
raise ValueError(result.get("error").get("message"))
|
|
425
|
+
return [
|
|
426
|
+
doc.get("content").get("sys.content") or ""
|
|
427
|
+
for doc in result.get("documents", [])
|
|
428
|
+
]
|
|
429
|
+
|
|
430
|
+
def _get_upload_url(self, files: list[str]) -> tuple[str, list[dict]]:
|
|
431
|
+
"""Obtain pre-signed upload URLs for file indexing.
|
|
432
|
+
|
|
433
|
+
Requests upload URLs from Context Search API for the specified files.
|
|
434
|
+
The returned URLs are pre-signed for direct upload to TOS (Volcengine
|
|
435
|
+
Object Storage) without requiring additional authentication.
|
|
436
|
+
|
|
437
|
+
Args:
|
|
438
|
+
files: List of file paths to be uploaded.
|
|
439
|
+
|
|
440
|
+
Returns:
|
|
441
|
+
tuple[str, list[dict]]: A tuple containing:
|
|
442
|
+
- UUID prefix string used for organizing uploads
|
|
443
|
+
- List of upload information dictionaries with keys:
|
|
444
|
+
file_path, file_name, upload_url, tos_path, headers
|
|
445
|
+
|
|
446
|
+
Raises:
|
|
447
|
+
ValueError: If the files list is empty or if the API response
|
|
448
|
+
is missing required upload information.
|
|
449
|
+
|
|
450
|
+
Note:
|
|
451
|
+
This is an internal method typically called by add_from_files().
|
|
452
|
+
"""
|
|
453
|
+
if not files:
|
|
454
|
+
raise ValueError("Files list is empty.")
|
|
455
|
+
|
|
456
|
+
uuid_prefix = str(uuid.uuid4())
|
|
457
|
+
res = self._do_request(
|
|
458
|
+
action="GetIndexerUploadFileInfo",
|
|
459
|
+
method="POST",
|
|
460
|
+
request_body={
|
|
461
|
+
"UuidPrefix": uuid_prefix,
|
|
462
|
+
"SseEnabled": False,
|
|
463
|
+
"FileInfos": self._build_file_infos(files),
|
|
464
|
+
},
|
|
465
|
+
)
|
|
466
|
+
upload_file_infos = res.get("UploadFileInfos") or []
|
|
467
|
+
if not upload_file_infos:
|
|
468
|
+
raise ValueError("UploadFileInfos is empty.")
|
|
469
|
+
|
|
470
|
+
results = []
|
|
471
|
+
for index, info in enumerate(upload_file_infos):
|
|
472
|
+
upload_url = info.get("UploadUrl")
|
|
473
|
+
if not upload_url:
|
|
474
|
+
raise ValueError("UploadUrl is missing in UploadFileInfos.")
|
|
475
|
+
if index >= len(files):
|
|
476
|
+
raise ValueError("UploadFileInfos size does not match files list.")
|
|
477
|
+
file_path = files[index]
|
|
478
|
+
file_name = os.path.basename(file_path)
|
|
479
|
+
tos_path = self._build_tos_path(upload_url, file_path)
|
|
480
|
+
results.append(
|
|
481
|
+
{
|
|
482
|
+
"file_path": file_path,
|
|
483
|
+
"file_name": file_name,
|
|
484
|
+
"upload_url": upload_url,
|
|
485
|
+
"tos_path": tos_path,
|
|
486
|
+
"headers": self._normalize_headers(info.get("Headers")),
|
|
487
|
+
}
|
|
488
|
+
)
|
|
489
|
+
return uuid_prefix, results
|
|
490
|
+
|
|
491
|
+
def _validate_files(self, files: list[str]) -> None:
|
|
492
|
+
"""Validate that all files in the list exist and are accessible.
|
|
493
|
+
|
|
494
|
+
Performs existence checks on all file paths before attempting upload.
|
|
495
|
+
This prevents partial uploads and provides clear error messages for
|
|
496
|
+
missing files.
|
|
497
|
+
|
|
498
|
+
Args:
|
|
499
|
+
files: List of file paths to validate.
|
|
500
|
+
|
|
501
|
+
Raises:
|
|
502
|
+
ValueError: If the files list is empty or if any file does not exist.
|
|
503
|
+
|
|
504
|
+
Note:
|
|
505
|
+
This is an internal method called by add_from_files() to ensure
|
|
506
|
+
all files are available before initiating the upload process.
|
|
507
|
+
"""
|
|
508
|
+
if not files:
|
|
509
|
+
raise ValueError("Files list is empty.")
|
|
510
|
+
for path in files:
|
|
511
|
+
if not Path(path).exists():
|
|
512
|
+
raise ValueError(f"File not found: {path}")
|
|
513
|
+
|
|
514
|
+
def _build_file_infos(self, files: list[str]) -> list[dict]:
|
|
515
|
+
"""Build file metadata for upload requests.
|
|
516
|
+
|
|
517
|
+
Extracts file name and size information required by the Context Search
|
|
518
|
+
API when requesting upload URLs.
|
|
519
|
+
|
|
520
|
+
Args:
|
|
521
|
+
files: List of file paths to extract metadata from.
|
|
522
|
+
|
|
523
|
+
Returns:
|
|
524
|
+
list[dict]: List of file info dictionaries containing:
|
|
525
|
+
- Name: The base filename
|
|
526
|
+
- Size: File size in bytes
|
|
527
|
+
|
|
528
|
+
Note:
|
|
529
|
+
This is an internal method used by _get_upload_url() to construct
|
|
530
|
+
the request body for the GetIndexerUploadFileInfo API call.
|
|
531
|
+
"""
|
|
532
|
+
return [
|
|
533
|
+
{
|
|
534
|
+
"Name": os.path.basename(file),
|
|
535
|
+
"Size": os.path.getsize(file),
|
|
536
|
+
}
|
|
537
|
+
for file in files
|
|
538
|
+
]
|
|
539
|
+
|
|
540
|
+
def _normalize_headers(self, headers: object) -> dict:
|
|
541
|
+
"""Normalize HTTP headers from various formats to a dictionary.
|
|
542
|
+
|
|
543
|
+
Context Search API may return headers in different formats (dict or list
|
|
544
|
+
of key-value pairs). This method normalizes them into a standard
|
|
545
|
+
dictionary format for use with the requests library.
|
|
546
|
+
|
|
547
|
+
Args:
|
|
548
|
+
headers: Headers in various formats (None, dict, or list of dicts).
|
|
549
|
+
List format may contain {"Key": "...", "Value": "..."} objects
|
|
550
|
+
or direct key-value mappings.
|
|
551
|
+
|
|
552
|
+
Returns:
|
|
553
|
+
dict: Normalized headers as a dictionary mapping header names to values.
|
|
554
|
+
|
|
555
|
+
Raises:
|
|
556
|
+
ValueError: If headers is in an unrecognized format.
|
|
557
|
+
|
|
558
|
+
Note:
|
|
559
|
+
This is an internal method used by _get_upload_url() to process
|
|
560
|
+
the Headers field from the GetIndexerUploadFileInfo API response.
|
|
561
|
+
"""
|
|
562
|
+
if not headers:
|
|
563
|
+
return {}
|
|
564
|
+
if isinstance(headers, dict):
|
|
565
|
+
return headers
|
|
566
|
+
if not isinstance(headers, list):
|
|
567
|
+
raise ValueError("Headers format is invalid.")
|
|
568
|
+
normalized_headers: dict[str, str] = {}
|
|
569
|
+
for item in headers:
|
|
570
|
+
if not isinstance(item, dict):
|
|
571
|
+
continue
|
|
572
|
+
if "Key" in item and "Value" in item:
|
|
573
|
+
normalized_headers[item["Key"]] = item["Value"]
|
|
574
|
+
continue
|
|
575
|
+
for key, value in item.items():
|
|
576
|
+
normalized_headers[key] = value
|
|
577
|
+
return normalized_headers
|
|
578
|
+
|
|
579
|
+
def _upload_file(self, file_path: str, upload_url: str, headers: dict) -> None:
|
|
580
|
+
"""Upload a single file to TOS using a pre-signed URL.
|
|
581
|
+
|
|
582
|
+
Performs a direct HTTP PUT upload to Volcengine Object Storage (TOS)
|
|
583
|
+
using a pre-signed URL obtained from Context Search. The pre-signed
|
|
584
|
+
URL contains temporary authentication credentials.
|
|
585
|
+
|
|
586
|
+
Args:
|
|
587
|
+
file_path: Local path to the file to upload.
|
|
588
|
+
upload_url: Pre-signed URL for uploading to TOS.
|
|
589
|
+
headers: HTTP headers required for the upload (e.g., Content-Type).
|
|
590
|
+
|
|
591
|
+
Raises:
|
|
592
|
+
ValueError: If the upload fails (non-2xx status code).
|
|
593
|
+
|
|
594
|
+
Note:
|
|
595
|
+
This is an internal method called by add_from_files() for each file.
|
|
596
|
+
The file is opened in binary mode and streamed to minimize memory usage.
|
|
597
|
+
"""
|
|
598
|
+
with open(file_path, "rb") as file_handle:
|
|
599
|
+
response = requests.put(upload_url, data=file_handle, headers=headers)
|
|
600
|
+
if response.status_code not in (200, 201, 204):
|
|
601
|
+
raise ValueError(
|
|
602
|
+
f"Upload failed for {file_path}: {response.status_code} {response.text}"
|
|
603
|
+
)
|
|
604
|
+
|
|
605
|
+
def _build_tos_path(self, upload_url: str, file_path: str) -> str:
|
|
606
|
+
"""Construct a TOS (Tinder Object Storage) URI from an upload URL.
|
|
607
|
+
|
|
608
|
+
Parses the pre-signed upload URL to extract the bucket name and object
|
|
609
|
+
key prefix, then constructs a TOS URI in the format:
|
|
610
|
+
tos://{bucket}/{prefix}/{filename}
|
|
611
|
+
|
|
612
|
+
Args:
|
|
613
|
+
upload_url: The pre-signed URL from Context Search API.
|
|
614
|
+
file_path: Original local file path (used for filename extraction).
|
|
615
|
+
|
|
616
|
+
Returns:
|
|
617
|
+
str: TOS URI in the format "tos://bucket/prefix/filename".
|
|
618
|
+
|
|
619
|
+
Raises:
|
|
620
|
+
ValueError: If the upload URL is missing hostname or path components.
|
|
621
|
+
|
|
622
|
+
Example:
|
|
623
|
+
>>> url = "https://mybucket.tos-cn-beijing.volces.com/prefix/obj?token=xxx"
|
|
624
|
+
>>> backend._build_tos_path(url, "/local/path/file.txt")
|
|
625
|
+
'tos://mybucket/prefix/file.txt'
|
|
626
|
+
|
|
627
|
+
Note:
|
|
628
|
+
This is an internal method used by _get_upload_url() to construct
|
|
629
|
+
the TOS path for registering uploaded files with Context Search.
|
|
630
|
+
"""
|
|
631
|
+
parsed_url = urlparse(upload_url)
|
|
632
|
+
hostname = parsed_url.hostname or ""
|
|
633
|
+
if not hostname:
|
|
634
|
+
raise ValueError("UploadUrl hostname is missing.")
|
|
635
|
+
bucket = hostname.split(".")[0]
|
|
636
|
+
path_segments = parsed_url.path.lstrip("/").split("/")
|
|
637
|
+
if not path_segments or not path_segments[0]:
|
|
638
|
+
raise ValueError("UploadUrl path is missing.")
|
|
639
|
+
return f"tos://{bucket}/{path_segments[0]}/{os.path.basename(file_path)}"
|
|
@@ -59,6 +59,12 @@ def _get_backend_cls(backend: str) -> type[BaseKnowledgebaseBackend]:
|
|
|
59
59
|
)
|
|
60
60
|
|
|
61
61
|
return VikingDBKnowledgeBackend
|
|
62
|
+
case "context_search":
|
|
63
|
+
from veadk.knowledgebase.backends.context_search_backend import (
|
|
64
|
+
ContextSearchBackend,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
return ContextSearchBackend
|
|
62
68
|
case _:
|
|
63
69
|
raise ValueError(f"Unsupported knowledgebase backend: {backend}")
|
|
64
70
|
except ImportError as e:
|
|
@@ -102,7 +108,9 @@ class KnowledgeBase(BaseModel):
|
|
|
102
108
|
description: str = "This knowledgebase stores some user-related information."
|
|
103
109
|
|
|
104
110
|
backend: Union[
|
|
105
|
-
Literal[
|
|
111
|
+
Literal[
|
|
112
|
+
"local", "opensearch", "viking", "redis", "tos_vector", "context_search"
|
|
113
|
+
],
|
|
106
114
|
BaseKnowledgebaseBackend,
|
|
107
115
|
] = "local"
|
|
108
116
|
|
|
@@ -23,6 +23,7 @@ class Skill(BaseModel):
|
|
|
23
23
|
skill_space_id: Optional[str] = None
|
|
24
24
|
bucket_name: Optional[str] = None
|
|
25
25
|
checklist: List[Dict[str, str]] = []
|
|
26
|
+
id: Optional[str] = None
|
|
26
27
|
|
|
27
28
|
def get_checklist_items(self) -> List[str]:
|
|
28
29
|
return [item.get("item", item.get("id", "")) for item in self.checklist]
|