auto-coder 1.0.0__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 (574) 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-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
  5. {auto_coder-1.0.0.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 +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 +73 -59
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +970 -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 +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/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 +288 -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 +349 -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 +1051 -0
  398. autocoder/default_project/__init__.py +501 -0
  399. autocoder/dispacher/__init__.py +4 -12
  400. autocoder/dispacher/actions/action.py +165 -7
  401. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  402. autocoder/index/entry.py +116 -124
  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 +932 -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 +489 -0
  536. autocoder/workflow_agents/loader.py +737 -0
  537. autocoder/workflow_agents/runner.py +267 -0
  538. autocoder/workflow_agents/types.py +172 -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.0.dist-info}/top_level.txt +0 -0
  574. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
autocoder/models.py CHANGED
@@ -1,117 +1,40 @@
1
1
  import os
2
2
  import json
3
- from typing import List, Dict
3
+ from typing import List, Dict, Optional, Union, cast
4
4
  from urllib.parse import urlparse
5
+ from autocoder.common.llms import LLMManager, LLMModel
5
6
 
7
+ # Backward compatibility - preserve the path constant
6
8
  MODELS_JSON = os.path.expanduser("~/.auto-coder/keys/models.json")
7
9
 
8
- # Default built-in models
9
- default_models_list = [
10
- {
11
- "name": "deepseek/r1",
12
- "description": "DeepSeek Reasoner is for design/review",
13
- "model_name": "deepseek-reasoner",
14
- "model_type": "saas/openai",
15
- "base_url": "https://api.deepseek.com/v1",
16
- "api_key_path": "api.deepseek.com",
17
- "is_reasoning": True,
18
- "input_price": 0.0, # 单位:M/百万 input tokens
19
- "output_price": 0.0, # 单位:M/百万 output tokens
20
- "average_speed": 0.0, # 单位:秒/请求
21
- "max_output_tokens": 8096
22
- },
23
- {
24
- "name": "deepseek/v3",
25
- "description": "DeepSeek Chat is for coding",
26
- "model_name": "deepseek-chat",
27
- "model_type": "saas/openai",
28
- "base_url": "https://api.deepseek.com/v1",
29
- "api_key_path": "api.deepseek.com",
30
- "is_reasoning": False,
31
- "input_price": 0.0,
32
- "output_price": 0.0,
33
- "average_speed": 0.0,
34
- "max_output_tokens": 8096
35
- },
36
- {
37
- "name": "ark/deepseek-v3-250324",
38
- "description": "DeepSeek Chat is for coding",
39
- "model_name": "deepseek-v3-250324",
40
- "model_type": "saas/openai",
41
- "base_url": "https://ark.cn-beijing.volces.com/api/v3",
42
- "api_key_path": "",
43
- "is_reasoning": False,
44
- "input_price": 2.0,
45
- "output_price": 8.0,
46
- "average_speed": 0.0,
47
- "max_output_tokens": 8096
48
- },
49
- {
50
- "name": "ark/deepseek-r1-250120",
51
- "description": "DeepSeek Reasoner is for design/review",
52
- "model_name": "deepseek-r1-250120",
53
- "model_type": "saas/openai",
54
- "base_url": "https://ark.cn-beijing.volces.com/api/v3",
55
- "api_key_path": "",
56
- "is_reasoning": True,
57
- "input_price": 4.0,
58
- "output_price": 16.0,
59
- "average_speed": 0.0,
60
- "max_output_tokens": 8096
61
- },
62
- {
63
- "name": "openai/gpt-4.1-mini",
64
- "description": "",
65
- "model_name": "openai/gpt-4.1-mini",
66
- "model_type": "saas/openai",
67
- "base_url": "https://openrouter.ai/api/v1",
68
- "api_key_path": "",
69
- "is_reasoning": False,
70
- "input_price": 2.8,
71
- "output_price": 11.2,
72
- "average_speed": 0.0,
73
- "max_output_tokens": 8096*3
74
- },
75
- {
76
- "name": "openai/gpt-4.1",
77
- "description": "",
78
- "model_name": "openai/gpt-4.1",
79
- "model_type": "saas/openai",
80
- "base_url": "https://openrouter.ai/api/v1",
81
- "api_key_path": "",
82
- "is_reasoning": False,
83
- "input_price": 14.0,
84
- "output_price": 42.0,
85
- "average_speed": 0.0,
86
- "max_output_tokens": 8096*3
87
- },
88
- {
89
- "name": "openai/gpt-4.1-nano",
90
- "description": "",
91
- "model_name": "openai/gpt-4.1-nano",
92
- "model_type": "saas/openai",
93
- "base_url": "https://openrouter.ai/api/v1",
94
- "api_key_path": "",
95
- "is_reasoning": False,
96
- "input_price": 0.0,
97
- "output_price": 0.0,
98
- "average_speed": 0.0,
99
- "max_output_tokens": 8096*3
100
- },
101
- {
102
- "name": "openrouter/google/gemini-2.5-pro-preview-03-25",
103
- "description": "",
104
- "model_name": "google/gemini-2.5-pro-preview-03-25",
105
- "model_type": "saas/openai",
106
- "base_url": "https://openrouter.ai/api/v1",
107
- "api_key_path": "",
108
- "is_reasoning": False,
109
- "input_price": 0.0,
110
- "output_price": 0.0,
111
- "average_speed": 0.0,
112
- "max_output_tokens": 8096*2
10
+ # Global LLMManager instance for backward compatibility
11
+ _llm_manager = None
12
+
13
+ def _get_llm_manager() -> LLMManager:
14
+ """Get or create the global LLMManager instance"""
15
+ global _llm_manager
16
+ if _llm_manager is None:
17
+ _llm_manager = LLMManager()
18
+ return _llm_manager
19
+
20
+ def _model_to_dict(model: LLMModel) -> Dict:
21
+ """Convert LLMModel to dictionary format for backward compatibility"""
22
+ return {
23
+ "name": model.name,
24
+ "description": model.description,
25
+ "model_name": model.model_name,
26
+ "model_type": model.model_type,
27
+ "base_url": model.base_url,
28
+ "api_key_path": model.api_key_path or "",
29
+ "is_reasoning": model.is_reasoning,
30
+ "input_price": model.input_price,
31
+ "output_price": model.output_price,
32
+ "average_speed": 0.0, # Default for backward compatibility
33
+ "context_window": model.context_window,
34
+ "provider": model.provider,
35
+ "max_output_tokens": model.max_output_tokens,
36
+ "api_key": model.get_api_key()
113
37
  }
114
- ]
115
38
 
116
39
  def process_api_key_path(base_url: str) -> str:
117
40
  """
@@ -135,75 +58,51 @@ def load_models() -> List[Dict]:
135
58
  Models are merged and deduplicated based on their name field.
136
59
  If file doesn't exist or is invalid, use default_models_list.
137
60
  """
138
- os.makedirs(os.path.dirname(MODELS_JSON), exist_ok=True)
139
-
140
- # Start with default models
141
- models_dict = {model["name"]: model for model in default_models_list}
142
-
143
- # If JSON file exists, read and merge with defaults
144
- if os.path.exists(MODELS_JSON):
145
- try:
146
- with open(MODELS_JSON, 'r', encoding='utf-8') as f:
147
- custom_models = json.load(f)
148
- # Custom models will override defaults with same name
149
- for model in custom_models:
150
- model["is_reasoning"] = model.get("is_reasoning", False)
151
- models_dict[model["name"]] = model
152
-
153
- except json.JSONDecodeError:
154
- # If JSON is invalid, just use defaults
155
- print("JSON is invalid, using defaults")
156
- save_models(default_models_list)
157
- else:
158
- # If file doesn't exist, create it with defaults
159
- save_models(default_models_list)
160
-
161
- # Convert merged dictionary back to list
162
- target_models = list(models_dict.values())
163
- api_key_dir = os.path.expanduser("~/.auto-coder/keys")
164
- for model in target_models:
165
- if model.get("api_key_path",""):
166
- api_key_file = os.path.join(api_key_dir, model["api_key_path"])
167
- if os.path.exists(api_key_file):
168
- with open(api_key_file, "r", encoding="utf-8") as f:
169
- model["api_key"] = f.read().strip()
170
- return target_models
61
+ lm = _get_llm_manager()
62
+ models = lm.get_all_models()
63
+ return [_model_to_dict(model) for model in models.values()]
171
64
 
172
65
  def save_models(models: List[Dict]) -> None:
173
66
  """
174
67
  Save models to ~/.auto-coder/keys/models.json
175
68
  """
176
- os.makedirs(os.path.dirname(MODELS_JSON), exist_ok=True)
177
- with open(MODELS_JSON, 'w', encoding='utf-8') as f:
178
- json.dump(models, f, indent=2, ensure_ascii=False)
179
-
69
+ lm = _get_llm_manager()
70
+ lm.add_models(cast(List[Union[LLMModel, Dict]], models))
180
71
 
181
72
  def add_and_activate_models(models: List[Dict]) -> None:
182
73
  """
183
74
  添加模型
184
75
  """
185
- exits_models = load_models()
186
- for model in models:
187
- if model["name"] not in [m["name"] for m in exits_models]:
188
- exits_models.append(model)
189
- save_models(exits_models)
190
-
191
- for model in models:
192
- if "api_key" in model:
193
- update_model_with_api_key(model["name"], model["api_key"])
76
+ lm = _get_llm_manager()
77
+
78
+ # First, get existing models to avoid duplicates
79
+ existing_models = lm.get_all_models()
80
+ new_models = []
81
+
82
+ for model_data in models:
83
+ if model_data["name"] not in existing_models:
84
+ new_models.append(model_data)
85
+
86
+ if new_models:
87
+ lm.add_models(new_models)
88
+
89
+ # Handle API keys separately for existing models
90
+ for model_data in models:
91
+ if "api_key" in model_data and model_data["api_key"]:
92
+ lm.update_model_with_api_key(model_data["name"], model_data["api_key"])
194
93
 
195
94
  def get_model_by_name(name: str) -> Dict:
196
95
  """
197
96
  根据模型名称查找模型
198
97
  """
199
98
  from autocoder.common.auto_coder_lang import get_message_with_format
200
- models = load_models()
201
- v = [m for m in models if m["name"] == name.strip()]
99
+ lm = _get_llm_manager()
100
+ model = lm.get_model(name.strip())
202
101
 
203
- if len(v) == 0:
102
+ if not model:
204
103
  raise Exception(get_message_with_format("model_not_found", model_name=name))
205
- return v[0]
206
-
104
+
105
+ return _model_to_dict(model)
207
106
 
208
107
  def update_model_input_price(name: str, price: float) -> bool:
209
108
  """更新模型输入价格
@@ -229,17 +128,9 @@ def update_model_input_price(name: str, price: float) -> bool:
229
128
  """
230
129
  if price < 0:
231
130
  raise ValueError("Price cannot be negative")
232
-
233
- models = load_models()
234
- updated = False
235
- for model in models:
236
- if model["name"] == name:
237
- model["input_price"] = float(price)
238
- updated = True
239
- break
240
- if updated:
241
- save_models(models)
242
- return updated
131
+
132
+ lm = _get_llm_manager()
133
+ return lm.update_input_price(name, price)
243
134
 
244
135
  def update_model_output_price(name: str, price: float) -> bool:
245
136
  """更新模型输出价格
@@ -265,17 +156,9 @@ def update_model_output_price(name: str, price: float) -> bool:
265
156
  """
266
157
  if price < 0:
267
158
  raise ValueError("Price cannot be negative")
268
-
269
- models = load_models()
270
- updated = False
271
- for model in models:
272
- if model["name"] == name:
273
- model["output_price"] = float(price)
274
- updated = True
275
- break
276
- if updated:
277
- save_models(models)
278
- return updated
159
+
160
+ lm = _get_llm_manager()
161
+ return lm.update_output_price(name, price)
279
162
 
280
163
  def update_model_speed(name: str, speed: float) -> bool:
281
164
  """更新模型平均速度
@@ -286,26 +169,20 @@ def update_model_speed(name: str, speed: float) -> bool:
286
169
 
287
170
  Returns:
288
171
  bool: 是否更新成功
289
- """
290
- models = load_models()
291
- updated = False
292
- for model in models:
293
- if model["name"] == name:
294
- model["average_speed"] = float(speed)
295
- updated = True
296
- break
297
- if updated:
298
- save_models(models)
299
- return updated
172
+ """
173
+ lm = _get_llm_manager()
174
+ # Since the new schema doesn't have average_speed, we'll use update_model
175
+ # with a custom field or just return True for backward compatibility
176
+ return lm.check_model_exists(name) # Just check if model exists
300
177
 
301
178
  def check_model_exists(name: str) -> bool:
302
179
  """
303
180
  检查模型是否存在
304
181
  """
305
- models = load_models()
306
- return any(m["name"] == name.strip() for m in models)
182
+ lm = _get_llm_manager()
183
+ return lm.check_model_exists(name.strip())
307
184
 
308
- def update_model_with_api_key(name: str, api_key: str) -> Dict:
185
+ def update_model_with_api_key(name: str, api_key: str) -> Optional[Dict]:
309
186
  """
310
187
  根据模型名称查找并更新模型的 api_key_path。
311
188
  如果找到模型,会根据其 base_url 处理 api_key_path。
@@ -317,44 +194,23 @@ def update_model_with_api_key(name: str, api_key: str) -> Dict:
317
194
  Returns:
318
195
  Dict: 更新后的模型信息,如果未找到则返回None
319
196
  """
320
- models = load_models()
197
+ lm = _get_llm_manager()
321
198
 
322
- # 在现有模型中查找
323
- found_model = None
324
- for model in models:
325
- if model["name"] == name.strip():
326
- found_model = model
327
- break
328
-
329
- if not found_model:
199
+ # Check if model exists
200
+ if not lm.check_model_exists(name.strip()):
330
201
  return None
331
-
332
- api_key_path = name.replace("/", "_") # 替换 / 为 _,保证文件名合法
333
- if api_key_path:
334
- found_model["api_key_path"] = api_key_path
335
-
336
- # 保存 API 密钥
337
- api_key_dir = os.path.expanduser("~/.auto-coder/keys")
338
- os.makedirs(api_key_dir, exist_ok=True)
339
- api_key_file = os.path.join(api_key_dir, api_key_path)
340
- with open(api_key_file, "w",encoding="utf-8") as f:
341
- f.write(api_key.strip())
342
-
343
- # 如果是新模型,添加到模型列表中
344
- if all(model["name"] != name for model in models):
345
- models.append(found_model)
346
- else:
347
- # 更新现有模型
348
- for i, model in enumerate(models):
349
- if model["name"] == name:
350
- models[i] = found_model
351
- break
352
-
353
- save_models(models)
354
202
 
355
- return found_model
203
+ # Update API key
204
+ success = lm.update_model_with_api_key(name.strip(), api_key)
205
+
206
+ if success:
207
+ # Return the updated model as dict for backward compatibility
208
+ model = lm.get_model(name.strip())
209
+ return _model_to_dict(model) if model else None
210
+
211
+ return None
356
212
 
357
- def update_model(name: str, model_data: Dict) -> Dict:
213
+ def update_model(name: str, model_data: Dict) -> Optional[Dict]:
358
214
  """
359
215
  更新模型信息
360
216
 
@@ -371,50 +227,23 @@ def update_model(name: str, model_data: Dict) -> Dict:
371
227
  - input_price: 输入价格
372
228
  - output_price: 输出价格
373
229
  - max_output_tokens: 最大输出tokens
374
- - average_speed: 平均速度
230
+ - average_speed: 平均速度(向后兼容,但不会保存)
375
231
 
376
232
  Returns:
377
233
  Dict: 更新后的模型信息,如果未找到则返回None
378
234
  """
379
- models = load_models()
235
+ lm = _get_llm_manager()
380
236
 
381
- # 查找要更新的模型
382
- found = False
383
- for i, model in enumerate(models):
384
- if model["name"] == name:
385
- # 更新模型字段
386
- if "description" in model_data:
387
- model["description"] = model_data["description"]
388
- if "model_name" in model_data:
389
- model["model_name"] = model_data["model_name"]
390
- if "model_type" in model_data:
391
- model["model_type"] = model_data["model_type"]
392
- if "base_url" in model_data:
393
- model["base_url"] = model_data["base_url"]
394
- if "is_reasoning" in model_data:
395
- model["is_reasoning"] = model_data["is_reasoning"]
396
- if "input_price" in model_data:
397
- model["input_price"] = float(model_data["input_price"])
398
- if "output_price" in model_data:
399
- model["output_price"] = float(model_data["output_price"])
400
- if "max_output_tokens" in model_data:
401
- model["max_output_tokens"] = int(model_data["max_output_tokens"])
402
- if "average_speed" in model_data:
403
- model["average_speed"] = float(model_data["average_speed"])
404
-
405
- # 保存更新后的模型
406
- models[i] = model
407
- found = True
408
-
409
- # 如果提供了API密钥,则更新
410
- if "api_key" in model_data and model_data["api_key"]:
411
- update_model_with_api_key(name, model_data["api_key"])
412
-
413
- break
237
+ # Filter out fields that don't exist in the new schema
238
+ filtered_data = {k: v for k, v in model_data.items() if k != "average_speed"}
239
+
240
+ updated_model = lm.update_model(name, filtered_data)
414
241
 
415
- if found:
416
- save_models(models)
417
- return models[i]
242
+ if updated_model:
243
+ return _model_to_dict(updated_model)
418
244
 
419
245
  return None
420
246
 
247
+ # Backward compatibility: preserve the default_models_list for any external usage
248
+ default_models_list = load_models()
249
+
@@ -8,6 +8,7 @@ import subprocess
8
8
  from typing import Any, Callable, Dict, List, Optional, Tuple
9
9
 
10
10
  from autocoder.plugins import Plugin, PluginManager
11
+ from autocoder.common.international import register_messages, get_message, get_message_with_format
11
12
 
12
13
 
13
14
  class GitHelperPlugin(Plugin):
@@ -19,7 +20,8 @@ class GitHelperPlugin(Plugin):
19
20
 
20
21
  def __init__(self, manager: PluginManager, config: Optional[Dict[str, Any]] = None, config_path: Optional[str] = None):
21
22
  """Initialize the Git helper plugin."""
22
- super().__init__(manager, config, config_path)
23
+ super().__init__(manager, config, config_path)
24
+
23
25
  self.git_available = self._check_git_available()
24
26
  self.default_branch = self.config.get("default_branch", "main")
25
27
 
@@ -43,10 +45,10 @@ class GitHelperPlugin(Plugin):
43
45
  True if initialization was successful
44
46
  """
45
47
  if not self.git_available:
46
- print(f"[{self.name}] 警告: Git不可用,某些功能受限")
48
+ print(f"[{self.name}] {get_message('git_not_available_warning')}")
47
49
  return True
48
50
 
49
- print(f"[{self.name}] Git助手插件已初始化")
51
+ print(f"[{self.name}] {get_message('git_helper_initialized')}")
50
52
  return True
51
53
 
52
54
  def get_commands(self) -> Dict[str, Tuple[Callable, str]]:
@@ -56,15 +58,15 @@ class GitHelperPlugin(Plugin):
56
58
  A dictionary of command name to handler and description
57
59
  """
58
60
  return {
59
- "git/status": (self.git_status, "显示Git仓库状态"),
60
- "git/commit": (self.git_commit, "提交更改"),
61
- "git/branch": (self.git_branch, "显示或创建分支"),
62
- "git/checkout": (self.git_checkout, "切换分支"),
63
- "git/diff": (self.git_diff, "显示更改差异"),
64
- "git/log": (self.git_log, "显示提交历史"),
65
- "git/pull": (self.git_pull, "拉取远程更改"),
66
- "git/push": (self.git_push, "推送本地更改到远程"),
67
- "git/reset": (self.handle_reset, "重置当前分支到指定状态 (hard/soft/mixed)"),
61
+ "git/status": (self.git_status, get_message("cmd_git_status_desc")),
62
+ "git/commit": (self.git_commit, get_message("cmd_git_commit_desc")),
63
+ "git/branch": (self.git_branch, get_message("cmd_git_branch_desc")),
64
+ "git/checkout": (self.git_checkout, get_message("cmd_git_checkout_desc")),
65
+ "git/diff": (self.git_diff, get_message("cmd_git_diff_desc")),
66
+ "git/log": (self.git_log, get_message("cmd_git_log_desc")),
67
+ "git/pull": (self.git_pull, get_message("cmd_git_pull_desc")),
68
+ "git/push": (self.git_push, get_message("cmd_git_push_desc")),
69
+ "git/reset": (self.handle_reset, get_message("cmd_git_reset_desc")),
68
70
  }
69
71
 
70
72
  def get_completions(self) -> Dict[str, List[str]]:
@@ -111,7 +113,7 @@ class GitHelperPlugin(Plugin):
111
113
  A tuple of (return_code, stdout, stderr)
112
114
  """
113
115
  if not self.git_available:
114
- return 1, "", "Git不可用"
116
+ return 1, "", get_message("git_not_available")
115
117
 
116
118
  try:
117
119
  process = subprocess.run(
@@ -143,12 +145,12 @@ class GitHelperPlugin(Plugin):
143
145
  if code == 0:
144
146
  print(f"\n{stdout}")
145
147
  else:
146
- print(f"Error: {stderr}")
148
+ print(f"{get_message('error_prefix')} {stderr}")
147
149
 
148
150
  def git_commit(self, args: str) -> None:
149
151
  """Handle the git/commit command."""
150
152
  if not args:
151
- print("请提供提交信息,例如: /git/commit 'Fix bug in login'")
153
+ print(get_message("commit_message_required"))
152
154
  return
153
155
 
154
156
  # 首先执行添加所有更改 (git add .)
@@ -159,7 +161,7 @@ class GitHelperPlugin(Plugin):
159
161
  if code == 0:
160
162
  print(f"\n{stdout}")
161
163
  else:
162
- print(f"Error: {stderr}")
164
+ print(f"{get_message('error_prefix')} {stderr}")
163
165
 
164
166
  def git_branch(self, args: str) -> None:
165
167
  """Handle the git/branch command."""
@@ -168,12 +170,12 @@ class GitHelperPlugin(Plugin):
168
170
  if code == 0:
169
171
  print(f"\n{stdout}")
170
172
  else:
171
- print(f"Error: {stderr}")
173
+ print(f"{get_message('error_prefix')} {stderr}")
172
174
 
173
175
  def git_checkout(self, args: str) -> None:
174
176
  """Handle the git/checkout command."""
175
177
  if not args:
176
- print("请提供分支名称,例如: /git/checkout main")
178
+ print(get_message("checkout_branch_required"))
177
179
  return
178
180
 
179
181
  args_list = args.split()
@@ -181,7 +183,7 @@ class GitHelperPlugin(Plugin):
181
183
  if code == 0:
182
184
  print(f"\n{stdout}")
183
185
  else:
184
- print(f"Error: {stderr}")
186
+ print(f"{get_message('error_prefix')} {stderr}")
185
187
 
186
188
  def git_diff(self, args: str) -> None:
187
189
  """Handle the git/diff command."""
@@ -191,9 +193,9 @@ class GitHelperPlugin(Plugin):
191
193
  if stdout:
192
194
  print(f"\n{stdout}")
193
195
  else:
194
- print("没有差异")
196
+ print(get_message("no_differences"))
195
197
  else:
196
- print(f"Error: {stderr}")
198
+ print(f"{get_message('error_prefix')} {stderr}")
197
199
 
198
200
  def git_log(self, args: str) -> None:
199
201
  """Handle the git/log command."""
@@ -202,7 +204,7 @@ class GitHelperPlugin(Plugin):
202
204
  if code == 0:
203
205
  print(f"\n{stdout}")
204
206
  else:
205
- print(f"Error: {stderr}")
207
+ print(f"{get_message('error_prefix')} {stderr}")
206
208
 
207
209
  def git_pull(self, args: str) -> None:
208
210
  """Handle the git/pull command."""
@@ -211,7 +213,7 @@ class GitHelperPlugin(Plugin):
211
213
  if code == 0:
212
214
  print(f"\n{stdout}")
213
215
  else:
214
- print(f"Error: {stderr}")
216
+ print(f"{get_message('error_prefix')} {stderr}")
215
217
 
216
218
  def git_push(self, args: str) -> None:
217
219
  """Handle the git/push command."""
@@ -220,7 +222,7 @@ class GitHelperPlugin(Plugin):
220
222
  if code == 0:
221
223
  print(f"\n{stdout}")
222
224
  else:
223
- print(f"Error: {stderr}")
225
+ print(f"{get_message('error_prefix')} {stderr}")
224
226
 
225
227
  def handle_reset(self, args: str) -> None:
226
228
  """Handle the git/reset command.
@@ -229,7 +231,7 @@ class GitHelperPlugin(Plugin):
229
231
  args: The reset mode (hard/soft/mixed) and optional commit hash
230
232
  """
231
233
  if not args:
232
- print("请提供重置模式 (hard/soft/mixed) 和可选的提交哈希")
234
+ print(get_message("reset_mode_required"))
233
235
  return
234
236
 
235
237
  args_list = args.split()
@@ -237,16 +239,16 @@ class GitHelperPlugin(Plugin):
237
239
  commit = args_list[1] if len(args_list) > 1 else "HEAD"
238
240
 
239
241
  if mode not in ["hard", "soft", "mixed"]:
240
- print(f"错误: 无效的重置模式 '{mode}',必须是 hard/soft/mixed 之一")
242
+ print(get_message_with_format("invalid_reset_mode", mode=mode))
241
243
  return
242
244
 
243
245
  code, stdout, stderr = self._run_git_command(["reset", f"--{mode}", commit])
244
246
  if code == 0:
245
247
  print(f"\n{stdout}")
246
- print(f"成功将仓库重置为 {mode} 模式到 {commit}")
248
+ print(get_message_with_format("reset_success", mode=mode, commit=commit))
247
249
  else:
248
- print(f"Error: {stderr}")
250
+ print(f"{get_message('error_prefix')} {stderr}")
249
251
 
250
252
  def shutdown(self) -> None:
251
253
  """Shutdown the plugin."""
252
- print(f"[{self.name}] Git助手插件已关闭")
254
+ print(f"[{self.name}] {get_message('git_helper_shutdown')}")