auto-coder 0.1.250__tar.gz → 0.1.252__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 (162) hide show
  1. {auto_coder-0.1.250 → auto_coder-0.1.252}/PKG-INFO +2 -2
  2. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/auto_coder.egg-info/PKG-INFO +2 -2
  3. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/auto_coder.egg-info/SOURCES.txt +2 -0
  4. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/auto_coder.egg-info/requires.txt +1 -1
  5. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/auto_coder.py +36 -4
  6. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/auto_coder_rag.py +198 -35
  7. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/chat_auto_coder.py +58 -5
  8. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/chat_auto_coder_lang.py +21 -3
  9. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/__init__.py +2 -1
  10. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/auto_coder_lang.py +11 -5
  11. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/code_auto_generate.py +10 -0
  12. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/code_auto_generate_diff.py +10 -0
  13. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/code_auto_generate_editblock.py +22 -8
  14. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/code_auto_generate_strict_diff.py +10 -0
  15. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/code_modification_ranker.py +3 -3
  16. auto_coder-0.1.252/src/autocoder/common/global_cancel.py +21 -0
  17. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/printer.py +4 -1
  18. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/dispacher/actions/action.py +29 -8
  19. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +17 -5
  20. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/index/filter/quick_filter.py +4 -6
  21. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/index/index.py +17 -6
  22. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/models.py +87 -6
  23. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/doc_filter.py +1 -3
  24. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/long_context_rag.py +7 -5
  25. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/token_limiter.py +1 -3
  26. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/auto_coder_utils/chat_stream_out.py +13 -2
  27. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/llms.py +15 -1
  28. auto_coder-0.1.252/src/autocoder/utils/thread_utils.py +201 -0
  29. auto_coder-0.1.252/src/autocoder/version.py +1 -0
  30. auto_coder-0.1.250/src/autocoder/version.py +0 -1
  31. {auto_coder-0.1.250 → auto_coder-0.1.252}/LICENSE +0 -0
  32. {auto_coder-0.1.250 → auto_coder-0.1.252}/README.md +0 -0
  33. {auto_coder-0.1.250 → auto_coder-0.1.252}/setup.cfg +0 -0
  34. {auto_coder-0.1.250 → auto_coder-0.1.252}/setup.py +0 -0
  35. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/auto_coder.egg-info/dependency_links.txt +0 -0
  36. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/auto_coder.egg-info/entry_points.txt +0 -0
  37. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/auto_coder.egg-info/top_level.txt +0 -0
  38. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/__init__.py +0 -0
  39. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/agent/__init__.py +0 -0
  40. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/agent/auto_demand_organizer.py +0 -0
  41. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/agent/auto_filegroup.py +0 -0
  42. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/agent/auto_guess_query.py +0 -0
  43. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/agent/auto_review_commit.py +0 -0
  44. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/agent/auto_tool.py +0 -0
  45. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/agent/coder.py +0 -0
  46. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/agent/designer.py +0 -0
  47. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/agent/planner.py +0 -0
  48. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/agent/project_reader.py +0 -0
  49. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/auto_coder_rag_client_mcp.py +0 -0
  50. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/auto_coder_rag_mcp.py +0 -0
  51. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/auto_coder_server.py +0 -0
  52. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/benchmark.py +0 -0
  53. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/chat/__init__.py +0 -0
  54. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/command_args.py +0 -0
  55. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/JupyterClient.py +0 -0
  56. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/ShellClient.py +0 -0
  57. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/anything2images.py +0 -0
  58. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/anything2img.py +0 -0
  59. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/audio.py +0 -0
  60. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/buildin_tokenizer.py +0 -0
  61. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/chunk_validation.py +0 -0
  62. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/cleaner.py +0 -0
  63. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/code_auto_execute.py +0 -0
  64. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/code_auto_merge.py +0 -0
  65. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/code_auto_merge_diff.py +0 -0
  66. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/code_auto_merge_editblock.py +0 -0
  67. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
  68. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/command_completer.py +0 -0
  69. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/command_generator.py +0 -0
  70. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/command_templates.py +0 -0
  71. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/const.py +0 -0
  72. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/files.py +0 -0
  73. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/git_utils.py +0 -0
  74. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/image_to_page.py +0 -0
  75. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/interpreter.py +0 -0
  76. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/llm_rerank.py +0 -0
  77. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/mcp_hub.py +0 -0
  78. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/mcp_server.py +0 -0
  79. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/mcp_servers/__init__.py +0 -0
  80. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +0 -0
  81. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/mcp_tools.py +0 -0
  82. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/memory_manager.py +0 -0
  83. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/recall_validation.py +0 -0
  84. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/screenshots.py +0 -0
  85. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/search.py +0 -0
  86. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/search_replace.py +0 -0
  87. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/shells.py +0 -0
  88. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/sys_prompt.py +0 -0
  89. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/text.py +0 -0
  90. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/types.py +0 -0
  91. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/common/utils_code_auto_generate.py +0 -0
  92. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/data/tokenizer.json +0 -0
  93. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/db/__init__.py +0 -0
  94. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/db/store.py +0 -0
  95. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/dispacher/__init__.py +0 -0
  96. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/dispacher/actions/__init__.py +0 -0
  97. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/dispacher/actions/copilot.py +0 -0
  98. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
  99. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/dispacher/actions/plugins/action_translate.py +0 -0
  100. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/index/__init__.py +0 -0
  101. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/index/entry.py +0 -0
  102. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/index/filter/__init__.py +0 -0
  103. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/index/filter/normal_filter.py +0 -0
  104. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/index/for_command.py +0 -0
  105. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/index/symbols_utils.py +0 -0
  106. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/index/types.py +0 -0
  107. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/lang.py +0 -0
  108. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/pyproject/__init__.py +0 -0
  109. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/__init__.py +0 -0
  110. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/api_server.py +0 -0
  111. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/cache/__init__.py +0 -0
  112. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/cache/base_cache.py +0 -0
  113. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/cache/byzer_storage_cache.py +0 -0
  114. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/cache/file_monitor_cache.py +0 -0
  115. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/cache/simple_cache.py +0 -0
  116. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/document_retriever.py +0 -0
  117. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/llm_wrapper.py +0 -0
  118. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/loaders/__init__.py +0 -0
  119. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/loaders/docx_loader.py +0 -0
  120. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/loaders/excel_loader.py +0 -0
  121. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
  122. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
  123. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/rag_config.py +0 -0
  124. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/rag_entry.py +0 -0
  125. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/raw_rag.py +0 -0
  126. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/relevant_utils.py +0 -0
  127. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/simple_directory_reader.py +0 -0
  128. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/simple_rag.py +0 -0
  129. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/stream_event/__init__.py +0 -0
  130. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/stream_event/event_writer.py +0 -0
  131. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/stream_event/types.py +0 -0
  132. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/token_checker.py +0 -0
  133. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/token_counter.py +0 -0
  134. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/types.py +0 -0
  135. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/utils.py +0 -0
  136. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/rag/variable_holder.py +0 -0
  137. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/regexproject/__init__.py +0 -0
  138. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/suffixproject/__init__.py +0 -0
  139. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/tsproject/__init__.py +0 -0
  140. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/__init__.py +0 -0
  141. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/_markitdown.py +0 -0
  142. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/auto_coder_utils/__init__.py +0 -0
  143. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/chat_auto_coder_utils/__init__.py +0 -0
  144. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/conversation_store.py +0 -0
  145. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/llm_client_interceptors.py +0 -0
  146. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/log_capture.py +0 -0
  147. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/multi_turn.py +0 -0
  148. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/operate_config_api.py +0 -0
  149. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/print_table.py +0 -0
  150. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/queue_communicate.py +0 -0
  151. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/request_event_queue.py +0 -0
  152. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/request_queue.py +0 -0
  153. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/rest.py +0 -0
  154. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/tests.py +0 -0
  155. {auto_coder-0.1.250 → auto_coder-0.1.252}/src/autocoder/utils/types.py +0 -0
  156. {auto_coder-0.1.250 → auto_coder-0.1.252}/tests/test_action_regex_project.py +0 -0
  157. {auto_coder-0.1.250 → auto_coder-0.1.252}/tests/test_chat_auto_coder.py +0 -0
  158. {auto_coder-0.1.250 → auto_coder-0.1.252}/tests/test_code_auto_merge_editblock.py +0 -0
  159. {auto_coder-0.1.250 → auto_coder-0.1.252}/tests/test_command_completer.py +0 -0
  160. {auto_coder-0.1.250 → auto_coder-0.1.252}/tests/test_planner.py +0 -0
  161. {auto_coder-0.1.250 → auto_coder-0.1.252}/tests/test_queue_communicate.py +0 -0
  162. {auto_coder-0.1.250 → auto_coder-0.1.252}/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.250
3
+ Version: 0.1.252
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -26,7 +26,7 @@ Requires-Dist: tabulate
26
26
  Requires-Dist: jupyter_client
27
27
  Requires-Dist: prompt-toolkit
28
28
  Requires-Dist: tokenizers
29
- Requires-Dist: byzerllm[saas]>=0.1.161
29
+ Requires-Dist: byzerllm[saas]>=0.1.163
30
30
  Requires-Dist: patch
31
31
  Requires-Dist: diff_match_patch
32
32
  Requires-Dist: GitPython
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.250
3
+ Version: 0.1.252
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -26,7 +26,7 @@ Requires-Dist: tabulate
26
26
  Requires-Dist: jupyter_client
27
27
  Requires-Dist: prompt-toolkit
28
28
  Requires-Dist: tokenizers
29
- Requires-Dist: byzerllm[saas]>=0.1.161
29
+ Requires-Dist: byzerllm[saas]>=0.1.163
30
30
  Requires-Dist: patch
31
31
  Requires-Dist: diff_match_patch
32
32
  Requires-Dist: GitPython
@@ -57,6 +57,7 @@ src/autocoder/common/command_templates.py
57
57
  src/autocoder/common/const.py
58
58
  src/autocoder/common/files.py
59
59
  src/autocoder/common/git_utils.py
60
+ src/autocoder/common/global_cancel.py
60
61
  src/autocoder/common/image_to_page.py
61
62
  src/autocoder/common/interpreter.py
62
63
  src/autocoder/common/llm_rerank.py
@@ -144,6 +145,7 @@ src/autocoder/utils/request_event_queue.py
144
145
  src/autocoder/utils/request_queue.py
145
146
  src/autocoder/utils/rest.py
146
147
  src/autocoder/utils/tests.py
148
+ src/autocoder/utils/thread_utils.py
147
149
  src/autocoder/utils/types.py
148
150
  src/autocoder/utils/auto_coder_utils/__init__.py
149
151
  src/autocoder/utils/auto_coder_utils/chat_stream_out.py
@@ -16,7 +16,7 @@ tabulate
16
16
  jupyter_client
17
17
  prompt-toolkit
18
18
  tokenizers
19
- byzerllm[saas]>=0.1.161
19
+ byzerllm[saas]>=0.1.163
20
20
  patch
21
21
  diff_match_patch
22
22
  GitPython
@@ -6,6 +6,7 @@ from autocoder.common import git_utils, code_auto_execute
6
6
  from autocoder.utils.llm_client_interceptors import token_counter_interceptor
7
7
  from autocoder.db.store import Store
8
8
 
9
+ from autocoder.utils.llms import get_llm_names
9
10
  from autocoder.utils.queue_communicate import (
10
11
  queue_communicate,
11
12
  CommunicateEvent,
@@ -45,6 +46,7 @@ from autocoder import models as models_module
45
46
  from autocoder.common.utils_code_auto_generate import stream_chat_with_continue
46
47
  from autocoder.utils.auto_coder_utils.chat_stream_out import stream_out
47
48
  from autocoder.common.printer import Printer
49
+ from autocoder.rag.token_counter import count_tokens
48
50
  console = Console()
49
51
 
50
52
 
@@ -764,6 +766,23 @@ def main(input_args: Optional[List[str]] = None):
764
766
  )
765
767
  llm.setup_sub_client("planner_model", planner_model)
766
768
 
769
+ if args.commit_model:
770
+ model_name = args.commit_model.strip()
771
+ model_info = models_module.get_model_by_name(model_name)
772
+ commit_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
773
+ commit_model.deploy(
774
+ model_path="",
775
+ pretrained_model_type=model_info["model_type"],
776
+ udf_name=model_name,
777
+ infer_params={
778
+ "saas.base_url": model_info["base_url"],
779
+ "saas.api_key": model_info["api_key"],
780
+ "saas.model": model_info["model_name"],
781
+ "saas.is_reasoning": model_info["is_reasoning"]
782
+ }
783
+ )
784
+ llm.setup_sub_client("commit_model", commit_model)
785
+
767
786
  if args.designer_model:
768
787
  model_name = args.designer_model.strip()
769
788
  model_info = models_module.get_model_by_name(model_name)
@@ -874,6 +893,11 @@ def main(input_args: Optional[List[str]] = None):
874
893
  designer_model.setup_default_model_name(args.designer_model)
875
894
  llm.setup_sub_client("designer_model", designer_model)
876
895
 
896
+ if args.commit_model:
897
+ commit_model = byzerllm.ByzerLLM()
898
+ commit_model.setup_default_model_name(args.commit_model)
899
+ llm.setup_sub_client("commit_model", commit_model)
900
+
877
901
  else:
878
902
  llm = None
879
903
 
@@ -1333,6 +1357,13 @@ def main(input_args: Optional[List[str]] = None):
1333
1357
  reviewer = AutoReviewCommit(llm=chat_llm, args=args)
1334
1358
  v = reviewer.review_commit(query=args.query,conversations=loaded_conversations)
1335
1359
  else:
1360
+ # 预估token数量
1361
+ estimated_input_tokens = count_tokens(json.dumps(loaded_conversations, ensure_ascii=False))
1362
+ printer = Printer()
1363
+ printer.print_in_terminal("estimated_chat_input_tokens", style="yellow",
1364
+ estimated_input_tokens=estimated_input_tokens
1365
+ )
1366
+
1336
1367
  v = stream_chat_with_continue(
1337
1368
  llm=chat_llm,
1338
1369
  conversations=loaded_conversations,
@@ -1340,9 +1371,7 @@ def main(input_args: Optional[List[str]] = None):
1340
1371
  )
1341
1372
 
1342
1373
 
1343
- model_name = getattr(chat_llm, 'default_model_name', None)
1344
- if not model_name:
1345
- model_name = "unknown(without default model name)"
1374
+ model_name = ",".join(get_llm_names(chat_llm))
1346
1375
 
1347
1376
  assistant_response, last_meta = stream_out(
1348
1377
  v,
@@ -1356,10 +1385,13 @@ def main(input_args: Optional[List[str]] = None):
1356
1385
  if last_meta:
1357
1386
  elapsed_time = time.time() - start_time
1358
1387
  printer = Printer()
1388
+ speed = last_meta.generated_tokens_count / elapsed_time
1359
1389
  printer.print_in_terminal("stream_out_stats",
1360
1390
  elapsed_time=elapsed_time,
1391
+ first_token_time=last_meta.first_token_time,
1361
1392
  input_tokens=last_meta.input_tokens_count,
1362
- output_tokens=last_meta.generated_tokens_count)
1393
+ output_tokens=last_meta.generated_tokens_count,
1394
+ speed=round(speed, 2))
1363
1395
 
1364
1396
  chat_history["ask_conversation"].append(
1365
1397
  {"role": "assistant", "content": assistant_response}
@@ -32,7 +32,10 @@ if platform.system() == "Windows":
32
32
  init()
33
33
 
34
34
 
35
- def initialize_system():
35
+ def initialize_system(args):
36
+ if args.product_mode == "lite":
37
+ return
38
+
36
39
  print(f"\n\033[1;34m{get_message('initializing')}\033[0m")
37
40
 
38
41
  def print_status(message, status):
@@ -316,13 +319,30 @@ def main(input_args: Optional[List[str]] = None):
316
319
  action="store_true",
317
320
  help="Whether to return responses without contexts. only works when pro plugin is installed",
318
321
  )
319
- serve_parser.add_argument(
320
- "--data_cells_max_num",
322
+
323
+ serve_parser.add_argument("--data_cells_max_num",
321
324
  type=int,
322
325
  default=2000,
323
326
  help="Maximum number of data cells to process",
324
327
  )
325
328
 
329
+ serve_parser.add_argument(
330
+ "--product_mode",
331
+ type=str,
332
+ default="pro",
333
+ help="The mode of the auto-coder.rag, lite/pro default is pro",
334
+ )
335
+ serve_parser.add_argument(
336
+ "--lite",
337
+ action="store_true",
338
+ help="Run in lite mode (equivalent to --product_mode=lite)",
339
+ )
340
+ serve_parser.add_argument(
341
+ "--pro",
342
+ action="store_true",
343
+ help="Run in pro mode (equivalent to --product_mode=pro)",
344
+ )
345
+
326
346
  serve_parser.add_argument(
327
347
  "--recall_model",
328
348
  default="",
@@ -373,6 +393,22 @@ def main(input_args: Optional[List[str]] = None):
373
393
  # Tools command
374
394
  tools_parser = subparsers.add_parser("tools", help="Various tools")
375
395
  tools_subparsers = tools_parser.add_subparsers(dest="tool", help="Available tools")
396
+ tools_parser.add_argument(
397
+ "--product_mode",
398
+ type=str,
399
+ default="pro",
400
+ help="The mode of the auto-coder.rag, lite/pro default is pro",
401
+ )
402
+ tools_parser.add_argument(
403
+ "--lite",
404
+ action="store_true",
405
+ help="Run in lite mode (equivalent to --product_mode=lite)",
406
+ )
407
+ tools_parser.add_argument(
408
+ "--pro",
409
+ action="store_true",
410
+ help="Run in pro mode (equivalent to --product_mode=pro)",
411
+ )
376
412
 
377
413
  # Count tool
378
414
  count_parser = tools_subparsers.add_parser("count", help="Count tokens in a file")
@@ -431,8 +467,15 @@ def main(input_args: Optional[List[str]] = None):
431
467
  benchmark_byzerllm(args.model, args.parallel, args.rounds, args.query)
432
468
 
433
469
  elif args.command == "serve":
470
+ # Handle lite/pro flags
471
+ if args.lite:
472
+ args.product_mode = "lite"
473
+ elif args.pro:
474
+ args.product_mode = "pro"
475
+
434
476
  if not args.quick:
435
- initialize_system()
477
+ initialize_system(args)
478
+
436
479
  server_args = ServerArgs(
437
480
  **{
438
481
  arg: getattr(args, arg)
@@ -448,7 +491,11 @@ def main(input_args: Optional[List[str]] = None):
448
491
  }
449
492
  )
450
493
 
451
- if auto_coder_args.enable_hybrid_index:
494
+
495
+ if auto_coder_args.enable_hybrid_index and args.product_mode == "lite":
496
+ raise Exception("Hybrid index is not supported in lite mode")
497
+
498
+ if auto_coder_args.enable_hybrid_index and args.product_mode == "pro":
452
499
  # 尝试连接storage
453
500
  try:
454
501
  from byzerllm.apps.byzer_storage.simple_api import ByzerStorage
@@ -460,36 +507,107 @@ def main(input_args: Optional[List[str]] = None):
460
507
  "When enable_hybrid_index is true, ByzerStorage must be started"
461
508
  )
462
509
  logger.error("Please run 'byzerllm storage start' first")
463
- return
464
- else:
465
- byzerllm.connect_cluster(address=args.ray_address)
466
- llm = byzerllm.ByzerLLM()
467
- llm.setup_default_model_name(args.model)
468
-
469
- # Setup sub models if specified
470
- if args.recall_model:
471
- recall_model = byzerllm.ByzerLLM()
472
- recall_model.setup_default_model_name(args.recall_model)
473
- llm.setup_sub_client("recall_model", recall_model)
474
-
475
- if args.chunk_model:
476
- chunk_model = byzerllm.ByzerLLM()
477
- chunk_model.setup_default_model_name(args.chunk_model)
478
- llm.setup_sub_client("chunk_model", chunk_model)
510
+ return
511
+
512
+
479
513
 
480
- if args.qa_model:
481
- qa_model = byzerllm.ByzerLLM()
482
- qa_model.setup_default_model_name(args.qa_model)
483
- llm.setup_sub_client("qa_model", qa_model)
514
+ if args.product_mode == "pro":
515
+ byzerllm.connect_cluster(address=args.ray_address)
516
+ llm = byzerllm.ByzerLLM()
517
+ llm.skip_nontext_check = True
518
+ llm.setup_default_model_name(args.model)
519
+
520
+ # Setup sub models if specified
521
+ if args.recall_model:
522
+ recall_model = byzerllm.ByzerLLM()
523
+ recall_model.setup_default_model_name(args.recall_model)
524
+ recall_model.skip_nontext_check = True
525
+ llm.setup_sub_client("recall_model", recall_model)
526
+
527
+ if args.chunk_model:
528
+ chunk_model = byzerllm.ByzerLLM()
529
+ chunk_model.setup_default_model_name(args.chunk_model)
530
+ llm.setup_sub_client("chunk_model", chunk_model)
531
+
532
+ if args.qa_model:
533
+ qa_model = byzerllm.ByzerLLM()
534
+ qa_model.setup_default_model_name(args.qa_model)
535
+ qa_model.skip_nontext_check = True
536
+ llm.setup_sub_client("qa_model", qa_model)
537
+
538
+ # 当启用hybrid_index时,检查必要的组件
539
+ if auto_coder_args.enable_hybrid_index:
540
+ if not llm.is_model_exist("emb"):
541
+ logger.error(
542
+ "When enable_hybrid_index is true, an 'emb' model must be deployed"
543
+ )
544
+ return
545
+ llm.setup_default_emb_model_name("emb")
546
+
547
+ elif args.product_mode == "lite":
548
+ from autocoder import models as models_module
549
+ model_info = models_module.get_model_by_name(args.model)
550
+ llm = byzerllm.SimpleByzerLLM(default_model_name=args.model)
551
+ llm.deploy(
552
+ model_path="",
553
+ pretrained_model_type=model_info["model_type"],
554
+ udf_name=args.model,
555
+ infer_params={
556
+ "saas.base_url": model_info["base_url"],
557
+ "saas.api_key": model_info["api_key"],
558
+ "saas.model": model_info["model_name"],
559
+ "saas.is_reasoning": model_info["is_reasoning"]
560
+ }
561
+ )
484
562
 
485
- # 当启用hybrid_index时,检查必要的组件
486
- if auto_coder_args.enable_hybrid_index:
487
- if not llm.is_model_exist("emb"):
488
- logger.error(
489
- "When enable_hybrid_index is true, an 'emb' model must be deployed"
563
+ # Setup sub models if specified
564
+ if args.recall_model:
565
+ model_info = models_module.get_model_by_name(args.recall_model)
566
+ recall_model = byzerllm.SimpleByzerLLM(default_model_name=args.recall_model)
567
+ recall_model.deploy(
568
+ model_path="",
569
+ pretrained_model_type=model_info["model_type"],
570
+ udf_name=args.recall_model,
571
+ infer_params={
572
+ "saas.base_url": model_info["base_url"],
573
+ "saas.api_key": model_info["api_key"],
574
+ "saas.model": model_info["model_name"],
575
+ "saas.is_reasoning": model_info["is_reasoning"]
576
+ }
490
577
  )
491
- return
492
- llm.setup_default_emb_model_name("emb")
578
+ llm.setup_sub_client("recall_model", recall_model)
579
+
580
+ if args.chunk_model:
581
+ model_info = models_module.get_model_by_name(args.chunk_model)
582
+ chunk_model = byzerllm.SimpleByzerLLM(default_model_name=args.chunk_model)
583
+ chunk_model.deploy(
584
+ model_path="",
585
+ pretrained_model_type=model_info["model_type"],
586
+ udf_name=args.chunk_model,
587
+ infer_params={
588
+ "saas.base_url": model_info["base_url"],
589
+ "saas.api_key": model_info["api_key"],
590
+ "saas.model": model_info["model_name"],
591
+ "saas.is_reasoning": model_info["is_reasoning"]
592
+ }
593
+ )
594
+ llm.setup_sub_client("chunk_model", chunk_model)
595
+
596
+ if args.qa_model:
597
+ model_info = models_module.get_model_by_name(args.qa_model)
598
+ qa_model = byzerllm.SimpleByzerLLM(default_model_name=args.qa_model)
599
+ qa_model.deploy(
600
+ model_path="",
601
+ pretrained_model_type=model_info["model_type"],
602
+ udf_name=args.qa_model,
603
+ infer_params={
604
+ "saas.base_url": model_info["base_url"],
605
+ "saas.api_key": model_info["api_key"],
606
+ "saas.model": model_info["model_name"],
607
+ "saas.is_reasoning": model_info["is_reasoning"]
608
+ }
609
+ )
610
+ llm.setup_sub_client("qa_model", qa_model)
493
611
 
494
612
  if server_args.doc_dir:
495
613
  auto_coder_args.rag_type = "simple"
@@ -577,16 +695,61 @@ def main(input_args: Optional[List[str]] = None):
577
695
  count_tokens(args.tokenizer_path, args.file)
578
696
  elif args.tool == "recall":
579
697
  from .common.recall_validation import validate_recall
580
-
581
- llm = byzerllm.ByzerLLM.from_default_model(args.model)
698
+ from autocoder import models as models_module
699
+
700
+ # Handle lite/pro flags
701
+ if args.lite:
702
+ args.product_mode = "lite"
703
+ elif args.pro:
704
+ args.product_mode = "pro"
705
+
706
+ if args.product_mode == "pro":
707
+ llm = byzerllm.ByzerLLM.from_default_model(args.model)
708
+ else: # lite mode
709
+ model_info = models_module.get_model_by_name(args.model)
710
+ llm = byzerllm.SimpleByzerLLM(default_model_name=args.model)
711
+ llm.deploy(
712
+ model_path="",
713
+ pretrained_model_type=model_info["model_type"],
714
+ udf_name=args.model,
715
+ infer_params={
716
+ "saas.base_url": model_info["base_url"],
717
+ "saas.api_key": model_info["api_key"],
718
+ "saas.model": model_info["model_name"],
719
+ "saas.is_reasoning": model_info["is_reasoning"]
720
+ }
721
+ )
582
722
 
583
723
  content = None if not args.content else [args.content]
584
724
  result = validate_recall(llm, content=content, query=args.query)
585
725
  print(f"Recall Validation Result:\n{result}")
726
+
586
727
  elif args.tool == "chunk":
587
728
  from .common.chunk_validation import validate_chunk
729
+ from autocoder import models as models_module
730
+
731
+ if args.lite:
732
+ args.product_mode = "lite"
733
+ elif args.pro:
734
+ args.product_mode = "pro"
735
+
736
+ if args.product_mode == "pro":
737
+ llm = byzerllm.ByzerLLM.from_default_model(args.model)
738
+ else: # lite mode
739
+ model_info = models_module.get_model_by_name(args.model)
740
+ llm = byzerllm.SimpleByzerLLM(default_model_name=args.model)
741
+ llm.deploy(
742
+ model_path="",
743
+ pretrained_model_type=model_info["model_type"],
744
+ udf_name=args.model,
745
+ infer_params={
746
+ "saas.base_url": model_info["base_url"],
747
+ "saas.api_key": model_info["api_key"],
748
+ "saas.model": model_info["model_name"],
749
+ "saas.is_reasoning": model_info["is_reasoning"]
750
+ }
751
+ )
588
752
 
589
- llm = byzerllm.ByzerLLM.from_default_model(args.model)
590
753
  content = None if not args.content else [args.content]
591
754
  result = validate_chunk(llm, content=content, query=args.query)
592
755
  print(f"Chunk Model Validation Result:\n{result}")
@@ -54,7 +54,7 @@ import shlex
54
54
  from autocoder.utils.llms import get_single_llm
55
55
  import pkg_resources
56
56
  from autocoder.common.printer import Printer
57
- from byzerllm.utils.langutil import run_in_thread,run_in_raw_thread
57
+ from autocoder.utils.thread_utils import run_in_thread,run_in_raw_thread
58
58
 
59
59
  class SymbolItem(BaseModel):
60
60
  symbol_name: str
@@ -136,6 +136,8 @@ commands = [
136
136
 
137
137
 
138
138
  def show_help():
139
+ print(f"\033[1m{get_message('official_doc')}\033[0m")
140
+ print()
139
141
  print(f"\033[1m{get_message('supported_commands')}\033[0m")
140
142
  print()
141
143
  print(
@@ -1713,7 +1715,7 @@ def commit(query: str):
1713
1715
  if os.path.exists(temp_yaml):
1714
1716
  os.remove(temp_yaml)
1715
1717
 
1716
- target_model = args.code_model or args.model
1718
+ target_model = args.commit_model or args.model
1717
1719
  llm = get_single_llm(target_model, product_mode)
1718
1720
  printer = Printer()
1719
1721
  printer.print_in_terminal("commit_generating", style="yellow", model_name=target_model)
@@ -2208,6 +2210,9 @@ def manage_models(params, query: str):
2208
2210
  table.add_column("Name", style="cyan", width=40, no_wrap=False)
2209
2211
  table.add_column("Model Name", style="magenta", width=30, overflow="fold")
2210
2212
  table.add_column("Base URL", style="white", width=50, overflow="fold")
2213
+ table.add_column("Input Price (M)", style="magenta", width=15)
2214
+ table.add_column("Output Price (M)", style="magenta", width=15)
2215
+ table.add_column("Speed (s/req)", style="blue", width=15)
2211
2216
  for m in models_data:
2212
2217
  # Check if api_key_path exists and file exists
2213
2218
  is_api_key_set = "api_key" in m
@@ -2221,12 +2226,60 @@ def manage_models(params, query: str):
2221
2226
  table.add_row(
2222
2227
  name,
2223
2228
  m.get("model_name", ""),
2224
- m.get("base_url", "")
2229
+ m.get("base_url", ""),
2230
+ f"{m.get('input_price', 0.0):.2f}",
2231
+ f"{m.get('output_price', 0.0):.2f}",
2232
+ f"{m.get('average_speed', 0.0):.3f}"
2225
2233
  )
2226
2234
  console.print(table)
2227
2235
  else:
2228
2236
  printer.print_in_terminal("models_no_models", style="yellow")
2229
2237
 
2238
+ elif subcmd == "/input_price":
2239
+ args = query.strip().split()
2240
+ if len(args) >= 2:
2241
+ name = args[0]
2242
+ try:
2243
+ price = float(args[1])
2244
+ if models.update_model_input_price(name, price):
2245
+ printer.print_in_terminal("models_input_price_updated", style="green", name=name, price=price)
2246
+ else:
2247
+ printer.print_in_terminal("models_not_found", style="red", name=name)
2248
+ except ValueError as e:
2249
+ printer.print_in_terminal("models_invalid_price", style="red", error=str(e))
2250
+ else:
2251
+ printer.print_in_terminal("models_input_price_usage", style="red")
2252
+
2253
+ elif subcmd == "/output_price":
2254
+ args = query.strip().split()
2255
+ if len(args) >= 2:
2256
+ name = args[0]
2257
+ try:
2258
+ price = float(args[1])
2259
+ if models.update_model_output_price(name, price):
2260
+ printer.print_in_terminal("models_output_price_updated", style="green", name=name, price=price)
2261
+ else:
2262
+ printer.print_in_terminal("models_not_found", style="red", name=name)
2263
+ except ValueError as e:
2264
+ printer.print_in_terminal("models_invalid_price", style="red", error=str(e))
2265
+ else:
2266
+ printer.print_in_terminal("models_output_price_usage", style="red")
2267
+
2268
+ elif subcmd == "/speed":
2269
+ args = query.strip().split()
2270
+ if len(args) >= 2:
2271
+ name = args[0]
2272
+ try:
2273
+ speed = float(args[1])
2274
+ if models.update_model_speed(name, speed):
2275
+ printer.print_in_terminal("models_speed_updated", style="green", name=name, speed=speed)
2276
+ else:
2277
+ printer.print_in_terminal("models_not_found", style="red", name=name)
2278
+ except ValueError as e:
2279
+ printer.print_in_terminal("models_invalid_speed", style="red", error=str(e))
2280
+ else:
2281
+ printer.print_in_terminal("models_speed_usage", style="red")
2282
+
2230
2283
  elif subcmd == "/add":
2231
2284
  # Support both simplified and legacy formats
2232
2285
  args = query.strip().split(" ")
@@ -2796,8 +2849,8 @@ def main():
2796
2849
  command = user_input[len("/shell"):].strip()
2797
2850
  if not command:
2798
2851
  print("Please enter a shell command to execute.")
2799
- else:
2800
- execute_shell_command(command)
2852
+ else:
2853
+ execute_shell_command(command)
2801
2854
 
2802
2855
  except KeyboardInterrupt:
2803
2856
  continue
@@ -85,7 +85,7 @@ MESSAGES = {
85
85
  "design_desc": "Generate SVG image based on the provided description",
86
86
  "commit_desc": "Auto generate yaml file and commit changes based on user's manual changes",
87
87
  "models_desc": "Manage model configurations, only available in lite mode",
88
- "models_usage": "Usage: /models /list|/add|/add_model|/remove ...",
88
+ "models_usage": "Usage: /models /list|/add|/add_model|/remove|/price|/speed ...",
89
89
  "models_added": "Added/Updated model '{{name}}' successfully.",
90
90
  "models_add_failed": "Failed to add model '{{name}}'. Model not found in defaults.",
91
91
  "models_add_usage": "Usage: /models /add <name> <api_key> or\n/models /add <name> <model_type> <model_name> <base_url> <api_key_path> [description]",
@@ -96,6 +96,14 @@ MESSAGES = {
96
96
  "models_add_model_remove": "Model '{{name}}' not found.",
97
97
  "models_add_model_removed": "Removed model: {{name}}",
98
98
  "models_unknown_subcmd": "Unknown subcommand: {{subcmd}}",
99
+ "models_input_price_updated": "Updated input price for model {{name}} to {{price}} M/token",
100
+ "models_output_price_updated": "Updated output price for model {{name}} to {{price}} M/token",
101
+ "models_invalid_price": "Invalid price value: {{error}}",
102
+ "models_input_price_usage": "Usage: /models /input_price <name> <value>",
103
+ "models_output_price_usage": "Usage: /models /output_price <name> <value>",
104
+ "models_speed_updated": "Updated speed for model {{name}} to {{speed}} s/request",
105
+ "models_invalid_speed": "Invalid speed value: {{error}}",
106
+ "models_speed_usage": "Usage: /models /speed <name> <value>",
99
107
  "models_title": "All Models (内置 + models.json)",
100
108
  "models_no_models": "No models found.",
101
109
  "models_lite_only": "The /models command is only available in lite mode",
@@ -117,6 +125,7 @@ MESSAGES = {
117
125
  "commit_message": "{{ model_name }} Generated commit message: {{ message }}",
118
126
  "commit_failed": "{{ model_name }} Failed to generate commit message: {{ error }}",
119
127
  "confirm_execute": "Do you want to execute this script?",
128
+ "official_doc": "Official Documentation: https://uelng8wukz.feishu.cn/wiki/NhPNwSRcWimKFIkQINIckloBncI",
120
129
  },
121
130
  "zh": {
122
131
  "commit_generating": "{{ model_name }} 正在生成提交信息...",
@@ -204,7 +213,7 @@ MESSAGES = {
204
213
  "conf_value": "值",
205
214
  "conf_title": "配置设置",
206
215
  "conf_subtitle": "使用 /conf <key>:<value> 修改这些设置",
207
- "models_usage": "用法: /models /list|/add|/add_model|/remove ...",
216
+ "models_usage": "用法: /models /list|/add|/add_model|/remove|/price|/speed ...",
208
217
  "models_added": "成功添加/更新模型 '{{name}}'。",
209
218
  "models_add_failed": "添加模型 '{{name}}' 失败。在默认模型中未找到该模型。",
210
219
  "models_add_usage": "用法: /models /add <name> <api_key> 或\n/models /add <name> <model_type> <model_name> <base_url> <api_key_path> [description]",
@@ -215,6 +224,14 @@ MESSAGES = {
215
224
  "models_add_model_remove": "找不到模型 '{{name}}'。",
216
225
  "models_add_model_removed": "已移除模型: {{name}}",
217
226
  "models_unknown_subcmd": "未知的子命令: {{subcmd}}",
227
+ "models_input_price_updated": "已更新模型 {{name}} 的输入价格为 {{price}} M/token",
228
+ "models_output_price_updated": "已更新模型 {{name}} 的输出价格为 {{price}} M/token",
229
+ "models_invalid_price": "无效的价格值: {{error}}",
230
+ "models_input_price_usage": "用法: /models /input_price <name> <value>",
231
+ "models_output_price_usage": "用法: /models /output_price <name> <value>",
232
+ "models_speed_updated": "已更新模型 {{name}} 的速度为 {{speed}} 秒/请求",
233
+ "models_invalid_speed": "无效的速度值: {{error}}",
234
+ "models_speed_usage": "用法: /models /speed <name> <value>",
218
235
  "models_title": "所有模型 (内置 + models.json)",
219
236
  "models_no_models": "未找到任何模型。",
220
237
  "models_lite_only": "/models 命令仅在 lite 模式下可用",
@@ -232,7 +249,8 @@ MESSAGES = {
232
249
  "remove_files_none": "没有文件被移除。",
233
250
  "files_removed": "移除的文件",
234
251
  "models_api_key_empty": "警告: {{name}} API key 为空。请设置一个有效的 API key。",
235
- "confirm_execute": "是否执行此脚本?",
252
+ "confirm_execute": "是否执行此脚本?",
253
+ "official_doc": "官方文档: https://uelng8wukz.feishu.cn/wiki/NhPNwSRcWimKFIkQINIckloBncI",
236
254
  }
237
255
  }
238
256
 
@@ -254,6 +254,7 @@ class AutoCoderArgs(pydantic.BaseModel):
254
254
  planner_model: Optional[str] = ""
255
255
  voice2text_model: Optional[str] = ""
256
256
  text2voice_model: Optional[str] = ""
257
+ commit_model: Optional[str] = ""
257
258
 
258
259
  skip_build_index: Optional[bool] = False
259
260
  skip_filter_index: Optional[bool] = False
@@ -357,7 +358,7 @@ class AutoCoderArgs(pydantic.BaseModel):
357
358
  enable_global_memory: Optional[bool] = True
358
359
  product_mode: Optional[str] = "lite"
359
360
 
360
- keep_reasoning_content: Optional[bool] = True
361
+ keep_reasoning_content: Optional[bool] = False
361
362
 
362
363
  in_code_apply: bool = False
363
364