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.

Files changed (203) hide show
  1. {veadk_python-0.2.11 → veadk_python-0.2.12}/PKG-INFO +1 -1
  2. {veadk_python-0.2.11 → veadk_python-0.2.12}/pyproject.toml +1 -1
  3. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/cli.py +2 -0
  4. veadk_python-0.2.12/veadk/cli/cli_uploadevalset.py +125 -0
  5. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/cli_web.py +15 -2
  6. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/long_term_memory_backends/vikingdb_memory_backend.py +1 -1
  7. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/generate_image.py +220 -184
  8. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/image_edit.py +15 -1
  9. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/image_generate.py +15 -1
  10. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/video_generate.py +32 -7
  11. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/version.py +1 -1
  12. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk_python.egg-info/PKG-INFO +1 -1
  13. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk_python.egg-info/SOURCES.txt +1 -0
  14. {veadk_python-0.2.11 → veadk_python-0.2.12}/LICENSE +0 -0
  15. {veadk_python-0.2.11 → veadk_python-0.2.12}/README.md +0 -0
  16. {veadk_python-0.2.11 → veadk_python-0.2.12}/setup.cfg +0 -0
  17. {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_agent.py +0 -0
  18. {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_cloud.py +0 -0
  19. {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_evaluator.py +0 -0
  20. {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_knowledgebase.py +0 -0
  21. {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_long_term_memory.py +0 -0
  22. {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_multiple_agents.py +0 -0
  23. {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_runner.py +0 -0
  24. {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_runtime_data_collecting.py +0 -0
  25. {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_short_term_memory.py +0 -0
  26. {veadk_python-0.2.11 → veadk_python-0.2.12}/tests/test_tracing.py +0 -0
  27. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/__init__.py +0 -0
  28. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/a2a/__init__.py +0 -0
  29. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/a2a/agent_card.py +0 -0
  30. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/a2a/remote_ve_agent.py +0 -0
  31. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/a2a/ve_a2a_server.py +0 -0
  32. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/a2a/ve_agent_executor.py +0 -0
  33. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/a2a/ve_task_store.py +0 -0
  34. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/agent.py +0 -0
  35. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/agent_builder.py +0 -0
  36. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/agents/loop_agent.py +0 -0
  37. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/agents/parallel_agent.py +0 -0
  38. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/agents/sequential_agent.py +0 -0
  39. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/__init__.py +0 -0
  40. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/base_auth.py +0 -0
  41. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/__init__.py +0 -0
  42. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/apmplus_veauth.py +0 -0
  43. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/ark_veauth.py +0 -0
  44. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/base_veauth.py +0 -0
  45. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/cozeloop_veauth.py +0 -0
  46. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/opensearch_veauth.py +0 -0
  47. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/postgresql_veauth.py +0 -0
  48. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/prompt_pilot_veauth.py +0 -0
  49. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/utils.py +0 -0
  50. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/auth/veauth/vesearch_veauth.py +0 -0
  51. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/__init__.py +0 -0
  52. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/cli_deploy.py +0 -0
  53. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/cli_eval.py +0 -0
  54. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/cli_init.py +0 -0
  55. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/cli_kb.py +0 -0
  56. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/cli_pipeline.py +0 -0
  57. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cli/cli_prompt.py +0 -0
  58. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cloud/__init__.py +0 -0
  59. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cloud/cloud_agent_engine.py +0 -0
  60. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/cloud/cloud_app.py +0 -0
  61. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/config.py +0 -0
  62. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/configs/__init__.py +0 -0
  63. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/configs/database_configs.py +0 -0
  64. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/configs/model_configs.py +0 -0
  65. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/configs/tool_configs.py +0 -0
  66. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/configs/tracing_configs.py +0 -0
  67. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/consts.py +0 -0
  68. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/__init__.py +0 -0
  69. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/adk_evaluator/__init__.py +0 -0
  70. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/adk_evaluator/adk_evaluator.py +0 -0
  71. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/base_evaluator.py +0 -0
  72. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/deepeval_evaluator/__init__.py +0 -0
  73. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/deepeval_evaluator/deepeval_evaluator.py +0 -0
  74. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/eval_set_file_loader.py +0 -0
  75. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/eval_set_recorder.py +0 -0
  76. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/types.py +0 -0
  77. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/evaluation/utils/prometheus.py +0 -0
  78. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/__init__.py +0 -0
  79. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_apig/__init__.py +0 -0
  80. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_apig/ve_apig.py +0 -0
  81. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_apig/ve_apig_utils.py +0 -0
  82. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_code_pipeline/__init__.py +0 -0
  83. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_code_pipeline/ve_code_pipeline.py +0 -0
  84. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_cozeloop/__init__.py +0 -0
  85. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_cozeloop/ve_cozeloop.py +0 -0
  86. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_cr/__init__.py +0 -0
  87. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_cr/ve_cr.py +0 -0
  88. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/__init__.py +0 -0
  89. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/cookiecutter.json +0 -0
  90. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/__init__.py +0 -0
  91. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/clean.py +0 -0
  92. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/config.yaml.example +0 -0
  93. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/deploy.py +0 -0
  94. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/__init__.py +0 -0
  95. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/agent.py +0 -0
  96. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/app.py +0 -0
  97. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/requirements.txt +0 -0
  98. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/run.sh +0 -0
  99. {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
  100. {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
  101. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/ve_faas.py +0 -0
  102. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/ve_faas_utils.py +0 -0
  103. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/cookiecutter.json +0 -0
  104. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/__init__.py +0 -0
  105. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/clean.py +0 -0
  106. {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
  107. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/deploy.py +0 -0
  108. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/Dockerfile +0 -0
  109. {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
  110. {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
  111. {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
  112. {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
  113. {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
  114. {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
  115. {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
  116. {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
  117. {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
  118. {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
  119. {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
  120. {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
  121. {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
  122. {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
  123. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_prompt_pilot/__init__.py +0 -0
  124. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_prompt_pilot/ve_prompt_pilot.py +0 -0
  125. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_tls/__init__.py +0 -0
  126. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_tls/utils.py +0 -0
  127. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_tls/ve_tls.py +0 -0
  128. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_tos/ve_tos.py +0 -0
  129. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_viking_db_memory/__init__.py +0 -0
  130. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/integrations/ve_viking_db_memory/ve_viking_db_memory.py +0 -0
  131. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/__init__.py +0 -0
  132. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/backends/__init__.py +0 -0
  133. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/backends/base_backend.py +0 -0
  134. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/backends/in_memory_backend.py +0 -0
  135. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/backends/opensearch_backend.py +0 -0
  136. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/backends/redis_backend.py +0 -0
  137. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/backends/utils.py +0 -0
  138. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/backends/vikingdb_knowledge_backend.py +0 -0
  139. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/entry.py +0 -0
  140. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/knowledgebase/knowledgebase.py +0 -0
  141. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/__init__.py +0 -0
  142. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/long_term_memory.py +0 -0
  143. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/long_term_memory_backends/__init__.py +0 -0
  144. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/long_term_memory_backends/base_backend.py +0 -0
  145. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/long_term_memory_backends/in_memory_backend.py +0 -0
  146. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/long_term_memory_backends/mem0_backend.py +0 -0
  147. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/long_term_memory_backends/opensearch_backend.py +0 -0
  148. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/long_term_memory_backends/redis_backend.py +0 -0
  149. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/short_term_memory.py +0 -0
  150. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/short_term_memory_backends/__init__.py +0 -0
  151. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/short_term_memory_backends/base_backend.py +0 -0
  152. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/short_term_memory_backends/mysql_backend.py +0 -0
  153. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/short_term_memory_backends/postgresql_backend.py +0 -0
  154. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/short_term_memory_backends/sqlite_backend.py +0 -0
  155. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/memory/short_term_memory_processor.py +0 -0
  156. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/prompts/__init__.py +0 -0
  157. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/prompts/agent_default_prompt.py +0 -0
  158. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/prompts/prompt_evaluator.py +0 -0
  159. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/prompts/prompt_memory_processor.py +0 -0
  160. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/prompts/prompt_optimization.py +0 -0
  161. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/runner.py +0 -0
  162. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/__init__.py +0 -0
  163. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/__init__.py +0 -0
  164. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/lark.py +0 -0
  165. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/las.py +0 -0
  166. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/load_knowledgebase.py +0 -0
  167. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/mcp_router.py +0 -0
  168. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/vesearch.py +0 -0
  169. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/web_scraper.py +0 -0
  170. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/builtin_tools/web_search.py +0 -0
  171. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/demo_tools.py +0 -0
  172. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/load_knowledgebase_tool.py +0 -0
  173. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/sandbox/__init__.py +0 -0
  174. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/sandbox/browser_sandbox.py +0 -0
  175. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/sandbox/code_sandbox.py +0 -0
  176. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tools/sandbox/computer_sandbox.py +0 -0
  177. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/__init__.py +0 -0
  178. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/base_tracer.py +0 -0
  179. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/__init__.py +0 -0
  180. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/attributes/attributes.py +0 -0
  181. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/attributes/extractors/common_attributes_extractors.py +0 -0
  182. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/attributes/extractors/llm_attributes_extractors.py +0 -0
  183. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/attributes/extractors/tool_attributes_extractors.py +0 -0
  184. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/attributes/extractors/types.py +0 -0
  185. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/exporters/__init__.py +0 -0
  186. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/exporters/apmplus_exporter.py +0 -0
  187. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/exporters/base_exporter.py +0 -0
  188. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/exporters/cozeloop_exporter.py +0 -0
  189. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/exporters/inmemory_exporter.py +0 -0
  190. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/exporters/tls_exporter.py +0 -0
  191. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/opentelemetry_tracer.py +0 -0
  192. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/tracing/telemetry/telemetry.py +0 -0
  193. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/types.py +0 -0
  194. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/utils/__init__.py +0 -0
  195. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/utils/logger.py +0 -0
  196. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/utils/mcp_utils.py +0 -0
  197. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/utils/misc.py +0 -0
  198. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/utils/patches.py +0 -0
  199. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk/utils/volcengine_sign.py +0 -0
  200. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk_python.egg-info/dependency_links.txt +0 -0
  201. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk_python.egg-info/entry_points.txt +0 -0
  202. {veadk_python-0.2.11 → veadk_python-0.2.12}/veadk_python.egg-info/requires.txt +0 -0
  203. {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.11
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "veadk-python"
3
- version = "0.2.11"
3
+ version = "0.2.12"
4
4
  description = "Volcengine agent development kit, integrations with Volcengine cloud services."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -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(backend=long_term_memory_backend) # type: ignore
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
- def web(host: str) -> None:
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
@@ -137,7 +137,7 @@ class VikingDBLTMBackend(BaseLongTermMemoryBackend):
137
137
  ) -> list[str]:
138
138
  filter = {
139
139
  "user_id": user_id,
140
- "memory_type": ["sys_event_v1"],
140
+ "memory_type": ["sys_event_v1", "event_v1"],
141
141
  }
142
142
 
143
143
  logger.debug(
@@ -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
- async def image_generate(
48
- tasks: list,
49
- tool_context: ToolContext,
50
- ) -> Dict:
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
- for idx, item in enumerate(tasks):
135
- input_part = {"role": "user"}
136
- output_part = {"message.role": "model"}
137
- total_tokens = 0
138
- output_tokens = 0
139
- tracer = trace.get_tracer("gcp.vertex.agent")
140
- with tracer.start_as_current_span("call_llm") as span:
141
- task_type = item.get("task_type", "text_to_single")
142
- prompt = item.get("prompt", "")
143
- response_format = item.get("response_format", None)
144
- size = item.get("size", None)
145
- watermark = item.get("watermark", None)
146
- image = item.get("image", None)
147
- sequential_image_generation = item.get("sequential_image_generation", None)
148
- max_images = item.get("max_images", None)
149
-
150
- input_part["parts.0.type"] = "text"
151
- input_part["parts.0.text"] = json.dumps(item, ensure_ascii=False)
152
- inputs = {
153
- "prompt": prompt,
154
- }
155
-
156
- if size:
157
- inputs["size"] = size
158
- if response_format:
159
- inputs["response_format"] = response_format
160
- if watermark:
161
- inputs["watermark"] = watermark
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
- else:
290
- app_name = tool_context._invocation_context.app_name
291
- user_id = tool_context._invocation_context.user_id
292
- session_id = tool_context._invocation_context.session.id
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
- artifact_service = tool_context._invocation_context.artifact_service
295
- if artifact_service:
296
- for image in success_list:
297
- for _, image_tos_url in image.items():
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(