auto-coder 0.1.309__tar.gz → 0.1.312__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 auto-coder might be problematic. Click here for more details.

Files changed (218) hide show
  1. {auto_coder-0.1.309 → auto_coder-0.1.312}/PKG-INFO +2 -2
  2. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/auto_coder.egg-info/PKG-INFO +2 -2
  3. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/auto_coder.egg-info/SOURCES.txt +2 -0
  4. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/auto_coder.egg-info/requires.txt +1 -1
  5. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/auto_coder_runner.py +22 -8
  6. auto_coder-0.1.312/src/autocoder/common/openai_content.py +256 -0
  7. auto_coder-0.1.312/src/autocoder/common/token_cost_caculate.py +200 -0
  8. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/memory/active_context_manager.py +353 -171
  9. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/memory/active_package.py +175 -34
  10. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/long_context_rag.py +4 -1
  11. auto_coder-0.1.312/src/autocoder/version.py +1 -0
  12. auto_coder-0.1.309/src/autocoder/version.py +0 -1
  13. {auto_coder-0.1.309 → auto_coder-0.1.312}/LICENSE +0 -0
  14. {auto_coder-0.1.309 → auto_coder-0.1.312}/README.md +0 -0
  15. {auto_coder-0.1.309 → auto_coder-0.1.312}/setup.cfg +0 -0
  16. {auto_coder-0.1.309 → auto_coder-0.1.312}/setup.py +0 -0
  17. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/auto_coder.egg-info/dependency_links.txt +0 -0
  18. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/auto_coder.egg-info/entry_points.txt +0 -0
  19. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/auto_coder.egg-info/top_level.txt +0 -0
  20. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/__init__.py +0 -0
  21. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/agent/__init__.py +0 -0
  22. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/agent/auto_demand_organizer.py +0 -0
  23. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/agent/auto_filegroup.py +0 -0
  24. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/agent/auto_guess_query.py +0 -0
  25. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/agent/auto_learn_from_commit.py +0 -0
  26. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/agent/auto_review_commit.py +0 -0
  27. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/agent/auto_tool.py +0 -0
  28. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/agent/coder.py +0 -0
  29. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/agent/designer.py +0 -0
  30. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/agent/planner.py +0 -0
  31. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/agent/project_reader.py +0 -0
  32. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/auto_coder.py +0 -0
  33. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/auto_coder_rag.py +0 -0
  34. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/auto_coder_server.py +0 -0
  35. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/benchmark.py +0 -0
  36. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/chat/__init__.py +0 -0
  37. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/chat_auto_coder.py +0 -0
  38. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/chat_auto_coder_lang.py +0 -0
  39. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/command_args.py +0 -0
  40. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/command_parser.py +0 -0
  41. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/commands/__init__.py +0 -0
  42. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/commands/auto_command.py +0 -0
  43. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/commands/auto_web.py +0 -0
  44. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/commands/tools.py +0 -0
  45. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/JupyterClient.py +0 -0
  46. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/ShellClient.py +0 -0
  47. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/__init__.py +0 -0
  48. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/action_yml_file_manager.py +0 -0
  49. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/anything2images.py +0 -0
  50. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/anything2img.py +0 -0
  51. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/audio.py +0 -0
  52. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/auto_coder_lang.py +0 -0
  53. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/auto_configure.py +0 -0
  54. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/buildin_tokenizer.py +0 -0
  55. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/chunk_validation.py +0 -0
  56. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/cleaner.py +0 -0
  57. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/code_auto_execute.py +0 -0
  58. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/code_auto_generate.py +0 -0
  59. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/code_auto_generate_diff.py +0 -0
  60. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
  61. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
  62. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/code_auto_merge.py +0 -0
  63. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/code_auto_merge_diff.py +0 -0
  64. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/code_auto_merge_editblock.py +0 -0
  65. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
  66. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/code_modification_ranker.py +0 -0
  67. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/command_completer.py +0 -0
  68. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/command_generator.py +0 -0
  69. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/command_templates.py +0 -0
  70. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/computer_use.py +0 -0
  71. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/conf_import_export.py +0 -0
  72. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/conf_validator.py +0 -0
  73. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/const.py +0 -0
  74. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/context_pruner.py +0 -0
  75. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/conversation_pruner.py +0 -0
  76. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/files.py +0 -0
  77. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/git_utils.py +0 -0
  78. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/global_cancel.py +0 -0
  79. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/image_to_page.py +0 -0
  80. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/index_import_export.py +0 -0
  81. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/interpreter.py +0 -0
  82. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/llm_rerank.py +0 -0
  83. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/mcp_hub.py +0 -0
  84. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/mcp_server.py +0 -0
  85. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/mcp_servers/__init__.py +0 -0
  86. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/mcp_servers/mcp_server_gpt4o_mini_search.py +0 -0
  87. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +0 -0
  88. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/mcp_tools.py +0 -0
  89. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/memory_manager.py +0 -0
  90. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/model_speed_test.py +0 -0
  91. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/printer.py +0 -0
  92. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/recall_validation.py +0 -0
  93. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/result_manager.py +0 -0
  94. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/screenshots.py +0 -0
  95. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/search.py +0 -0
  96. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/search_replace.py +0 -0
  97. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/shells.py +0 -0
  98. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/stats_panel.py +0 -0
  99. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/stream_out_type.py +0 -0
  100. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/sys_prompt.py +0 -0
  101. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/text.py +0 -0
  102. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/types.py +0 -0
  103. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/common/utils_code_auto_generate.py +0 -0
  104. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/data/byzerllm.md +0 -0
  105. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/data/tokenizer.json +0 -0
  106. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/db/__init__.py +0 -0
  107. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/db/store.py +0 -0
  108. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/dispacher/__init__.py +0 -0
  109. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/dispacher/actions/__init__.py +0 -0
  110. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/dispacher/actions/action.py +0 -0
  111. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/dispacher/actions/copilot.py +0 -0
  112. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
  113. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +0 -0
  114. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/events/__init__.py +0 -0
  115. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/events/event_content.py +0 -0
  116. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/events/event_manager.py +0 -0
  117. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/events/event_manager_singleton.py +0 -0
  118. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/events/event_store.py +0 -0
  119. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/events/event_types.py +0 -0
  120. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/index/__init__.py +0 -0
  121. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/index/entry.py +0 -0
  122. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/index/filter/__init__.py +0 -0
  123. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/index/filter/normal_filter.py +0 -0
  124. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/index/filter/quick_filter.py +0 -0
  125. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/index/for_command.py +0 -0
  126. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/index/index.py +0 -0
  127. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/index/symbols_utils.py +0 -0
  128. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/index/types.py +0 -0
  129. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/lang.py +0 -0
  130. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/memory/__init__.py +0 -0
  131. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/memory/async_processor.py +0 -0
  132. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/memory/directory_mapper.py +0 -0
  133. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/models.py +0 -0
  134. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/plugins/__init__.py +0 -0
  135. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/plugins/dynamic_completion_example.py +0 -0
  136. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/plugins/git_helper_plugin.py +0 -0
  137. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/plugins/sample_plugin.py +0 -0
  138. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/plugins/token_helper_plugin.py +0 -0
  139. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/plugins/utils.py +0 -0
  140. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/privacy/__init__.py +0 -0
  141. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/privacy/model_filter.py +0 -0
  142. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/pyproject/__init__.py +0 -0
  143. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/__init__.py +0 -0
  144. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/api_server.py +0 -0
  145. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/cache/__init__.py +0 -0
  146. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/cache/base_cache.py +0 -0
  147. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/cache/byzer_storage_cache.py +0 -0
  148. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/cache/cache_result_merge.py +0 -0
  149. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/cache/file_monitor_cache.py +0 -0
  150. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/cache/local_byzer_storage_cache.py +0 -0
  151. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/cache/local_duckdb_storage_cache.py +0 -0
  152. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/cache/rag_file_meta.py +0 -0
  153. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/cache/simple_cache.py +0 -0
  154. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/conversation_to_queries.py +0 -0
  155. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/doc_filter.py +0 -0
  156. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/document_retriever.py +0 -0
  157. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/lang.py +0 -0
  158. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/llm_wrapper.py +0 -0
  159. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/loaders/__init__.py +0 -0
  160. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/loaders/docx_loader.py +0 -0
  161. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/loaders/excel_loader.py +0 -0
  162. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
  163. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
  164. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/qa_conversation_strategy.py +0 -0
  165. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/rag_config.py +0 -0
  166. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/rag_entry.py +0 -0
  167. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/raw_rag.py +0 -0
  168. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/relevant_utils.py +0 -0
  169. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/searchable.py +0 -0
  170. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/simple_directory_reader.py +0 -0
  171. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/simple_rag.py +0 -0
  172. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/stream_event/__init__.py +0 -0
  173. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/stream_event/event_writer.py +0 -0
  174. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/stream_event/types.py +0 -0
  175. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/token_checker.py +0 -0
  176. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/token_counter.py +0 -0
  177. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/token_limiter.py +0 -0
  178. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/token_limiter_utils.py +0 -0
  179. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/types.py +0 -0
  180. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/utils.py +0 -0
  181. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/rag/variable_holder.py +0 -0
  182. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/regexproject/__init__.py +0 -0
  183. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/run_context.py +0 -0
  184. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/suffixproject/__init__.py +0 -0
  185. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/tsproject/__init__.py +0 -0
  186. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/__init__.py +0 -0
  187. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/_markitdown.py +0 -0
  188. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/auto_coder_utils/__init__.py +0 -0
  189. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/auto_coder_utils/chat_stream_out.py +0 -0
  190. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/auto_project_type.py +0 -0
  191. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/chat_auto_coder_utils/__init__.py +0 -0
  192. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/conversation_store.py +0 -0
  193. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/llm_client_interceptors.py +0 -0
  194. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/llms.py +0 -0
  195. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/log_capture.py +0 -0
  196. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/model_provider_selector.py +0 -0
  197. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/multi_turn.py +0 -0
  198. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/operate_config_api.py +0 -0
  199. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/print_table.py +0 -0
  200. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/project_structure.py +0 -0
  201. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/queue_communicate.py +0 -0
  202. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/request_event_queue.py +0 -0
  203. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/request_queue.py +0 -0
  204. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/rest.py +0 -0
  205. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/stream_thinking.py +0 -0
  206. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/tests.py +0 -0
  207. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/thread_utils.py +0 -0
  208. {auto_coder-0.1.309 → auto_coder-0.1.312}/src/autocoder/utils/types.py +0 -0
  209. {auto_coder-0.1.309 → auto_coder-0.1.312}/tests/test_action_regex_project.py +0 -0
  210. {auto_coder-0.1.309 → auto_coder-0.1.312}/tests/test_action_yml_file_manager.py +0 -0
  211. {auto_coder-0.1.309 → auto_coder-0.1.312}/tests/test_chat_auto_coder.py +0 -0
  212. {auto_coder-0.1.309 → auto_coder-0.1.312}/tests/test_code_auto_merge_editblock.py +0 -0
  213. {auto_coder-0.1.309 → auto_coder-0.1.312}/tests/test_command_completer.py +0 -0
  214. {auto_coder-0.1.309 → auto_coder-0.1.312}/tests/test_planner.py +0 -0
  215. {auto_coder-0.1.309 → auto_coder-0.1.312}/tests/test_plugins.py +0 -0
  216. {auto_coder-0.1.309 → auto_coder-0.1.312}/tests/test_privacy.py +0 -0
  217. {auto_coder-0.1.309 → auto_coder-0.1.312}/tests/test_queue_communicate.py +0 -0
  218. {auto_coder-0.1.309 → auto_coder-0.1.312}/tests/test_symbols_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.309
3
+ Version: 0.1.312
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -28,7 +28,7 @@ Requires-Dist: prompt-toolkit
28
28
  Requires-Dist: tokenizers
29
29
  Requires-Dist: aiofiles
30
30
  Requires-Dist: readerwriterlock
31
- Requires-Dist: byzerllm[saas]>=0.1.177
31
+ Requires-Dist: byzerllm[saas]>=0.1.178
32
32
  Requires-Dist: patch
33
33
  Requires-Dist: diff_match_patch
34
34
  Requires-Dist: GitPython
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.309
3
+ Version: 0.1.312
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -28,7 +28,7 @@ Requires-Dist: prompt-toolkit
28
28
  Requires-Dist: tokenizers
29
29
  Requires-Dist: aiofiles
30
30
  Requires-Dist: readerwriterlock
31
- Requires-Dist: byzerllm[saas]>=0.1.177
31
+ Requires-Dist: byzerllm[saas]>=0.1.178
32
32
  Requires-Dist: patch
33
33
  Requires-Dist: diff_match_patch
34
34
  Requires-Dist: GitPython
@@ -80,6 +80,7 @@ src/autocoder/common/mcp_server.py
80
80
  src/autocoder/common/mcp_tools.py
81
81
  src/autocoder/common/memory_manager.py
82
82
  src/autocoder/common/model_speed_test.py
83
+ src/autocoder/common/openai_content.py
83
84
  src/autocoder/common/printer.py
84
85
  src/autocoder/common/recall_validation.py
85
86
  src/autocoder/common/result_manager.py
@@ -91,6 +92,7 @@ src/autocoder/common/stats_panel.py
91
92
  src/autocoder/common/stream_out_type.py
92
93
  src/autocoder/common/sys_prompt.py
93
94
  src/autocoder/common/text.py
95
+ src/autocoder/common/token_cost_caculate.py
94
96
  src/autocoder/common/types.py
95
97
  src/autocoder/common/utils_code_auto_generate.py
96
98
  src/autocoder/common/mcp_servers/__init__.py
@@ -18,7 +18,7 @@ prompt-toolkit
18
18
  tokenizers
19
19
  aiofiles
20
20
  readerwriterlock
21
- byzerllm[saas]>=0.1.177
21
+ byzerllm[saas]>=0.1.178
22
22
  patch
23
23
  diff_match_patch
24
24
  GitPython
@@ -1854,12 +1854,14 @@ def active_context(query: str):
1854
1854
  return
1855
1855
 
1856
1856
  # 创建表格
1857
- table = Table(title="活动上下文任务列表")
1858
- table.add_column("任务ID", style="cyan")
1859
- table.add_column("状态", style="green")
1860
- table.add_column("开始时间", style="yellow")
1861
- table.add_column("完成时间", style="yellow")
1862
- table.add_column("文件", style="blue")
1857
+ table = Table(title="活动上下文任务列表", show_lines=True, expand=True)
1858
+ table.add_column("任务ID", style="cyan", no_wrap=False)
1859
+ table.add_column("状态", style="green", no_wrap=False)
1860
+ table.add_column("开始时间", style="yellow", no_wrap=False)
1861
+ table.add_column("完成时间", style="yellow", no_wrap=False)
1862
+ table.add_column("文件", style="blue", no_wrap=False)
1863
+ table.add_column("Token统计", style="magenta", no_wrap=False)
1864
+ table.add_column("费用", style="red", no_wrap=False)
1863
1865
 
1864
1866
  # 添加任务数据
1865
1867
  for task in all_tasks:
@@ -1887,17 +1889,29 @@ def active_context(query: str):
1887
1889
  # 获取文件名
1888
1890
  file_name = task.get("file_name", "未知")
1889
1891
 
1892
+ # 获取token信息
1893
+ total_tokens = task.get("total_tokens", 0)
1894
+ input_tokens = task.get("input_tokens", 0)
1895
+ output_tokens = task.get("output_tokens", 0)
1896
+ token_info = f"总计: {total_tokens:,}\n输入: {input_tokens:,}\n输出: {output_tokens:,}"
1897
+
1898
+ # 获取费用信息
1899
+ cost = task.get("cost", 0.0)
1900
+ cost_info = f"${cost:.6f}"
1901
+
1890
1902
  # 添加到表格
1891
1903
  table.add_row(
1892
1904
  task.get("task_id", "未知"),
1893
1905
  status_display,
1894
1906
  start_time_str,
1895
1907
  completion_time_str,
1896
- file_name
1908
+ file_name,
1909
+ token_info,
1910
+ cost_info
1897
1911
  )
1898
1912
 
1899
1913
  # 显示表格
1900
- console = Console()
1914
+ console = Console(width=120) # 设置更宽的显示宽度
1901
1915
  console.print(table)
1902
1916
 
1903
1917
 
@@ -0,0 +1,256 @@
1
+ from typing import Any, Dict, List, Optional, Union
2
+ import base64
3
+ import os
4
+ from enum import Enum
5
+ from pydantic import BaseModel, Field, validator
6
+
7
+
8
+ class ContentType(str, Enum):
9
+ """Type of content in the OpenAI chat message."""
10
+ TEXT = "text"
11
+ IMAGE_URL = "image_url"
12
+
13
+
14
+ class ImageUrl(BaseModel):
15
+ """Image URL structure in OpenAI chat messages."""
16
+ url: str = Field(..., description="URL of the image, can be http(s) or data URI")
17
+
18
+ @validator('url')
19
+ def validate_url(cls, v):
20
+ """Validate that URL is either an http(s) URL or a valid data URI."""
21
+ if v.startswith(('http://', 'https://')):
22
+ return v
23
+ elif v.startswith('data:image/'):
24
+ return v
25
+ else:
26
+ raise ValueError("Image URL must be http(s) or data URI format")
27
+
28
+
29
+ class TextContent(BaseModel):
30
+ """Text content in OpenAI chat messages."""
31
+ type: str = ContentType.TEXT
32
+ text: str
33
+
34
+
35
+ class ImageUrlContent(BaseModel):
36
+ """Image URL content in OpenAI chat messages."""
37
+ type: str = ContentType.IMAGE_URL
38
+ image_url: Union[str, ImageUrl]
39
+
40
+ @validator('image_url')
41
+ def validate_image_url(cls, v):
42
+ """Convert string to ImageUrl if necessary."""
43
+ if isinstance(v, str):
44
+ return ImageUrl(url=v)
45
+ return v
46
+
47
+
48
+ ContentItem = Union[TextContent, ImageUrlContent]
49
+
50
+
51
+ class OpenAIMessage(BaseModel):
52
+ """Model for an OpenAI chat message."""
53
+ role: str
54
+ content: Union[str, List[ContentItem]]
55
+ name: Optional[str] = None
56
+
57
+
58
+ class OpenAIConversation(BaseModel):
59
+ """Model for a conversation with OpenAI."""
60
+ messages: List[OpenAIMessage]
61
+
62
+
63
+ def is_structured_content(content: Any) -> bool:
64
+ """
65
+ Check if the content is structured (list of items with type field).
66
+
67
+ Args:
68
+ content: The content to check
69
+
70
+ Returns:
71
+ bool: True if the content is structured, False otherwise
72
+ """
73
+ if not isinstance(content, list):
74
+ return False
75
+
76
+ if not content:
77
+ return False
78
+
79
+ # Check if all items have a 'type' field
80
+ return all(isinstance(item, dict) and 'type' in item for item in content)
81
+
82
+
83
+ def encode_image_to_base64(image_path: str) -> str:
84
+ """
85
+ Encode an image file to base64.
86
+
87
+ Args:
88
+ image_path: Path to the image file
89
+
90
+ Returns:
91
+ str: Base64-encoded image data
92
+ """
93
+ if not os.path.exists(image_path):
94
+ raise FileNotFoundError(f"Image file not found: {image_path}")
95
+
96
+ with open(image_path, "rb") as image_file:
97
+ encoded_string = base64.b64encode(image_file.read()).decode('utf-8')
98
+
99
+ # Determine content type based on file extension
100
+ file_ext = os.path.splitext(image_path)[1].lower()
101
+ content_type = {
102
+ '.jpg': 'image/jpeg',
103
+ '.jpeg': 'image/jpeg',
104
+ '.png': 'image/png',
105
+ '.gif': 'image/gif',
106
+ '.webp': 'image/webp',
107
+ }.get(file_ext, 'image/jpeg')
108
+
109
+ return f"data:{content_type};base64,{encoded_string}"
110
+
111
+
112
+ def create_text_content(text: str) -> TextContent:
113
+ """
114
+ Create a text content item.
115
+
116
+ Args:
117
+ text: The text content
118
+
119
+ Returns:
120
+ TextContent: A text content item
121
+ """
122
+ return TextContent(text=text)
123
+
124
+
125
+ def create_image_content(image_path_or_url: str) -> ImageUrlContent:
126
+ """
127
+ Create an image content item from a file path or URL.
128
+
129
+ Args:
130
+ image_path_or_url: Path to the image file or an image URL
131
+
132
+ Returns:
133
+ ImageUrlContent: An image content item
134
+ """
135
+ # If it's a URL already, use it directly
136
+ if image_path_or_url.startswith(('http://', 'https://', 'data:')):
137
+ return ImageUrlContent(image_url=image_path_or_url)
138
+
139
+ # Otherwise, treat it as a file path and encode it
140
+ return ImageUrlContent(image_url=encode_image_to_base64(image_path_or_url))
141
+
142
+
143
+ def normalize_content(content: Any) -> Union[str, List[ContentItem]]:
144
+ """
145
+ Normalize content to either a string or a list of structured content items.
146
+
147
+ Args:
148
+ content: The content to normalize
149
+
150
+ Returns:
151
+ Union[str, List[ContentItem]]: Normalized content
152
+ """
153
+ if isinstance(content, str):
154
+ return content
155
+
156
+ if is_structured_content(content):
157
+ normalized_items = []
158
+ for item in content:
159
+ if item['type'] == ContentType.TEXT:
160
+ normalized_items.append(create_text_content(item['text']))
161
+ elif item['type'] == ContentType.IMAGE_URL:
162
+ normalized_items.append(ImageUrlContent(image_url=item['image_url']))
163
+ return normalized_items
164
+
165
+ # If it's neither a string nor structured content, convert to string
166
+ return str(content)
167
+
168
+
169
+ def create_message(role: str, content: Union[str, List[ContentItem]], name: Optional[str] = None) -> OpenAIMessage:
170
+ """
171
+ Create an OpenAI chat message.
172
+
173
+ Args:
174
+ role: Role of the message sender (system, user, assistant)
175
+ content: Content of the message (string or structured content)
176
+ name: Optional name of the sender
177
+
178
+ Returns:
179
+ OpenAIMessage: An OpenAI chat message
180
+ """
181
+ return OpenAIMessage(
182
+ role=role,
183
+ content=normalize_content(content),
184
+ name=name
185
+ )
186
+
187
+
188
+ def process_conversations(conversations: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
189
+ """
190
+ 处理会话列表,确保每个消息都符合标准格式,并只保留文本内容。
191
+
192
+ Args:
193
+ conversations: 会话列表,可能包含各种格式的消息
194
+
195
+ Returns:
196
+ List[Dict[str, Any]]: 标准化后的会话列表,每个消息都有 role 和 content 字段
197
+
198
+ 例子:
199
+ >>> conversations = [
200
+ ... {"role": "user", "content": "Hello"},
201
+ ... {"role": "assistant", "content": "Hi, how can I help?"},
202
+ ... {"role": "user", "content": [
203
+ ... {"type": "text", "text": "What's in this image?"},
204
+ ... {"type": "image_url", "image_url": "data:image/jpeg;base64,/9j/4AAQ..."}
205
+ ... ]}
206
+ ... ]
207
+ >>> processed = process_conversations(conversations)
208
+ >>> # 结果保持相同的结构,但确保格式一致性
209
+
210
+ 输出格式要是这样的:
211
+ [
212
+ {"role": "user", "content": "Hello"},
213
+ {"role": "assistant", "content": "Hi, how can I help?"},
214
+ {"role": "user", "content": "What's in this image?"}
215
+ ]
216
+
217
+ 只保留 text 内容。如果有多个 text 内容,用换行符连接弄成一个。
218
+
219
+ """
220
+ processed_conversations = []
221
+
222
+ for message in conversations:
223
+ # 确保消息有 role 字段
224
+ if "role" not in message:
225
+ raise ValueError(f"Message missing 'role' field: {message}")
226
+
227
+ role = message["role"]
228
+
229
+ # 处理 content 字段,确保存在
230
+ if "content" not in message:
231
+ processed_content = "" # 如果不存在,设置为空字符串
232
+ else:
233
+ content = message["content"]
234
+
235
+ # 处理结构化内容
236
+ if isinstance(content, list) and is_structured_content(content):
237
+ # 提取所有文本内容并用换行符连接
238
+ text_contents = []
239
+ for item in content:
240
+ if item.get('type') == ContentType.TEXT and 'text' in item:
241
+ text_contents.append(item['text'])
242
+ processed_content = '\n'.join(text_contents)
243
+ else:
244
+ # 如果是字符串或其他类型,确保转换为字符串
245
+ processed_content = str(content) if content is not None else ""
246
+
247
+ # 构建标准化的消息
248
+ processed_message = {"role": role, "content": processed_content}
249
+
250
+ # 如果原消息有 name 字段,也加入
251
+ if "name" in message and message["name"]:
252
+ processed_message["name"] = message["name"]
253
+
254
+ processed_conversations.append(processed_message)
255
+
256
+ return processed_conversations
@@ -0,0 +1,200 @@
1
+ from typing import Dict, Any, Optional, Tuple, List
2
+ import time
3
+ from loguru import logger
4
+ import byzerllm
5
+ from byzerllm import MetaHolder
6
+ from autocoder.utils import llms
7
+ from autocoder.events.event_manager_singleton import get_event_manager
8
+ from autocoder.events import event_content as EventContentCreator
9
+ from pydantic import BaseModel, Field
10
+
11
+
12
+ class TokenUsageStats(BaseModel):
13
+ """Token使用统计数据模型"""
14
+ input_tokens: int = Field(default=0, description="输入的token数量")
15
+ output_tokens: int = Field(default=0, description="输出的token数量")
16
+ input_cost: float = Field(default=0.0, description="输入token的成本")
17
+ output_cost: float = Field(default=0.0, description="输出token的成本")
18
+
19
+ @property
20
+ def total_tokens(self) -> int:
21
+ """总token数"""
22
+ return self.input_tokens + self.output_tokens
23
+
24
+ @property
25
+ def total_cost(self) -> float:
26
+ """总成本"""
27
+ return self.input_cost + self.output_cost
28
+
29
+
30
+ class TokenCostCalculator:
31
+ """
32
+ Token计费计算器 - 提供获取模型信息、计算token成本和记录token统计信息的公共功能
33
+ """
34
+
35
+ def __init__(self, logger_name: str = "TokenCostCalculator"):
36
+ """
37
+ 初始化Token计费计算器
38
+
39
+ Args:
40
+ logger_name: logger名称,默认为TokenCostCalculator
41
+ """
42
+ self.logger = logger.bind(name=logger_name)
43
+
44
+ def get_model_info(self, llm: byzerllm.ByzerLLM,product_mode:str="lite") -> Tuple[str, Dict[str, Dict[str, float]]]:
45
+ """
46
+ 获取模型名称和价格信息
47
+
48
+ Args:
49
+ llm: ByzerLLM实例
50
+
51
+ Returns:
52
+ Tuple[str, Dict]: 模型名称字符串和价格信息字典
53
+ """
54
+ # 获取模型名称列表
55
+ model_names = llms.get_llm_names(llm)
56
+ model_name = ",".join(model_names)
57
+
58
+ # 获取模型价格信息
59
+ model_info_map = {}
60
+ for name in model_names:
61
+ info = llms.get_model_info(name, product_mode)
62
+ if info:
63
+ model_info_map[name] = {
64
+ "input_price": info.get("input_price", 0.0),
65
+ "output_price": info.get("output_price", 0.0)
66
+ }
67
+
68
+ return model_name, model_info_map
69
+
70
+ def calculate_token_costs(self, meta_holder: MetaHolder,
71
+ model_info_map: Dict[str, Dict[str, float]]) -> TokenUsageStats:
72
+ """
73
+ 计算token统计和成本
74
+
75
+ Args:
76
+ meta_holder: MetaHolder实例
77
+ model_info_map: 模型价格信息字典
78
+
79
+ Returns:
80
+ TokenUsageStats: Token使用统计数据对象
81
+ """
82
+ stats = TokenUsageStats()
83
+
84
+ if meta_holder.get_meta():
85
+ meta_dict = meta_holder.get_meta()
86
+ stats.input_tokens = meta_dict.get("input_tokens_count", 0)
87
+ stats.output_tokens = meta_dict.get("generated_tokens_count", 0)
88
+
89
+ for name, info in model_info_map.items():
90
+ stats.input_cost += (stats.input_tokens *
91
+ info.get("input_price", 0.0)) / 1000000
92
+ stats.output_cost += (stats.output_tokens *
93
+ info.get("output_price", 0.0)) / 1000000
94
+
95
+ return stats
96
+
97
+ def log_event(self,
98
+ model_name: str,
99
+ operation_name: str,
100
+ start_time: float,
101
+ end_time: float,
102
+ stats: TokenUsageStats,
103
+ event_file: Optional[str] = None):
104
+ """
105
+ 记录token统计信息到日志和事件系统
106
+
107
+ Args:
108
+ model_name: 模型名称
109
+ operation_name: 操作名称,用于日志记录
110
+ start_time: 开始时间
111
+ end_time: 结束时间
112
+ stats: Token使用统计数据
113
+ event_file: 事件文件路径,如果提供则写入事件
114
+ """
115
+ elapsed_time = end_time - start_time
116
+
117
+ # 计算token生成速度(每秒生成的token数)
118
+ speed = stats.output_tokens / elapsed_time if elapsed_time > 0 else 0
119
+
120
+ # 记录日志
121
+ self.logger.info(f"{operation_name} Stats - Model: {model_name}, "
122
+ f"Input Tokens: {stats.input_tokens}, "
123
+ f"Output Tokens: {stats.output_tokens}, "
124
+ f"Total Tokens: {stats.total_tokens}, "
125
+ f"Time: {elapsed_time:.2f}s, "
126
+ f"Speed: {speed:.2f}tokens/s, "
127
+ f"Total Cost: ${stats.total_cost:.6f}")
128
+
129
+ # 记录事件(如果提供了event_file)
130
+ try:
131
+ if event_file:
132
+ get_event_manager(event_file).write_result(
133
+ EventContentCreator.create_result(content=EventContentCreator.ResultTokenStatContent(
134
+ model_name=model_name,
135
+ elapsed_time=elapsed_time,
136
+ first_token_time=0, # 不跟踪首个token时间
137
+ input_tokens=stats.input_tokens,
138
+ output_tokens=stats.output_tokens,
139
+ input_cost=stats.input_cost,
140
+ output_cost=stats.output_cost,
141
+ speed=speed
142
+ ).to_dict()))
143
+ else:
144
+ # 尝试使用默认事件管理器
145
+ get_event_manager().write_result(
146
+ EventContentCreator.create_result(content=EventContentCreator.ResultTokenStatContent(
147
+ model_name=model_name,
148
+ elapsed_time=elapsed_time,
149
+ input_tokens=stats.input_tokens,
150
+ output_tokens=stats.output_tokens,
151
+ input_cost=stats.input_cost,
152
+ output_cost=stats.output_cost,
153
+ speed=speed
154
+ ).to_dict()))
155
+ except Exception as e:
156
+ self.logger.error(f"Error writing event for {operation_name}: {e}")
157
+
158
+ def track_token_usage(self,
159
+ llm: byzerllm.ByzerLLM,
160
+ meta_holder: MetaHolder,
161
+ operation_name: str,
162
+ start_time: float,
163
+ end_time: float,
164
+ product_mode: Optional[str] = None,
165
+ event_file: Optional[str] = None) -> TokenUsageStats:
166
+ """
167
+ 跟踪token使用情况的便捷方法,整合了获取模型信息、计算成本和记录统计的功能
168
+
169
+ Args:
170
+ llm: ByzerLLM实例
171
+ meta_holder: MetaHolder实例
172
+ operation_name: 操作名称
173
+ start_time: 开始时间
174
+ end_time: 结束时间
175
+ product_mode: 产品模式,如果不提供则使用实例的product_mode
176
+ event_file: 事件文件路径
177
+
178
+ Returns:
179
+ TokenUsageStats: Token使用统计数据对象
180
+ """
181
+ # 使用传入的product_mode或实例的product_mode
182
+ actual_product_mode = product_mode
183
+
184
+ # 获取模型信息
185
+ model_name, model_info_map = self.get_model_info(llm,actual_product_mode)
186
+
187
+ # 计算token统计和成本
188
+ stats = self.calculate_token_costs(meta_holder, model_info_map)
189
+
190
+ # 记录事件
191
+ self.log_event(
192
+ model_name=model_name,
193
+ operation_name=operation_name,
194
+ start_time=start_time,
195
+ end_time=end_time,
196
+ stats=stats,
197
+ event_file=event_file
198
+ )
199
+
200
+ return stats