veadk-python 0.2.11__tar.gz → 0.2.12__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of veadk-python might be problematic. Click here for more details.
- {veadk_python-0.2.11 → veadk_python-0.2.12}/PKG-INFO +1 -1
- {veadk_python-0.2.11 → veadk_python-0.2.12}/pyproject.toml +1 -1
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/cli.py +2 -0
- veadk_python-0.2.12/veadk/cli/cli_uploadevalset.py +125 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/cli_web.py +15 -2
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/long_term_memory_backends/vikingdb_memory_backend.py +1 -1
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/generate_image.py +220 -184
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/image_edit.py +15 -1
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/image_generate.py +15 -1
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/video_generate.py +32 -7
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/version.py +1 -1
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk_python.egg-info/PKG-INFO +1 -1
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk_python.egg-info/SOURCES.txt +1 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/LICENSE +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/README.md +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/setup.cfg +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_agent.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_cloud.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_evaluator.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_knowledgebase.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_long_term_memory.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_multiple_agents.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_runner.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_runtime_data_collecting.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_short_term_memory.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_tracing.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/a2a/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/a2a/agent_card.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/a2a/remote_ve_agent.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/a2a/ve_a2a_server.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/a2a/ve_agent_executor.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/a2a/ve_task_store.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/agent.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/agent_builder.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/agents/loop_agent.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/agents/parallel_agent.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/agents/sequential_agent.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/base_auth.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/apmplus_veauth.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/ark_veauth.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/base_veauth.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/cozeloop_veauth.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/opensearch_veauth.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/postgresql_veauth.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/prompt_pilot_veauth.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/utils.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/vesearch_veauth.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/cli_deploy.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/cli_eval.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/cli_init.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/cli_kb.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/cli_pipeline.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/cli_prompt.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cloud/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cloud/cloud_agent_engine.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cloud/cloud_app.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/config.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/configs/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/configs/database_configs.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/configs/model_configs.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/configs/tool_configs.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/configs/tracing_configs.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/consts.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/adk_evaluator/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/adk_evaluator/adk_evaluator.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/base_evaluator.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/deepeval_evaluator/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/deepeval_evaluator/deepeval_evaluator.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/eval_set_file_loader.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/eval_set_recorder.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/types.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/utils/prometheus.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_apig/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_apig/ve_apig.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_apig/ve_apig_utils.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_code_pipeline/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_code_pipeline/ve_code_pipeline.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_cozeloop/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_cozeloop/ve_cozeloop.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_cr/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_cr/ve_cr.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/cookiecutter.json +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/clean.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/config.yaml.example +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/deploy.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/agent.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/app.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/requirements.txt +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/run.sh +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{ cookiecutter.app_name }}/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{ cookiecutter.app_name }}/agent.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/ve_faas.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/ve_faas_utils.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/cookiecutter.json +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/clean.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/config.yaml.example +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/deploy.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/Dockerfile +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/app.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/init_db.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/models.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/requirements.txt +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/run.sh +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/css/style.css +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/js/admin.js +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/dashboard.html +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/edit_post.html +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/login.html +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/posts.html +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/base.html +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/index.html +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/post.html +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_prompt_pilot/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_prompt_pilot/ve_prompt_pilot.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_tls/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_tls/utils.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_tls/ve_tls.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_tos/ve_tos.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_viking_db_memory/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_viking_db_memory/ve_viking_db_memory.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/backends/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/backends/base_backend.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/backends/in_memory_backend.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/backends/opensearch_backend.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/backends/redis_backend.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/backends/utils.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/backends/vikingdb_knowledge_backend.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/entry.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/knowledgebase.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/long_term_memory.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/long_term_memory_backends/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/long_term_memory_backends/base_backend.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/long_term_memory_backends/in_memory_backend.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/long_term_memory_backends/mem0_backend.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/long_term_memory_backends/opensearch_backend.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/long_term_memory_backends/redis_backend.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/short_term_memory.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/short_term_memory_backends/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/short_term_memory_backends/base_backend.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/short_term_memory_backends/mysql_backend.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/short_term_memory_backends/postgresql_backend.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/short_term_memory_backends/sqlite_backend.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/short_term_memory_processor.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/prompts/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/prompts/agent_default_prompt.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/prompts/prompt_evaluator.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/prompts/prompt_memory_processor.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/prompts/prompt_optimization.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/runner.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/lark.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/las.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/load_knowledgebase.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/mcp_router.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/vesearch.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/web_scraper.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/web_search.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/demo_tools.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/load_knowledgebase_tool.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/sandbox/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/sandbox/browser_sandbox.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/sandbox/code_sandbox.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/sandbox/computer_sandbox.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/base_tracer.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/attributes/attributes.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/attributes/extractors/common_attributes_extractors.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/attributes/extractors/llm_attributes_extractors.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/attributes/extractors/tool_attributes_extractors.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/attributes/extractors/types.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/exporters/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/exporters/apmplus_exporter.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/exporters/base_exporter.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/exporters/cozeloop_exporter.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/exporters/inmemory_exporter.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/exporters/tls_exporter.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/opentelemetry_tracer.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/telemetry.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/types.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/utils/__init__.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/utils/logger.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/utils/mcp_utils.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/utils/misc.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/utils/patches.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/utils/volcengine_sign.py +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk_python.egg-info/dependency_links.txt +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk_python.egg-info/entry_points.txt +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk_python.egg-info/requires.txt +0 -0
- {veadk_python-0.2.11 → veadk_python-0.2.12}/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.12
|
|
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
|
|
@@ -22,6 +22,7 @@ from veadk.cli.cli_kb import kb
|
|
|
22
22
|
from veadk.cli.cli_pipeline import pipeline
|
|
23
23
|
from veadk.cli.cli_prompt import prompt
|
|
24
24
|
from veadk.cli.cli_web import web
|
|
25
|
+
from veadk.cli.cli_uploadevalset import uploadevalset
|
|
25
26
|
from veadk.version import VERSION
|
|
26
27
|
|
|
27
28
|
|
|
@@ -41,6 +42,7 @@ veadk.add_command(web)
|
|
|
41
42
|
veadk.add_command(pipeline)
|
|
42
43
|
veadk.add_command(eval)
|
|
43
44
|
veadk.add_command(kb)
|
|
45
|
+
veadk.add_command(uploadevalset)
|
|
44
46
|
|
|
45
47
|
if __name__ == "__main__":
|
|
46
48
|
veadk()
|
|
@@ -0,0 +1,125 @@
|
|
|
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 click
|
|
16
|
+
import json
|
|
17
|
+
import requests
|
|
18
|
+
from veadk.utils.logger import get_logger
|
|
19
|
+
from veadk.config import getenv
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
|
|
22
|
+
logger = get_logger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@click.command()
|
|
26
|
+
@click.option("--file", required=True, help="JSON file path containing dataset items")
|
|
27
|
+
@click.option("--cozeloop-workspace-id", default=None, help="CozeLoop workspace ID")
|
|
28
|
+
@click.option("--cozeloop-evalset-id", default=None, help="CozeLoop evaluation set ID")
|
|
29
|
+
@click.option(
|
|
30
|
+
"--cozeloop-api-key",
|
|
31
|
+
default=None,
|
|
32
|
+
help="CozeLoop API key (or set COZELOOP_API_KEY env var)",
|
|
33
|
+
)
|
|
34
|
+
def uploadevalset(
|
|
35
|
+
file: str,
|
|
36
|
+
cozeloop_workspace_id: str,
|
|
37
|
+
cozeloop_evalset_id: str,
|
|
38
|
+
cozeloop_api_key: str,
|
|
39
|
+
) -> None:
|
|
40
|
+
"""Upload dataset items to CozeLoop evaluation set."""
|
|
41
|
+
|
|
42
|
+
if not cozeloop_workspace_id:
|
|
43
|
+
cozeloop_workspace_id = getenv(
|
|
44
|
+
"OBSERVABILITY_OPENTELEMETRY_COZELOOP_SERVICE_NAME"
|
|
45
|
+
)
|
|
46
|
+
if not cozeloop_evalset_id:
|
|
47
|
+
cozeloop_evalset_id = getenv("OBSERVABILITY_OPENTELEMETRY_COZELOOP_EVALSET_ID")
|
|
48
|
+
if not cozeloop_api_key:
|
|
49
|
+
cozeloop_api_key = getenv("OBSERVABILITY_OPENTELEMETRY_COZELOOP_API_KEY")
|
|
50
|
+
|
|
51
|
+
# Read JSON file
|
|
52
|
+
file_path = Path(file)
|
|
53
|
+
if not file_path.exists():
|
|
54
|
+
logger.error(f"File not found: {file}")
|
|
55
|
+
return
|
|
56
|
+
|
|
57
|
+
logger.info(f"Reading dataset from {file}")
|
|
58
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
|
59
|
+
data = json.load(f)
|
|
60
|
+
|
|
61
|
+
# Prepare items
|
|
62
|
+
items = []
|
|
63
|
+
for case in data.get("eval_cases", []):
|
|
64
|
+
conversation = case.get("conversation", [])
|
|
65
|
+
for turn in conversation:
|
|
66
|
+
user_text = (
|
|
67
|
+
turn.get("user_content", {}).get("parts", [{}])[0].get("text", "")
|
|
68
|
+
)
|
|
69
|
+
output_text = (
|
|
70
|
+
turn.get("final_response", {}).get("parts", [{}])[0].get("text", "")
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
items.append(
|
|
74
|
+
{
|
|
75
|
+
"turns": [
|
|
76
|
+
{
|
|
77
|
+
"field_datas": [
|
|
78
|
+
{
|
|
79
|
+
"name": "input",
|
|
80
|
+
"content": {
|
|
81
|
+
"content_type": "Text",
|
|
82
|
+
"text": user_text,
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"name": "output",
|
|
87
|
+
"content": {
|
|
88
|
+
"content_type": "Text",
|
|
89
|
+
"text": output_text,
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
}
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
# Upload to CozeLoop
|
|
99
|
+
url = f"https://api.coze.cn/v1/loop/evaluation/evaluation_sets/{cozeloop_evalset_id}/items"
|
|
100
|
+
logger.info(
|
|
101
|
+
f"Uploading {len(items)} items to workspace_id={cozeloop_workspace_id} evalset_id={cozeloop_evalset_id}"
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
response = requests.post(
|
|
105
|
+
url=url,
|
|
106
|
+
headers={
|
|
107
|
+
"Authorization": f"Bearer {cozeloop_api_key}",
|
|
108
|
+
"Content-Type": "application/json",
|
|
109
|
+
"X-TT-ENV": "ppe_eval_openapi",
|
|
110
|
+
"x-use-ppe": "1",
|
|
111
|
+
},
|
|
112
|
+
json={
|
|
113
|
+
"workspace_id": cozeloop_workspace_id,
|
|
114
|
+
"is_allow_partial_add": True,
|
|
115
|
+
"is_skip_invalid_items": True,
|
|
116
|
+
"items": items,
|
|
117
|
+
},
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
if response.status_code == 200:
|
|
121
|
+
logger.info(
|
|
122
|
+
f"Successfully uploaded dataset to CozeLoop evalset {cozeloop_evalset_id}"
|
|
123
|
+
)
|
|
124
|
+
else:
|
|
125
|
+
logger.error(f"Failed to upload dataset: {response.text}")
|
|
@@ -56,10 +56,14 @@ def _get_ltm_from_env() -> LongTermMemory | None:
|
|
|
56
56
|
logger = get_logger(__name__)
|
|
57
57
|
|
|
58
58
|
long_term_memory_backend = os.getenv("LONG_TERM_MEMORY_BACKEND")
|
|
59
|
+
app_name = os.getenv("VEADK_WEB_APP_NAME", "")
|
|
60
|
+
user_id = os.getenv("VEADK_WEB_USER_ID", "")
|
|
59
61
|
|
|
60
62
|
if long_term_memory_backend:
|
|
61
63
|
logger.info(f"Long term memory: backend={long_term_memory_backend}")
|
|
62
|
-
return LongTermMemory(
|
|
64
|
+
return LongTermMemory(
|
|
65
|
+
backend=long_term_memory_backend, app_name=app_name, user_id=user_id
|
|
66
|
+
) # type: ignore
|
|
63
67
|
else:
|
|
64
68
|
logger.warning("No long term memory backend settings detected.")
|
|
65
69
|
return None
|
|
@@ -131,7 +135,13 @@ def patch_adkwebserver_disable_openapi():
|
|
|
131
135
|
|
|
132
136
|
@click.command()
|
|
133
137
|
@click.option("--host", default="127.0.0.1", help="Host to run the web server on")
|
|
134
|
-
|
|
138
|
+
@click.option(
|
|
139
|
+
"--app_name", default="", help="The `app_name` for initializing long term memory"
|
|
140
|
+
)
|
|
141
|
+
@click.option(
|
|
142
|
+
"--user_id", default="", help="The `user_id` for initializing long term memory"
|
|
143
|
+
)
|
|
144
|
+
def web(host: str, app_name: str, user_id: str) -> None:
|
|
135
145
|
"""Launch web with long term and short term memory."""
|
|
136
146
|
import os
|
|
137
147
|
from typing import Any
|
|
@@ -175,6 +185,9 @@ def web(host: str) -> None:
|
|
|
175
185
|
self.session_service = short_term_memory.session_service
|
|
176
186
|
self.memory_service = long_term_memory
|
|
177
187
|
|
|
188
|
+
os.environ["VEADK_WEB_APP_NAME"] = app_name
|
|
189
|
+
os.environ["VEADK_WEB_USER_ID"] = user_id
|
|
190
|
+
|
|
178
191
|
import google.adk.cli.adk_web_server
|
|
179
192
|
|
|
180
193
|
google.adk.cli.adk_web_server.AdkWebServer.__init__ = init_for_veadk
|
|
@@ -33,6 +33,10 @@ from veadk.consts import (
|
|
|
33
33
|
from veadk.utils.logger import get_logger
|
|
34
34
|
from veadk.utils.misc import formatted_timestamp, read_file_to_bytes
|
|
35
35
|
from veadk.version import VERSION
|
|
36
|
+
import asyncio
|
|
37
|
+
import concurrent.futures
|
|
38
|
+
import contextvars
|
|
39
|
+
|
|
36
40
|
|
|
37
41
|
logger = get_logger(__name__)
|
|
38
42
|
|
|
@@ -43,11 +47,164 @@ client = Ark(
|
|
|
43
47
|
base_url=getenv("MODEL_IMAGE_API_BASE", DEFAULT_IMAGE_GENERATE_MODEL_API_BASE),
|
|
44
48
|
)
|
|
45
49
|
|
|
50
|
+
executor = concurrent.futures.ThreadPoolExecutor(max_workers=8)
|
|
51
|
+
tracer = trace.get_tracer("gcp.vertex.agent")
|
|
46
52
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
53
|
+
|
|
54
|
+
def _build_input_parts(item: dict, task_type: str, image_field):
|
|
55
|
+
input_part = {"role": "user"}
|
|
56
|
+
input_part["parts.0.type"] = "text"
|
|
57
|
+
input_part["parts.0.text"] = json.dumps(item, ensure_ascii=False)
|
|
58
|
+
|
|
59
|
+
if image_field:
|
|
60
|
+
if task_type.startswith("single"):
|
|
61
|
+
assert isinstance(image_field, str), (
|
|
62
|
+
f"single_* task_type image must be str, got {type(image_field)}"
|
|
63
|
+
)
|
|
64
|
+
input_part["parts.1.type"] = "image_url"
|
|
65
|
+
input_part["parts.1.image_url.name"] = "origin_image"
|
|
66
|
+
input_part["parts.1.image_url.url"] = image_field
|
|
67
|
+
elif task_type.startswith("multi"):
|
|
68
|
+
assert isinstance(image_field, list), (
|
|
69
|
+
f"multi_* task_type image must be list, got {type(image_field)}"
|
|
70
|
+
)
|
|
71
|
+
assert len(image_field) <= 10, (
|
|
72
|
+
f"multi_* task_type image list length must be <= 10, got {len(image_field)}"
|
|
73
|
+
)
|
|
74
|
+
for i, image_url in enumerate(image_field):
|
|
75
|
+
idx = i + 1
|
|
76
|
+
input_part[f"parts.{idx}.type"] = "image_url"
|
|
77
|
+
input_part[f"parts.{idx}.image_url.name"] = f"origin_image_{i}"
|
|
78
|
+
input_part[f"parts.{idx}.image_url.url"] = image_url
|
|
79
|
+
|
|
80
|
+
return input_part
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def handle_single_task_sync(
|
|
84
|
+
idx: int, item: dict, tool_context
|
|
85
|
+
) -> tuple[list[dict], list[str]]:
|
|
86
|
+
logger.debug(f"handle_single_task_sync item {idx}: {item}")
|
|
87
|
+
success_list: list[dict] = []
|
|
88
|
+
error_list: list[str] = []
|
|
89
|
+
total_tokens = 0
|
|
90
|
+
output_tokens = 0
|
|
91
|
+
output_part = {"message.role": "model"}
|
|
92
|
+
|
|
93
|
+
task_type = item.get("task_type", "text_to_single")
|
|
94
|
+
prompt = item.get("prompt", "")
|
|
95
|
+
response_format = item.get("response_format", None)
|
|
96
|
+
size = item.get("size", None)
|
|
97
|
+
watermark = item.get("watermark", None)
|
|
98
|
+
image_field = item.get("image", None)
|
|
99
|
+
sequential_image_generation = item.get("sequential_image_generation", None)
|
|
100
|
+
max_images = item.get("max_images", None)
|
|
101
|
+
|
|
102
|
+
input_part = _build_input_parts(item, task_type, image_field)
|
|
103
|
+
|
|
104
|
+
inputs = {"prompt": prompt}
|
|
105
|
+
if size:
|
|
106
|
+
inputs["size"] = size
|
|
107
|
+
if response_format:
|
|
108
|
+
inputs["response_format"] = response_format
|
|
109
|
+
if watermark is not None:
|
|
110
|
+
inputs["watermark"] = watermark
|
|
111
|
+
if sequential_image_generation:
|
|
112
|
+
inputs["sequential_image_generation"] = sequential_image_generation
|
|
113
|
+
|
|
114
|
+
with tracer.start_as_current_span(f"call_llm_task_{idx}") as span:
|
|
115
|
+
try:
|
|
116
|
+
if (
|
|
117
|
+
sequential_image_generation
|
|
118
|
+
and sequential_image_generation == "auto"
|
|
119
|
+
and max_images
|
|
120
|
+
):
|
|
121
|
+
response = client.images.generate(
|
|
122
|
+
model=getenv("MODEL_IMAGE_NAME", DEFAULT_IMAGE_GENERATE_MODEL_NAME),
|
|
123
|
+
**inputs,
|
|
124
|
+
sequential_image_generation_options=SequentialImageGenerationOptions(
|
|
125
|
+
max_images=max_images
|
|
126
|
+
),
|
|
127
|
+
)
|
|
128
|
+
else:
|
|
129
|
+
response = client.images.generate(
|
|
130
|
+
model=getenv("MODEL_IMAGE_NAME", DEFAULT_IMAGE_GENERATE_MODEL_NAME),
|
|
131
|
+
**inputs,
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
if not response.error:
|
|
135
|
+
logger.debug(f"task {idx} Image generate response: {response}")
|
|
136
|
+
|
|
137
|
+
total_tokens += getattr(response.usage, "total_tokens", 0) or 0
|
|
138
|
+
output_tokens += getattr(response.usage, "output_tokens", 0) or 0
|
|
139
|
+
|
|
140
|
+
for i, image_data in enumerate(response.data):
|
|
141
|
+
image_name = f"task_{idx}_image_{i}"
|
|
142
|
+
if "error" in image_data:
|
|
143
|
+
logger.error(f"Image {image_name} error: {image_data.error}")
|
|
144
|
+
error_list.append(image_name)
|
|
145
|
+
continue
|
|
146
|
+
|
|
147
|
+
if getattr(image_data, "url", None):
|
|
148
|
+
image_url = image_data.url
|
|
149
|
+
else:
|
|
150
|
+
b64 = getattr(image_data, "b64_json", None)
|
|
151
|
+
if not b64:
|
|
152
|
+
logger.error(
|
|
153
|
+
f"Image {image_name} missing data (no url/b64)"
|
|
154
|
+
)
|
|
155
|
+
error_list.append(image_name)
|
|
156
|
+
continue
|
|
157
|
+
image_bytes = base64.b64decode(b64)
|
|
158
|
+
image_url = _upload_image_to_tos(
|
|
159
|
+
image_bytes=image_bytes, object_key=f"{image_name}.png"
|
|
160
|
+
)
|
|
161
|
+
if not image_url:
|
|
162
|
+
logger.error(f"Upload image to TOS failed: {image_name}")
|
|
163
|
+
error_list.append(image_name)
|
|
164
|
+
continue
|
|
165
|
+
logger.debug(f"Image saved as ADK artifact: {image_name}")
|
|
166
|
+
|
|
167
|
+
tool_context.state[f"{image_name}_url"] = image_url
|
|
168
|
+
output_part[f"message.parts.{i}.type"] = "image_url"
|
|
169
|
+
output_part[f"message.parts.{i}.image_url.name"] = image_name
|
|
170
|
+
output_part[f"message.parts.{i}.image_url.url"] = image_url
|
|
171
|
+
logger.debug(
|
|
172
|
+
f"Image {image_name} generated successfully: {image_url}"
|
|
173
|
+
)
|
|
174
|
+
success_list.append({image_name: image_url})
|
|
175
|
+
else:
|
|
176
|
+
logger.error(
|
|
177
|
+
f"Task {idx} No images returned by model: {response.error}"
|
|
178
|
+
)
|
|
179
|
+
error_list.append(f"task_{idx}")
|
|
180
|
+
|
|
181
|
+
except Exception as e:
|
|
182
|
+
logger.error(f"Error in task {idx}: {e}")
|
|
183
|
+
traceback.print_exc()
|
|
184
|
+
error_list.append(f"task_{idx}")
|
|
185
|
+
|
|
186
|
+
finally:
|
|
187
|
+
add_span_attributes(
|
|
188
|
+
span,
|
|
189
|
+
tool_context,
|
|
190
|
+
input_part=input_part,
|
|
191
|
+
output_part=output_part,
|
|
192
|
+
output_tokens=output_tokens,
|
|
193
|
+
total_tokens=total_tokens,
|
|
194
|
+
request_model=getenv(
|
|
195
|
+
"MODEL_IMAGE_NAME", DEFAULT_IMAGE_GENERATE_MODEL_NAME
|
|
196
|
+
),
|
|
197
|
+
response_model=getenv(
|
|
198
|
+
"MODEL_IMAGE_NAME", DEFAULT_IMAGE_GENERATE_MODEL_NAME
|
|
199
|
+
),
|
|
200
|
+
)
|
|
201
|
+
logger.debug(
|
|
202
|
+
f"task {idx} Image generate success_list: {success_list}\nerror_list: {error_list}"
|
|
203
|
+
)
|
|
204
|
+
return success_list, error_list
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
async def image_generate(tasks: list[dict], tool_context) -> Dict:
|
|
51
208
|
"""
|
|
52
209
|
Seedream 4.0: batch image generation via tasks.
|
|
53
210
|
Args:
|
|
@@ -127,193 +284,72 @@ async def image_generate(
|
|
|
127
284
|
- 如果想要指定生成组图的数量,请在prompt里添加数量说明,例如:"生成3张图片"。
|
|
128
285
|
- size 推荐使用 2048x2048 或表格里的标准比例,确保生成质量。
|
|
129
286
|
"""
|
|
130
|
-
|
|
287
|
+
logger.debug(
|
|
288
|
+
f"Using model: {getenv('MODEL_IMAGE_NAME', DEFAULT_IMAGE_GENERATE_MODEL_NAME)}"
|
|
289
|
+
)
|
|
131
290
|
success_list: list[dict] = []
|
|
132
|
-
error_list = []
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
if image:
|
|
163
|
-
if task_type.startswith("single"):
|
|
164
|
-
assert isinstance(image, str), (
|
|
165
|
-
f"single_* task_type image must be str, got {type(image)}"
|
|
166
|
-
)
|
|
167
|
-
input_part["parts.1.type"] = "image_url"
|
|
168
|
-
input_part["parts.1.image_url.name"] = "origin_image"
|
|
169
|
-
input_part["parts.1.image_url.url"] = image
|
|
170
|
-
elif task_type.startswith("multi"):
|
|
171
|
-
assert isinstance(image, list), (
|
|
172
|
-
f"multi_* task_type image must be list, got {type(image)}"
|
|
173
|
-
)
|
|
174
|
-
assert len(image) <= 10, (
|
|
175
|
-
f"multi_* task_type image list length must be <= 10, got {len(image)}"
|
|
176
|
-
)
|
|
177
|
-
for i, image_url in enumerate(image):
|
|
178
|
-
input_part[f"parts.{i + 1}.type"] = "image_url"
|
|
179
|
-
input_part[f"parts.{i + 1}.image_url.name"] = (
|
|
180
|
-
f"origin_image_{i}"
|
|
181
|
-
)
|
|
182
|
-
input_part[f"parts.{i + 1}.image_url.url"] = image_url
|
|
183
|
-
|
|
184
|
-
if sequential_image_generation:
|
|
185
|
-
inputs["sequential_image_generation"] = sequential_image_generation
|
|
186
|
-
|
|
187
|
-
try:
|
|
188
|
-
if (
|
|
189
|
-
sequential_image_generation
|
|
190
|
-
and sequential_image_generation == "auto"
|
|
191
|
-
and max_images
|
|
192
|
-
):
|
|
193
|
-
response = client.images.generate(
|
|
194
|
-
model=getenv(
|
|
195
|
-
"MODEL_IMAGE_NAME", DEFAULT_IMAGE_GENERATE_MODEL_NAME
|
|
196
|
-
),
|
|
197
|
-
**inputs,
|
|
198
|
-
sequential_image_generation_options=SequentialImageGenerationOptions(
|
|
199
|
-
max_images=max_images
|
|
200
|
-
),
|
|
201
|
-
)
|
|
202
|
-
else:
|
|
203
|
-
response = client.images.generate(
|
|
204
|
-
model=getenv(
|
|
205
|
-
"MODEL_IMAGE_NAME", DEFAULT_IMAGE_GENERATE_MODEL_NAME
|
|
206
|
-
),
|
|
207
|
-
**inputs,
|
|
208
|
-
)
|
|
209
|
-
if not response.error:
|
|
210
|
-
for i, image_data in enumerate(response.data):
|
|
211
|
-
image_name = f"task_{idx}_image_{i}"
|
|
212
|
-
if "error" in image_data:
|
|
213
|
-
error_details = (
|
|
214
|
-
f"Image {image_name} error: {image_data.error}"
|
|
215
|
-
)
|
|
216
|
-
logger.error(error_details)
|
|
217
|
-
error_list.append(image_name)
|
|
218
|
-
continue
|
|
219
|
-
if image_data.url:
|
|
220
|
-
image = image_data.url
|
|
221
|
-
tool_context.state[f"{image_name}_url"] = image
|
|
222
|
-
|
|
223
|
-
output_part[f"message.parts.{i}.type"] = "image_url"
|
|
224
|
-
output_part[f"message.parts.{i}.image_url.name"] = (
|
|
225
|
-
image_name
|
|
226
|
-
)
|
|
227
|
-
output_part[f"message.parts.{i}.image_url.url"] = image
|
|
228
|
-
|
|
229
|
-
else:
|
|
230
|
-
image = image_data.b64_json
|
|
231
|
-
image_bytes = base64.b64decode(image)
|
|
232
|
-
|
|
233
|
-
tos_url = _upload_image_to_tos(
|
|
234
|
-
image_bytes=image_bytes, object_key=f"{image_name}.png"
|
|
235
|
-
)
|
|
236
|
-
if tos_url:
|
|
237
|
-
tool_context.state[f"{image_name}_url"] = tos_url
|
|
238
|
-
image = tos_url
|
|
239
|
-
output_part[f"message.parts.{i}.type"] = "image_url"
|
|
240
|
-
output_part[f"message.parts.{i}.image_url.name"] = (
|
|
241
|
-
image_name
|
|
242
|
-
)
|
|
243
|
-
output_part[f"message.parts.{i}.image_url.url"] = image
|
|
244
|
-
else:
|
|
245
|
-
logger.error(
|
|
246
|
-
f"Upload image to TOS failed: {image_name}"
|
|
247
|
-
)
|
|
248
|
-
error_list.append(image_name)
|
|
249
|
-
continue
|
|
250
|
-
|
|
251
|
-
logger.debug(f"Image saved as ADK artifact: {image_name}")
|
|
252
|
-
|
|
253
|
-
total_tokens += response.usage.total_tokens
|
|
254
|
-
output_tokens += response.usage.output_tokens
|
|
255
|
-
success_list.append({image_name: image})
|
|
256
|
-
else:
|
|
257
|
-
error_details = (
|
|
258
|
-
f"No images returned by Doubao model: {response.error}"
|
|
259
|
-
)
|
|
260
|
-
logger.error(error_details)
|
|
261
|
-
error_list.append(f"task_{idx}")
|
|
262
|
-
|
|
263
|
-
except Exception as e:
|
|
264
|
-
error_details = f"Error: {e}"
|
|
265
|
-
logger.error(error_details)
|
|
266
|
-
traceback.print_exc()
|
|
267
|
-
error_list.append(f"task_{idx}")
|
|
268
|
-
|
|
269
|
-
add_span_attributes(
|
|
270
|
-
span,
|
|
271
|
-
tool_context,
|
|
272
|
-
input_part=input_part,
|
|
273
|
-
output_part=output_part,
|
|
274
|
-
output_tokens=output_tokens,
|
|
275
|
-
total_tokens=total_tokens,
|
|
276
|
-
request_model=getenv(
|
|
277
|
-
"MODEL_IMAGE_NAME", DEFAULT_IMAGE_GENERATE_MODEL_NAME
|
|
278
|
-
),
|
|
279
|
-
response_model=getenv(
|
|
280
|
-
"MODEL_IMAGE_NAME", DEFAULT_IMAGE_GENERATE_MODEL_NAME
|
|
281
|
-
),
|
|
282
|
-
)
|
|
283
|
-
if len(success_list) == 0:
|
|
291
|
+
error_list: list[str] = []
|
|
292
|
+
logger.debug(f"image_generate tasks: {tasks}")
|
|
293
|
+
with tracer.start_as_current_span("image_generate"):
|
|
294
|
+
base_ctx = contextvars.copy_context()
|
|
295
|
+
|
|
296
|
+
def make_task(idx, item):
|
|
297
|
+
ctx = base_ctx.copy()
|
|
298
|
+
return lambda: ctx.run(handle_single_task_sync, idx, item, tool_context)
|
|
299
|
+
|
|
300
|
+
loop = asyncio.get_event_loop()
|
|
301
|
+
futures = [
|
|
302
|
+
loop.run_in_executor(executor, make_task(idx, item))
|
|
303
|
+
for idx, item in enumerate(tasks)
|
|
304
|
+
]
|
|
305
|
+
|
|
306
|
+
results = await asyncio.gather(*futures, return_exceptions=True)
|
|
307
|
+
|
|
308
|
+
for res in results:
|
|
309
|
+
if isinstance(res, Exception):
|
|
310
|
+
logger.error(f"Task raised exception: {res}")
|
|
311
|
+
error_list.append("unknown_task_exception")
|
|
312
|
+
continue
|
|
313
|
+
s, e = res
|
|
314
|
+
success_list.extend(s)
|
|
315
|
+
error_list.extend(e)
|
|
316
|
+
|
|
317
|
+
if not success_list:
|
|
318
|
+
logger.debug(
|
|
319
|
+
f"image_generate success_list: {success_list}\nerror_list: {error_list}"
|
|
320
|
+
)
|
|
284
321
|
return {
|
|
285
322
|
"status": "error",
|
|
286
323
|
"success_list": success_list,
|
|
287
324
|
"error_list": error_list,
|
|
288
325
|
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
326
|
+
app_name = tool_context._invocation_context.app_name
|
|
327
|
+
user_id = tool_context._invocation_context.user_id
|
|
328
|
+
session_id = tool_context._invocation_context.session.id
|
|
329
|
+
artifact_service = tool_context._invocation_context.artifact_service
|
|
330
|
+
|
|
331
|
+
if artifact_service:
|
|
332
|
+
for image in success_list:
|
|
333
|
+
for _, image_tos_url in image.items():
|
|
334
|
+
filename = f"artifact_{formatted_timestamp()}"
|
|
335
|
+
await artifact_service.save_artifact(
|
|
336
|
+
app_name=app_name,
|
|
337
|
+
user_id=user_id,
|
|
338
|
+
session_id=session_id,
|
|
339
|
+
filename=filename,
|
|
340
|
+
artifact=Part(
|
|
341
|
+
inline_data=Blob(
|
|
342
|
+
display_name=filename,
|
|
343
|
+
data=read_file_to_bytes(image_tos_url),
|
|
344
|
+
mime_type=mimetypes.guess_type(image_tos_url)[0],
|
|
345
|
+
)
|
|
346
|
+
),
|
|
347
|
+
)
|
|
293
348
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
filename = f"artifact_{formatted_timestamp()}"
|
|
299
|
-
await artifact_service.save_artifact(
|
|
300
|
-
app_name=app_name,
|
|
301
|
-
user_id=user_id,
|
|
302
|
-
session_id=session_id,
|
|
303
|
-
filename=filename,
|
|
304
|
-
artifact=Part(
|
|
305
|
-
inline_data=Blob(
|
|
306
|
-
display_name=filename,
|
|
307
|
-
data=read_file_to_bytes(image_tos_url),
|
|
308
|
-
mime_type=mimetypes.guess_type(image_tos_url)[0],
|
|
309
|
-
)
|
|
310
|
-
),
|
|
311
|
-
)
|
|
312
|
-
return {
|
|
313
|
-
"status": "success",
|
|
314
|
-
"success_list": success_list,
|
|
315
|
-
"error_list": error_list,
|
|
316
|
-
}
|
|
349
|
+
logger.debug(
|
|
350
|
+
f"image_generate success_list: {success_list}\nerror_list: {error_list}"
|
|
351
|
+
)
|
|
352
|
+
return {"status": "success", "success_list": success_list, "error_list": error_list}
|
|
317
353
|
|
|
318
354
|
|
|
319
355
|
def add_span_attributes(
|