auto-coder 0.1.400__py3-none-any.whl → 2.0.0__py3-none-any.whl

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 (579) hide show
  1. auto_coder-2.0.0.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.0.dist-info/METADATA +558 -0
  3. auto_coder-2.0.0.dist-info/RECORD +795 -0
  4. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
  5. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/entry_points.txt +3 -3
  6. autocoder/__init__.py +31 -0
  7. autocoder/agent/auto_filegroup.py +32 -13
  8. autocoder/agent/auto_learn_from_commit.py +9 -1
  9. autocoder/agent/base_agentic/__init__.py +3 -0
  10. autocoder/agent/base_agentic/agent_hub.py +1 -1
  11. autocoder/agent/base_agentic/base_agent.py +235 -136
  12. autocoder/agent/base_agentic/default_tools.py +119 -118
  13. autocoder/agent/base_agentic/test_base_agent.py +1 -1
  14. autocoder/agent/base_agentic/tool_registry.py +32 -20
  15. autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +25 -4
  16. autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
  17. autocoder/agent/base_agentic/types.py +42 -0
  18. autocoder/agent/entry_command_agent/chat.py +73 -59
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +1029 -2310
  22. autocoder/auto_coder_terminal.py +26 -0
  23. autocoder/auto_coder_terminal_v3.py +190 -0
  24. autocoder/chat/conf_command.py +224 -124
  25. autocoder/chat/models_command.py +361 -299
  26. autocoder/chat/rules_command.py +79 -31
  27. autocoder/chat_auto_coder.py +1021 -372
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +26 -9
  30. autocoder/commands/auto_web.py +1 -1
  31. autocoder/commands/tools.py +44 -44
  32. autocoder/common/__init__.py +150 -128
  33. autocoder/common/ac_style_command_parser/__init__.py +39 -2
  34. autocoder/common/ac_style_command_parser/config.py +422 -0
  35. autocoder/common/ac_style_command_parser/parser.py +292 -78
  36. autocoder/common/ac_style_command_parser/test_parser.py +241 -16
  37. autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
  38. autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
  39. autocoder/common/action_yml_file_manager.py +25 -13
  40. autocoder/common/agent_events/__init__.py +52 -0
  41. autocoder/common/agent_events/agent_event_emitter.py +193 -0
  42. autocoder/common/agent_events/event_factory.py +177 -0
  43. autocoder/common/agent_events/examples.py +307 -0
  44. autocoder/common/agent_events/types.py +113 -0
  45. autocoder/common/agent_events/utils.py +68 -0
  46. autocoder/common/agent_hooks/__init__.py +44 -0
  47. autocoder/common/agent_hooks/examples.py +582 -0
  48. autocoder/common/agent_hooks/hook_executor.py +217 -0
  49. autocoder/common/agent_hooks/hook_manager.py +288 -0
  50. autocoder/common/agent_hooks/types.py +133 -0
  51. autocoder/common/agent_hooks/utils.py +99 -0
  52. autocoder/common/agent_query_queue/queue_executor.py +324 -0
  53. autocoder/common/agent_query_queue/queue_manager.py +325 -0
  54. autocoder/common/agents/__init__.py +11 -0
  55. autocoder/common/agents/agent_manager.py +323 -0
  56. autocoder/common/agents/agent_parser.py +189 -0
  57. autocoder/common/agents/example_usage.py +344 -0
  58. autocoder/common/agents/integration_example.py +330 -0
  59. autocoder/common/agents/test_agent_parser.py +545 -0
  60. autocoder/common/async_utils.py +101 -0
  61. autocoder/common/auto_coder_lang.py +23 -972
  62. autocoder/common/autocoderargs_parser/__init__.py +14 -0
  63. autocoder/common/autocoderargs_parser/parser.py +184 -0
  64. autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
  65. autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
  66. autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
  67. autocoder/common/autocoderargs_parser/token_parser.py +290 -0
  68. autocoder/common/buildin_tokenizer.py +2 -4
  69. autocoder/common/code_auto_generate.py +149 -74
  70. autocoder/common/code_auto_generate_diff.py +163 -70
  71. autocoder/common/code_auto_generate_editblock.py +179 -89
  72. autocoder/common/code_auto_generate_strict_diff.py +167 -72
  73. autocoder/common/code_auto_merge_editblock.py +13 -6
  74. autocoder/common/code_modification_ranker.py +1 -1
  75. autocoder/common/command_completer.py +3 -3
  76. autocoder/common/command_file_manager/manager.py +183 -47
  77. autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
  78. autocoder/common/command_templates.py +1 -1
  79. autocoder/common/conf_utils.py +2 -4
  80. autocoder/common/conversations/config.py +11 -3
  81. autocoder/common/conversations/get_conversation_manager.py +100 -2
  82. autocoder/common/conversations/llm_stats_models.py +264 -0
  83. autocoder/common/conversations/manager.py +112 -28
  84. autocoder/common/conversations/models.py +16 -2
  85. autocoder/common/conversations/storage/index_manager.py +134 -10
  86. autocoder/common/core_config/__init__.py +63 -0
  87. autocoder/common/core_config/agentic_mode_manager.py +109 -0
  88. autocoder/common/core_config/base_manager.py +123 -0
  89. autocoder/common/core_config/compatibility.py +151 -0
  90. autocoder/common/core_config/config_manager.py +156 -0
  91. autocoder/common/core_config/conversation_manager.py +31 -0
  92. autocoder/common/core_config/exclude_manager.py +72 -0
  93. autocoder/common/core_config/file_manager.py +177 -0
  94. autocoder/common/core_config/human_as_model_manager.py +129 -0
  95. autocoder/common/core_config/lib_manager.py +54 -0
  96. autocoder/common/core_config/main_manager.py +81 -0
  97. autocoder/common/core_config/mode_manager.py +126 -0
  98. autocoder/common/core_config/models.py +70 -0
  99. autocoder/common/core_config/test_memory_manager.py +1056 -0
  100. autocoder/common/env_manager.py +282 -0
  101. autocoder/common/env_manager_usage_example.py +211 -0
  102. autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
  103. autocoder/common/file_checkpoint/manager.py +264 -48
  104. autocoder/common/file_checkpoint/test_backup.py +1 -18
  105. autocoder/common/file_checkpoint/test_manager.py +270 -1
  106. autocoder/common/file_checkpoint/test_store.py +1 -17
  107. autocoder/common/file_handler/__init__.py +23 -0
  108. autocoder/common/file_handler/active_context_handler.py +159 -0
  109. autocoder/common/file_handler/add_files_handler.py +409 -0
  110. autocoder/common/file_handler/chat_handler.py +180 -0
  111. autocoder/common/file_handler/coding_handler.py +401 -0
  112. autocoder/common/file_handler/commit_handler.py +200 -0
  113. autocoder/common/file_handler/lib_handler.py +156 -0
  114. autocoder/common/file_handler/list_files_handler.py +111 -0
  115. autocoder/common/file_handler/mcp_handler.py +268 -0
  116. autocoder/common/file_handler/models_handler.py +493 -0
  117. autocoder/common/file_handler/remove_files_handler.py +172 -0
  118. autocoder/common/file_monitor/test_file_monitor.py +307 -0
  119. autocoder/common/git_utils.py +51 -10
  120. autocoder/common/global_cancel.py +15 -6
  121. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  122. autocoder/common/international/__init__.py +31 -0
  123. autocoder/common/international/demo_international.py +92 -0
  124. autocoder/common/international/message_manager.py +157 -0
  125. autocoder/common/international/messages/__init__.py +56 -0
  126. autocoder/common/international/messages/async_command_messages.py +507 -0
  127. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  128. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  129. autocoder/common/international/messages/command_help_messages.py +986 -0
  130. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  131. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  132. autocoder/common/international/messages/queue_command_messages.py +751 -0
  133. autocoder/common/international/messages/rules_command_messages.py +77 -0
  134. autocoder/common/international/messages/sdk_messages.py +1707 -0
  135. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  136. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  137. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  138. autocoder/common/international/test_international.py +612 -0
  139. autocoder/common/linter_core/__init__.py +28 -0
  140. autocoder/common/linter_core/base_linter.py +61 -0
  141. autocoder/common/linter_core/config_loader.py +271 -0
  142. autocoder/common/linter_core/formatters/__init__.py +0 -0
  143. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  144. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  145. autocoder/common/linter_core/linter.py +166 -0
  146. autocoder/common/linter_core/linter_factory.py +216 -0
  147. autocoder/common/linter_core/linter_manager.py +333 -0
  148. autocoder/common/linter_core/linters/__init__.py +9 -0
  149. autocoder/common/linter_core/linters/java_linter.py +342 -0
  150. autocoder/common/linter_core/linters/python_linter.py +115 -0
  151. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  152. autocoder/common/linter_core/models/__init__.py +7 -0
  153. autocoder/common/linter_core/models/lint_result.py +91 -0
  154. autocoder/common/linter_core/models.py +33 -0
  155. autocoder/common/linter_core/tests/__init__.py +3 -0
  156. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  157. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  158. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  159. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  160. autocoder/common/linter_core/tests/test_integration.py +317 -0
  161. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  162. autocoder/common/linter_core/tests/test_linters.py +265 -0
  163. autocoder/common/linter_core/tests/test_models.py +81 -0
  164. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  165. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  166. autocoder/common/llm_friendly_package/__init__.py +31 -0
  167. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  168. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  169. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  170. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  171. autocoder/common/llm_friendly_package/models.py +40 -0
  172. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  173. autocoder/common/llms/__init__.py +15 -0
  174. autocoder/common/llms/demo_error_handling.py +85 -0
  175. autocoder/common/llms/factory.py +142 -0
  176. autocoder/common/llms/manager.py +264 -0
  177. autocoder/common/llms/pricing.py +121 -0
  178. autocoder/common/llms/registry.py +288 -0
  179. autocoder/common/llms/schema.py +77 -0
  180. autocoder/common/llms/simple_demo.py +45 -0
  181. autocoder/common/llms/test_quick_model.py +116 -0
  182. autocoder/common/llms/test_remove_functionality.py +182 -0
  183. autocoder/common/llms/tests/__init__.py +1 -0
  184. autocoder/common/llms/tests/test_manager.py +330 -0
  185. autocoder/common/llms/tests/test_registry.py +364 -0
  186. autocoder/common/mcp_tools/__init__.py +62 -0
  187. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  188. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  189. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  190. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  191. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  192. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  193. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  194. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  195. autocoder/common/model_speed_tester.py +32 -26
  196. autocoder/common/priority_directory_finder/__init__.py +142 -0
  197. autocoder/common/priority_directory_finder/examples.py +230 -0
  198. autocoder/common/priority_directory_finder/finder.py +283 -0
  199. autocoder/common/priority_directory_finder/models.py +236 -0
  200. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  201. autocoder/common/project_scanner/__init__.py +18 -0
  202. autocoder/common/project_scanner/compat.py +77 -0
  203. autocoder/common/project_scanner/scanner.py +436 -0
  204. autocoder/common/project_tracker/__init__.py +27 -0
  205. autocoder/common/project_tracker/api.py +228 -0
  206. autocoder/common/project_tracker/demo.py +272 -0
  207. autocoder/common/project_tracker/tracker.py +487 -0
  208. autocoder/common/project_tracker/types.py +53 -0
  209. autocoder/common/pruner/__init__.py +67 -0
  210. autocoder/common/pruner/agentic_conversation_pruner.py +746 -0
  211. autocoder/common/{context_pruner.py → pruner/context_pruner.py} +137 -40
  212. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  213. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  214. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  215. autocoder/common/pruner/conversation_normalizer.py +347 -0
  216. autocoder/common/{conversation_pruner.py → pruner/conversation_pruner.py} +26 -6
  217. autocoder/common/pruner/test_agentic_conversation_pruner.py +784 -0
  218. autocoder/common/pruner/test_context_pruner.py +546 -0
  219. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  220. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  221. autocoder/common/pruner/tool_content_detector.py +227 -0
  222. autocoder/common/pruner/tools/__init__.py +18 -0
  223. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  224. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  225. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  226. autocoder/common/pull_requests/__init__.py +9 -1
  227. autocoder/common/pull_requests/utils.py +122 -1
  228. autocoder/common/rag_manager/rag_manager.py +36 -40
  229. autocoder/common/rulefiles/__init__.py +53 -1
  230. autocoder/common/rulefiles/api.py +250 -0
  231. autocoder/common/rulefiles/core/__init__.py +14 -0
  232. autocoder/common/rulefiles/core/manager.py +241 -0
  233. autocoder/common/rulefiles/core/selector.py +805 -0
  234. autocoder/common/rulefiles/models/__init__.py +20 -0
  235. autocoder/common/rulefiles/models/index.py +16 -0
  236. autocoder/common/rulefiles/models/init_rule.py +18 -0
  237. autocoder/common/rulefiles/models/rule_file.py +18 -0
  238. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  239. autocoder/common/rulefiles/models/summary.py +16 -0
  240. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  241. autocoder/common/rulefiles/utils/__init__.py +34 -0
  242. autocoder/common/rulefiles/utils/monitor.py +86 -0
  243. autocoder/common/rulefiles/utils/parser.py +230 -0
  244. autocoder/common/save_formatted_log.py +67 -10
  245. autocoder/common/search_replace.py +8 -1
  246. autocoder/common/search_replace_patch/__init__.py +24 -0
  247. autocoder/common/search_replace_patch/base.py +115 -0
  248. autocoder/common/search_replace_patch/manager.py +248 -0
  249. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  250. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  251. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  252. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  253. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  254. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  255. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  256. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  257. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  258. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  259. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  260. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  261. autocoder/common/shell_commands/__init__.py +197 -0
  262. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  263. autocoder/common/shell_commands/command_executor.py +1127 -0
  264. autocoder/common/shell_commands/error_recovery.py +541 -0
  265. autocoder/common/shell_commands/exceptions.py +120 -0
  266. autocoder/common/shell_commands/interactive_executor.py +476 -0
  267. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  268. autocoder/common/shell_commands/interactive_process.py +744 -0
  269. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  270. autocoder/common/shell_commands/monitoring.py +529 -0
  271. autocoder/common/shell_commands/process_cleanup.py +386 -0
  272. autocoder/common/shell_commands/process_manager.py +606 -0
  273. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  274. autocoder/common/shell_commands/tests/__init__.py +6 -0
  275. autocoder/common/shell_commands/tests/conftest.py +118 -0
  276. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  277. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  278. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  279. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  280. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  281. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  282. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  283. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  284. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  285. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  286. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  287. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  288. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  289. autocoder/common/shell_commands/timeout_config.py +315 -0
  290. autocoder/common/shell_commands/timeout_manager.py +352 -0
  291. autocoder/common/terminal_paste/__init__.py +14 -0
  292. autocoder/common/terminal_paste/demo.py +145 -0
  293. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  294. autocoder/common/terminal_paste/paste_handler.py +200 -0
  295. autocoder/common/terminal_paste/paste_manager.py +118 -0
  296. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  297. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  298. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  299. autocoder/common/terminal_paste/utils.py +163 -0
  300. autocoder/common/test_autocoder_args.py +232 -0
  301. autocoder/common/test_env_manager.py +173 -0
  302. autocoder/common/test_env_manager_integration.py +159 -0
  303. autocoder/common/text_similarity/__init__.py +9 -0
  304. autocoder/common/text_similarity/demo.py +216 -0
  305. autocoder/common/text_similarity/examples.py +266 -0
  306. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  307. autocoder/common/text_similarity/text_similarity.py +194 -0
  308. autocoder/common/text_similarity/utils.py +125 -0
  309. autocoder/common/todos/__init__.py +61 -0
  310. autocoder/common/todos/cache/__init__.py +16 -0
  311. autocoder/common/todos/cache/base_cache.py +89 -0
  312. autocoder/common/todos/cache/cache_manager.py +228 -0
  313. autocoder/common/todos/cache/memory_cache.py +225 -0
  314. autocoder/common/todos/config.py +155 -0
  315. autocoder/common/todos/exceptions.py +35 -0
  316. autocoder/common/todos/get_todo_manager.py +161 -0
  317. autocoder/common/todos/manager.py +537 -0
  318. autocoder/common/todos/models.py +239 -0
  319. autocoder/common/todos/storage/__init__.py +14 -0
  320. autocoder/common/todos/storage/base_storage.py +76 -0
  321. autocoder/common/todos/storage/file_storage.py +278 -0
  322. autocoder/common/tokens/__init__.py +15 -0
  323. autocoder/common/tokens/counter.py +44 -2
  324. autocoder/common/tools_manager/__init__.py +17 -0
  325. autocoder/common/tools_manager/examples.py +162 -0
  326. autocoder/common/tools_manager/manager.py +385 -0
  327. autocoder/common/tools_manager/models.py +39 -0
  328. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  329. autocoder/common/tools_manager/utils.py +191 -0
  330. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  331. autocoder/common/v2/agent/agentic_edit.py +2729 -2052
  332. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +43 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_read_tool_resolver.py +40 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +52 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +8 -0
  338. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  340. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +565 -30
  344. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  346. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  347. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  349. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  350. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +244 -51
  352. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  353. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  354. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +409 -140
  355. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  356. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +209 -194
  359. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +135 -0
  360. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +328 -0
  361. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  362. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  363. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  364. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  365. autocoder/common/v2/agent/agentic_edit_types.py +386 -10
  366. autocoder/common/v2/agent/runner/__init__.py +31 -0
  367. autocoder/common/v2/agent/runner/base_runner.py +92 -0
  368. autocoder/common/v2/agent/runner/file_based_event_runner.py +217 -0
  369. autocoder/common/v2/agent/runner/sdk_runner.py +182 -0
  370. autocoder/common/v2/agent/runner/terminal_runner.py +396 -0
  371. autocoder/common/v2/agent/runner/tool_display.py +589 -0
  372. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  373. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  374. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  375. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  376. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  377. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  378. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  379. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  380. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  381. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  382. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  383. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  384. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  385. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  386. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  387. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  388. autocoder/common/v2/code_auto_generate.py +136 -78
  389. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  390. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  391. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  392. autocoder/common/v2/code_auto_merge.py +1 -1
  393. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  394. autocoder/common/v2/code_diff_manager.py +3 -3
  395. autocoder/common/v2/code_editblock_manager.py +4 -14
  396. autocoder/common/v2/code_manager.py +1 -1
  397. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  398. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  399. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  400. autocoder/common/wrap_llm_hint/utils.py +432 -0
  401. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  402. autocoder/completer/__init__.py +8 -0
  403. autocoder/completer/command_completer_v2.py +1051 -0
  404. autocoder/default_project/__init__.py +501 -0
  405. autocoder/dispacher/__init__.py +4 -12
  406. autocoder/dispacher/actions/action.py +165 -7
  407. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  408. autocoder/index/entry.py +117 -125
  409. autocoder/{agent → index/filter}/agentic_filter.py +323 -334
  410. autocoder/index/filter/normal_filter.py +5 -11
  411. autocoder/index/filter/quick_filter.py +1 -1
  412. autocoder/index/index.py +36 -9
  413. autocoder/index/tests/__init__.py +1 -0
  414. autocoder/index/tests/run_tests.py +195 -0
  415. autocoder/index/tests/test_entry.py +303 -0
  416. autocoder/index/tests/test_index_manager.py +314 -0
  417. autocoder/index/tests/test_module_integration.py +300 -0
  418. autocoder/index/tests/test_symbols_utils.py +183 -0
  419. autocoder/inner/__init__.py +4 -0
  420. autocoder/inner/agentic.py +932 -0
  421. autocoder/inner/async_command_handler.py +992 -0
  422. autocoder/inner/conversation_command_handlers.py +623 -0
  423. autocoder/inner/merge_command_handler.py +213 -0
  424. autocoder/inner/queue_command_handler.py +684 -0
  425. autocoder/models.py +95 -266
  426. autocoder/plugins/git_helper_plugin.py +31 -29
  427. autocoder/plugins/token_helper_plugin.py +156 -37
  428. autocoder/pyproject/__init__.py +32 -29
  429. autocoder/rag/agentic_rag.py +215 -75
  430. autocoder/rag/cache/simple_cache.py +1 -2
  431. autocoder/rag/loaders/image_loader.py +1 -1
  432. autocoder/rag/long_context_rag.py +42 -26
  433. autocoder/rag/qa_conversation_strategy.py +1 -1
  434. autocoder/rag/terminal/__init__.py +17 -0
  435. autocoder/rag/terminal/args.py +581 -0
  436. autocoder/rag/terminal/bootstrap.py +61 -0
  437. autocoder/rag/terminal/command_handlers.py +653 -0
  438. autocoder/rag/terminal/formatters/__init__.py +20 -0
  439. autocoder/rag/terminal/formatters/base.py +70 -0
  440. autocoder/rag/terminal/formatters/json_format.py +66 -0
  441. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  442. autocoder/rag/terminal/formatters/text.py +28 -0
  443. autocoder/rag/terminal/init.py +120 -0
  444. autocoder/rag/terminal/utils.py +106 -0
  445. autocoder/rag/test_agentic_rag.py +389 -0
  446. autocoder/rag/test_doc_filter.py +3 -3
  447. autocoder/rag/test_long_context_rag.py +1 -1
  448. autocoder/rag/test_token_limiter.py +517 -10
  449. autocoder/rag/token_counter.py +3 -0
  450. autocoder/rag/token_limiter.py +19 -15
  451. autocoder/rag/tools/__init__.py +26 -2
  452. autocoder/rag/tools/bochaai_example.py +343 -0
  453. autocoder/rag/tools/bochaai_sdk.py +541 -0
  454. autocoder/rag/tools/metaso_example.py +268 -0
  455. autocoder/rag/tools/metaso_sdk.py +417 -0
  456. autocoder/rag/tools/recall_tool.py +28 -7
  457. autocoder/rag/tools/run_integration_tests.py +204 -0
  458. autocoder/rag/tools/test_all_providers.py +318 -0
  459. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  460. autocoder/rag/tools/test_final_integration.py +215 -0
  461. autocoder/rag/tools/test_metaso_integration.py +424 -0
  462. autocoder/rag/tools/test_metaso_real.py +171 -0
  463. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  464. autocoder/rag/tools/test_web_search_tool.py +509 -0
  465. autocoder/rag/tools/todo_read_tool.py +202 -0
  466. autocoder/rag/tools/todo_write_tool.py +412 -0
  467. autocoder/rag/tools/web_crawl_tool.py +634 -0
  468. autocoder/rag/tools/web_search_tool.py +558 -0
  469. autocoder/rag/tools/web_tools_example.py +119 -0
  470. autocoder/rag/types.py +16 -0
  471. autocoder/rag/variable_holder.py +4 -2
  472. autocoder/rags.py +86 -79
  473. autocoder/regexproject/__init__.py +23 -21
  474. autocoder/run_context.py +9 -0
  475. autocoder/sdk/__init__.py +50 -161
  476. autocoder/sdk/api.py +370 -0
  477. autocoder/sdk/async_runner/__init__.py +26 -0
  478. autocoder/sdk/async_runner/async_executor.py +650 -0
  479. autocoder/sdk/async_runner/async_handler.py +356 -0
  480. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  481. autocoder/sdk/async_runner/task_metadata.py +284 -0
  482. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  483. autocoder/sdk/cli/__init__.py +2 -5
  484. autocoder/sdk/cli/formatters.py +28 -204
  485. autocoder/sdk/cli/handlers.py +77 -44
  486. autocoder/sdk/cli/main.py +158 -170
  487. autocoder/sdk/cli/options.py +95 -22
  488. autocoder/sdk/constants.py +139 -51
  489. autocoder/sdk/core/auto_coder_core.py +484 -267
  490. autocoder/sdk/core/bridge.py +298 -118
  491. autocoder/sdk/exceptions.py +18 -12
  492. autocoder/sdk/formatters/__init__.py +19 -0
  493. autocoder/sdk/formatters/input.py +64 -0
  494. autocoder/sdk/formatters/output.py +247 -0
  495. autocoder/sdk/formatters/stream.py +54 -0
  496. autocoder/sdk/models/__init__.py +6 -5
  497. autocoder/sdk/models/options.py +55 -18
  498. autocoder/sdk/utils/formatters.py +27 -195
  499. autocoder/suffixproject/__init__.py +28 -25
  500. autocoder/terminal/__init__.py +14 -0
  501. autocoder/terminal/app.py +454 -0
  502. autocoder/terminal/args.py +32 -0
  503. autocoder/terminal/bootstrap.py +178 -0
  504. autocoder/terminal/command_processor.py +521 -0
  505. autocoder/terminal/command_registry.py +57 -0
  506. autocoder/terminal/help.py +97 -0
  507. autocoder/terminal/tasks/__init__.py +5 -0
  508. autocoder/terminal/tasks/background.py +77 -0
  509. autocoder/terminal/tasks/task_event.py +70 -0
  510. autocoder/terminal/ui/__init__.py +13 -0
  511. autocoder/terminal/ui/completer.py +268 -0
  512. autocoder/terminal/ui/keybindings.py +75 -0
  513. autocoder/terminal/ui/session.py +41 -0
  514. autocoder/terminal/ui/toolbar.py +64 -0
  515. autocoder/terminal/utils/__init__.py +13 -0
  516. autocoder/terminal/utils/errors.py +18 -0
  517. autocoder/terminal/utils/paths.py +19 -0
  518. autocoder/terminal/utils/shell.py +43 -0
  519. autocoder/terminal_v3/__init__.py +10 -0
  520. autocoder/terminal_v3/app.py +201 -0
  521. autocoder/terminal_v3/handlers/__init__.py +5 -0
  522. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  523. autocoder/terminal_v3/models/__init__.py +6 -0
  524. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  525. autocoder/terminal_v3/models/message.py +50 -0
  526. autocoder/terminal_v3/models/tool_display.py +247 -0
  527. autocoder/terminal_v3/ui/__init__.py +7 -0
  528. autocoder/terminal_v3/ui/keybindings.py +56 -0
  529. autocoder/terminal_v3/ui/layout.py +141 -0
  530. autocoder/terminal_v3/ui/styles.py +43 -0
  531. autocoder/tsproject/__init__.py +23 -23
  532. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  533. autocoder/utils/llms.py +88 -80
  534. autocoder/utils/math_utils.py +101 -0
  535. autocoder/utils/model_provider_selector.py +16 -4
  536. autocoder/utils/operate_config_api.py +33 -5
  537. autocoder/utils/thread_utils.py +2 -2
  538. autocoder/version.py +4 -2
  539. autocoder/workflow_agents/__init__.py +84 -0
  540. autocoder/workflow_agents/agent.py +143 -0
  541. autocoder/workflow_agents/exceptions.py +573 -0
  542. autocoder/workflow_agents/executor.py +489 -0
  543. autocoder/workflow_agents/loader.py +737 -0
  544. autocoder/workflow_agents/runner.py +267 -0
  545. autocoder/workflow_agents/types.py +172 -0
  546. autocoder/workflow_agents/utils.py +434 -0
  547. autocoder/workflow_agents/workflow_manager.py +211 -0
  548. auto_coder-0.1.400.dist-info/METADATA +0 -396
  549. auto_coder-0.1.400.dist-info/RECORD +0 -425
  550. auto_coder-0.1.400.dist-info/licenses/LICENSE +0 -201
  551. autocoder/auto_coder_server.py +0 -672
  552. autocoder/benchmark.py +0 -138
  553. autocoder/common/ac_style_command_parser/example.py +0 -7
  554. autocoder/common/cleaner.py +0 -31
  555. autocoder/common/command_completer_v2.py +0 -615
  556. autocoder/common/directory_cache/__init__.py +0 -1
  557. autocoder/common/directory_cache/cache.py +0 -192
  558. autocoder/common/directory_cache/test_cache.py +0 -190
  559. autocoder/common/file_checkpoint/examples.py +0 -217
  560. autocoder/common/llm_friendly_package_example.py +0 -138
  561. autocoder/common/llm_friendly_package_test.py +0 -63
  562. autocoder/common/pull_requests/test_module.py +0 -1
  563. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  564. autocoder/common/text.py +0 -30
  565. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  566. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  567. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  568. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  569. autocoder/plugins/dynamic_completion_example.py +0 -148
  570. autocoder/plugins/sample_plugin.py +0 -160
  571. autocoder/sdk/cli/__main__.py +0 -26
  572. autocoder/sdk/cli/completion_wrapper.py +0 -38
  573. autocoder/sdk/cli/install_completion.py +0 -301
  574. autocoder/sdk/models/messages.py +0 -209
  575. autocoder/sdk/session/__init__.py +0 -32
  576. autocoder/sdk/session/session.py +0 -106
  577. autocoder/sdk/session/session_manager.py +0 -56
  578. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
  579. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -0,0 +1,653 @@
1
+ """命令处理逻辑模块"""
2
+
3
+ import asyncio
4
+ import os
5
+ from datetime import datetime
6
+ import byzerllm
7
+ from loguru import logger
8
+
9
+ from autocoder.common import AutoCoderArgs
10
+ from autocoder.rag.api_server import serve, ServerArgs
11
+ from autocoder.rag.rag_entry import RAGFactory
12
+ from autocoder.rag.agentic_rag import AgenticRAG
13
+ from autocoder.rag.long_context_rag import LongContextRAG
14
+ from autocoder.rag.llm_wrapper import LLWrapper
15
+ from autocoder.rag.types import RAGServiceInfo
16
+ from autocoder.rags import get_rag_config
17
+ from autocoder.common.file_monitor.monitor import FileMonitor
18
+ from autocoder.common.rulefiles import get_rules
19
+ from autocoder.rag.terminal.utils import (
20
+ generate_unique_name_from_path,
21
+ merge_args_with_config,
22
+ count_tokens,
23
+ )
24
+ from autocoder.common.recall_validation import validate_recall
25
+ from autocoder.common.chunk_validation import validate_chunk
26
+ from autocoder.common.llms import LLMManager
27
+ from autocoder.rag.terminal.formatters import format_rag_output
28
+
29
+ # 配置加载时需要跳过的字段(这些是系统内部字段,不应从保存的配置中恢复)
30
+ _SKIP_CONFIG_FIELDS = {
31
+ "name",
32
+ "status",
33
+ "created_at",
34
+ "updated_at",
35
+ "process_id",
36
+ "stdout_fd",
37
+ "stderr_fd",
38
+ "cache_build_task_id",
39
+ }
40
+
41
+
42
+ def handle_run_command(args):
43
+ """处理 run 命令 - 直接运行 RAG 查询,不启动服务器
44
+
45
+ 主要步骤:
46
+ 1. 读取查询内容(从 --query 或 stdin)
47
+ 2. 设置 product_mode (lite/pro)
48
+ 3. 创建 AutoCoderArgs
49
+ 4. 初始化 LLM
50
+ 5. 创建 RAG 实例(AgenticRAG 或 LongContextRAG)
51
+ 6. 执行查询
52
+ 7. 输出结果
53
+ """
54
+ import sys
55
+ import json
56
+
57
+ # 步骤1: 读取查询内容
58
+ query = args.query
59
+
60
+ # 如果没有提供 --query,从 stdin 读取(支持管道)
61
+ if not query:
62
+ if not sys.stdin.isatty():
63
+ query = sys.stdin.read().strip()
64
+ else:
65
+ logger.error("No query provided. Use --query or pipe input via stdin")
66
+ print("错误: 没有提供查询内容。请使用 --query 参数或通过管道传入。")
67
+ print("示例: echo '你的问题' | auto-coder.rag run --doc_dir /path/to/docs")
68
+ return
69
+
70
+ if not query:
71
+ logger.error("Empty query provided")
72
+ print("错误: 查询内容为空")
73
+ return
74
+
75
+ # 步骤2: 设置 product_mode
76
+ if args.pro:
77
+ args.product_mode = "pro"
78
+ elif args.lite:
79
+ args.product_mode = "lite"
80
+ # 否则使用默认值 (lite)
81
+
82
+ # 步骤3: 创建 AutoCoderArgs
83
+ auto_coder_args = AutoCoderArgs(
84
+ source_dir=args.doc_dir,
85
+ rag_context_window_limit=args.rag_context_window_limit,
86
+ full_text_ratio=args.full_text_ratio,
87
+ segment_ratio=args.segment_ratio,
88
+ rag_doc_filter_relevance=args.rag_doc_filter_relevance,
89
+ required_exts=args.required_exts,
90
+ enable_hybrid_index=args.enable_hybrid_index,
91
+ disable_auto_window=args.disable_auto_window,
92
+ disable_segment_reorder=args.disable_segment_reorder,
93
+ model=args.model,
94
+ product_mode=args.product_mode or "lite",
95
+ )
96
+
97
+ # 生成 RAG build name
98
+ auto_coder_args.rag_build_name = generate_unique_name_from_path(args.doc_dir)
99
+
100
+ # 步骤4: 初始化 LLM
101
+ llm = _setup_llm(args, auto_coder_args)
102
+
103
+ # 步骤5: 创建 RAG 实例
104
+ if args.agentic:
105
+ rag = AgenticRAG(
106
+ llm=llm,
107
+ args=auto_coder_args,
108
+ path=args.doc_dir,
109
+ tokenizer_path=args.tokenizer_path,
110
+ )
111
+ else:
112
+ rag = LongContextRAG(
113
+ llm=llm,
114
+ args=auto_coder_args,
115
+ path=args.doc_dir,
116
+ tokenizer_path=args.tokenizer_path,
117
+ )
118
+
119
+ # 步骤6: 执行查询
120
+ conversations = [{"role": "user", "content": query}]
121
+
122
+ try:
123
+ result_generator, contexts = rag.stream_chat_oai(conversations)
124
+
125
+ # 步骤7: 使用格式化器输出结果
126
+ format_rag_output(result_generator, contexts, args.output_format)
127
+
128
+ except Exception as e:
129
+ logger.error(f"Error executing RAG query: {str(e)}")
130
+ import traceback
131
+
132
+ traceback.print_exc()
133
+ print(f"\n错误: {str(e)}")
134
+ return
135
+ finally:
136
+ rag.close()
137
+
138
+
139
+ def handle_benchmark_command(args):
140
+ """处理 benchmark 命令"""
141
+ try:
142
+ from autocoder.rag.benchmark import benchmark_openai, benchmark_byzerllm
143
+ except ImportError:
144
+ logger.error(
145
+ "Benchmark module not found. This feature may have been removed or moved."
146
+ )
147
+ print("错误: benchmark 功能模块未找到")
148
+ return
149
+
150
+ if args.type == "openai":
151
+ if not args.api_key:
152
+ print("OpenAI API key is required for OpenAI client benchmark")
153
+ return
154
+ asyncio.run(
155
+ benchmark_openai(
156
+ args.model,
157
+ args.parallel,
158
+ args.api_key,
159
+ args.base_url,
160
+ args.rounds,
161
+ args.query,
162
+ )
163
+ )
164
+ else: # byzerllm
165
+ benchmark_byzerllm(args.model, args.parallel, args.rounds, args.query)
166
+
167
+
168
+ def handle_serve_command(args, serve_parser):
169
+ """处理 serve 命令
170
+
171
+ 主要步骤:
172
+ 1. 加载保存的配置(如果指定了 --name)
173
+ 2. 设置 product_mode (lite/pro)
174
+ 3. 合并参数配置
175
+ 4. 设置本地图床
176
+ 5. 生成 RAG build name
177
+ 6. 检查 ByzerStorage(pro 模式 + hybrid_index)
178
+ 7. 初始化 LLM
179
+ 8. 创建 RAG 实例
180
+ 9. 启动文件监控
181
+ 10. 启动服务
182
+ """
183
+ # 步骤1: 加载保存的配置
184
+ server_args_config = {}
185
+ auto_coder_args_config = {}
186
+
187
+ if args.name:
188
+ saved_config = get_rag_config(args.name)
189
+ if saved_config:
190
+ logger.info(f"加载已保存的RAG配置: {args.name}")
191
+
192
+ # 合并配置,跳过系统内部字段
193
+ for key, value in saved_config.items():
194
+ if key in _SKIP_CONFIG_FIELDS:
195
+ continue
196
+ server_args_config[key] = value
197
+ setattr(args, key, value)
198
+
199
+ # 特殊处理 infer_params 字段
200
+ if "infer_params" in saved_config and saved_config["infer_params"]:
201
+ for infer_key, infer_value in saved_config["infer_params"].items():
202
+ auto_coder_args_config[infer_key] = infer_value
203
+
204
+ logger.info(
205
+ f"配置合并完成,使用文档目录: {getattr(args, 'doc_dir', 'N/A')}"
206
+ )
207
+ else:
208
+ logger.warning(f"未找到名为 '{args.name}' 的RAG配置")
209
+
210
+ # 步骤2: 设置 product_mode
211
+ if args.pro:
212
+ args.product_mode = "pro"
213
+ else:
214
+ args.product_mode = "lite"
215
+
216
+ # 步骤3: 合并参数配置
217
+ server_args = merge_args_with_config(
218
+ args, server_args_config, ServerArgs, serve_parser
219
+ )
220
+ auto_coder_args = merge_args_with_config(
221
+ args, server_args_config, AutoCoderArgs, serve_parser
222
+ )
223
+
224
+ # 步骤4: 设置本地图床地址
225
+ if args.enable_local_image_host:
226
+ host = server_args.host or "127.0.0.1"
227
+ # 如果监听所有地址,本地访问用 127.0.0.1
228
+ if host == "0.0.0.0":
229
+ host = "127.0.0.1"
230
+ port = str(server_args.port)
231
+ auto_coder_args.local_image_host = f"{host}:{port}"
232
+
233
+ # 步骤5: 生成 RAG build name(用于标识此 RAG 实例)
234
+ if server_args.doc_dir:
235
+ auto_coder_args.rag_build_name = generate_unique_name_from_path(
236
+ server_args.doc_dir
237
+ )
238
+ auto_coder_args.source_dir = server_args.doc_dir
239
+ logger.info(f"Generated RAG build name: {auto_coder_args.rag_build_name}")
240
+
241
+ # 步骤6: 检查 ByzerStorage(仅 pro 模式 + hybrid_index 时需要)
242
+ if auto_coder_args.enable_hybrid_index and args.product_mode == "pro":
243
+ try:
244
+ from byzerllm.apps.byzer_storage.simple_api import ByzerStorage
245
+
246
+ storage = ByzerStorage(
247
+ "byzerai_store", "rag", auto_coder_args.rag_build_name
248
+ )
249
+ storage.retrieval.cluster_info("byzerai_store")
250
+ except Exception as e:
251
+ logger.error(
252
+ "When enable_hybrid_index is true, ByzerStorage must be started"
253
+ )
254
+ logger.error("Please run 'byzerllm storage start' first")
255
+ return
256
+
257
+ # 步骤7: 初始化 LLM(根据 product_mode 选择 pro 或 lite)
258
+ llm = _setup_llm(args, auto_coder_args)
259
+
260
+ # 步骤8: 创建 RAG 实例(AgenticRAG 或 LongContextRAG)
261
+ if server_args.doc_dir:
262
+ auto_coder_args.rag_build_name = generate_unique_name_from_path(
263
+ server_args.doc_dir
264
+ )
265
+
266
+ # 根据 --agentic 参数选择 RAG 类型
267
+ if args.agentic:
268
+ rag = AgenticRAG(
269
+ llm=llm,
270
+ args=auto_coder_args,
271
+ path=server_args.doc_dir,
272
+ tokenizer_path=server_args.tokenizer_path,
273
+ )
274
+ else:
275
+ rag = LongContextRAG(
276
+ llm=llm,
277
+ args=auto_coder_args,
278
+ path=server_args.doc_dir,
279
+ tokenizer_path=server_args.tokenizer_path,
280
+ )
281
+ else:
282
+ raise Exception("doc_dir is required")
283
+
284
+ # 创建 LLM Wrapper(包装 LLM 和 RAG)
285
+ llm_wrapper = LLWrapper(llm=llm, rag=rag)
286
+
287
+ # 保存服务信息(用于服务管理和监控)
288
+ service_info = RAGServiceInfo(
289
+ host=server_args.host or "127.0.0.1",
290
+ port=server_args.port,
291
+ model=args.model,
292
+ _pid=os.getpid(),
293
+ _timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
294
+ args={k: v for k, v in vars(args).items() if not k.startswith("_")},
295
+ )
296
+ try:
297
+ service_info.save()
298
+ except Exception as e:
299
+ logger.warning(f"Failed to save service info: {str(e)}")
300
+
301
+ # 步骤9: 启动文件监控(监控文档目录变化)
302
+ if server_args.doc_dir:
303
+ try:
304
+ # 使用单例模式获取/创建监控实例(每个目录只能有一个监控实例)
305
+ monitor = FileMonitor(server_args.doc_dir)
306
+
307
+ if not monitor.is_running():
308
+ monitor.start()
309
+ logger.info(
310
+ f"File monitor started for directory: {server_args.doc_dir}"
311
+ )
312
+ else:
313
+ # 检查已运行的监控是否为同一目录
314
+ if monitor.root_dir == os.path.abspath(server_args.doc_dir):
315
+ logger.info(
316
+ f"File monitor already running for directory: {monitor.root_dir}"
317
+ )
318
+ else:
319
+ logger.warning(
320
+ f"File monitor is running for a different directory ({monitor.root_dir}), "
321
+ f"cannot start a new one for {args.source_dir}."
322
+ )
323
+
324
+ # 加载规则文件(.gitignore, .autocoderignore 等)
325
+ logger.info(f"Getting rules for {server_args.doc_dir}")
326
+ _ = get_rules(server_args.doc_dir)
327
+
328
+ except ValueError as ve:
329
+ logger.error(
330
+ f"Failed to initialize file monitor for {args.source_dir}: {ve}"
331
+ )
332
+ except ImportError as ie:
333
+ logger.error(f"Failed to start file monitor: {ie}")
334
+ except Exception as e:
335
+ logger.error(
336
+ f"An unexpected error occurred while starting file monitor "
337
+ f"for {args.source_dir}: {e}"
338
+ )
339
+
340
+ # 步骤10: 启动 RAG 服务
341
+ serve(llm=llm_wrapper, args=server_args)
342
+
343
+
344
+ def handle_build_hybrid_index_command(args):
345
+ """处理 build_hybrid_index 命令"""
346
+ auto_coder_args = AutoCoderArgs(
347
+ **{
348
+ arg: getattr(args, arg)
349
+ for arg in vars(AutoCoderArgs())
350
+ if hasattr(args, arg)
351
+ }
352
+ )
353
+
354
+ # Generate unique name for RAG build if doc_dir exists
355
+ if args.doc_dir:
356
+ auto_coder_args.rag_build_name = generate_unique_name_from_path(args.doc_dir)
357
+ logger.info(f"Generated RAG build name: {auto_coder_args.rag_build_name}")
358
+
359
+ auto_coder_args.enable_hybrid_index = True
360
+ auto_coder_args.rag_type = "simple"
361
+
362
+ if args.on_ray:
363
+
364
+ try:
365
+ from byzerllm.apps.byzer_storage.simple_api import ByzerStorage
366
+
367
+ storage = ByzerStorage("byzerai_store", "rag", "files")
368
+ storage.retrieval.cluster_info("byzerai_store")
369
+ except Exception as e:
370
+ logger.error(
371
+ "When enable_hybrid_index is true, ByzerStorage must be started"
372
+ )
373
+ logger.error("Please run 'byzerllm storage start' first")
374
+ return
375
+
376
+ llm = byzerllm.ByzerLLM()
377
+ llm.setup_default_model_name(args.model)
378
+
379
+ # 当启用hybrid_index时,检查必要的组件
380
+ if auto_coder_args.enable_hybrid_index:
381
+ if not llm.is_model_exist("emb"):
382
+ logger.error(
383
+ "When enable_hybrid_index is true, an 'emb' model must be deployed"
384
+ )
385
+ return
386
+ llm.setup_default_emb_model_name("emb")
387
+ else:
388
+ llm_manager = LLMManager(
389
+ models_json_path=args.model_file if args.model_file else None
390
+ )
391
+ model_info = llm_manager.get_model_info(args.model, "lite")
392
+ if not model_info:
393
+ raise ValueError(f"模型 {args.model} 不存在")
394
+ llm = byzerllm.SimpleByzerLLM(default_model_name=args.model)
395
+ llm.deploy(
396
+ model_path="",
397
+ pretrained_model_type=model_info["model_type"],
398
+ udf_name=args.model,
399
+ infer_params={
400
+ "saas.base_url": model_info["base_url"],
401
+ "saas.api_key": model_info["api_key"],
402
+ "saas.model": model_info["model_name"],
403
+ "saas.is_reasoning": model_info["is_reasoning"],
404
+ "saas.max_output_tokens": model_info.get("max_output_tokens", 8096),
405
+ },
406
+ )
407
+
408
+ emb_model_info = llm_manager.get_model_info(args.emb_model, "lite")
409
+ if not emb_model_info:
410
+ raise ValueError(f"模型 {args.emb_model} 不存在")
411
+ emb_model = byzerllm.SimpleByzerLLM(default_model_name=args.emb_model)
412
+ emb_model.deploy(
413
+ model_path="",
414
+ pretrained_model_type=emb_model_info["model_type"],
415
+ udf_name=args.emb_model,
416
+ infer_params={
417
+ "saas.base_url": emb_model_info["base_url"],
418
+ "saas.api_key": emb_model_info["api_key"],
419
+ "saas.model": emb_model_info["model_name"],
420
+ "saas.is_reasoning": False,
421
+ "saas.max_output_tokens": emb_model_info.get("max_output_tokens", 8096),
422
+ },
423
+ )
424
+ llm.setup_sub_client("emb_model", emb_model)
425
+
426
+ rag = RAGFactory.get_rag(
427
+ llm=llm,
428
+ args=auto_coder_args,
429
+ path=args.doc_dir,
430
+ tokenizer_path=args.tokenizer_path,
431
+ )
432
+
433
+ if hasattr(rag.document_retriever, "cacher"):
434
+ rag.document_retriever.cacher.build_cache()
435
+ else:
436
+ logger.error("The document retriever does not support hybrid index building")
437
+ try:
438
+ monitor = FileMonitor(args.doc_dir)
439
+ monitor.stop()
440
+ except Exception as e:
441
+ logger.warning(f"Failed to stop file monitor: {e}")
442
+
443
+
444
+ def handle_tools_command(args):
445
+ """处理 tools 命令"""
446
+ if args.tool == "count":
447
+ # auto-coder.rag tools count --tokenizer_path /Users/allwefantasy/Downloads/tokenizer.json --file /Users/allwefantasy/data/yum/schema/schema.xlsx
448
+ count_tokens(args.tokenizer_path, args.file)
449
+ elif args.tool == "recall":
450
+ _handle_recall_tool(args)
451
+ elif args.tool == "chunk":
452
+ _handle_chunk_tool(args)
453
+
454
+
455
+ def _handle_recall_tool(args):
456
+ """处理 recall 工具"""
457
+
458
+ # Handle lite/pro flags
459
+ if args.lite:
460
+ args.product_mode = "lite"
461
+ elif args.pro:
462
+ args.product_mode = "pro"
463
+
464
+ if args.product_mode == "pro":
465
+ llm = byzerllm.ByzerLLM.from_default_model(args.model)
466
+ else: # lite mode
467
+ llm_manager = LLMManager(
468
+ models_json_path=args.model_file if args.model_file else None
469
+ )
470
+ model_info = llm_manager.get_model_info(args.model, "lite")
471
+ if not model_info:
472
+ raise ValueError(f"模型 {args.model} 不存在")
473
+ llm = byzerllm.SimpleByzerLLM(default_model_name=args.model)
474
+ llm.deploy(
475
+ model_path="",
476
+ pretrained_model_type=model_info["model_type"],
477
+ udf_name=args.model,
478
+ infer_params={
479
+ "saas.base_url": model_info["base_url"],
480
+ "saas.api_key": model_info["api_key"],
481
+ "saas.model": model_info["model_name"],
482
+ "saas.is_reasoning": model_info["is_reasoning"],
483
+ "saas.max_output_tokens": model_info.get("max_output_tokens", 8096),
484
+ },
485
+ )
486
+
487
+ content = None if not args.content else [args.content]
488
+ result = validate_recall(llm, content=content, query=args.query)
489
+ print(f"Recall Validation Result:\n{result}")
490
+
491
+
492
+ def _handle_chunk_tool(args):
493
+ """处理 chunk 工具"""
494
+ if args.lite:
495
+ args.product_mode = "lite"
496
+ elif args.pro:
497
+ args.product_mode = "pro"
498
+
499
+ if args.product_mode == "pro":
500
+ llm = byzerllm.ByzerLLM.from_default_model(args.model)
501
+ else: # lite mode
502
+ chunk_llm_manager = LLMManager(
503
+ models_json_path=args.model_file if args.model_file else None
504
+ )
505
+ model_info = chunk_llm_manager.get_model_info(args.model, "lite")
506
+ if not model_info:
507
+ raise ValueError(f"模型 {args.model} 不存在")
508
+ llm = byzerllm.SimpleByzerLLM(default_model_name=args.model)
509
+ llm.deploy(
510
+ model_path="",
511
+ pretrained_model_type=model_info["model_type"],
512
+ udf_name=args.model,
513
+ infer_params={
514
+ "saas.base_url": model_info["base_url"],
515
+ "saas.api_key": model_info["api_key"],
516
+ "saas.model": model_info["model_name"],
517
+ "saas.is_reasoning": model_info["is_reasoning"],
518
+ "saas.max_output_tokens": model_info.get("max_output_tokens", 8096),
519
+ },
520
+ )
521
+
522
+ content = None if not args.content else [args.content]
523
+ result = validate_chunk(llm, content=content, query=args.query)
524
+ print(f"Chunk Model Validation Result:\n{result}")
525
+
526
+
527
+ def _setup_llm(args, auto_coder_args):
528
+ """设置并配置 LLM"""
529
+ if args.product_mode == "pro":
530
+ return _setup_llm_pro(args, auto_coder_args)
531
+ else:
532
+ return _setup_llm_lite(args, auto_coder_args)
533
+
534
+
535
+ def _setup_llm_pro(args, auto_coder_args):
536
+ """Pro 模式下设置 LLM"""
537
+ byzerllm.connect_cluster(address=args.ray_address)
538
+ llm = byzerllm.ByzerLLM()
539
+ llm.skip_nontext_check = True
540
+ llm.setup_default_model_name(args.model)
541
+
542
+ # Setup sub models if specified
543
+ if args.recall_model:
544
+ recall_model = byzerllm.ByzerLLM()
545
+ recall_model.setup_default_model_name(args.recall_model)
546
+ recall_model.skip_nontext_check = True
547
+ llm.setup_sub_client("recall_model", recall_model)
548
+
549
+ if args.chunk_model:
550
+ chunk_model = byzerllm.ByzerLLM()
551
+ chunk_model.setup_default_model_name(args.chunk_model)
552
+ llm.setup_sub_client("chunk_model", chunk_model)
553
+
554
+ if args.qa_model:
555
+ qa_model = byzerllm.ByzerLLM()
556
+ qa_model.setup_default_model_name(args.qa_model)
557
+ qa_model.skip_nontext_check = True
558
+ llm.setup_sub_client("qa_model", qa_model)
559
+
560
+ if args.emb_model:
561
+ emb_model = byzerllm.ByzerLLM()
562
+ emb_model.setup_default_model_name(args.emb_model)
563
+ emb_model.skip_nontext_check = True
564
+ llm.setup_sub_client("emb_model", emb_model)
565
+
566
+ if args.agentic_model:
567
+ agentic_model = byzerllm.ByzerLLM()
568
+ agentic_model.setup_default_model_name(args.agentic_model)
569
+ agentic_model.skip_nontext_check = True
570
+ llm.setup_sub_client("agentic_model", agentic_model)
571
+
572
+ if args.context_prune_model:
573
+ context_prune_model = byzerllm.ByzerLLM()
574
+ context_prune_model.setup_default_model_name(args.context_prune_model)
575
+ context_prune_model.skip_nontext_check = True
576
+ llm.setup_sub_client("context_prune_model", context_prune_model)
577
+
578
+ # 当启用hybrid_index时,检查必要的组件
579
+ if auto_coder_args.enable_hybrid_index:
580
+ if not args.emb_model and not llm.is_model_exist("emb"):
581
+ logger.error(
582
+ "When enable_hybrid_index is true, an 'emb' model must be deployed"
583
+ )
584
+ return
585
+ llm.setup_default_emb_model_name(args.emb_model or "emb")
586
+
587
+ return llm
588
+
589
+
590
+ def _setup_llm_lite(args, auto_coder_args):
591
+ """Lite 模式下设置 LLM"""
592
+ from autocoder.common.llms import LLMManager
593
+
594
+ llm_manager = LLMManager(
595
+ models_json_path=args.model_file if args.model_file else None
596
+ )
597
+
598
+ def get_model_info_dict(model_name):
599
+ """获取模型信息的辅助函数"""
600
+ model_info = llm_manager.get_model_info(model_name, "lite")
601
+ if not model_info:
602
+ raise ValueError(f"模型 {model_name} 不存在")
603
+ return model_info
604
+
605
+ def deploy_simple_llm(model_name):
606
+ """部署单个 SimpleByzerLLM 模型的辅助函数"""
607
+ model_info = get_model_info_dict(model_name)
608
+ model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
609
+ model.deploy(
610
+ model_path="",
611
+ pretrained_model_type=model_info["model_type"],
612
+ udf_name=model_name,
613
+ infer_params={
614
+ "saas.base_url": model_info["base_url"],
615
+ "saas.api_key": model_info["api_key"],
616
+ "saas.model": model_info["model_name"],
617
+ "saas.is_reasoning": model_info["is_reasoning"],
618
+ "saas.max_output_tokens": model_info.get("max_output_tokens", 8096),
619
+ },
620
+ )
621
+ return model
622
+
623
+ # 部署主模型
624
+ llm = deploy_simple_llm(args.model)
625
+
626
+ # 部署子模型(如果指定)
627
+ if args.recall_model:
628
+ llm.setup_sub_client("recall_model", deploy_simple_llm(args.recall_model))
629
+
630
+ if args.chunk_model:
631
+ llm.setup_sub_client("chunk_model", deploy_simple_llm(args.chunk_model))
632
+
633
+ if args.qa_model:
634
+ llm.setup_sub_client("qa_model", deploy_simple_llm(args.qa_model))
635
+
636
+ if args.emb_model:
637
+ llm.setup_sub_client("emb_model", deploy_simple_llm(args.emb_model))
638
+
639
+ if args.agentic_model:
640
+ llm.setup_sub_client("agentic_model", deploy_simple_llm(args.agentic_model))
641
+
642
+ if args.context_prune_model:
643
+ llm.setup_sub_client(
644
+ "context_prune_model", deploy_simple_llm(args.context_prune_model)
645
+ )
646
+
647
+ if auto_coder_args.enable_hybrid_index:
648
+ if not args.emb_model:
649
+ raise Exception(
650
+ "When enable_hybrid_index is true, an 'emb' model must be specified"
651
+ )
652
+
653
+ return llm
@@ -0,0 +1,20 @@
1
+ """
2
+ RAG Terminal 输出格式化器模块
3
+
4
+ 提供三种输出格式:
5
+ - text: 纯文本,只输出答案
6
+ - json: JSON格式,包含完整结果和元数据
7
+ - stream-json: 流式JSON,实时输出每个处理步骤
8
+ """
9
+
10
+ from .text import TextFormatter
11
+ from .json_format import JSONFormatter
12
+ from .stream_json import StreamJSONFormatter
13
+ from .base import format_rag_output
14
+
15
+ __all__ = [
16
+ "TextFormatter",
17
+ "JSONFormatter",
18
+ "StreamJSONFormatter",
19
+ "format_rag_output",
20
+ ]