auto-coder 1.0.0__py3-none-any.whl → 2.0.1__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 (574) hide show
  1. auto_coder-2.0.1.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.1.dist-info/METADATA +558 -0
  3. auto_coder-2.0.1.dist-info/RECORD +795 -0
  4. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/WHEEL +1 -1
  5. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.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 +24 -3
  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 +77 -73
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +962 -2345
  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 +988 -398
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +25 -8
  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 +409 -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/git_utils.py +44 -8
  119. autocoder/common/global_cancel.py +15 -6
  120. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  121. autocoder/common/international/__init__.py +31 -0
  122. autocoder/common/international/demo_international.py +92 -0
  123. autocoder/common/international/message_manager.py +157 -0
  124. autocoder/common/international/messages/__init__.py +56 -0
  125. autocoder/common/international/messages/async_command_messages.py +507 -0
  126. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  127. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  128. autocoder/common/international/messages/command_help_messages.py +986 -0
  129. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  130. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  131. autocoder/common/international/messages/queue_command_messages.py +751 -0
  132. autocoder/common/international/messages/rules_command_messages.py +77 -0
  133. autocoder/common/international/messages/sdk_messages.py +1707 -0
  134. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  135. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  136. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  137. autocoder/common/international/test_international.py +612 -0
  138. autocoder/common/linter_core/__init__.py +28 -0
  139. autocoder/common/linter_core/base_linter.py +61 -0
  140. autocoder/common/linter_core/config_loader.py +271 -0
  141. autocoder/common/linter_core/formatters/__init__.py +0 -0
  142. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  143. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  144. autocoder/common/linter_core/linter.py +166 -0
  145. autocoder/common/linter_core/linter_factory.py +216 -0
  146. autocoder/common/linter_core/linter_manager.py +333 -0
  147. autocoder/common/linter_core/linters/__init__.py +9 -0
  148. autocoder/common/linter_core/linters/java_linter.py +342 -0
  149. autocoder/common/linter_core/linters/python_linter.py +115 -0
  150. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  151. autocoder/common/linter_core/models/__init__.py +7 -0
  152. autocoder/common/linter_core/models/lint_result.py +91 -0
  153. autocoder/common/linter_core/models.py +33 -0
  154. autocoder/common/linter_core/tests/__init__.py +3 -0
  155. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  156. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  157. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  158. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  159. autocoder/common/linter_core/tests/test_integration.py +317 -0
  160. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  161. autocoder/common/linter_core/tests/test_linters.py +265 -0
  162. autocoder/common/linter_core/tests/test_models.py +81 -0
  163. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  164. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  165. autocoder/common/llm_friendly_package/__init__.py +31 -0
  166. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  167. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  168. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  169. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  170. autocoder/common/llm_friendly_package/models.py +40 -0
  171. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  172. autocoder/common/llms/__init__.py +15 -0
  173. autocoder/common/llms/demo_error_handling.py +85 -0
  174. autocoder/common/llms/factory.py +142 -0
  175. autocoder/common/llms/manager.py +264 -0
  176. autocoder/common/llms/pricing.py +121 -0
  177. autocoder/common/llms/registry.py +316 -0
  178. autocoder/common/llms/schema.py +77 -0
  179. autocoder/common/llms/simple_demo.py +45 -0
  180. autocoder/common/llms/test_quick_model.py +116 -0
  181. autocoder/common/llms/test_remove_functionality.py +182 -0
  182. autocoder/common/llms/tests/__init__.py +1 -0
  183. autocoder/common/llms/tests/test_manager.py +330 -0
  184. autocoder/common/llms/tests/test_registry.py +364 -0
  185. autocoder/common/mcp_tools/__init__.py +62 -0
  186. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  187. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  188. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  189. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  190. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  191. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  192. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  193. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  194. autocoder/common/model_speed_tester.py +32 -26
  195. autocoder/common/priority_directory_finder/__init__.py +142 -0
  196. autocoder/common/priority_directory_finder/examples.py +230 -0
  197. autocoder/common/priority_directory_finder/finder.py +283 -0
  198. autocoder/common/priority_directory_finder/models.py +236 -0
  199. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  200. autocoder/common/project_scanner/__init__.py +18 -0
  201. autocoder/common/project_scanner/compat.py +77 -0
  202. autocoder/common/project_scanner/scanner.py +436 -0
  203. autocoder/common/project_tracker/__init__.py +27 -0
  204. autocoder/common/project_tracker/api.py +228 -0
  205. autocoder/common/project_tracker/demo.py +272 -0
  206. autocoder/common/project_tracker/tracker.py +487 -0
  207. autocoder/common/project_tracker/types.py +53 -0
  208. autocoder/common/pruner/__init__.py +67 -0
  209. autocoder/common/pruner/agentic_conversation_pruner.py +651 -102
  210. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  211. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  212. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  213. autocoder/common/pruner/conversation_normalizer.py +347 -0
  214. autocoder/common/pruner/conversation_pruner.py +26 -6
  215. autocoder/common/pruner/test_agentic_conversation_pruner.py +554 -112
  216. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  217. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  218. autocoder/common/pruner/tool_content_detector.py +227 -0
  219. autocoder/common/pruner/tools/__init__.py +18 -0
  220. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  221. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  222. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  223. autocoder/common/pull_requests/__init__.py +9 -1
  224. autocoder/common/pull_requests/utils.py +122 -1
  225. autocoder/common/rag_manager/rag_manager.py +36 -40
  226. autocoder/common/rulefiles/__init__.py +53 -1
  227. autocoder/common/rulefiles/api.py +250 -0
  228. autocoder/common/rulefiles/core/__init__.py +14 -0
  229. autocoder/common/rulefiles/core/manager.py +241 -0
  230. autocoder/common/rulefiles/core/selector.py +805 -0
  231. autocoder/common/rulefiles/models/__init__.py +20 -0
  232. autocoder/common/rulefiles/models/index.py +16 -0
  233. autocoder/common/rulefiles/models/init_rule.py +18 -0
  234. autocoder/common/rulefiles/models/rule_file.py +18 -0
  235. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  236. autocoder/common/rulefiles/models/summary.py +16 -0
  237. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  238. autocoder/common/rulefiles/utils/__init__.py +34 -0
  239. autocoder/common/rulefiles/utils/monitor.py +86 -0
  240. autocoder/common/rulefiles/utils/parser.py +230 -0
  241. autocoder/common/save_formatted_log.py +67 -10
  242. autocoder/common/search_replace.py +8 -1
  243. autocoder/common/search_replace_patch/__init__.py +24 -0
  244. autocoder/common/search_replace_patch/base.py +115 -0
  245. autocoder/common/search_replace_patch/manager.py +248 -0
  246. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  247. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  248. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  249. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  250. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  251. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  252. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  253. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  254. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  255. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  256. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  257. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  258. autocoder/common/shell_commands/__init__.py +197 -0
  259. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  260. autocoder/common/shell_commands/command_executor.py +1127 -0
  261. autocoder/common/shell_commands/error_recovery.py +541 -0
  262. autocoder/common/shell_commands/exceptions.py +120 -0
  263. autocoder/common/shell_commands/interactive_executor.py +476 -0
  264. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  265. autocoder/common/shell_commands/interactive_process.py +744 -0
  266. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  267. autocoder/common/shell_commands/monitoring.py +529 -0
  268. autocoder/common/shell_commands/process_cleanup.py +386 -0
  269. autocoder/common/shell_commands/process_manager.py +606 -0
  270. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  271. autocoder/common/shell_commands/tests/__init__.py +6 -0
  272. autocoder/common/shell_commands/tests/conftest.py +118 -0
  273. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  274. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  275. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  276. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  277. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  278. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  279. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  280. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  281. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  282. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  283. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  284. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  285. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  286. autocoder/common/shell_commands/timeout_config.py +315 -0
  287. autocoder/common/shell_commands/timeout_manager.py +352 -0
  288. autocoder/common/terminal_paste/__init__.py +14 -0
  289. autocoder/common/terminal_paste/demo.py +145 -0
  290. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  291. autocoder/common/terminal_paste/paste_handler.py +200 -0
  292. autocoder/common/terminal_paste/paste_manager.py +118 -0
  293. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  294. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  295. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  296. autocoder/common/terminal_paste/utils.py +163 -0
  297. autocoder/common/test_autocoder_args.py +232 -0
  298. autocoder/common/test_env_manager.py +173 -0
  299. autocoder/common/test_env_manager_integration.py +159 -0
  300. autocoder/common/text_similarity/__init__.py +9 -0
  301. autocoder/common/text_similarity/demo.py +216 -0
  302. autocoder/common/text_similarity/examples.py +266 -0
  303. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  304. autocoder/common/text_similarity/text_similarity.py +194 -0
  305. autocoder/common/text_similarity/utils.py +125 -0
  306. autocoder/common/todos/__init__.py +61 -0
  307. autocoder/common/todos/cache/__init__.py +16 -0
  308. autocoder/common/todos/cache/base_cache.py +89 -0
  309. autocoder/common/todos/cache/cache_manager.py +228 -0
  310. autocoder/common/todos/cache/memory_cache.py +225 -0
  311. autocoder/common/todos/config.py +155 -0
  312. autocoder/common/todos/exceptions.py +35 -0
  313. autocoder/common/todos/get_todo_manager.py +161 -0
  314. autocoder/common/todos/manager.py +537 -0
  315. autocoder/common/todos/models.py +239 -0
  316. autocoder/common/todos/storage/__init__.py +14 -0
  317. autocoder/common/todos/storage/base_storage.py +76 -0
  318. autocoder/common/todos/storage/file_storage.py +278 -0
  319. autocoder/common/tokens/counter.py +24 -2
  320. autocoder/common/tools_manager/__init__.py +17 -0
  321. autocoder/common/tools_manager/examples.py +162 -0
  322. autocoder/common/tools_manager/manager.py +385 -0
  323. autocoder/common/tools_manager/models.py +39 -0
  324. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  325. autocoder/common/tools_manager/utils.py +191 -0
  326. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  327. autocoder/common/v2/agent/agentic_edit.py +2699 -1856
  328. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  329. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +35 -1
  330. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  331. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +10 -1
  332. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +564 -29
  338. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  340. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  344. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +356 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +243 -50
  346. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  347. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +410 -86
  349. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  350. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  352. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +207 -192
  353. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +80 -63
  354. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +237 -233
  355. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  356. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  359. autocoder/common/v2/agent/agentic_edit_types.py +343 -9
  360. autocoder/common/v2/agent/runner/__init__.py +3 -3
  361. autocoder/common/v2/agent/runner/base_runner.py +12 -26
  362. autocoder/common/v2/agent/runner/{event_runner.py → file_based_event_runner.py} +3 -2
  363. autocoder/common/v2/agent/runner/sdk_runner.py +150 -8
  364. autocoder/common/v2/agent/runner/terminal_runner.py +170 -57
  365. autocoder/common/v2/agent/runner/tool_display.py +557 -159
  366. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  367. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  368. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  369. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  370. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  371. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  372. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  373. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  374. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  375. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  376. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  377. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  378. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  379. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  380. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  381. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  382. autocoder/common/v2/code_auto_generate.py +136 -78
  383. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  384. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  385. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  386. autocoder/common/v2/code_auto_merge.py +1 -1
  387. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  388. autocoder/common/v2/code_diff_manager.py +3 -3
  389. autocoder/common/v2/code_editblock_manager.py +4 -14
  390. autocoder/common/v2/code_manager.py +1 -1
  391. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  392. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  393. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  394. autocoder/common/wrap_llm_hint/utils.py +432 -0
  395. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  396. autocoder/completer/__init__.py +8 -0
  397. autocoder/completer/command_completer_v2.py +1094 -0
  398. autocoder/default_project/__init__.py +501 -0
  399. autocoder/dispacher/__init__.py +4 -12
  400. autocoder/dispacher/actions/action.py +400 -129
  401. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  402. autocoder/index/entry.py +117 -125
  403. autocoder/{agent → index/filter}/agentic_filter.py +322 -333
  404. autocoder/index/filter/normal_filter.py +5 -11
  405. autocoder/index/filter/quick_filter.py +1 -1
  406. autocoder/index/index.py +36 -9
  407. autocoder/index/tests/__init__.py +1 -0
  408. autocoder/index/tests/run_tests.py +195 -0
  409. autocoder/index/tests/test_entry.py +303 -0
  410. autocoder/index/tests/test_index_manager.py +314 -0
  411. autocoder/index/tests/test_module_integration.py +300 -0
  412. autocoder/index/tests/test_symbols_utils.py +183 -0
  413. autocoder/inner/__init__.py +4 -0
  414. autocoder/inner/agentic.py +923 -0
  415. autocoder/inner/async_command_handler.py +992 -0
  416. autocoder/inner/conversation_command_handlers.py +623 -0
  417. autocoder/inner/merge_command_handler.py +213 -0
  418. autocoder/inner/queue_command_handler.py +684 -0
  419. autocoder/models.py +95 -266
  420. autocoder/plugins/git_helper_plugin.py +31 -29
  421. autocoder/plugins/token_helper_plugin.py +65 -46
  422. autocoder/pyproject/__init__.py +32 -29
  423. autocoder/rag/agentic_rag.py +215 -75
  424. autocoder/rag/cache/simple_cache.py +1 -2
  425. autocoder/rag/loaders/image_loader.py +1 -1
  426. autocoder/rag/long_context_rag.py +42 -26
  427. autocoder/rag/qa_conversation_strategy.py +1 -1
  428. autocoder/rag/terminal/__init__.py +17 -0
  429. autocoder/rag/terminal/args.py +581 -0
  430. autocoder/rag/terminal/bootstrap.py +61 -0
  431. autocoder/rag/terminal/command_handlers.py +653 -0
  432. autocoder/rag/terminal/formatters/__init__.py +20 -0
  433. autocoder/rag/terminal/formatters/base.py +70 -0
  434. autocoder/rag/terminal/formatters/json_format.py +66 -0
  435. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  436. autocoder/rag/terminal/formatters/text.py +28 -0
  437. autocoder/rag/terminal/init.py +120 -0
  438. autocoder/rag/terminal/utils.py +106 -0
  439. autocoder/rag/test_agentic_rag.py +389 -0
  440. autocoder/rag/test_doc_filter.py +3 -3
  441. autocoder/rag/test_long_context_rag.py +1 -1
  442. autocoder/rag/test_token_limiter.py +517 -10
  443. autocoder/rag/token_counter.py +3 -0
  444. autocoder/rag/token_limiter.py +19 -15
  445. autocoder/rag/tools/__init__.py +26 -2
  446. autocoder/rag/tools/bochaai_example.py +343 -0
  447. autocoder/rag/tools/bochaai_sdk.py +541 -0
  448. autocoder/rag/tools/metaso_example.py +268 -0
  449. autocoder/rag/tools/metaso_sdk.py +417 -0
  450. autocoder/rag/tools/recall_tool.py +28 -7
  451. autocoder/rag/tools/run_integration_tests.py +204 -0
  452. autocoder/rag/tools/test_all_providers.py +318 -0
  453. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  454. autocoder/rag/tools/test_final_integration.py +215 -0
  455. autocoder/rag/tools/test_metaso_integration.py +424 -0
  456. autocoder/rag/tools/test_metaso_real.py +171 -0
  457. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  458. autocoder/rag/tools/test_web_search_tool.py +509 -0
  459. autocoder/rag/tools/todo_read_tool.py +202 -0
  460. autocoder/rag/tools/todo_write_tool.py +412 -0
  461. autocoder/rag/tools/web_crawl_tool.py +634 -0
  462. autocoder/rag/tools/web_search_tool.py +558 -0
  463. autocoder/rag/tools/web_tools_example.py +119 -0
  464. autocoder/rag/types.py +16 -0
  465. autocoder/rag/variable_holder.py +4 -2
  466. autocoder/rags.py +86 -79
  467. autocoder/regexproject/__init__.py +23 -21
  468. autocoder/sdk/__init__.py +46 -190
  469. autocoder/sdk/api.py +370 -0
  470. autocoder/sdk/async_runner/__init__.py +26 -0
  471. autocoder/sdk/async_runner/async_executor.py +650 -0
  472. autocoder/sdk/async_runner/async_handler.py +356 -0
  473. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  474. autocoder/sdk/async_runner/task_metadata.py +284 -0
  475. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  476. autocoder/sdk/cli/__init__.py +2 -5
  477. autocoder/sdk/cli/formatters.py +28 -204
  478. autocoder/sdk/cli/handlers.py +77 -44
  479. autocoder/sdk/cli/main.py +154 -171
  480. autocoder/sdk/cli/options.py +95 -22
  481. autocoder/sdk/constants.py +139 -51
  482. autocoder/sdk/core/auto_coder_core.py +484 -109
  483. autocoder/sdk/core/bridge.py +297 -115
  484. autocoder/sdk/exceptions.py +18 -12
  485. autocoder/sdk/formatters/__init__.py +19 -0
  486. autocoder/sdk/formatters/input.py +64 -0
  487. autocoder/sdk/formatters/output.py +247 -0
  488. autocoder/sdk/formatters/stream.py +54 -0
  489. autocoder/sdk/models/__init__.py +6 -5
  490. autocoder/sdk/models/options.py +55 -18
  491. autocoder/sdk/utils/formatters.py +27 -195
  492. autocoder/suffixproject/__init__.py +28 -25
  493. autocoder/terminal/__init__.py +14 -0
  494. autocoder/terminal/app.py +454 -0
  495. autocoder/terminal/args.py +32 -0
  496. autocoder/terminal/bootstrap.py +178 -0
  497. autocoder/terminal/command_processor.py +521 -0
  498. autocoder/terminal/command_registry.py +57 -0
  499. autocoder/terminal/help.py +97 -0
  500. autocoder/terminal/tasks/__init__.py +5 -0
  501. autocoder/terminal/tasks/background.py +77 -0
  502. autocoder/terminal/tasks/task_event.py +70 -0
  503. autocoder/terminal/ui/__init__.py +13 -0
  504. autocoder/terminal/ui/completer.py +268 -0
  505. autocoder/terminal/ui/keybindings.py +75 -0
  506. autocoder/terminal/ui/session.py +41 -0
  507. autocoder/terminal/ui/toolbar.py +64 -0
  508. autocoder/terminal/utils/__init__.py +13 -0
  509. autocoder/terminal/utils/errors.py +18 -0
  510. autocoder/terminal/utils/paths.py +19 -0
  511. autocoder/terminal/utils/shell.py +43 -0
  512. autocoder/terminal_v3/__init__.py +10 -0
  513. autocoder/terminal_v3/app.py +201 -0
  514. autocoder/terminal_v3/handlers/__init__.py +5 -0
  515. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  516. autocoder/terminal_v3/models/__init__.py +6 -0
  517. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  518. autocoder/terminal_v3/models/message.py +50 -0
  519. autocoder/terminal_v3/models/tool_display.py +247 -0
  520. autocoder/terminal_v3/ui/__init__.py +7 -0
  521. autocoder/terminal_v3/ui/keybindings.py +56 -0
  522. autocoder/terminal_v3/ui/layout.py +141 -0
  523. autocoder/terminal_v3/ui/styles.py +43 -0
  524. autocoder/tsproject/__init__.py +23 -23
  525. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  526. autocoder/utils/llms.py +88 -80
  527. autocoder/utils/math_utils.py +101 -0
  528. autocoder/utils/model_provider_selector.py +16 -4
  529. autocoder/utils/operate_config_api.py +33 -5
  530. autocoder/utils/thread_utils.py +2 -2
  531. autocoder/version.py +4 -2
  532. autocoder/workflow_agents/__init__.py +84 -0
  533. autocoder/workflow_agents/agent.py +143 -0
  534. autocoder/workflow_agents/exceptions.py +573 -0
  535. autocoder/workflow_agents/executor.py +665 -0
  536. autocoder/workflow_agents/loader.py +749 -0
  537. autocoder/workflow_agents/runner.py +267 -0
  538. autocoder/workflow_agents/types.py +173 -0
  539. autocoder/workflow_agents/utils.py +434 -0
  540. autocoder/workflow_agents/workflow_manager.py +211 -0
  541. auto_coder-1.0.0.dist-info/METADATA +0 -396
  542. auto_coder-1.0.0.dist-info/RECORD +0 -442
  543. auto_coder-1.0.0.dist-info/licenses/LICENSE +0 -201
  544. autocoder/auto_coder_server.py +0 -672
  545. autocoder/benchmark.py +0 -138
  546. autocoder/common/ac_style_command_parser/example.py +0 -7
  547. autocoder/common/cleaner.py +0 -31
  548. autocoder/common/command_completer_v2.py +0 -615
  549. autocoder/common/context_pruner.py +0 -477
  550. autocoder/common/conversation_pruner.py +0 -132
  551. autocoder/common/directory_cache/__init__.py +0 -1
  552. autocoder/common/directory_cache/cache.py +0 -192
  553. autocoder/common/directory_cache/test_cache.py +0 -190
  554. autocoder/common/file_checkpoint/examples.py +0 -217
  555. autocoder/common/llm_friendly_package_example.py +0 -138
  556. autocoder/common/llm_friendly_package_test.py +0 -63
  557. autocoder/common/pull_requests/test_module.py +0 -1
  558. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  559. autocoder/common/text.py +0 -30
  560. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  561. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  562. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  563. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  564. autocoder/plugins/dynamic_completion_example.py +0 -148
  565. autocoder/plugins/sample_plugin.py +0 -160
  566. autocoder/sdk/cli/__main__.py +0 -26
  567. autocoder/sdk/cli/completion_wrapper.py +0 -38
  568. autocoder/sdk/cli/install_completion.py +0 -301
  569. autocoder/sdk/models/messages.py +0 -209
  570. autocoder/sdk/session/__init__.py +0 -32
  571. autocoder/sdk/session/session.py +0 -106
  572. autocoder/sdk/session/session_manager.py +0 -56
  573. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/top_level.txt +0 -0
  574. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -14,47 +14,67 @@ from importlib.metadata import version
14
14
  from pydantic import BaseModel
15
15
  from autocoder.common import openai_content as OpenAIContentProcessor
16
16
  from autocoder.rag.long_context_rag import LongContextRAG
17
- import json, os
17
+ import json
18
+ import os
18
19
  from autocoder.agent.base_agentic.base_agent import BaseAgent
19
- from autocoder.agent.base_agentic.types import AgentRequest
20
+ from autocoder.agent.base_agentic.types import AgentRequest, AgenticEditConversationConfig
20
21
  from autocoder.common import SourceCodeList
21
- from autocoder.rag.tools import register_search_tool, register_recall_tool
22
+ from autocoder.rag.tools import register_search_tool, register_recall_tool, register_todo_read_tool, register_todo_write_tool, register_web_search_tool, register_web_crawl_tool
22
23
  from byzerllm.utils.types import SingleOutputMeta
23
- from autocoder.utils.llms import get_single_llm
24
- try:
25
- from autocoder_pro.rag.llm_compute import LLMComputeEngine
26
- pro_version = version("auto-coder-pro")
27
- autocoder_version = version("auto-coder")
28
- logger.warning(
29
- f"auto-coder-pro({pro_version}) plugin is enabled in auto-coder.rag({autocoder_version})")
30
- except ImportError:
31
- logger.warning(
32
- "Please install auto-coder-pro to enhance llm compute ability")
33
- LLMComputeEngine = None
34
-
35
-
36
- class RAGAgent(BaseAgent):
37
- def __init__(self, name: str,
38
- llm: Union[byzerllm.ByzerLLM, byzerllm.SimpleByzerLLM],
39
- files: SourceCodeList,
40
- args: AutoCoderArgs,
41
- rag: LongContextRAG,
42
- conversation_history: Optional[List[Dict[str, Any]]] = None):
43
- self.llm = llm
24
+ import uuid
25
+
26
+ class RAGAgent(BaseAgent):
27
+ def __init__(self, name: str,
28
+ llm: Union[byzerllm.ByzerLLM, byzerllm.SimpleByzerLLM],
29
+ files: SourceCodeList,
30
+ args: AutoCoderArgs,
31
+ rag: LongContextRAG,
32
+ conversation_history: Optional[List[Dict[str, Any]]] = None,
33
+ custom_system_prompt: Optional[str] = None,
34
+ conversation_config: Optional[Any] = None,
35
+ cancel_token: Optional[str] = None):
36
+
37
+ if conversation_config is None:
38
+ conversation_config = AgenticEditConversationConfig(
39
+ conversation_name=f"rag_session_{uuid.uuid4().hex[:8]}",
40
+ conversation_id=str(uuid.uuid4())
41
+ )
42
+
43
+ self.llm = llm
44
44
  self.default_llm = self.llm
45
45
  self.context_prune_llm = self.default_llm
46
46
  if self.default_llm.get_sub_client("context_prune_model"):
47
- self.context_prune_llm = self.default_llm.get_sub_client("context_prune_model")
47
+ self.context_prune_llm = self.default_llm.get_sub_client(
48
+ "context_prune_model")
48
49
 
49
50
  self.llm = self.default_llm
50
51
  if self.default_llm.get_sub_client("agentic_model"):
51
52
  self.llm = self.default_llm.get_sub_client("agentic_model")
52
-
53
- self.rag = rag
54
- super().__init__(name, self.llm, files, args, conversation_history, default_tools_list=["read_file"])
53
+
54
+ self.rag = rag
55
+ super().__init__(
56
+ name=name,
57
+ llm=self.llm,
58
+ files=files,
59
+ args=args,
60
+ conversation_history=conversation_history,
61
+ default_tools_list=["read_file"],
62
+ custom_system_prompt=custom_system_prompt,
63
+ conversation_config=conversation_config,
64
+ cancel_token=cancel_token
65
+ )
55
66
  # 注册RAG工具
56
67
  # register_search_tool()
57
68
  register_recall_tool()
69
+ register_todo_read_tool()
70
+ register_todo_write_tool()
71
+
72
+ # 如果配置了firecrawl_api_key,则注册web_search_tool和web_crawl_tool
73
+ if self.args.firecrawl_api_key or self.args.metaso_api_key or self.args.bochaai_api_key:
74
+ logger.info(f"firecrawl_api_key or metaso_api_key or bochaai_api_key is configured, register web_search_tool and web_crawl_tool")
75
+ register_web_search_tool()
76
+ register_web_crawl_tool()
77
+
58
78
 
59
79
  class AgenticRAG:
60
80
  def __init__(
@@ -64,19 +84,18 @@ class AgenticRAG:
64
84
  path: str,
65
85
  tokenizer_path: Optional[str] = None,
66
86
  ) -> None:
67
- self.llm = llm
68
- self.args = args
69
- self.path = path
70
- self.tokenizer_path = tokenizer_path
71
- self.rag = LongContextRAG(llm=self.llm, args=self.args, path=self.path, tokenizer_path=self.tokenizer_path)
72
-
87
+ self.llm = llm
88
+ self.args = args
89
+ self.path = path
90
+ self.tokenizer_path = tokenizer_path
91
+ self.rag = LongContextRAG(
92
+ llm=self.llm, args=self.args, path=self.path, tokenizer_path=self.tokenizer_path)
73
93
 
74
94
  def build(self):
75
95
  pass
76
96
 
77
97
  def search(self, query: str) -> List[SourceCode]:
78
98
  return []
79
-
80
99
 
81
100
  def stream_chat_oai(
82
101
  self,
@@ -85,7 +104,7 @@ class AgenticRAG:
85
104
  role_mapping=None,
86
105
  llm_config: Dict[str, Any] = {},
87
106
  extra_request_params: Dict[str, Any] = {}
88
- ):
107
+ ):
89
108
  try:
90
109
  return self._stream_chat_oai(
91
110
  conversations,
@@ -100,7 +119,7 @@ class AgenticRAG:
100
119
  return ["出现错误,请稍后再试。"], []
101
120
 
102
121
  @byzerllm.prompt()
103
- def conversation_to_query(self,messages: List[Dict[str, Any]]):
122
+ def conversation_to_query(self, messages: List[Dict[str, Any]]):
104
123
  '''
105
124
  【历史对话】按时间顺序排列,从旧到新:
106
125
  {% for message in messages %}
@@ -111,45 +130,139 @@ class AgenticRAG:
111
130
  </content>
112
131
  </message>
113
132
  {% endfor %}
114
-
133
+
115
134
  【当前问题】用户的最新需求如下:
116
135
  <current_query>
117
136
  {{ query }}
118
137
  </current_query>
119
- '''
138
+ '''
120
139
  temp_messages = messages[0:-1]
121
140
  message = messages[-1]
122
141
 
123
142
  return {
124
143
  "messages": temp_messages,
125
- "query":message["content"]
144
+ "query": message["content"]
126
145
  }
127
146
 
128
147
  @byzerllm.prompt()
129
148
  def system_prompt(self):
130
149
  '''
131
- 你是一个基于知识库的智能助手,我的核心能力是通过检索增强生成(RAG)技术来回答用户问题。
132
-
133
- 你的工作流程如下:
134
- 1. 当用户提出问题时,你首先理解问题的核心意图和关键信息需求
135
- 2. 你会从多个角度分析问题,确定最佳的检索策略和关键词,然后召回工具 recall 获取与问题最相关的详细内容,只有在特别有必要的情况下,你才回使用 read_file 来获得相关文件更详细的信息。
136
- 5. 如果获得的信息足够回答用户问题,你会直接生成回答。
137
- 6. 如果获得的信息不足以回答用户问题,你会继续使用 recall 工具,直到你确信已经获取了足够的信息来回答用户问题。
138
- 7. 有的问题可能需要拆解成多个问题,分别进行recall,然后最终得到的结果才是完整信息,最后才能进行回答。
139
- 8. 当你遇到图片的时候,请根据图片前后文本内容推测改图片与问题的相关性,有相关性则在回答中使用 ![]()格式输出该Markdown图片路径,否则不输出。
150
+ You are an intelligent assistant based on a knowledge base. My core capability is to answer user questions through Retrieval-Augmented Generation (RAG) technology.
151
+
152
+ Your workflow is as follows:
153
+ 1. When users ask questions, you first understand the core intent and key information needs of the question
154
+ 2. For complex questions, you MUST use TODO tools to manage the analysis and retrieval process
155
+ 3. You analyze the question from multiple angles, determine the best retrieval strategy and keywords, then use the recall tool to get the most relevant detailed content
156
+ 4. If the obtained information is sufficient to answer the user's question, you will generate an answer directly
157
+ 5. If the obtained information is insufficient, you will continue using the recall tool until you have obtained enough information
158
+
159
+ ## IMPORTANT: All Complex Questions MUST Use TODO Files
160
+
161
+ For ANY complex question that requires multiple steps, comparisons, or process tracing, you MUST use TODO tools to manage the work:
162
+
163
+ ### Example 1: Comparison Questions
164
+ User question: "What are the differences between the implementation methods of the user authentication module and the permission management module in the system?"
165
+
166
+ **MANDATORY Processing with TODO:**
167
+
168
+ 1. **First create TODO list**:
169
+ ```
170
+ <todo_write>
171
+ <action>create</action>
172
+ <content>
173
+ <task>Retrieve and analyze user authentication module implementation details</task>
174
+ <task>Retrieve and analyze permission management module implementation details</task>
175
+ <task>Compare architecture design between the two modules</task>
176
+ <task>Compare technology selection and patterns used</task>
177
+ <task>Synthesize findings into comprehensive comparison</task>
178
+ </content>
179
+ <priority>high</priority>
180
+ </todo_write>
181
+ ```
182
+
183
+ 2. **Execute with TODO tracking**:
184
+ - Check todo_read before starting
185
+ - Mark first todo as in_progress
186
+ - Use recall("user authentication login token") for authentication info
187
+ - Mark first todo as completed with notes
188
+ - Mark second todo as in_progress
189
+ - Use recall("permission management authorization role RBAC") for permission info
190
+ - Mark second todo as completed
191
+ - Continue through all todos systematically
192
+
193
+ 3. **Complete analysis**: After all todos are marked completed, provide comprehensive comparison
194
+
195
+ ### Example 2: Process Tracing Questions
196
+ User question: "What is the entire process from user login to order completion? Which modules and interfaces are involved?"
197
+
198
+ **MANDATORY Processing with TODO:**
199
+
200
+ 1. **First create TODO list**:
201
+ ```
202
+ <todo_write>
203
+ <action>create</action>
204
+ <content>
205
+ <task>Trace and document user login process and entry points</task>
206
+ <task>Analyze session management and token verification flow</task>
207
+ <task>Map order creation process and required data</task>
208
+ <task>Track order processing workflow and state transitions</task>
209
+ <task>Identify payment integration and completion mechanisms</task>
210
+ <task>Document all involved modules and interfaces</task>
211
+ <task>Create end-to-end process summary</task>
212
+ </content>
213
+ <priority>high</priority>
214
+ </todo_write>
215
+ ```
216
+
217
+ 2. **Execute with TODO tracking**:
218
+ - Use todo_read to check current status
219
+ - For each todo: mark as in_progress → execute recalls → mark as completed
220
+ - Use recall for each process step (login, session, order, payment)
221
+ - Add new todos if additional steps are discovered
222
+ - Document findings in todo notes
223
+
224
+ 3. **Synthesize results**: Once all todos completed, organize the complete business flow
225
+
226
+ ### When TODO Files are MANDATORY:
227
+
228
+ **You MUST use TODO files for:**
229
+ - Any question requiring comparison between multiple items
230
+ - Process tracing or workflow analysis questions
231
+ - Questions with "step by step", "entire process", or "all involved" keywords
232
+ - Multi-part questions that need systematic investigation
233
+ - Questions about relationships between different components
234
+ - Any analysis requiring more than 3 recall operations
235
+
236
+ ### TODO Tool Usage Rules:
237
+
238
+ 1. **Always start complex questions with todo_write**: Create a comprehensive plan BEFORE any recall
239
+ 2. **Use todo_read before each major step**: Maintain awareness of progress
240
+ 3. **Mark todos systematically**: in_progress → completed with notes
241
+ 4. **Add discovered todos**: Use action="add_task" when finding new aspects to investigate
242
+ 5. **Document in notes**: Record key findings, blockers, or important information
243
+
244
+ ### Tool Usage Principles:
245
+ - **todo_write/todo_read**: MANDATORY for all complex questions - use FIRST before any recalls
246
+ - **recall tool**: Primary tool for information retrieval after TODO planning
247
+ - **read_file tool**: Only when specific file details are needed beyond recall results
248
+ - **Iterative approach**: Adjust keywords and add todos based on findings
249
+
250
+ ### Remember:
251
+ This is a RAG system focused on information retrieval and synthesis. We do not modify code or files, we only retrieve and analyze information to answer questions. TODO tools help organize complex retrieval tasks systematically.
252
+
253
+ 8. When you encounter images, please infer the relevance of the image to the question based on the surrounding text content. If relevant, output the Markdown image path using ![]() format in your answer; otherwise, do not output it.
140
254
  {% if local_image_host %}
141
- 9. 图片路径处理
142
- - 图片地址需返回绝对路径,
143
- - 对于Windows风格的路径,需要转换为Linux风格, 例如:![image](C:\\Users\\user\\Desktop\\image.png) 转换为 ![image](C:/Users/user/Desktop/image.png)
144
- - 为请求图片资源 需增加 http://{{ local_image_host }}/static/ 作为前缀
145
- 举个例子:![image](/path/to/images/image.png) 返回 ![image](http://{{ local_image_host }}/static/path/to/images/image.png)
255
+ 9. Image path processing
256
+ - Image addresses need to return absolute paths
257
+ - For Windows-style paths, convert to Linux-style, for example: ![image](C:\\Users\\user\\Desktop\\image.png) converts to ![image](C:/Users/user/Desktop/image.png)
258
+ - To request image resources, add http://{{ local_image_host }}/static/ as a prefix
259
+ For example: ![image](/path/to/images/image.png), return ![image](http://{{ local_image_host }}/static/path/to/images/image.png)
146
260
  {% endif %}
147
- '''
261
+ '''
148
262
  return {
149
263
  "local_image_host": self.args.local_image_host
150
264
  }
151
265
 
152
-
153
266
  def _stream_chat_oai(
154
267
  self,
155
268
  conversations,
@@ -160,45 +273,72 @@ class AgenticRAG:
160
273
  ):
161
274
  if not llm_config:
162
275
  llm_config = {}
163
-
276
+
164
277
  if extra_request_params:
165
278
  llm_config.update(extra_request_params)
166
-
167
- conversations = OpenAIContentProcessor.process_conversations(conversations)
279
+
280
+ conversations = OpenAIContentProcessor.process_conversations(
281
+ conversations)
168
282
 
169
283
  context = []
170
284
 
171
285
  def _generate_sream():
172
-
173
- recall_request = AgentRequest(user_input=self.conversation_to_query.prompt(conversations))
286
+ # 提取最后一个 user 消息和对话历史
287
+ last_user_message = None
288
+ conversation_history = []
289
+
290
+ # 从后往前查找最后一个 role="user" 的消息
291
+ for i in range(len(conversations) - 1, -1, -1):
292
+ if conversations[i].get("role") == "user":
293
+ last_user_message = conversations[i]["content"]
294
+ # 将之前的所有消息作为历史记录(不包括最后一个user消息)
295
+ conversation_history = conversations[:i]
296
+ break
297
+
298
+ # 如果没有找到 user 消息,使用默认处理
299
+ if last_user_message is None:
300
+ last_user_message = self.conversation_to_query.prompt(
301
+ conversations)
302
+ conversation_history = []
303
+
304
+ recall_request = AgentRequest(user_input=last_user_message)
305
+
306
+ # 为每个RAGAgent实例创建新的conversation_config
307
+ conversation_config = AgenticEditConversationConfig(
308
+ conversation_name=f"rag_session_{uuid.uuid4().hex[:8]}",
309
+ conversation_id=str(uuid.uuid4())
310
+ )
311
+
174
312
  rag_agent = RAGAgent(
175
313
  name="RAGAgent",
176
314
  llm=self.llm,
177
315
  files=SourceCodeList(sources=[]),
178
316
  args=self.args,
179
317
  rag=self.rag,
180
- conversation_history=[]
181
- )
318
+ conversation_history=conversation_history,
319
+ custom_system_prompt=None,
320
+ conversation_config=conversation_config,
321
+ cancel_token=None
322
+ )
182
323
 
183
324
  rag_agent.who_am_i(self.system_prompt.prompt())
184
-
185
- events =rag_agent.run_with_generator(recall_request)
186
- for (t,content) in events:
187
- if t == "thinking":
325
+
326
+ events = rag_agent.run_with_generator(recall_request)
327
+ for (t, content) in events:
328
+ if t == "thinking":
188
329
  yield ("", SingleOutputMeta(
189
- generated_tokens_count=0,
190
- input_tokens_count=0,
191
- reasoning_content=content,
192
- ))
330
+ generated_tokens_count=0,
331
+ input_tokens_count=0,
332
+ reasoning_content=content,
333
+ ))
193
334
  else:
194
335
  yield (content, SingleOutputMeta(
195
336
  generated_tokens_count=0,
196
337
  input_tokens_count=0,
197
- reasoning_content="",
338
+ reasoning_content="",
198
339
  ))
199
340
 
200
341
  return _generate_sream(), context
201
-
202
-
203
-
204
342
 
343
+ def close(self):
344
+ self.rag.close()
@@ -157,8 +157,7 @@ class AutoCoderRAGAsyncUpdateQueue(BaseCacheManager):
157
157
  # 检查是否在忽略规则中
158
158
  if self.ignore_spec and self.ignore_spec.match_file(os.path.relpath(file_path, self.path)):
159
159
  return
160
-
161
- logger.info(f"File change detected: {change_type} - {file_path}")
160
+
162
161
  self.trigger_update()
163
162
  except Exception as e:
164
163
  logger.error(f"Error in file change handler: {e}")
@@ -18,7 +18,7 @@ from byzerllm.utils.client import code_utils
18
18
  from autocoder.utils.llms import get_single_llm
19
19
  from loguru import logger
20
20
  from typing import List, Tuple, Optional
21
- from autocoder.common.text import TextSimilarity
21
+ from autocoder.common.text_similarity import TextSimilarity
22
22
  from pydantic import BaseModel
23
23
 
24
24
 
@@ -32,6 +32,7 @@ from autocoder.common.save_formatted_log import save_formatted_log
32
32
  from autocoder.rag.types import (
33
33
  RecallStat,ChunkStat,AnswerStat,OtherStat,RAGStat
34
34
  )
35
+ from autocoder.common.llms import LLMManager
35
36
  import json, os
36
37
  try:
37
38
  from autocoder_pro.rag.llm_compute import LLMComputeEngine
@@ -1103,19 +1104,21 @@ class LongContextRAG:
1103
1104
 
1104
1105
  def _estimate_token_cost(self, rag_stat: RAGStat) -> float:
1105
1106
  """估算当前请求的令牌成本(人民币)"""
1106
- from autocoder.models import get_model_by_name
1107
-
1107
+ llm_manager = LLMManager()
1108
1108
  total_cost = 0.0
1109
1109
 
1110
1110
  # 计算召回阶段成本
1111
1111
  if rag_stat.recall_stat.model_name != "unknown":
1112
1112
  try:
1113
- recall_model = get_model_by_name(rag_stat.recall_stat.model_name)
1114
- input_cost = recall_model.get("input_price", 0.0) / 1000000
1115
- output_cost = recall_model.get("output_price", 0.0) / 1000000
1116
- recall_cost = (rag_stat.recall_stat.total_input_tokens * input_cost) + \
1117
- (rag_stat.recall_stat.total_generated_tokens * output_cost)
1118
- total_cost += recall_cost
1113
+ recall_model = llm_manager.get_model(rag_stat.recall_stat.model_name)
1114
+ if recall_model:
1115
+ input_cost = recall_model.input_price / 1000000
1116
+ output_cost = recall_model.output_price / 1000000
1117
+ recall_cost = (rag_stat.recall_stat.total_input_tokens * input_cost) + \
1118
+ (rag_stat.recall_stat.total_generated_tokens * output_cost)
1119
+ total_cost += recall_cost
1120
+ else:
1121
+ recall_cost = 0.0
1119
1122
  except Exception as e:
1120
1123
  logger.warning(f"计算召回阶段成本时出错: {str(e)}")
1121
1124
  recall_cost = 0.0
@@ -1125,12 +1128,15 @@ class LongContextRAG:
1125
1128
  # 计算分块阶段成本
1126
1129
  if rag_stat.chunk_stat.model_name != "unknown":
1127
1130
  try:
1128
- chunk_model = get_model_by_name(rag_stat.chunk_stat.model_name)
1129
- input_cost = chunk_model.get("input_price", 0.0) / 1000000
1130
- output_cost = chunk_model.get("output_price", 0.0) / 1000000
1131
- chunk_cost = (rag_stat.chunk_stat.total_input_tokens * input_cost) + \
1132
- (rag_stat.chunk_stat.total_generated_tokens * output_cost)
1133
- total_cost += chunk_cost
1131
+ chunk_model = llm_manager.get_model(rag_stat.chunk_stat.model_name)
1132
+ if chunk_model:
1133
+ input_cost = chunk_model.input_price / 1000000
1134
+ output_cost = chunk_model.output_price / 1000000
1135
+ chunk_cost = (rag_stat.chunk_stat.total_input_tokens * input_cost) + \
1136
+ (rag_stat.chunk_stat.total_generated_tokens * output_cost)
1137
+ total_cost += chunk_cost
1138
+ else:
1139
+ chunk_cost = 0.0
1134
1140
  except Exception as e:
1135
1141
  logger.warning(f"计算分块阶段成本时出错: {str(e)}")
1136
1142
  # 使用默认值
@@ -1141,12 +1147,15 @@ class LongContextRAG:
1141
1147
  # 计算答案生成阶段成本
1142
1148
  if rag_stat.answer_stat.model_name != "unknown":
1143
1149
  try:
1144
- answer_model = get_model_by_name(rag_stat.answer_stat.model_name)
1145
- input_cost = answer_model.get("input_price", 0.0) / 1000000
1146
- output_cost = answer_model.get("output_price", 0.0) / 1000000
1147
- answer_cost = (rag_stat.answer_stat.total_input_tokens * input_cost) + \
1148
- (rag_stat.answer_stat.total_generated_tokens * output_cost)
1149
- total_cost += answer_cost
1150
+ answer_model = llm_manager.get_model(rag_stat.answer_stat.model_name)
1151
+ if answer_model:
1152
+ input_cost = answer_model.input_price / 1000000
1153
+ output_cost = answer_model.output_price / 1000000
1154
+ answer_cost = (rag_stat.answer_stat.total_input_tokens * input_cost) + \
1155
+ (rag_stat.answer_stat.total_generated_tokens * output_cost)
1156
+ total_cost += answer_cost
1157
+ else:
1158
+ answer_cost = 0.0
1150
1159
  except Exception as e:
1151
1160
  logger.warning(f"计算答案生成阶段成本时出错: {str(e)}")
1152
1161
  # 使用默认值
@@ -1158,12 +1167,15 @@ class LongContextRAG:
1158
1167
  for i, other_stat in enumerate(rag_stat.other_stats):
1159
1168
  if other_stat.model_name != "unknown":
1160
1169
  try:
1161
- other_model = get_model_by_name(other_stat.model_name)
1162
- input_cost = other_model.get("input_price", 0.0) / 1000000
1163
- output_cost = other_model.get("output_price", 0.0) / 1000000
1164
- other_cost = (other_stat.total_input_tokens * input_cost) + \
1165
- (other_stat.total_generated_tokens * output_cost)
1166
- total_cost += other_cost
1170
+ other_model = llm_manager.get_model(other_stat.model_name)
1171
+ if other_model:
1172
+ input_cost = other_model.input_price / 1000000
1173
+ output_cost = other_model.output_price / 1000000
1174
+ other_cost = (other_stat.total_input_tokens * input_cost) + \
1175
+ (other_stat.total_generated_tokens * output_cost)
1176
+ total_cost += other_cost
1177
+ else:
1178
+ other_cost = 0.0
1167
1179
  except Exception as e:
1168
1180
  logger.warning(f"计算其他阶段 {i+1} 成本时出错: {str(e)}")
1169
1181
  # 使用默认值
@@ -1174,3 +1186,7 @@ class LongContextRAG:
1174
1186
  # 将总成本保存到 rag_stat
1175
1187
  rag_stat.cost = total_cost
1176
1188
  return total_cost
1189
+
1190
+ def close(self):
1191
+ if self.tokenizer and isinstance(self.tokenizer, TokenCounter):
1192
+ self.tokenizer.close()
@@ -2,7 +2,7 @@ from abc import ABC, abstractmethod
2
2
  from typing import List, Dict, Any, Generator
3
3
  import byzerllm
4
4
  from autocoder.common import AutoCoderArgs
5
- from autocoder.common.rulefiles.autocoderrules_utils import get_rules
5
+ from autocoder.common.rulefiles import get_rules
6
6
 
7
7
  class QAConversationStrategy(ABC):
8
8
  """
@@ -0,0 +1,17 @@
1
+ """
2
+ RAG Terminal - RAG 系统的终端交互入口模块
3
+
4
+ 这个模块提供了 RAG 系统的终端交互功能,代码结构清晰,职责分明。
5
+ """
6
+
7
+ # 延迟导入以避免循环依赖
8
+ __all__ = ["run_cli"]
9
+
10
+
11
+ def __getattr__(name):
12
+ """延迟导入以避免循环依赖"""
13
+ if name == "run_cli":
14
+ from autocoder.rag.terminal.bootstrap import run_cli
15
+
16
+ return run_cli
17
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")