veadk-python 0.2.22__tar.gz → 0.2.24__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.2.22/veadk_python.egg-info → veadk_python-0.2.24}/PKG-INFO +4 -2
- {veadk_python-0.2.22 → veadk_python-0.2.24}/pyproject.toml +4 -2
- {veadk_python-0.2.22 → veadk_python-0.2.24}/tests/test_cloud.py +6 -0
- veadk_python-0.2.24/tests/test_ve_a2a_middlewares.py +321 -0
- veadk_python-0.2.24/veadk/a2a/remote_ve_agent.py +390 -0
- veadk_python-0.2.24/veadk/a2a/utils/agent_to_a2a.py +170 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/a2a/ve_a2a_server.py +18 -3
- veadk_python-0.2.24/veadk/a2a/ve_middlewares.py +313 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/agent.py +18 -0
- veadk_python-0.2.24/veadk/auth/ve_credential_service.py +203 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/cli/cli_clean.py +7 -9
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/cli/cli_deploy.py +36 -10
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/cli/cli_init.py +37 -1
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/cli/cli_update.py +5 -5
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/cloud/cloud_agent_engine.py +124 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/cloud/cloud_app.py +20 -1
- veadk_python-0.2.24/veadk/configs/auth_configs.py +133 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_apig/ve_apig.py +134 -9
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/template/cookiecutter.json +3 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/deploy.py +3 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/ve_faas.py +34 -9
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/cookiecutter.json +3 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/deploy.py +3 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_identity/__init__.py +3 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_identity/auth_config.py +15 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_identity/auth_mixins.py +2 -6
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_identity/auth_processor.py +4 -7
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_identity/identity_client.py +364 -10
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_identity/models.py +6 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_identity/token_manager.py +16 -13
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_viking_db_memory/ve_viking_db_memory.py +17 -2
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/knowledgebase/backends/redis_backend.py +3 -3
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/knowledgebase/backends/vikingdb_knowledge_backend.py +17 -3
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/knowledgebase/knowledgebase.py +1 -1
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/memory/short_term_memory.py +6 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/memory/short_term_memory_backends/mysql_backend.py +9 -1
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/memory/short_term_memory_backends/postgresql_backend.py +9 -3
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/memory/short_term_memory_backends/sqlite_backend.py +8 -1
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/runner.py +13 -1
- veadk_python-0.2.24/veadk/tools/builtin_tools/agent_authorization.py +94 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/builtin_tools/run_code.py +7 -3
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/builtin_tools/video_generate.py +5 -2
- veadk_python-0.2.24/veadk/utils/__init__.py +13 -0
- veadk_python-0.2.24/veadk/utils/auth.py +294 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/utils/patches.py +2 -2
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/version.py +1 -1
- {veadk_python-0.2.22 → veadk_python-0.2.24/veadk_python.egg-info}/PKG-INFO +4 -2
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk_python.egg-info/SOURCES.txt +7 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk_python.egg-info/requires.txt +3 -1
- veadk_python-0.2.22/veadk/a2a/remote_ve_agent.py +0 -198
- veadk_python-0.2.22/veadk/configs/auth_configs.py +0 -57
- {veadk_python-0.2.22 → veadk_python-0.2.24}/LICENSE +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/README.md +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/setup.cfg +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/tests/test_agent.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/tests/test_evaluator.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/tests/test_knowledgebase.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/tests/test_long_term_memory.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/tests/test_misc.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/tests/test_multiple_agents.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/tests/test_runner.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/tests/test_runtime_data_collecting.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/tests/test_short_term_memory.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/tests/test_tracing.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/tests/test_ve_identity_auth_config.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/tests/test_ve_identity_function_tool.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/tests/test_ve_identity_mcp_tool.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/tests/test_ve_identity_mcp_toolset.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/a2a/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/a2a/agent_card.py +0 -0
- {veadk_python-0.2.22/veadk/auth → veadk_python-0.2.24/veadk/a2a/utils}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/a2a/ve_agent_executor.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/a2a/ve_task_store.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/agent_builder.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/agents/loop_agent.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/agents/parallel_agent.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/agents/sequential_agent.py +0 -0
- {veadk_python-0.2.22/veadk/auth/veauth → veadk_python-0.2.24/veadk/auth}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/auth/base_auth.py +0 -0
- {veadk_python-0.2.22/veadk/cli → veadk_python-0.2.24/veadk/auth/veauth}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/auth/veauth/apmplus_veauth.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/auth/veauth/ark_veauth.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/auth/veauth/base_veauth.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/auth/veauth/cozeloop_veauth.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/auth/veauth/opensearch_veauth.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/auth/veauth/postgresql_veauth.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/auth/veauth/prompt_pilot_veauth.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/auth/veauth/speech_veauth.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/auth/veauth/utils.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/auth/veauth/vesearch_veauth.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/auth/veauth/viking_mem0_veauth.py +0 -0
- {veadk_python-0.2.22/veadk/cloud → veadk_python-0.2.24/veadk/cli}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/cli/cli.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/cli/cli_create.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/cli/cli_eval.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/cli/cli_kb.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/cli/cli_pipeline.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/cli/cli_prompt.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/cli/cli_uploadevalset.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/cli/cli_web.py +0 -0
- {veadk_python-0.2.22/veadk/configs → veadk_python-0.2.24/veadk/cloud}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/config.py +0 -0
- {veadk_python-0.2.22/veadk/integrations → veadk_python-0.2.24/veadk/configs}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/configs/database_configs.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/configs/model_configs.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/configs/tool_configs.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/configs/tracing_configs.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/consts.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/evaluation/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/evaluation/adk_evaluator/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/evaluation/adk_evaluator/adk_evaluator.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/evaluation/base_evaluator.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/evaluation/deepeval_evaluator/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/evaluation/deepeval_evaluator/deepeval_evaluator.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/evaluation/eval_set_file_loader.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/evaluation/eval_set_recorder.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/evaluation/types.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/evaluation/utils/prometheus.py +0 -0
- {veadk_python-0.2.22/veadk/integrations/ve_apig → veadk_python-0.2.24/veadk/integrations}/__init__.py +0 -0
- {veadk_python-0.2.22/veadk/integrations/ve_code_pipeline → veadk_python-0.2.24/veadk/integrations/ve_apig}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_apig/ve_apig_utils.py +0 -0
- {veadk_python-0.2.22/veadk/integrations/ve_cozeloop → veadk_python-0.2.24/veadk/integrations/ve_code_pipeline}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_code_pipeline/ve_code_pipeline.py +0 -0
- {veadk_python-0.2.22/veadk/integrations/ve_cr → veadk_python-0.2.24/veadk/integrations/ve_cozeloop}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_cozeloop/ve_cozeloop.py +0 -0
- {veadk_python-0.2.22/veadk/integrations/ve_faas → veadk_python-0.2.24/veadk/integrations/ve_cr}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_cr/ve_cr.py +0 -0
- {veadk_python-0.2.22/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}} → veadk_python-0.2.24/veadk/integrations/ve_faas}/__init__.py +0 -0
- {veadk_python-0.2.22/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src → veadk_python-0.2.24/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/clean.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/config.yaml.example +0 -0
- {veadk_python-0.2.22/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}} → veadk_python-0.2.24/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/agent.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/app.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/requirements.txt +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/run.sh +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{ cookiecutter.app_name }}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{ cookiecutter.app_name }}/agent.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/ve_faas_utils.py +0 -0
- {veadk_python-0.2.22/veadk/integrations/ve_prompt_pilot → veadk_python-0.2.24/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/clean.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/config.yaml.example +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/Dockerfile +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/app.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/init_db.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/models.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/requirements.txt +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/run.sh +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/css/style.css +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/js/admin.js +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/dashboard.html +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/edit_post.html +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/login.html +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/posts.html +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/base.html +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/index.html +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/post.html +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_identity/function_tool.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_identity/mcp_tool.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_identity/mcp_toolset.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_identity/utils.py +0 -0
- {veadk_python-0.2.22/veadk/integrations/ve_tls → veadk_python-0.2.24/veadk/integrations/ve_prompt_pilot}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_prompt_pilot/ve_prompt_pilot.py +0 -0
- {veadk_python-0.2.22/veadk/integrations/ve_viking_db_memory → veadk_python-0.2.24/veadk/integrations/ve_tls}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_tls/utils.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_tls/ve_tls.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/integrations/ve_tos/ve_tos.py +0 -0
- {veadk_python-0.2.22/veadk/knowledgebase/backends → veadk_python-0.2.24/veadk/integrations/ve_viking_db_memory}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/knowledgebase/__init__.py +0 -0
- {veadk_python-0.2.22/veadk/memory/long_term_memory_backends → veadk_python-0.2.24/veadk/knowledgebase/backends}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/knowledgebase/backends/base_backend.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/knowledgebase/backends/in_memory_backend.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/knowledgebase/backends/opensearch_backend.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/knowledgebase/backends/utils.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/knowledgebase/entry.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/memory/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/memory/long_term_memory.py +0 -0
- {veadk_python-0.2.22/veadk/memory/short_term_memory_backends → veadk_python-0.2.24/veadk/memory/long_term_memory_backends}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/memory/long_term_memory_backends/base_backend.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/memory/long_term_memory_backends/in_memory_backend.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/memory/long_term_memory_backends/mem0_backend.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/memory/long_term_memory_backends/opensearch_backend.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/memory/long_term_memory_backends/redis_backend.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/memory/long_term_memory_backends/vikingdb_memory_backend.py +0 -0
- {veadk_python-0.2.22/veadk/prompts → veadk_python-0.2.24/veadk/memory/short_term_memory_backends}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/memory/short_term_memory_backends/base_backend.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/memory/short_term_memory_processor.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/processors/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/processors/base_run_processor.py +0 -0
- {veadk_python-0.2.22/veadk/tools → veadk_python-0.2.24/veadk/prompts}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/prompts/agent_default_prompt.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/prompts/prompt_evaluator.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/prompts/prompt_memory_processor.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/prompts/prompt_optimization.py +0 -0
- {veadk_python-0.2.22/veadk/tools/builtin_tools → veadk_python-0.2.24/veadk/tools}/__init__.py +0 -0
- {veadk_python-0.2.22/veadk/tools/sandbox → veadk_python-0.2.24/veadk/tools/builtin_tools}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/builtin_tools/generate_image.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/builtin_tools/image_edit.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/builtin_tools/image_generate.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/builtin_tools/lark.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/builtin_tools/las.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/builtin_tools/link_reader.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/builtin_tools/llm_shield.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/builtin_tools/load_knowledgebase.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/builtin_tools/mcp_router.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/builtin_tools/tts.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/builtin_tools/vesearch.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/builtin_tools/web_scraper.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/builtin_tools/web_search.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/demo_tools.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/load_knowledgebase_tool.py +0 -0
- {veadk_python-0.2.22/veadk/tracing → veadk_python-0.2.24/veadk/tools/sandbox}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/sandbox/browser_sandbox.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/sandbox/code_sandbox.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tools/sandbox/computer_sandbox.py +0 -0
- {veadk_python-0.2.22/veadk/tracing/telemetry → veadk_python-0.2.24/veadk/tracing}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tracing/base_tracer.py +0 -0
- {veadk_python-0.2.22/veadk/tracing/telemetry/exporters → veadk_python-0.2.24/veadk/tracing/telemetry}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tracing/telemetry/attributes/attributes.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tracing/telemetry/attributes/extractors/common_attributes_extractors.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tracing/telemetry/attributes/extractors/llm_attributes_extractors.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tracing/telemetry/attributes/extractors/tool_attributes_extractors.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tracing/telemetry/attributes/extractors/types.py +0 -0
- {veadk_python-0.2.22/veadk/utils → veadk_python-0.2.24/veadk/tracing/telemetry/exporters}/__init__.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tracing/telemetry/exporters/apmplus_exporter.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tracing/telemetry/exporters/base_exporter.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tracing/telemetry/exporters/cozeloop_exporter.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tracing/telemetry/exporters/inmemory_exporter.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tracing/telemetry/exporters/tls_exporter.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tracing/telemetry/opentelemetry_tracer.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/tracing/telemetry/telemetry.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/types.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/utils/audio_manager.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/utils/logger.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/utils/mcp_utils.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/utils/misc.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk/utils/volcengine_sign.py +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk_python.egg-info/dependency_links.txt +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/veadk_python.egg-info/entry_points.txt +0 -0
- {veadk_python-0.2.22 → veadk_python-0.2.24}/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.24
|
|
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
|
|
@@ -218,7 +218,7 @@ Requires-Dist: opentelemetry-exporter-otlp>=1.35.0
|
|
|
218
218
|
Requires-Dist: opentelemetry-instrumentation-logging>=0.56b0
|
|
219
219
|
Requires-Dist: wrapt>=1.17.2
|
|
220
220
|
Requires-Dist: openai<1.100
|
|
221
|
-
Requires-Dist: volcengine-python-sdk>=4.0.
|
|
221
|
+
Requires-Dist: volcengine-python-sdk>=4.0.33
|
|
222
222
|
Requires-Dist: volcengine>=1.0.193
|
|
223
223
|
Requires-Dist: agent-pilot-sdk>=0.1.2
|
|
224
224
|
Requires-Dist: fastmcp>=2.11.3
|
|
@@ -229,7 +229,9 @@ Requires-Dist: llama-index-embeddings-openai-like>=0.2.2
|
|
|
229
229
|
Requires-Dist: llama-index-llms-openai-like>=0.5.1
|
|
230
230
|
Requires-Dist: llama-index-vector-stores-opensearch>=0.6.1
|
|
231
231
|
Requires-Dist: psycopg2-binary>=2.9.10
|
|
232
|
+
Requires-Dist: asyncpg>=0.29.0
|
|
232
233
|
Requires-Dist: pymysql>=1.1.1
|
|
234
|
+
Requires-Dist: aiomysql>=0.3.2
|
|
233
235
|
Requires-Dist: opensearch-py==2.8.0
|
|
234
236
|
Requires-Dist: filetype>=1.2.0
|
|
235
237
|
Provides-Extra: extensions
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "veadk-python"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.24"
|
|
4
4
|
description = "Volcengine agent development kit, integrations with Volcengine cloud services."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -22,7 +22,7 @@ dependencies = [
|
|
|
22
22
|
"opentelemetry-instrumentation-logging>=0.56b0",
|
|
23
23
|
"wrapt>=1.17.2", # For patching built-in functions
|
|
24
24
|
"openai<1.100", # For fix https://github.com/BerriAI/litellm/issues/13710
|
|
25
|
-
"volcengine-python-sdk>=4.0.
|
|
25
|
+
"volcengine-python-sdk>=4.0.33", # For Volcengine API
|
|
26
26
|
"volcengine>=1.0.193", # For Volcengine sign
|
|
27
27
|
"agent-pilot-sdk>=0.1.2", # Prompt optimization by Volcengine AgentPilot/PromptPilot toolkits
|
|
28
28
|
"fastmcp>=2.11.3", # For running MCP
|
|
@@ -33,7 +33,9 @@ dependencies = [
|
|
|
33
33
|
"llama-index-llms-openai-like>=0.5.1",
|
|
34
34
|
"llama-index-vector-stores-opensearch>=0.6.1",
|
|
35
35
|
"psycopg2-binary>=2.9.10", # For PostgreSQL database (short term memory)
|
|
36
|
+
"asyncpg>=0.29.0", # For async PostgreSQL database (short term memory)
|
|
36
37
|
"pymysql>=1.1.1", # For MySQL database (short term memory)
|
|
38
|
+
"aiomysql>=0.3.2", # For async MySQL database (short term memory)
|
|
37
39
|
"opensearch-py==2.8.0",
|
|
38
40
|
"filetype>=1.2.0",
|
|
39
41
|
]
|
|
@@ -61,6 +61,12 @@ async def test_cloud():
|
|
|
61
61
|
mock_vefaas_service.find_app_id_by_name.return_value = "app-123"
|
|
62
62
|
mock_vefaas_service.delete.return_value = None
|
|
63
63
|
|
|
64
|
+
mock_vefaas_service.get_application_route.return_value = (
|
|
65
|
+
"gw-123",
|
|
66
|
+
"svc-456",
|
|
67
|
+
"route-789",
|
|
68
|
+
)
|
|
69
|
+
|
|
64
70
|
# Test CloudAgentEngine creation and deploy functionality
|
|
65
71
|
engine = CloudAgentEngine()
|
|
66
72
|
|
|
@@ -0,0 +1,321 @@
|
|
|
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
|
+
"""Unit tests for A2A authentication middleware."""
|
|
16
|
+
|
|
17
|
+
import pytest
|
|
18
|
+
from unittest.mock import Mock, patch
|
|
19
|
+
from starlette.applications import Starlette
|
|
20
|
+
from starlette.requests import Request
|
|
21
|
+
from starlette.responses import Response
|
|
22
|
+
|
|
23
|
+
from veadk.a2a.ve_middlewares import A2AAuthMiddleware, build_a2a_auth_middleware
|
|
24
|
+
from veadk.auth.ve_credential_service import VeCredentialService
|
|
25
|
+
from veadk.utils.auth import VE_TIP_TOKEN_HEADER
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@pytest.fixture
|
|
29
|
+
def credential_service():
|
|
30
|
+
"""Create a VeCredentialService instance for testing."""
|
|
31
|
+
return VeCredentialService()
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@pytest.fixture
|
|
35
|
+
def mock_identity_client():
|
|
36
|
+
"""Create a mock IdentityClient."""
|
|
37
|
+
mock_client = Mock()
|
|
38
|
+
mock_client.get_workload_access_token = Mock()
|
|
39
|
+
return mock_client
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@pytest.fixture
|
|
43
|
+
def sample_jwt_token():
|
|
44
|
+
"""Sample JWT token for testing."""
|
|
45
|
+
# This is a sample JWT with sub="user123" and act claim
|
|
46
|
+
# Header: {"alg": "HS256", "typ": "JWT"}
|
|
47
|
+
# Payload: {"sub": "user123", "act": {"sub": "agent1"}}
|
|
48
|
+
return "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMTIzIiwiYWN0Ijp7InN1YiI6ImFnZW50MSJ9fQ.signature"
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class TestA2AAuthMiddleware:
|
|
52
|
+
"""Tests for A2AAuthMiddleware class."""
|
|
53
|
+
|
|
54
|
+
def test_middleware_initialization(self, credential_service, mock_identity_client):
|
|
55
|
+
"""Test middleware initialization with all parameters."""
|
|
56
|
+
app = Starlette()
|
|
57
|
+
middleware = A2AAuthMiddleware(
|
|
58
|
+
app=app,
|
|
59
|
+
app_name="test_app",
|
|
60
|
+
credential_service=credential_service,
|
|
61
|
+
auth_method="header",
|
|
62
|
+
token_param="token",
|
|
63
|
+
credential_key="test_key",
|
|
64
|
+
identity_client=mock_identity_client,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
assert middleware.app_name == "test_app"
|
|
68
|
+
assert middleware.credential_service == credential_service
|
|
69
|
+
assert middleware.auth_method == "header"
|
|
70
|
+
assert middleware.token_param == "token"
|
|
71
|
+
assert middleware.credential_key == "test_key"
|
|
72
|
+
assert middleware.identity_client == mock_identity_client
|
|
73
|
+
|
|
74
|
+
def test_middleware_default_identity_client(self, credential_service):
|
|
75
|
+
"""Test middleware uses global identity client when not provided."""
|
|
76
|
+
app = Starlette()
|
|
77
|
+
|
|
78
|
+
with patch(
|
|
79
|
+
"veadk.a2a.ve_middlewares.get_default_identity_client"
|
|
80
|
+
) as mock_get_client:
|
|
81
|
+
mock_client = Mock()
|
|
82
|
+
mock_get_client.return_value = mock_client
|
|
83
|
+
|
|
84
|
+
middleware = A2AAuthMiddleware(
|
|
85
|
+
app=app,
|
|
86
|
+
app_name="test_app",
|
|
87
|
+
credential_service=credential_service,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
mock_get_client.assert_called_once()
|
|
91
|
+
assert middleware.identity_client == mock_client
|
|
92
|
+
|
|
93
|
+
def test_extract_token_from_header_with_bearer(self, credential_service):
|
|
94
|
+
"""Test extracting token from Authorization header with Bearer prefix."""
|
|
95
|
+
app = Starlette()
|
|
96
|
+
middleware = A2AAuthMiddleware(
|
|
97
|
+
app=app,
|
|
98
|
+
app_name="test_app",
|
|
99
|
+
credential_service=credential_service,
|
|
100
|
+
auth_method="header",
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
# Create mock request
|
|
104
|
+
mock_request = Mock(spec=Request)
|
|
105
|
+
mock_request.headers = {"Authorization": "Bearer test_token_123"}
|
|
106
|
+
|
|
107
|
+
token, has_prefix = middleware._extract_token(mock_request)
|
|
108
|
+
|
|
109
|
+
assert token == "test_token_123"
|
|
110
|
+
assert has_prefix is True
|
|
111
|
+
|
|
112
|
+
def test_extract_token_from_header_without_bearer(self, credential_service):
|
|
113
|
+
"""Test extracting token from Authorization header without Bearer prefix."""
|
|
114
|
+
app = Starlette()
|
|
115
|
+
middleware = A2AAuthMiddleware(
|
|
116
|
+
app=app,
|
|
117
|
+
app_name="test_app",
|
|
118
|
+
credential_service=credential_service,
|
|
119
|
+
auth_method="header",
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
mock_request = Mock(spec=Request)
|
|
123
|
+
mock_request.headers = {"Authorization": "test_token_123"}
|
|
124
|
+
|
|
125
|
+
token, has_prefix = middleware._extract_token(mock_request)
|
|
126
|
+
|
|
127
|
+
assert token == "test_token_123"
|
|
128
|
+
assert has_prefix is False
|
|
129
|
+
|
|
130
|
+
def test_extract_token_from_query_string(self, credential_service):
|
|
131
|
+
"""Test extracting token from query string."""
|
|
132
|
+
app = Starlette()
|
|
133
|
+
middleware = A2AAuthMiddleware(
|
|
134
|
+
app=app,
|
|
135
|
+
app_name="test_app",
|
|
136
|
+
credential_service=credential_service,
|
|
137
|
+
auth_method="querystring",
|
|
138
|
+
token_param="access_token",
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
mock_request = Mock(spec=Request)
|
|
142
|
+
mock_request.query_params = {"access_token": "test_token_123"}
|
|
143
|
+
|
|
144
|
+
token, has_prefix = middleware._extract_token(mock_request)
|
|
145
|
+
|
|
146
|
+
assert token == "test_token_123"
|
|
147
|
+
assert has_prefix is False
|
|
148
|
+
|
|
149
|
+
def test_extract_token_no_token_found(self, credential_service):
|
|
150
|
+
"""Test extracting token when no token is present."""
|
|
151
|
+
app = Starlette()
|
|
152
|
+
middleware = A2AAuthMiddleware(
|
|
153
|
+
app=app,
|
|
154
|
+
app_name="test_app",
|
|
155
|
+
credential_service=credential_service,
|
|
156
|
+
auth_method="header",
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
mock_request = Mock(spec=Request)
|
|
160
|
+
mock_request.headers = {}
|
|
161
|
+
|
|
162
|
+
token, has_prefix = middleware._extract_token(mock_request)
|
|
163
|
+
|
|
164
|
+
assert token is None
|
|
165
|
+
assert has_prefix is False
|
|
166
|
+
|
|
167
|
+
@pytest.mark.asyncio
|
|
168
|
+
async def test_dispatch_with_valid_jwt_token(
|
|
169
|
+
self, credential_service, mock_identity_client, sample_jwt_token
|
|
170
|
+
):
|
|
171
|
+
"""Test dispatch with valid JWT token."""
|
|
172
|
+
app = Starlette()
|
|
173
|
+
|
|
174
|
+
# Mock WorkloadToken
|
|
175
|
+
mock_workload_token = Mock()
|
|
176
|
+
mock_workload_token.workload_access_token = "workload_token_123"
|
|
177
|
+
mock_workload_token.expires_at = 1234567890
|
|
178
|
+
mock_identity_client.get_workload_access_token.return_value = (
|
|
179
|
+
mock_workload_token
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
middleware = A2AAuthMiddleware(
|
|
183
|
+
app=app,
|
|
184
|
+
app_name="test_app",
|
|
185
|
+
credential_service=credential_service,
|
|
186
|
+
auth_method="header",
|
|
187
|
+
identity_client=mock_identity_client,
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
# Create mock request with JWT token
|
|
191
|
+
mock_request = Mock(spec=Request)
|
|
192
|
+
mock_request.headers = {
|
|
193
|
+
"Authorization": f"Bearer {sample_jwt_token}",
|
|
194
|
+
}
|
|
195
|
+
mock_request.scope = {}
|
|
196
|
+
|
|
197
|
+
# Mock call_next
|
|
198
|
+
async def mock_call_next(request):
|
|
199
|
+
return Response("OK", status_code=200)
|
|
200
|
+
|
|
201
|
+
# Execute dispatch
|
|
202
|
+
with patch(
|
|
203
|
+
"veadk.a2a.ve_middlewares.extract_delegation_chain_from_jwt"
|
|
204
|
+
) as mock_extract:
|
|
205
|
+
mock_extract.return_value = ("user123", ["agent1"])
|
|
206
|
+
|
|
207
|
+
with patch(
|
|
208
|
+
"veadk.a2a.ve_middlewares.build_auth_config"
|
|
209
|
+
) as mock_build_config:
|
|
210
|
+
mock_auth_config = Mock()
|
|
211
|
+
mock_auth_config.exchanged_auth_credential = Mock()
|
|
212
|
+
mock_build_config.return_value = mock_auth_config
|
|
213
|
+
|
|
214
|
+
response = await middleware.dispatch(mock_request, mock_call_next)
|
|
215
|
+
|
|
216
|
+
# Verify response
|
|
217
|
+
assert response.status_code == 200
|
|
218
|
+
|
|
219
|
+
# Verify user was set in request scope
|
|
220
|
+
assert "user" in mock_request.scope
|
|
221
|
+
assert mock_request.scope["user"].username == "user123"
|
|
222
|
+
|
|
223
|
+
# Verify workload token was set
|
|
224
|
+
assert "auth" in mock_request.scope
|
|
225
|
+
assert mock_request.scope["auth"] == mock_workload_token
|
|
226
|
+
|
|
227
|
+
@pytest.mark.asyncio
|
|
228
|
+
async def test_dispatch_with_tip_token(
|
|
229
|
+
self, credential_service, mock_identity_client, sample_jwt_token
|
|
230
|
+
):
|
|
231
|
+
"""Test dispatch with TIP token in header."""
|
|
232
|
+
app = Starlette()
|
|
233
|
+
|
|
234
|
+
# Mock WorkloadToken
|
|
235
|
+
mock_workload_token = Mock()
|
|
236
|
+
mock_workload_token.workload_access_token = "workload_token_from_tip"
|
|
237
|
+
mock_workload_token.expires_at = 1234567890
|
|
238
|
+
mock_identity_client.get_workload_access_token.return_value = (
|
|
239
|
+
mock_workload_token
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
middleware = A2AAuthMiddleware(
|
|
243
|
+
app=app,
|
|
244
|
+
app_name="test_app",
|
|
245
|
+
credential_service=credential_service,
|
|
246
|
+
auth_method="header",
|
|
247
|
+
identity_client=mock_identity_client,
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
# Create mock request with both JWT and TIP token
|
|
251
|
+
tip_token = "tip_token_123"
|
|
252
|
+
mock_request = Mock(spec=Request)
|
|
253
|
+
mock_request.headers = {
|
|
254
|
+
"Authorization": f"Bearer {sample_jwt_token}",
|
|
255
|
+
VE_TIP_TOKEN_HEADER: tip_token,
|
|
256
|
+
}
|
|
257
|
+
mock_request.scope = {}
|
|
258
|
+
|
|
259
|
+
# Mock call_next
|
|
260
|
+
async def mock_call_next(request):
|
|
261
|
+
return Response("OK", status_code=200)
|
|
262
|
+
|
|
263
|
+
# Execute dispatch
|
|
264
|
+
with patch(
|
|
265
|
+
"veadk.a2a.ve_middlewares.extract_delegation_chain_from_jwt"
|
|
266
|
+
) as mock_extract:
|
|
267
|
+
mock_extract.return_value = ("user123", ["agent1"])
|
|
268
|
+
|
|
269
|
+
with patch(
|
|
270
|
+
"veadk.a2a.ve_middlewares.build_auth_config"
|
|
271
|
+
) as mock_build_config:
|
|
272
|
+
mock_auth_config = Mock()
|
|
273
|
+
mock_auth_config.exchanged_auth_credential = Mock()
|
|
274
|
+
mock_build_config.return_value = mock_auth_config
|
|
275
|
+
|
|
276
|
+
_ = await middleware.dispatch(mock_request, mock_call_next)
|
|
277
|
+
|
|
278
|
+
# Verify TIP token was used for workload token exchange
|
|
279
|
+
mock_identity_client.get_workload_access_token.assert_called_once_with(
|
|
280
|
+
user_token=tip_token, user_id="user123"
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
# Verify workload token was set
|
|
284
|
+
assert mock_request.scope["auth"] == mock_workload_token
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
class TestBuildA2AAuthMiddleware:
|
|
288
|
+
"""Tests for build_a2a_auth_middleware factory function."""
|
|
289
|
+
|
|
290
|
+
def test_build_middleware_basic(self, credential_service):
|
|
291
|
+
"""Test building middleware with basic parameters."""
|
|
292
|
+
middleware_class = build_a2a_auth_middleware(
|
|
293
|
+
app_name="test_app",
|
|
294
|
+
credential_service=credential_service,
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
assert middleware_class is not None
|
|
298
|
+
assert issubclass(middleware_class, A2AAuthMiddleware)
|
|
299
|
+
|
|
300
|
+
def test_build_middleware_with_all_params(
|
|
301
|
+
self, credential_service, mock_identity_client
|
|
302
|
+
):
|
|
303
|
+
"""Test building middleware with all parameters."""
|
|
304
|
+
middleware_class = build_a2a_auth_middleware(
|
|
305
|
+
app_name="test_app",
|
|
306
|
+
credential_service=credential_service,
|
|
307
|
+
auth_method="querystring",
|
|
308
|
+
token_param="access_token",
|
|
309
|
+
credential_key="custom_key",
|
|
310
|
+
identity_client=mock_identity_client,
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
# Create instance to verify parameters
|
|
314
|
+
app = Starlette()
|
|
315
|
+
instance = middleware_class(app)
|
|
316
|
+
|
|
317
|
+
assert instance.app_name == "test_app"
|
|
318
|
+
assert instance.auth_method == "querystring"
|
|
319
|
+
assert instance.token_param == "access_token"
|
|
320
|
+
assert instance.credential_key == "custom_key"
|
|
321
|
+
assert instance.identity_client == mock_identity_client
|