veadk-python 0.2.5__tar.gz → 0.2.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of veadk-python might be problematic. Click here for more details.

Files changed (167) hide show
  1. {veadk_python-0.2.5 → veadk_python-0.2.6}/PKG-INFO +1 -1
  2. {veadk_python-0.2.5 → veadk_python-0.2.6}/pyproject.toml +3 -2
  3. {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_agent.py +12 -6
  4. {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_runner.py +6 -2
  5. {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_tos.py +67 -8
  6. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/agent.py +19 -7
  7. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cli/cli_deploy.py +2 -0
  8. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cli/cli_init.py +25 -6
  9. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/consts.py +20 -1
  10. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/database_adapter.py +88 -0
  11. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/kv/redis_database.py +47 -0
  12. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/local_database.py +22 -4
  13. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/relational/mysql_database.py +58 -0
  14. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/vector/opensearch_vector_database.py +6 -3
  15. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/viking/viking_database.py +69 -0
  16. veadk_python-0.2.6/veadk/integrations/ve_cr/ve_cr.py +205 -0
  17. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/cookiecutter.json +2 -1
  18. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/app.py +24 -1
  19. veadk_python-0.2.6/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/requirements.txt +3 -0
  20. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/run.sh +0 -7
  21. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/ve_faas.py +2 -0
  22. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/cookiecutter.json +17 -0
  23. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/clean.py +23 -0
  24. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/config.yaml.example +2 -0
  25. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/deploy.py +41 -0
  26. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/Dockerfile +23 -0
  27. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/app.py +123 -0
  28. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/init_db.py +46 -0
  29. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/models.py +36 -0
  30. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/requirements.txt +4 -0
  31. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/run.sh +21 -0
  32. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/css/style.css +368 -0
  33. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/js/admin.js +0 -0
  34. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/dashboard.html +21 -0
  35. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/edit_post.html +24 -0
  36. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/login.html +21 -0
  37. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/posts.html +53 -0
  38. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/base.html +45 -0
  39. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/index.html +29 -0
  40. veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/post.html +14 -0
  41. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_tos/ve_tos.py +92 -30
  42. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/knowledgebase/knowledgebase.py +8 -0
  43. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/runner.py +49 -16
  44. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/attributes/extractors/common_attributes_extractors.py +5 -0
  45. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/attributes/extractors/llm_attributes_extractors.py +253 -129
  46. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/attributes/extractors/types.py +15 -4
  47. veadk_python-0.2.6/veadk/tracing/telemetry/exporters/__init__.py +13 -0
  48. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/opentelemetry_tracer.py +11 -5
  49. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/telemetry.py +19 -4
  50. veadk_python-0.2.6/veadk/utils/__init__.py +13 -0
  51. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/version.py +1 -1
  52. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk_python.egg-info/PKG-INFO +1 -1
  53. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk_python.egg-info/SOURCES.txt +22 -0
  54. veadk_python-0.2.5/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/requirements.txt +0 -1
  55. {veadk_python-0.2.5 → veadk_python-0.2.6}/LICENSE +0 -0
  56. {veadk_python-0.2.5 → veadk_python-0.2.6}/README.md +0 -0
  57. {veadk_python-0.2.5 → veadk_python-0.2.6}/setup.cfg +0 -0
  58. {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_agent_card.py +0 -0
  59. {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_cloud.py +0 -0
  60. {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_evaluator.py +0 -0
  61. {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_knowledgebase.py +0 -0
  62. {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_long_term_memory.py +0 -0
  63. {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_multiple_agents.py +0 -0
  64. {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_runtime_data_collecting.py +0 -0
  65. {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_short_term_memory.py +0 -0
  66. {veadk_python-0.2.5 → veadk_python-0.2.6}/tests/test_tracing.py +0 -0
  67. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/__init__.py +0 -0
  68. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/a2a/__init__.py +0 -0
  69. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/a2a/agent_card.py +0 -0
  70. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/a2a/remote_ve_agent.py +0 -0
  71. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/a2a/ve_a2a_server.py +0 -0
  72. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/a2a/ve_agent_executor.py +0 -0
  73. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/a2a/ve_task_store.py +0 -0
  74. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/agents/loop_agent.py +0 -0
  75. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/agents/parallel_agent.py +0 -0
  76. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/agents/sequential_agent.py +0 -0
  77. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cli/__init__.py +0 -0
  78. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cli/cli.py +0 -0
  79. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cli/cli_prompt.py +0 -0
  80. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cli/cli_web.py +0 -0
  81. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cloud/__init__.py +0 -0
  82. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cloud/cloud_agent_engine.py +0 -0
  83. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/cloud/cloud_app.py +0 -0
  84. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/config.py +0 -0
  85. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/__init__.py +0 -0
  86. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/base_database.py +0 -0
  87. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/database_factory.py +0 -0
  88. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/kv/__init__.py +0 -0
  89. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/relational/__init__.py +0 -0
  90. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/vector/__init__.py +0 -0
  91. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/vector/type.py +0 -0
  92. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/viking/__init__.py +0 -0
  93. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/database/viking/viking_memory_db.py +0 -0
  94. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/__init__.py +0 -0
  95. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/adk_evaluator/__init__.py +0 -0
  96. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/adk_evaluator/adk_evaluator.py +0 -0
  97. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/base_evaluator.py +0 -0
  98. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/deepeval_evaluator/__init__.py +0 -0
  99. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/deepeval_evaluator/deepeval_evaluator.py +0 -0
  100. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/eval_set_file_loader.py +0 -0
  101. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/eval_set_recorder.py +0 -0
  102. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/types.py +0 -0
  103. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/evaluation/utils/prometheus.py +0 -0
  104. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_apig/__init__.py +0 -0
  105. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_apig/ve_apig.py +0 -0
  106. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_apig/ve_apig_utils.py +0 -0
  107. {veadk_python-0.2.5/veadk/integrations/ve_faas → veadk_python-0.2.6/veadk/integrations/ve_cr}/__init__.py +0 -0
  108. {veadk_python-0.2.5/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}} → veadk_python-0.2.6/veadk/integrations/ve_faas}/__init__.py +0 -0
  109. {veadk_python-0.2.5/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src → veadk_python-0.2.6/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}}/__init__.py +0 -0
  110. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/clean.py +0 -0
  111. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/config.yaml.example +0 -0
  112. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/deploy.py +0 -0
  113. {veadk_python-0.2.5/veadk/integrations/ve_prompt_pilot → veadk_python-0.2.6/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src}/__init__.py +0 -0
  114. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/agent.py +0 -0
  115. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{ cookiecutter.app_name|replace('-', '_') }}/__init__.py +0 -0
  116. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{ cookiecutter.app_name|replace('-', '_') }}/agent.py +0 -0
  117. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_faas/ve_faas_utils.py +0 -0
  118. {veadk_python-0.2.5/veadk/memory → veadk_python-0.2.6/veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}}/__init__.py +0 -0
  119. {veadk_python-0.2.5/veadk/prompts → veadk_python-0.2.6/veadk/integrations/ve_prompt_pilot}/__init__.py +0 -0
  120. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/integrations/ve_prompt_pilot/ve_prompt_pilot.py +0 -0
  121. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/knowledgebase/__init__.py +0 -0
  122. {veadk_python-0.2.5/veadk/tools → veadk_python-0.2.6/veadk/memory}/__init__.py +0 -0
  123. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/memory/long_term_memory.py +0 -0
  124. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/memory/short_term_memory.py +0 -0
  125. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/memory/short_term_memory_processor.py +0 -0
  126. {veadk_python-0.2.5/veadk/tools/builtin_tools → veadk_python-0.2.6/veadk/prompts}/__init__.py +0 -0
  127. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/prompts/agent_default_prompt.py +0 -0
  128. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/prompts/prompt_evaluator.py +0 -0
  129. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/prompts/prompt_memory_processor.py +0 -0
  130. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/prompts/prompt_optimization.py +0 -0
  131. {veadk_python-0.2.5/veadk/tools/sandbox → veadk_python-0.2.6/veadk/tools}/__init__.py +0 -0
  132. {veadk_python-0.2.5/veadk/tracing → veadk_python-0.2.6/veadk/tools/builtin_tools}/__init__.py +0 -0
  133. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/image_edit.py +0 -0
  134. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/image_generate.py +0 -0
  135. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/lark.py +0 -0
  136. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/las.py +0 -0
  137. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/mcp_router.py +0 -0
  138. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/vesearch.py +0 -0
  139. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/video_generate.py +0 -0
  140. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/web_scraper.py +0 -0
  141. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/builtin_tools/web_search.py +0 -0
  142. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/demo_tools.py +0 -0
  143. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/load_knowledgebase_tool.py +0 -0
  144. {veadk_python-0.2.5/veadk/tracing/telemetry → veadk_python-0.2.6/veadk/tools/sandbox}/__init__.py +0 -0
  145. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/sandbox/browser_sandbox.py +0 -0
  146. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/sandbox/code_sandbox.py +0 -0
  147. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tools/sandbox/computer_sandbox.py +0 -0
  148. {veadk_python-0.2.5/veadk/tracing/telemetry/exporters → veadk_python-0.2.6/veadk/tracing}/__init__.py +0 -0
  149. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/base_tracer.py +0 -0
  150. {veadk_python-0.2.5/veadk/utils → veadk_python-0.2.6/veadk/tracing/telemetry}/__init__.py +0 -0
  151. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/attributes/attributes.py +0 -0
  152. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/attributes/extractors/tool_attributes_extractors.py +0 -0
  153. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/exporters/apmplus_exporter.py +0 -0
  154. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/exporters/base_exporter.py +0 -0
  155. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/exporters/cozeloop_exporter.py +0 -0
  156. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/exporters/inmemory_exporter.py +0 -0
  157. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/tracing/telemetry/exporters/tls_exporter.py +0 -0
  158. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/types.py +0 -0
  159. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/utils/logger.py +0 -0
  160. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/utils/mcp_utils.py +0 -0
  161. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/utils/misc.py +0 -0
  162. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/utils/patches.py +0 -0
  163. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk/utils/volcengine_sign.py +0 -0
  164. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk_python.egg-info/dependency_links.txt +0 -0
  165. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk_python.egg-info/entry_points.txt +0 -0
  166. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk_python.egg-info/requires.txt +0 -0
  167. {veadk_python-0.2.5 → veadk_python-0.2.6}/veadk_python.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: veadk-python
3
- Version: 0.2.5
3
+ Version: 0.2.6
4
4
  Summary: Volcengine agent development kit, integrations with Volcengine cloud services.
5
5
  Author-email: Yaozheng Fang <fangyozheng@gmail.com>, Guodong Li <cu.eric.lee@gmail.com>, Zhi Han <sliverydayday@gmail.com>, Meng Wang <mengwangwm@gmail.com>
6
6
  License: Apache License
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "veadk-python"
3
- version = "0.2.5"
3
+ version = "0.2.6"
4
4
  description = "Volcengine agent development kit, integrations with Volcengine cloud services."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -74,5 +74,6 @@ include-package-data = true
74
74
 
75
75
  [tool.ruff]
76
76
  exclude = [
77
- "veadk/integrations/ve_faas/template/*"
77
+ "veadk/integrations/ve_faas/template/*",
78
+ "veadk/integrations/ve_faas/web_template/*"
78
79
  ]
@@ -15,7 +15,7 @@
15
15
  from google.adk.tools import load_memory
16
16
 
17
17
  from veadk import Agent
18
- from veadk.consts import DEFAULT_MODEL_EXTRA_HEADERS
18
+ from veadk.consts import DEFAULT_MODEL_EXTRA_CONFIG
19
19
  from veadk.knowledgebase import KnowledgeBase
20
20
  from veadk.memory.long_term_memory import LongTermMemory
21
21
  from veadk.tools import load_knowledgebase_tool
@@ -27,14 +27,17 @@ def test_agent():
27
27
  long_term_memory = LongTermMemory(backend="local")
28
28
  tracer = OpentelemetryTracer()
29
29
 
30
- model_extra_headers = {"test-header": "test-value"}
30
+ extra_config = {
31
+ "extra_headers": {"thinking": "test"},
32
+ "extra_body": {"content": "test"},
33
+ }
31
34
 
32
35
  agent = Agent(
33
36
  model_name="test_model_name",
34
37
  model_provider="test_model_provider",
35
38
  model_api_key="test_model_api_key",
36
39
  model_api_base="test_model_api_base",
37
- model_extra_headers=model_extra_headers,
40
+ model_extra_config=extra_config,
38
41
  tools=[],
39
42
  sub_agents=[],
40
43
  knowledgebase=knowledgebase,
@@ -43,10 +46,13 @@ def test_agent():
43
46
  serve_url="",
44
47
  )
45
48
 
46
- model_extra_headers |= DEFAULT_MODEL_EXTRA_HEADERS
47
-
48
49
  assert agent.model.model == f"{agent.model_provider}/{agent.model_name}"
49
- assert agent.model_extra_headers == model_extra_headers
50
+
51
+ expected_config = DEFAULT_MODEL_EXTRA_CONFIG.copy()
52
+ expected_config["extra_headers"] |= extra_config["extra_headers"]
53
+ expected_config["extra_body"] |= extra_config["extra_body"]
54
+
55
+ assert agent.model_extra_config == expected_config
50
56
 
51
57
  assert agent.knowledgebase == knowledgebase
52
58
  assert agent.knowledgebase.backend == "local"
@@ -28,7 +28,9 @@ def _test_convert_messages(runner):
28
28
  role="user",
29
29
  )
30
30
  ]
31
- actual_message = runner._convert_messages(message, session_id="test_session_id")
31
+ actual_message = runner._convert_messages(
32
+ message, session_id="test_session_id", upload_inline_data_to_tos=True
33
+ )
32
34
  assert actual_message == expected_message
33
35
 
34
36
  message = ["test message 1", "test message 2"]
@@ -42,7 +44,9 @@ def _test_convert_messages(runner):
42
44
  role="user",
43
45
  ),
44
46
  ]
45
- actual_message = runner._convert_messages(message, session_id="test_session_id")
47
+ actual_message = runner._convert_messages(
48
+ message, session_id="test_session_id", upload_inline_data_to_tos=True
49
+ )
46
50
  assert actual_message == expected_message
47
51
 
48
52
 
@@ -14,14 +14,29 @@
14
14
 
15
15
  import pytest
16
16
  from unittest import mock
17
- import veadk.integrations.ve_tos.ve_tos as tos_mod
17
+
18
+ # Check if tos module is available
19
+ import importlib
20
+
21
+ TOS_AVAILABLE = False
22
+ try:
23
+ importlib.import_module("veadk.integrations.ve_tos.ve_tos")
24
+ TOS_AVAILABLE = True
25
+ except ImportError:
26
+ pass
27
+
28
+ # Skip tests that require tos module if it's not available
29
+ require_tos = pytest.mark.skipif(not TOS_AVAILABLE, reason="tos module not available")
18
30
 
19
31
  # 使用 pytest-asyncio
20
32
  pytest_plugins = ("pytest_asyncio",)
21
33
 
22
34
 
23
35
  @pytest.fixture
36
+ @require_tos
24
37
  def mock_client(monkeypatch):
38
+ import veadk.integrations.ve_tos.ve_tos as tos_mod
39
+
25
40
  fake_client = mock.Mock()
26
41
 
27
42
  monkeypatch.setenv("DATABASE_TOS_REGION", "test-region")
@@ -33,9 +48,17 @@ def mock_client(monkeypatch):
33
48
 
34
49
  class FakeExceptions:
35
50
  class TosServerError(Exception):
36
- def __init__(self, msg):
51
+ def __init__(
52
+ self,
53
+ msg: str,
54
+ code: int = 0,
55
+ host_id: str = "",
56
+ resource: str = "",
57
+ request_id: str = "",
58
+ header=None,
59
+ ):
37
60
  super().__init__(msg)
38
- self.status_code = None
61
+ self.status_code = code
39
62
 
40
63
  monkeypatch.setattr(tos_mod.tos, "exceptions", FakeExceptions)
41
64
  monkeypatch.setattr(
@@ -44,17 +67,23 @@ def mock_client(monkeypatch):
44
67
  type("S", (), {"Storage_Class_Standard": "STANDARD"}),
45
68
  )
46
69
  monkeypatch.setattr(
47
- tos_mod.tos, "ACLType", type("A", (), {"ACL_Private": "private"})
70
+ tos_mod.tos,
71
+ "ACLType",
72
+ type("A", (), {"ACL_Private": "private", "ACL_Public_Read": "public-read"}),
48
73
  )
49
74
 
50
75
  return fake_client
51
76
 
52
77
 
53
78
  @pytest.fixture
79
+ @require_tos
54
80
  def tos_client(mock_client):
81
+ import veadk.integrations.ve_tos.ve_tos as tos_mod
82
+
55
83
  return tos_mod.VeTOS()
56
84
 
57
85
 
86
+ @require_tos
58
87
  def test_create_bucket_exists(tos_client, mock_client):
59
88
  mock_client.head_bucket.return_value = None # head_bucket 正常返回表示存在
60
89
  result = tos_client.create_bucket()
@@ -62,9 +91,11 @@ def test_create_bucket_exists(tos_client, mock_client):
62
91
  mock_client.create_bucket.assert_not_called()
63
92
 
64
93
 
94
+ @require_tos
65
95
  def test_create_bucket_not_exists(tos_client, mock_client):
66
- exc = tos_mod.tos.exceptions.TosServerError("not found")
67
- exc.status_code = 404
96
+ import veadk.integrations.ve_tos.ve_tos as tos_mod
97
+
98
+ exc = tos_mod.tos.exceptions.TosServerError(msg="not found", code=404)
68
99
  mock_client.head_bucket.side_effect = exc
69
100
 
70
101
  result = tos_client.create_bucket()
@@ -72,17 +103,19 @@ def test_create_bucket_not_exists(tos_client, mock_client):
72
103
  mock_client.create_bucket.assert_called_once()
73
104
 
74
105
 
106
+ @require_tos
75
107
  @pytest.mark.asyncio
76
108
  async def test_upload_bytes_success(tos_client, mock_client):
77
109
  mock_client.head_bucket.return_value = True
78
110
  data = b"hello world"
79
111
 
80
112
  result = await tos_client.upload("obj-key", data)
81
- assert result is True
113
+ assert result is None
82
114
  mock_client.put_object.assert_called_once()
83
115
  mock_client.close.assert_called_once()
84
116
 
85
117
 
118
+ @require_tos
86
119
  @pytest.mark.asyncio
87
120
  async def test_upload_file_success(tmp_path, tos_client, mock_client):
88
121
  mock_client.head_bucket.return_value = True
@@ -90,11 +123,12 @@ async def test_upload_file_success(tmp_path, tos_client, mock_client):
90
123
  file_path.write_text("hello file")
91
124
 
92
125
  result = await tos_client.upload("obj-key", str(file_path))
93
- assert result is True
126
+ assert result is None
94
127
  mock_client.put_object_from_file.assert_called_once()
95
128
  mock_client.close.assert_called_once()
96
129
 
97
130
 
131
+ @require_tos
98
132
  def test_download_success(tmp_path, tos_client, mock_client):
99
133
  save_path = tmp_path / "out.txt"
100
134
  mock_client.get_object.return_value = [b"abc", b"def"]
@@ -104,7 +138,32 @@ def test_download_success(tmp_path, tos_client, mock_client):
104
138
  assert save_path.read_bytes() == b"abcdef"
105
139
 
106
140
 
141
+ @require_tos
107
142
  def test_download_fail(tos_client, mock_client):
108
143
  mock_client.get_object.side_effect = Exception("boom")
109
144
  result = tos_client.download("obj-key", "somewhere.txt")
110
145
  assert result is False
146
+
147
+
148
+ @require_tos
149
+ @pytest.mark.skipif(TOS_AVAILABLE, reason="tos module is available")
150
+ def test_tos_import_error():
151
+ """Test VeTOS behavior when tos module is not installed"""
152
+ # Remove tos from sys.modules to simulate it's not installed
153
+ import sys
154
+
155
+ original_tos = sys.modules.get("tos")
156
+ if "tos" in sys.modules:
157
+ del sys.modules["tos"]
158
+
159
+ try:
160
+ # Try to import ve_tos module, which should raise ImportError
161
+ with pytest.raises(ImportError) as exc_info:
162
+ pass
163
+
164
+ # Check that the error message contains installation instructions
165
+ assert "pip install tos" in str(exc_info.value)
166
+ finally:
167
+ # Restore original state
168
+ if original_tos is not None:
169
+ sys.modules["tos"] = original_tos
@@ -28,10 +28,10 @@ from typing_extensions import Any
28
28
 
29
29
  from veadk.config import getenv
30
30
  from veadk.consts import (
31
- DEFAULT_MODEL_AGENT_PROVIDER,
32
31
  DEFAULT_MODEL_AGENT_API_BASE,
33
32
  DEFAULT_MODEL_AGENT_NAME,
34
- DEFAULT_MODEL_EXTRA_HEADERS,
33
+ DEFAULT_MODEL_AGENT_PROVIDER,
34
+ DEFAULT_MODEL_EXTRA_CONFIG,
35
35
  )
36
36
  from veadk.evaluation import EvalSetRecorder
37
37
  from veadk.knowledgebase import KnowledgeBase
@@ -101,11 +101,23 @@ class Agent(LlmAgent):
101
101
  def model_post_init(self, __context: Any) -> None:
102
102
  super().model_post_init(None) # for sub_agents init
103
103
 
104
- # add model request source (veadk) in extra headers
105
- if self.model_extra_config and "extra_headers" in self.model_extra_config:
106
- self.model_extra_config["extra_headers"] |= DEFAULT_MODEL_EXTRA_HEADERS
107
- else:
108
- self.model_extra_config["extra_headers"] = DEFAULT_MODEL_EXTRA_HEADERS
104
+ # combine user model config with VeADK defaults
105
+ headers = DEFAULT_MODEL_EXTRA_CONFIG["extra_headers"].copy()
106
+ body = DEFAULT_MODEL_EXTRA_CONFIG["extra_body"].copy()
107
+
108
+ if self.model_extra_config:
109
+ user_headers = self.model_extra_config.get("extra_headers", {})
110
+ user_body = self.model_extra_config.get("extra_body", {})
111
+
112
+ headers |= user_headers
113
+ body |= user_body
114
+
115
+ self.model_extra_config |= {
116
+ "extra_headers": headers,
117
+ "extra_body": body,
118
+ }
119
+
120
+ logger.info(f"Model extra config: {self.model_extra_config}")
109
121
 
110
122
  if not self.model:
111
123
  self.model = LiteLlm(
@@ -14,6 +14,7 @@
14
14
 
15
15
 
16
16
  import click
17
+ from veadk.version import VERSION
17
18
 
18
19
  TEMP_PATH = "/tmp"
19
20
 
@@ -94,6 +95,7 @@ def deploy(
94
95
  "veapig_service_name": veapig_service_name,
95
96
  "veapig_upstream_name": veapig_upstream_name,
96
97
  "use_adk_web": use_adk_web,
98
+ "veadk_version": VERSION,
97
99
  }
98
100
 
99
101
  cookiecutter(
@@ -16,6 +16,8 @@ import warnings
16
16
  from typing import Any
17
17
 
18
18
  import click
19
+ from veadk.version import VERSION
20
+
19
21
 
20
22
  warnings.filterwarnings(
21
23
  "ignore", category=UserWarning, module="pydantic._internal._fields"
@@ -58,12 +60,21 @@ def _render_prompts() -> dict[str, Any]:
58
60
  "veapig_service_name": veapig_service_name,
59
61
  "veapig_upstream_name": veapig_upstream_name,
60
62
  "use_adk_web": deploy_mode == "2",
63
+ "veadk_version": VERSION,
61
64
  }
62
65
 
63
66
 
64
67
  @click.command()
65
- def init() -> None:
66
- """Init a veadk project that can be deployed to Volcengine VeFaaS."""
68
+ @click.option(
69
+ "--vefaas-template-type", default="template", help="Expected template type"
70
+ )
71
+ def init(
72
+ vefaas_template_type: str,
73
+ ) -> None:
74
+ """Init a veadk project that can be deployed to Volcengine VeFaaS.
75
+
76
+ `template` is A2A/MCP/Web server template, `web_template` is for web applications (i.e., a simple blog).
77
+ """
67
78
  import shutil
68
79
  from pathlib import Path
69
80
 
@@ -71,9 +82,14 @@ def init() -> None:
71
82
 
72
83
  import veadk.integrations.ve_faas as vefaas
73
84
 
74
- click.echo(
75
- "Welcome use VeADK to create your project. We will generate a `weather-reporter` application for you."
76
- )
85
+ if vefaas_template_type == "web_template":
86
+ click.echo(
87
+ "Welcome use VeADK to create your project. We will generate a `simple-blog` web application for you."
88
+ )
89
+ else:
90
+ click.echo(
91
+ "Welcome use VeADK to create your project. We will generate a `weather-reporter` application for you."
92
+ )
77
93
 
78
94
  cwd = Path.cwd()
79
95
  local_dir_name = click.prompt("Local directory name", default="veadk-cloud-proj")
@@ -89,7 +105,10 @@ def init() -> None:
89
105
  settings = _render_prompts()
90
106
  settings["local_dir_name"] = local_dir_name
91
107
 
92
- template_dir_path = Path(vefaas.__file__).parent / "template"
108
+ if not vefaas_template_type:
109
+ vefaas_template_type = "template"
110
+
111
+ template_dir_path = Path(vefaas.__file__).parent / vefaas_template_type
93
112
 
94
113
  cookiecutter(
95
114
  template=str(template_dir_path),
@@ -12,12 +12,27 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ import time
16
+
17
+ from veadk.config import getenv
15
18
  from veadk.version import VERSION
16
19
 
17
20
  DEFAULT_MODEL_AGENT_NAME = "doubao-seed-1-6-250615"
18
21
  DEFAULT_MODEL_AGENT_PROVIDER = "openai"
19
22
  DEFAULT_MODEL_AGENT_API_BASE = "https://ark.cn-beijing.volces.com/api/v3/"
20
- DEFAULT_MODEL_EXTRA_HEADERS = {"veadk-source": "veadk", "veadk-version": VERSION}
23
+ DEFAULT_MODEL_EXTRA_CONFIG = {
24
+ "extra_headers": {
25
+ "x-is-encrypted": getenv("MODEL_AGENT_ENCRYPTED", "true"),
26
+ "veadk-source": "veadk",
27
+ "veadk-version": VERSION,
28
+ },
29
+ "extra_body": {
30
+ "caching": {
31
+ "type": getenv("MODEL_AGENT_CACHING", "enabled"),
32
+ },
33
+ "expire_at": int(time.time()) + 3600, # expire after 1 hour
34
+ },
35
+ }
21
36
 
22
37
  DEFAULT_APMPLUS_OTEL_EXPORTER_ENDPOINT = "http://apmplus-cn-beijing.volces.com:4317"
23
38
  DEFAULT_APMPLUS_OTEL_EXPORTER_SERVICE_NAME = "veadk_tracing"
@@ -28,3 +43,7 @@ DEFAULT_COZELOOP_OTEL_EXPORTER_ENDPOINT = (
28
43
 
29
44
  DEFAULT_TLS_OTEL_EXPORTER_ENDPOINT = "https://tls-cn-beijing.volces.com:4318/v1/traces"
30
45
  DEFAULT_TLS_OTEL_EXPORTER_REGION = "cn-beijing"
46
+
47
+ DEFAULT_CR_INSTANCE_NAME = "veadk-user-instance"
48
+ DEFAULT_CR_NAMESPACE_NAME = "veadk-user-namespace"
49
+ DEFAULT_CR_REPO_NAME = "veadk-user-repo"
@@ -54,6 +54,33 @@ class KVDatabaseAdapter:
54
54
  logger.error(f"Failed to search from Redis: index={index} error={e}")
55
55
  raise e
56
56
 
57
+ def delete_doc(self, index: str, id: str) -> bool:
58
+ logger.debug(f"Deleting document from Redis database: index={index} id={id}")
59
+ try:
60
+ # For Redis, we need to handle deletion differently since RedisDatabase.delete_doc
61
+ # takes a key and a single id
62
+ result = self.client.delete_doc(key=index, id=id)
63
+ return result
64
+ except Exception as e:
65
+ logger.error(
66
+ f"Failed to delete document from Redis database: index={index} id={id} error={e}"
67
+ )
68
+ return False
69
+
70
+ def list_docs(self, index: str, offset: int = 0, limit: int = 100) -> list[dict]:
71
+ logger.debug(f"Listing documents from Redis database: index={index}")
72
+ try:
73
+ # Get all documents from Redis
74
+ docs = self.client.list_docs(key=index)
75
+
76
+ # Apply offset and limit for pagination
77
+ return docs[offset : offset + limit]
78
+ except Exception as e:
79
+ logger.error(
80
+ f"Failed to list documents from Redis database: index={index} error={e}"
81
+ )
82
+ return []
83
+
57
84
 
58
85
  class RelationalDatabaseAdapter:
59
86
  def __init__(self, client):
@@ -108,6 +135,28 @@ class RelationalDatabaseAdapter:
108
135
 
109
136
  return [item["data"] for item in results]
110
137
 
138
+ def delete_doc(self, index: str, id: str) -> bool:
139
+ logger.debug(f"Deleting document from SQL database: table_name={index} id={id}")
140
+ try:
141
+ # Convert single id to list for the client method
142
+ result = self.client.delete_doc(table=index, ids=[int(id)])
143
+ return result
144
+ except Exception as e:
145
+ logger.error(
146
+ f"Failed to delete document from SQL database: table_name={index} id={id} error={e}"
147
+ )
148
+ return False
149
+
150
+ def list_docs(self, index: str, offset: int = 0, limit: int = 100) -> list[dict]:
151
+ logger.debug(f"Listing documents from SQL database: table_name={index}")
152
+ try:
153
+ return self.client.list_docs(table=index, offset=offset, limit=limit)
154
+ except Exception as e:
155
+ logger.error(
156
+ f"Failed to list documents from SQL database: table_name={index} error={e}"
157
+ )
158
+ return []
159
+
111
160
 
112
161
  class VectorDatabaseAdapter:
113
162
  def __init__(self, client):
@@ -152,6 +201,23 @@ class VectorDatabaseAdapter:
152
201
  top_k=top_k,
153
202
  )
154
203
 
204
+ def delete_doc(self, index: str, id: str) -> bool:
205
+ self._validate_index(index)
206
+ logger.debug(f"Deleting documents from vector database: index={index} id={id}")
207
+ try:
208
+ self.client.delete_by_id(collection_name=index, id=id)
209
+ return True
210
+ except Exception as e:
211
+ logger.error(
212
+ f"Failed to delete document from vector database: index={index} id={id} error={e}"
213
+ )
214
+ return False
215
+
216
+ def list_docs(self, index: str, offset: int = 0, limit: int = 1000) -> list[dict]:
217
+ self._validate_index(index)
218
+ logger.debug(f"Listing documents from vector database: index={index}")
219
+ return self.client.list_docs(collection_name=index, offset=offset, limit=limit)
220
+
155
221
 
156
222
  class VikingDatabaseAdapter:
157
223
  def __init__(self, client):
@@ -212,6 +278,16 @@ class VikingDatabaseAdapter:
212
278
 
213
279
  return self.client.query(query, collection_name=index, top_k=top_k)
214
280
 
281
+ def delete_doc(self, index: str, id: str) -> bool:
282
+ self._validate_index(index)
283
+ logger.debug(f"Deleting documents from vector database: index={index} id={id}")
284
+ return self.client.delete_by_id(collection_name=index, id=id)
285
+
286
+ def list_docs(self, index: str, offset: int, limit: int) -> list[dict]:
287
+ self._validate_index(index)
288
+ logger.debug(f"Listing documents from vector database: index={index}")
289
+ return self.client.list_docs(collection_name=index, offset=offset, limit=limit)
290
+
215
291
 
216
292
  class VikingMemoryDatabaseAdapter:
217
293
  def __init__(self, client):
@@ -248,6 +324,12 @@ class VikingMemoryDatabaseAdapter:
248
324
  result = self.client.query(query, collection_name=index, top_k=top_k, **kwargs)
249
325
  return result
250
326
 
327
+ def delete_docs(self, index: str, ids: list[int]):
328
+ raise NotImplementedError("VikingMemoryDatabase does not support delete_docs")
329
+
330
+ def list_docs(self, index: str):
331
+ raise NotImplementedError("VikingMemoryDatabase does not support list_docs")
332
+
251
333
 
252
334
  class LocalDatabaseAdapter:
253
335
  def __init__(self, client):
@@ -261,6 +343,12 @@ class LocalDatabaseAdapter:
261
343
  def query(self, query: str, **kwargs):
262
344
  return self.client.query(query, **kwargs)
263
345
 
346
+ def delete_doc(self, index: str, id: str) -> bool:
347
+ return self.client.delete_doc(id)
348
+
349
+ def list_docs(self, index: str, offset: int = 0, limit: int = 100) -> list[dict]:
350
+ return self.client.list_docs(offset=offset, limit=limit)
351
+
264
352
 
265
353
  MAPPING = {
266
354
  "RedisDatabase": KVDatabaseAdapter,
@@ -110,3 +110,50 @@ class RedisDatabase(BaseModel, BaseDatabase):
110
110
  except Exception as e:
111
111
  logger.error(f"Failed to delete key `{key}`: {e}")
112
112
  raise e
113
+
114
+ def delete_doc(self, key: str, id: str) -> bool:
115
+ """Delete a specific document by ID from a Redis list.
116
+
117
+ Args:
118
+ key: The Redis key (list) to delete from
119
+ id: The ID of the document to delete
120
+
121
+ Returns:
122
+ bool: True if deletion was successful, False otherwise
123
+ """
124
+ try:
125
+ # Get all items in the list
126
+ items = self._client.lrange(key, 0, -1)
127
+
128
+ # Find the index of the item to delete
129
+ for i, item in enumerate(items):
130
+ # Assuming the item is stored as a JSON string with an 'id' field
131
+ # If it's just the content, we'll use the list index as ID
132
+ if str(i) == id:
133
+ self._client.lrem(key, 1, item)
134
+ return True
135
+
136
+ logger.warning(f"Document with id {id} not found in key {key}")
137
+ return False
138
+ except Exception as e:
139
+ logger.error(f"Failed to delete document with id {id} from key {key}: {e}")
140
+ return False
141
+
142
+ def list_docs(self, key: str) -> list[dict]:
143
+ """List all documents in a Redis list.
144
+
145
+ Args:
146
+ key: The Redis key (list) to list documents from
147
+
148
+ Returns:
149
+ list[dict]: List of documents with id and content
150
+ """
151
+ try:
152
+ items = self._client.lrange(key, 0, -1)
153
+ return [
154
+ {"id": str(i), "content": item, "metadata": {}}
155
+ for i, item in enumerate(items)
156
+ ]
157
+ except Exception as e:
158
+ logger.error(f"Failed to list documents from key {key}: {e}")
159
+ return []
@@ -24,20 +24,38 @@ class LocalDataBase(BaseDatabase):
24
24
 
25
25
  def __init__(self, **kwargs):
26
26
  super().__init__()
27
- self.data = []
27
+ self.data = {}
28
28
  self._type = "local"
29
+ self._next_id = 0 # Used to generate unique IDs
29
30
 
30
31
  def add_texts(self, texts: list[str], **kwargs):
31
- self.data.extend(texts)
32
+ for text in texts:
33
+ self.data[str(self._next_id)] = text
34
+ self._next_id += 1
32
35
 
33
36
  def is_empty(self):
34
37
  return len(self.data) == 0
35
38
 
36
39
  def query(self, query: str, **kwargs: Any) -> list[str]:
37
- return self.data
40
+ return list(self.data.values())
38
41
 
39
42
  def delete(self, **kwargs: Any):
40
- self.data = []
43
+ self.data = {}
41
44
 
42
45
  def add(self, texts: list[str], **kwargs: Any):
43
46
  return self.add_texts(texts)
47
+
48
+ def list_docs(self, **kwargs: Any) -> list[dict]:
49
+ return [
50
+ {"id": id, "content": content, "metadata": {}}
51
+ for id, content in self.data.items()
52
+ ]
53
+
54
+ def delete_doc(self, id: str, **kwargs: Any):
55
+ if id not in self.data:
56
+ raise ValueError(f"id {id} not found")
57
+ try:
58
+ del self.data[id]
59
+ return True
60
+ except Exception:
61
+ return False