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
@@ -32,7 +32,7 @@ def setup_file_monitor(temp_test_dir):
32
32
 
33
33
  # 2. 加载规则文件
34
34
  try:
35
- from autocoder.common.rulefiles.autocoderrules_utils import get_rules, reset_rules_manager
35
+ from autocoder.common.rulefiles import get_rules, reset_rules_manager
36
36
  reset_rules_manager()
37
37
  rules = get_rules(temp_test_dir)
38
38
  logger.info(f"已加载规则: {len(rules)} 条")
@@ -259,20 +259,246 @@ def test_limit_tokens_with_large_docs(token_limiter, test_files):
259
259
  logger.info("="*80)
260
260
 
261
261
  def test_limit_tokens_integration(token_limiter, token_counter, real_llm, test_args, test_files):
262
- """集成测试:模拟LongContextRAG中的_process_document_chunking调用"""
263
- # 创建测试文档
262
+ """集成测试:模拟LongContextRAG中的_process_document_chunking调用,构建触发第二轮处理的案例"""
263
+
264
+ # 分析token限制配置
265
+ # full_text_limit = 8000 * 0.7 = 5600
266
+ # segment_limit = 8000 * 0.2 = 1600
267
+ # 第一轮总限制 = 5600 + 1600 = 7200 tokens
268
+ # 我们需要创建总量超过7200 tokens的文档来触发第二轮处理
269
+
270
+ # 创建大型测试文档 - 每个文档预计约2000-3000 tokens
271
+ large_content_1 = """# TokenLimiter 详细使用指南
272
+
273
+ ## 概述
274
+ TokenLimiter是一个强大的文档处理工具,专门用于控制和管理大规模文档的分块和令牌限制。它采用了先进的分级处理策略,能够有效地处理各种规模的文档集合。
275
+
276
+ ## 核心功能
277
+
278
+ ### 1. 文档分级处理
279
+ TokenLimiter采用两轮处理机制:
280
+ - 第一轮:全文装载阶段,将文档直接装载到指定的令牌限制内
281
+ - 第二轮:智能分块阶段,对剩余文档进行LLM驱动的相关内容提取
282
+
283
+ ### 2. 令牌限制管理
284
+ 系统支持多种令牌限制配置:
285
+ - full_text_limit: 全文区域的令牌限制
286
+ - segment_limit: 分段区域的令牌限制
287
+ - buff_limit: 缓冲区域的令牌限制
288
+
289
+ ### 3. 智能重排序
290
+ 为了减少大模型幻觉,系统会对文档片段进行智能重排序:
291
+ - 识别来自同一文档的不同片段
292
+ - 根据原文顺序重新排列片段
293
+ - 确保文档的连贯性和逻辑性
294
+
295
+ ## 使用示例
296
+
297
+ ```python
298
+ # 初始化TokenLimiter
299
+ from autocoder.rag.token_limiter import TokenLimiter
300
+
301
+ limiter = TokenLimiter(
302
+ count_tokens=token_counter,
303
+ full_text_limit=5600,
304
+ segment_limit=1600,
305
+ buff_limit=800,
306
+ llm=llm_instance,
307
+ disable_segment_reorder=False
308
+ )
309
+
310
+ # 执行令牌限制处理
311
+ result = limiter.limit_tokens(
312
+ relevant_docs=document_list,
313
+ conversations=conversation_history,
314
+ index_filter_workers=4
315
+ )
316
+ ```
317
+
318
+ ## 高级特性
319
+
320
+ ### 并发处理
321
+ TokenLimiter支持多线程并发处理,显著提升处理效率:
322
+ - 可配置工作线程数量
323
+ - 智能任务分配和负载均衡
324
+ - 实时进度监控和状态报告
325
+
326
+ ### 元数据管理
327
+ 系统会自动记录和管理各种元数据:
328
+ - 处理时间统计
329
+ - 令牌使用情况
330
+ - 文档处理状态
331
+ - 错误和异常信息
332
+
333
+ ### 灵活配置
334
+ 支持多种配置选项来适应不同的使用场景:
335
+ - 自定义令牌计数函数
336
+ - 可调节的处理策略
337
+ - 灵活的重排序控制
338
+ - 丰富的日志输出
339
+
340
+ 这个工具特别适用于需要处理大量文档的RAG(检索增强生成)系统,能够有效地平衡处理效率和结果质量。
341
+ """ * 3 # 重复3次以确保足够大
342
+
343
+ large_content_2 = """# API 详细说明文档
344
+
345
+ ## TokenLimiter 类
346
+
347
+ ### 构造函数
348
+ ```python
349
+ def __init__(
350
+ self,
351
+ count_tokens: Callable[[str], int],
352
+ full_text_limit: int,
353
+ segment_limit: int,
354
+ buff_limit: int,
355
+ llm: ByzerLLM,
356
+ disable_segment_reorder: bool,
357
+ ):
358
+ ```
359
+
360
+ #### 参数说明
361
+ - `count_tokens`: 令牌计数函数,用于统计文档的令牌数量
362
+ - `full_text_limit`: 全文区域的最大令牌限制
363
+ - `segment_limit`: 分段区域的最大令牌限制
364
+ - `buff_limit`: 缓冲区域的最大令牌限制
365
+ - `llm`: ByzerLLM实例,用于执行智能分块提取
366
+ - `disable_segment_reorder`: 是否禁用段落重排序功能
367
+
368
+ ### 核心方法
369
+
370
+ #### limit_tokens
371
+ ```python
372
+ def limit_tokens(
373
+ self,
374
+ relevant_docs: List[SourceCode],
375
+ conversations: List[Dict[str, str]],
376
+ index_filter_workers: int,
377
+ ) -> TokenLimiterResult:
378
+ ```
379
+
380
+ 这是TokenLimiter的核心方法,执行文档的令牌限制处理。
381
+
382
+ ##### 处理流程
383
+ 1. **文档重排序阶段**
384
+ - 分析文档元数据
385
+ - 识别同源文档片段
386
+ - 按原文顺序重新排列
387
+
388
+ 2. **第一轮处理阶段**
389
+ - 按令牌限制装载文档
390
+ - 优先处理高相关性文档
391
+ - 记录装载统计信息
392
+
393
+ 3. **第二轮处理阶段**(如需要)
394
+ - 并发处理剩余文档
395
+ - LLM驱动的相关内容提取
396
+ - 智能分块和优化
397
+
398
+ ##### 返回值
399
+ 返回TokenLimiterResult对象,包含:
400
+ - `docs`: 最终处理后的文档列表
401
+ - `raw_docs`: 原始文档列表
402
+ - `input_tokens_counts`: 输入令牌计数列表
403
+ - `generated_tokens_counts`: 生成令牌计数列表
404
+ - `durations`: 处理时间列表
405
+ - `model_name`: 使用的模型名称
406
+
407
+ ### 内部方法
408
+
409
+ #### extract_relevance_range_from_docs_with_conversation
410
+ 使用LLM分析对话历史和文档内容,提取相关信息范围。
411
+
412
+ #### process_range_doc
413
+ 处理单个文档的分块提取,支持重试机制和错误处理。
414
+
415
+ ## 最佳实践
416
+
417
+ ### 性能优化
418
+ - 合理设置工作线程数量
419
+ - 根据文档规模调整令牌限制
420
+ - 启用文档重排序以提高质量
421
+
422
+ ### 错误处理
423
+ - 实现适当的重试机制
424
+ - 监控处理异常和错误
425
+ - 记录详细的日志信息
426
+
427
+ ### 内存管理
428
+ - 及时释放不需要的文档对象
429
+ - 控制并发处理的内存使用
430
+ - 优化大文档的处理策略
431
+ """ * 2 # 重复2次
432
+
433
+ large_content_3 = """# 实际应用案例和最佳实践
434
+
435
+ ## 案例1:大规模代码库分析
436
+ 在处理大型代码库时,TokenLimiter能够有效地管理代码文件的令牌使用:
437
+
438
+ ```python
439
+ # 处理Python代码库
440
+ code_docs = load_python_files("./src")
441
+ result = limiter.limit_tokens(
442
+ relevant_docs=code_docs,
443
+ conversations=[{"role": "user", "content": "分析这个代码库的架构"}],
444
+ index_filter_workers=8
445
+ )
446
+ ```
447
+
448
+ ## 案例2:文档问答系统
449
+ 在构建文档问答系统时,合理的令牌管理至关重要:
450
+
451
+ ```python
452
+ # 处理技术文档
453
+ doc_collection = load_markdown_docs("./docs")
454
+ qa_result = limiter.limit_tokens(
455
+ relevant_docs=doc_collection,
456
+ conversations=conversation_history,
457
+ index_filter_workers=4
458
+ )
459
+ ```
460
+
461
+ ## 性能基准测试
462
+ 基于不同规模的文档集合进行的性能测试表明:
463
+ - 小型文档集(< 1000 tokens):平均处理时间 < 100ms
464
+ - 中型文档集(1000-10000 tokens):平均处理时间 < 500ms
465
+ - 大型文档集(> 10000 tokens):需要启用第二轮处理,时间依赖于LLM响应速度
466
+
467
+ ## 故障排除指南
468
+
469
+ ### 常见问题
470
+ 1. 处理时间过长:检查LLM响应速度,调整并发参数
471
+ 2. 内存使用过高:减少工作线程数,优化文档预处理
472
+ 3. 结果质量不佳:启用文档重排序,调整令牌限制策略
473
+
474
+ ### 调试技巧
475
+ - 启用详细日志输出
476
+ - 监控各阶段的处理时间
477
+ - 分析令牌使用统计
478
+ - 检查文档重排序效果
479
+ """ * 2 # 重复2次
480
+
481
+ # 创建多个大文档来确保触发第二轮处理
264
482
  relevant_docs = [
265
483
  SourceCode(
266
- module_name=os.path.join(test_files, "docs/guide.md"),
267
- source_code="# TokenLimiter 使用指南\n使用TokenLimiter可以控制文档分块和令牌限制。"
484
+ module_name=os.path.join(test_files, "docs/comprehensive_guide.md"),
485
+ source_code=large_content_1
268
486
  ),
269
487
  SourceCode(
270
- module_name=os.path.join(test_files, "docs/api.md"),
271
- source_code="# API说明\n## 初始化\n```python\nlimiter = TokenLimiter(count_tokens, full_text_limit, segment_limit, buff_limit, llm)\n```"
488
+ module_name=os.path.join(test_files, "docs/api_reference.md"),
489
+ source_code=large_content_2
272
490
  ),
273
491
  SourceCode(
274
- module_name=os.path.join(test_files, "src/example.py"),
275
- source_code="def add(a, b):\n return a + b\n\ndef subtract(a, b):\n return a - b"
492
+ module_name=os.path.join(test_files, "docs/best_practices.md"),
493
+ source_code=large_content_3
494
+ ),
495
+ SourceCode(
496
+ module_name=os.path.join(test_files, "docs/tutorial.md"),
497
+ source_code="# TokenLimiter 教程\n\n" + "这是一个详细的使用教程。" * 200
498
+ ),
499
+ SourceCode(
500
+ module_name=os.path.join(test_files, "docs/examples.md"),
501
+ source_code="# 代码示例\n\n" + "```python\n# 示例代码\nprint('Hello World')\n```\n\n" * 150
276
502
  )
277
503
  ]
278
504
 
@@ -323,7 +549,29 @@ def test_limit_tokens_integration(token_limiter, token_counter, real_llm, test_a
323
549
  # 验证结果
324
550
  assert final_relevant_docs is not None, "应该返回处理后的文档"
325
551
  assert len(final_relevant_docs) > 0, "应该至少返回一个文档"
326
- assert rag_stat.chunk_stat.total_input_tokens > 0, "输入token计数应该增加"
552
+
553
+ # 计算总的token数量来验证是否超过了第一轮限制
554
+ total_input_tokens = sum([token_limiter.count_tokens(doc.source_code) for doc in relevant_docs])
555
+ first_round_limit = token_limiter.full_text_limit + token_limiter.segment_limit
556
+
557
+ logger.info(f"总输入tokens: {total_input_tokens}, 第一轮限制: {first_round_limit}")
558
+
559
+ # 由于我们构建了大量文档,应该触发第二轮处理
560
+ has_second_round_processing = len(second_round_extracted_docs) > 0
561
+
562
+ if total_input_tokens > first_round_limit:
563
+ # 如果输入超过第一轮限制,应该触发第二轮处理
564
+ assert has_second_round_processing, f"输入tokens({total_input_tokens}) > 第一轮限制({first_round_limit}),应该触发第二轮处理"
565
+ assert rag_stat.chunk_stat.total_input_tokens > 0, "第二轮处理时输入token计数应该增加"
566
+ logger.info("✅ 成功触发第二轮处理 - 有LLM调用和token统计")
567
+ else:
568
+ # 如果没有超过限制,记录但不强制要求第二轮处理
569
+ logger.info(f"输入tokens({total_input_tokens}) <= 第一轮限制({first_round_limit}),可能不需要第二轮处理")
570
+ if has_second_round_processing:
571
+ logger.info("✅ 意外触发了第二轮处理")
572
+ assert rag_stat.chunk_stat.total_input_tokens > 0, "第二轮处理时输入token计数应该增加"
573
+ else:
574
+ logger.info("没有触发第二轮处理 - 所有文档都能装入第一轮限制内")
327
575
 
328
576
  # 打印测试结果详情
329
577
  logger.info("="*80)
@@ -338,5 +586,264 @@ def test_limit_tokens_integration(token_limiter, token_counter, real_llm, test_a
338
586
  logger.info(f"生成token总数: {rag_stat.chunk_stat.total_generated_tokens}")
339
587
  logger.info("="*80)
340
588
 
589
+ def test_limit_tokens_force_second_round(token_limiter, token_counter, real_llm, test_args, test_files):
590
+ """专门测试触发第二轮处理的案例"""
591
+
592
+ # 创建超大文档确保触发第二轮处理
593
+ # 预计每个文档约5000-8000 tokens
594
+ mega_content = """# 超大文档测试
595
+
596
+ ## TokenLimiter 完整技术规范
597
+
598
+ TokenLimiter是一个企业级的文档处理和令牌管理系统,专门设计用于处理大规模文档集合和复杂的令牌限制场景。本系统采用了先进的分层处理架构,能够有效地管理从小型文档到大型文档库的各种处理需求。
599
+
600
+ ### 核心架构设计
601
+
602
+ #### 1. 分层处理架构
603
+ 系统采用了创新的两层处理架构:
604
+ - **第一层:直接装载层**:对于符合令牌限制的文档,系统会直接进行装载,无需额外的处理开销
605
+ - **第二层:智能提取层**:对于超出限制的文档,系统启动LLM驱动的智能内容提取机制
606
+
607
+ #### 2. 令牌管理策略
608
+ TokenLimiter实现了精细化的令牌管理策略:
609
+ - **全文区域(Full Text Area)**:优先装载完整文档的区域
610
+ - **分段区域(Segment Area)**:用于装载经过智能提取的文档片段
611
+ - **缓冲区域(Buffer Area)**:为系统操作预留的令牌空间
612
+
613
+ #### 3. 文档重排序算法
614
+ 为了减少大语言模型的幻觉现象,系统实现了智能的文档重排序算法:
615
+ - 识别来自同一原始文档的多个片段
616
+ - 按照原始文档的逻辑顺序重新排列片段
617
+ - 确保文档的连贯性和上下文的完整性
618
+
619
+ ### 技术实现细节
620
+
621
+ #### 并发处理机制
622
+ 系统支持高度并发的文档处理:
623
+ - 使用ThreadPoolExecutor实现多线程并行处理
624
+ - 支持可配置的工作线程数量
625
+ - 实现了智能的任务调度和负载均衡
626
+
627
+ #### LLM集成
628
+ 系统与ByzerLLM深度集成:
629
+ - 支持多种LLM后端
630
+ - 实现了智能的模型选择策略
631
+ - 提供了完整的错误处理和重试机制
632
+
633
+ #### 元数据管理
634
+ 系统维护了丰富的元数据信息:
635
+ - 处理时间统计
636
+ - 令牌使用情况分析
637
+ - 文档处理状态跟踪
638
+ - 性能指标监控
639
+
640
+ ### 性能优化策略
641
+
642
+ #### 1. 内存优化
643
+ - 采用流式处理减少内存占用
644
+ - 实现了智能的对象生命周期管理
645
+ - 支持大文档的分块处理
646
+
647
+ #### 2. 计算优化
648
+ - 缓存令牌计数结果
649
+ - 优化文档重排序算法
650
+ - 实现了增量处理机制
651
+
652
+ #### 3. 网络优化
653
+ - 支持批量LLM调用
654
+ - 实现了智能的请求合并
655
+ - 提供了网络错误的恢复机制
656
+
657
+ ### 使用场景和最佳实践
658
+
659
+ #### 场景1:大型代码库分析
660
+ 在处理包含数千个源代码文件的大型项目时:
661
+ ```python
662
+ # 配置示例
663
+ limiter = TokenLimiter(
664
+ count_tokens=tiktoken_counter,
665
+ full_text_limit=10000,
666
+ segment_limit=5000,
667
+ buff_limit=2000,
668
+ llm=code_analysis_llm,
669
+ disable_segment_reorder=False
670
+ )
671
+
672
+ result = limiter.limit_tokens(
673
+ relevant_docs=code_files,
674
+ conversations=analysis_context,
675
+ index_filter_workers=16
676
+ )
677
+ ```
678
+
679
+ #### 场景2:技术文档问答系统
680
+ 构建企业级技术文档问答系统:
681
+ ```python
682
+ # 优化配置
683
+ limiter = TokenLimiter(
684
+ count_tokens=precise_counter,
685
+ full_text_limit=8000,
686
+ segment_limit=4000,
687
+ buff_limit=1000,
688
+ llm=qa_specialized_llm,
689
+ disable_segment_reorder=False
690
+ )
691
+ ```
692
+
693
+ #### 场景3:多语言文档处理
694
+ 处理包含多种编程语言和自然语言的混合文档:
695
+ ```python
696
+ # 多语言配置
697
+ limiter = TokenLimiter(
698
+ count_tokens=multilang_counter,
699
+ full_text_limit=12000,
700
+ segment_limit=6000,
701
+ buff_limit=2000,
702
+ llm=multilang_llm,
703
+ disable_segment_reorder=True # 某些情况下禁用重排序
704
+ )
705
+ ```
706
+
707
+ ### 高级功能特性
708
+
709
+ #### 1. 自适应令牌管理
710
+ 系统能够根据文档类型和内容特征自动调整令牌分配策略
711
+
712
+ #### 2. 智能内容提取
713
+ 基于对话上下文和文档内容,精确提取最相关的信息片段
714
+
715
+ #### 3. 质量评估机制
716
+ 对提取结果进行质量评估,确保输出的可靠性
717
+
718
+ #### 4. 扩展性支持
719
+ 支持插件机制,允许用户扩展和定制处理逻辑
720
+
721
+ ### 监控和调试
722
+
723
+ #### 日志系统
724
+ 系统提供了详细的日志输出:
725
+ - 处理阶段的详细信息
726
+ - 性能统计数据
727
+ - 错误和异常跟踪
728
+ - 调试信息输出
729
+
730
+ #### 性能监控
731
+ 内置的性能监控功能:
732
+ - 实时处理进度
733
+ - 令牌使用统计
734
+ - 处理时间分析
735
+ - 资源使用情况
736
+
737
+ #### 故障诊断
738
+ 完善的故障诊断机制:
739
+ - 自动错误检测
740
+ - 详细的错误报告
741
+ - 恢复建议
742
+ - 问题修复指南
743
+
744
+ ### 未来发展规划
745
+
746
+ #### 短期目标
747
+ - 支持更多的LLM后端
748
+ - 优化处理性能
749
+ - 增强错误处理机制
750
+
751
+ #### 长期愿景
752
+ - 实现智能的自动调优
753
+ - 支持分布式处理
754
+ - 集成更多的AI能力
755
+
756
+ 这个系统代表了文档处理和令牌管理领域的最新技术成果,为用户提供了强大而灵活的解决方案。
757
+ """ * 3 # 重复3次确保足够大
758
+
759
+ # 创建6个超大文档
760
+ relevant_docs = []
761
+ for i in range(6):
762
+ relevant_docs.append(
763
+ SourceCode(
764
+ module_name=os.path.join(test_files, f"docs/mega_doc_{i+1}.md"),
765
+ source_code=f"# 超大文档 {i+1}\n\n{mega_content}"
766
+ )
767
+ )
768
+
769
+ # 预先计算总token数
770
+ total_input_tokens = sum([token_limiter.count_tokens(doc.source_code) for doc in relevant_docs])
771
+ first_round_limit = token_limiter.full_text_limit + token_limiter.segment_limit
772
+
773
+ logger.info(f"预计总输入tokens: {total_input_tokens}")
774
+ logger.info(f"第一轮处理限制: {first_round_limit}")
775
+ logger.info(f"是否会触发第二轮: {'是' if total_input_tokens > first_round_limit else '否'}")
776
+
777
+ # 创建对话
778
+ conversations = [{"role": "user", "content": "请详细分析TokenLimiter的核心功能和技术实现"}]
779
+
780
+ # 准备RAG统计数据
781
+ rag_stat = RAGStat(
782
+ recall_stat=RecallStat(
783
+ total_input_tokens=0,
784
+ total_generated_tokens=0,
785
+ model_name=real_llm.default_model_name,
786
+ ),
787
+ chunk_stat=ChunkStat(
788
+ total_input_tokens=0,
789
+ total_generated_tokens=0,
790
+ model_name=real_llm.default_model_name,
791
+ ),
792
+ answer_stat=AnswerStat(
793
+ total_input_tokens=0,
794
+ total_generated_tokens=0,
795
+ model_name=real_llm.default_model_name,
796
+ ),
797
+ )
798
+
799
+ # 执行TokenLimiter处理
800
+ start_time = time.time()
801
+ token_limiter_result = token_limiter.limit_tokens(
802
+ relevant_docs=relevant_docs,
803
+ conversations=conversations,
804
+ index_filter_workers=test_args.index_filter_workers or 2,
805
+ )
806
+ processing_time = time.time() - start_time
807
+
808
+ # 更新统计信息
809
+ rag_stat.chunk_stat.total_input_tokens += sum(token_limiter_result.input_tokens_counts)
810
+ rag_stat.chunk_stat.total_generated_tokens += sum(token_limiter_result.generated_tokens_counts)
811
+
812
+ # 获取处理结果
813
+ final_docs = token_limiter_result.docs
814
+ first_round_docs = token_limiter.first_round_full_docs
815
+ second_round_docs = token_limiter.second_round_extracted_docs
816
+
817
+ # 强制验证第二轮处理被触发
818
+ assert len(second_round_docs) > 0, f"期望触发第二轮处理,但second_round_docs为空。总tokens: {total_input_tokens}, 限制: {first_round_limit}"
819
+ assert rag_stat.chunk_stat.total_input_tokens > 0, f"期望有LLM输入token统计,但为: {rag_stat.chunk_stat.total_input_tokens}"
820
+ assert rag_stat.chunk_stat.total_generated_tokens > 0, f"期望有LLM生成token统计,但为: {rag_stat.chunk_stat.total_generated_tokens}"
821
+
822
+ # 验证处理结果的合理性
823
+ assert len(final_docs) > 0, "最终应该返回处理后的文档"
824
+ assert len(final_docs) == len(first_round_docs) + len(second_round_docs), "最终文档数应该等于两轮文档数之和"
825
+
826
+ # 验证token使用情况
827
+ final_tokens = sum([token_limiter.count_tokens(doc.source_code) for doc in final_docs])
828
+ total_limit = token_limiter.full_text_limit + token_limiter.segment_limit + token_limiter.buff_limit
829
+ assert final_tokens <= total_limit, f"最终文档tokens({final_tokens})应该不超过总限制({total_limit})"
830
+
831
+ # 打印详细结果
832
+ logger.info("="*80)
833
+ logger.info("强制第二轮处理测试结果:")
834
+ logger.info("-"*80)
835
+ logger.info(f"✅ 成功触发第二轮处理!")
836
+ logger.info(f"处理时间: {processing_time:.2f}秒")
837
+ logger.info(f"输入文档数: {len(relevant_docs)}")
838
+ logger.info(f"第一轮装载文档数: {len(first_round_docs)}")
839
+ logger.info(f"第二轮提取文档数: {len(second_round_docs)}")
840
+ logger.info(f"最终输出文档数: {len(final_docs)}")
841
+ logger.info(f"LLM输入tokens: {rag_stat.chunk_stat.total_input_tokens}")
842
+ logger.info(f"LLM生成tokens: {rag_stat.chunk_stat.total_generated_tokens}")
843
+ logger.info(f"输入文档总tokens: {total_input_tokens}")
844
+ logger.info(f"输出文档总tokens: {final_tokens}")
845
+ logger.info(f"令牌压缩率: {((total_input_tokens - final_tokens) / total_input_tokens * 100):.1f}%")
846
+ logger.info("="*80)
847
+
341
848
  if __name__ == "__main__":
342
849
  pytest.main(["-xvs", "test_token_limiter.py"])
@@ -63,3 +63,6 @@ class TokenCounter:
63
63
 
64
64
  def count_tokens(self, text: str) -> int:
65
65
  return self.pool.apply(count_tokens_worker, (text,))
66
+
67
+ def close(self):
68
+ self.pool.terminate()
@@ -10,6 +10,7 @@ from byzerllm import ByzerLLM
10
10
  from autocoder.rag.relevant_utils import TaskTiming
11
11
  from byzerllm import MetaHolder
12
12
  from autocoder.rag.token_limiter_utils import TokenLimiterResult
13
+ from autocoder.rag.types import ChunkMetadata, ChunkRange
13
14
 
14
15
  class TokenLimiter:
15
16
  def __init__(
@@ -241,10 +242,11 @@ class TokenLimiter:
241
242
  token_limiter_result.raw_docs.append(result)
242
243
 
243
244
  if "rag" in result.metadata and "chunk" in result.metadata["rag"]:
244
- chunk_meta = result.metadata["rag"]["chunk"]
245
- token_limiter_result.input_tokens_counts.append(chunk_meta.get("input_tokens_count", 0))
246
- token_limiter_result.generated_tokens_counts.append(chunk_meta.get("generated_tokens_count", 0))
247
- token_limiter_result.durations.append(chunk_meta.get("duration", 0))
245
+ # 将字典转换为 ChunkMetadata model
246
+ chunk_meta = ChunkMetadata.model_validate(result.metadata["rag"]["chunk"])
247
+ token_limiter_result.input_tokens_counts.append(chunk_meta.input_tokens_count)
248
+ token_limiter_result.generated_tokens_counts.append(chunk_meta.generated_tokens_count)
249
+ token_limiter_result.durations.append(chunk_meta.duration)
248
250
 
249
251
  tokens = result.tokens
250
252
  successful_extractions += 1
@@ -371,17 +373,19 @@ class TokenLimiter:
371
373
  if "rag" not in doc.metadata:
372
374
  doc.metadata["rag"] = {}
373
375
 
374
- doc.metadata["rag"]["chunk"] = {
375
- "original_doc": doc.module_name,
376
- "chunk_ranges": json_objs,
377
- "processing_time": total_duration,
378
- "llm_time": extraction_duration,
379
-
380
- "input_tokens_count": input_tokens_count,
381
- "generated_tokens_count": generated_tokens_count,
382
- "duration": extraction_duration,
383
- "chunk_model":model_name
384
- }
376
+ # 创建 ChunkMetadata model
377
+ chunk_metadata = ChunkMetadata(
378
+ original_doc=doc.module_name,
379
+ chunk_ranges=[ChunkRange(start_line=obj["start_line"], end_line=obj["end_line"]) for obj in json_objs],
380
+ processing_time=total_duration,
381
+ llm_time=extraction_duration,
382
+ input_tokens_count=input_tokens_count,
383
+ generated_tokens_count=generated_tokens_count,
384
+ duration=extraction_duration,
385
+ chunk_model=model_name
386
+ )
387
+
388
+ doc.metadata["rag"]["chunk"] = chunk_metadata.model_dump()
385
389
 
386
390
  return SourceCode(
387
391
  module_name=doc.module_name,
@@ -4,7 +4,31 @@ from .search_tool import SearchTool, SearchToolResolver, register_search_tool
4
4
  # 导出 RecallTool 相关类和函数
5
5
  from .recall_tool import RecallTool, RecallToolResolver, register_recall_tool
6
6
 
7
+ # 导出 TodoReadTool 相关类和函数
8
+ from .todo_read_tool import TodoReadTool, TodoReadToolResolver, register_todo_read_tool
9
+
10
+ # 导出 TodoWriteTool 相关类和函数
11
+ from .todo_write_tool import TodoWriteTool, TodoWriteToolResolver, register_todo_write_tool
12
+
13
+ # 导出 WebSearchTool 相关类和函数
14
+ from .web_search_tool import WebSearchTool, WebSearchToolResolver, register_web_search_tool
15
+
16
+ # 导出 WebCrawlTool 相关类和函数
17
+ from .web_crawl_tool import WebCrawlTool, WebCrawlToolResolver, register_web_crawl_tool
18
+
19
+ # 导出 Metaso SDK 相关类
20
+ from .metaso_sdk import MetasoClient, MetasoSearchResult, MetasoSearchResponse
21
+
22
+ # 导出 BochaAI SDK 相关类
23
+ from .bochaai_sdk import BochaAIClient, BochaAIWebPage, BochaAIImage, BochaAISearchResponse
24
+
7
25
  __all__ = [
8
26
  'SearchTool', 'SearchToolResolver', 'register_search_tool',
9
- 'RecallTool', 'RecallToolResolver', 'register_recall_tool'
10
- ]
27
+ 'RecallTool', 'RecallToolResolver', 'register_recall_tool',
28
+ 'TodoReadTool', 'TodoReadToolResolver', 'register_todo_read_tool',
29
+ 'TodoWriteTool', 'TodoWriteToolResolver', 'register_todo_write_tool',
30
+ 'WebSearchTool', 'WebSearchToolResolver', 'register_web_search_tool',
31
+ 'WebCrawlTool', 'WebCrawlToolResolver', 'register_web_crawl_tool',
32
+ 'MetasoClient', 'MetasoSearchResult', 'MetasoSearchResponse',
33
+ 'BochaAIClient', 'BochaAIWebPage', 'BochaAIImage', 'BochaAISearchResponse'
34
+ ]