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.
- auto_coder-2.0.0.dist-info/LICENSE +158 -0
- auto_coder-2.0.0.dist-info/METADATA +558 -0
- auto_coder-2.0.0.dist-info/RECORD +795 -0
- {auto_coder-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
- {auto_coder-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/entry_points.txt +3 -3
- autocoder/__init__.py +31 -0
- autocoder/agent/auto_filegroup.py +32 -13
- autocoder/agent/auto_learn_from_commit.py +9 -1
- autocoder/agent/base_agentic/__init__.py +3 -0
- autocoder/agent/base_agentic/agent_hub.py +1 -1
- autocoder/agent/base_agentic/base_agent.py +235 -136
- autocoder/agent/base_agentic/default_tools.py +119 -118
- autocoder/agent/base_agentic/test_base_agent.py +1 -1
- autocoder/agent/base_agentic/tool_registry.py +32 -20
- autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +24 -3
- autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
- autocoder/agent/base_agentic/types.py +42 -0
- autocoder/agent/entry_command_agent/chat.py +73 -59
- autocoder/auto_coder.py +31 -40
- autocoder/auto_coder_rag.py +11 -1084
- autocoder/auto_coder_runner.py +970 -2345
- autocoder/auto_coder_terminal.py +26 -0
- autocoder/auto_coder_terminal_v3.py +190 -0
- autocoder/chat/conf_command.py +224 -124
- autocoder/chat/models_command.py +361 -299
- autocoder/chat/rules_command.py +79 -31
- autocoder/chat_auto_coder.py +988 -398
- autocoder/chat_auto_coder_lang.py +23 -732
- autocoder/commands/auto_command.py +25 -8
- autocoder/commands/auto_web.py +1 -1
- autocoder/commands/tools.py +44 -44
- autocoder/common/__init__.py +150 -128
- autocoder/common/ac_style_command_parser/__init__.py +39 -2
- autocoder/common/ac_style_command_parser/config.py +422 -0
- autocoder/common/ac_style_command_parser/parser.py +292 -78
- autocoder/common/ac_style_command_parser/test_parser.py +241 -16
- autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
- autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
- autocoder/common/action_yml_file_manager.py +25 -13
- autocoder/common/agent_events/__init__.py +52 -0
- autocoder/common/agent_events/agent_event_emitter.py +193 -0
- autocoder/common/agent_events/event_factory.py +177 -0
- autocoder/common/agent_events/examples.py +307 -0
- autocoder/common/agent_events/types.py +113 -0
- autocoder/common/agent_events/utils.py +68 -0
- autocoder/common/agent_hooks/__init__.py +44 -0
- autocoder/common/agent_hooks/examples.py +582 -0
- autocoder/common/agent_hooks/hook_executor.py +217 -0
- autocoder/common/agent_hooks/hook_manager.py +288 -0
- autocoder/common/agent_hooks/types.py +133 -0
- autocoder/common/agent_hooks/utils.py +99 -0
- autocoder/common/agent_query_queue/queue_executor.py +324 -0
- autocoder/common/agent_query_queue/queue_manager.py +325 -0
- autocoder/common/agents/__init__.py +11 -0
- autocoder/common/agents/agent_manager.py +323 -0
- autocoder/common/agents/agent_parser.py +189 -0
- autocoder/common/agents/example_usage.py +344 -0
- autocoder/common/agents/integration_example.py +330 -0
- autocoder/common/agents/test_agent_parser.py +545 -0
- autocoder/common/async_utils.py +101 -0
- autocoder/common/auto_coder_lang.py +23 -972
- autocoder/common/autocoderargs_parser/__init__.py +14 -0
- autocoder/common/autocoderargs_parser/parser.py +184 -0
- autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
- autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
- autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
- autocoder/common/autocoderargs_parser/token_parser.py +290 -0
- autocoder/common/buildin_tokenizer.py +2 -4
- autocoder/common/code_auto_generate.py +149 -74
- autocoder/common/code_auto_generate_diff.py +163 -70
- autocoder/common/code_auto_generate_editblock.py +179 -89
- autocoder/common/code_auto_generate_strict_diff.py +167 -72
- autocoder/common/code_auto_merge_editblock.py +13 -6
- autocoder/common/code_modification_ranker.py +1 -1
- autocoder/common/command_completer.py +3 -3
- autocoder/common/command_file_manager/manager.py +183 -47
- autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
- autocoder/common/command_templates.py +1 -1
- autocoder/common/conf_utils.py +2 -4
- autocoder/common/conversations/config.py +11 -3
- autocoder/common/conversations/get_conversation_manager.py +100 -2
- autocoder/common/conversations/llm_stats_models.py +264 -0
- autocoder/common/conversations/manager.py +112 -28
- autocoder/common/conversations/models.py +16 -2
- autocoder/common/conversations/storage/index_manager.py +134 -10
- autocoder/common/core_config/__init__.py +63 -0
- autocoder/common/core_config/agentic_mode_manager.py +109 -0
- autocoder/common/core_config/base_manager.py +123 -0
- autocoder/common/core_config/compatibility.py +151 -0
- autocoder/common/core_config/config_manager.py +156 -0
- autocoder/common/core_config/conversation_manager.py +31 -0
- autocoder/common/core_config/exclude_manager.py +72 -0
- autocoder/common/core_config/file_manager.py +177 -0
- autocoder/common/core_config/human_as_model_manager.py +129 -0
- autocoder/common/core_config/lib_manager.py +54 -0
- autocoder/common/core_config/main_manager.py +81 -0
- autocoder/common/core_config/mode_manager.py +126 -0
- autocoder/common/core_config/models.py +70 -0
- autocoder/common/core_config/test_memory_manager.py +1056 -0
- autocoder/common/env_manager.py +282 -0
- autocoder/common/env_manager_usage_example.py +211 -0
- autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
- autocoder/common/file_checkpoint/manager.py +264 -48
- autocoder/common/file_checkpoint/test_backup.py +1 -18
- autocoder/common/file_checkpoint/test_manager.py +270 -1
- autocoder/common/file_checkpoint/test_store.py +1 -17
- autocoder/common/file_handler/__init__.py +23 -0
- autocoder/common/file_handler/active_context_handler.py +159 -0
- autocoder/common/file_handler/add_files_handler.py +409 -0
- autocoder/common/file_handler/chat_handler.py +180 -0
- autocoder/common/file_handler/coding_handler.py +401 -0
- autocoder/common/file_handler/commit_handler.py +200 -0
- autocoder/common/file_handler/lib_handler.py +156 -0
- autocoder/common/file_handler/list_files_handler.py +111 -0
- autocoder/common/file_handler/mcp_handler.py +268 -0
- autocoder/common/file_handler/models_handler.py +493 -0
- autocoder/common/file_handler/remove_files_handler.py +172 -0
- autocoder/common/git_utils.py +44 -8
- autocoder/common/global_cancel.py +15 -6
- autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
- autocoder/common/international/__init__.py +31 -0
- autocoder/common/international/demo_international.py +92 -0
- autocoder/common/international/message_manager.py +157 -0
- autocoder/common/international/messages/__init__.py +56 -0
- autocoder/common/international/messages/async_command_messages.py +507 -0
- autocoder/common/international/messages/auto_coder_messages.py +2208 -0
- autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
- autocoder/common/international/messages/command_help_messages.py +986 -0
- autocoder/common/international/messages/conversation_command_messages.py +191 -0
- autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
- autocoder/common/international/messages/queue_command_messages.py +751 -0
- autocoder/common/international/messages/rules_command_messages.py +77 -0
- autocoder/common/international/messages/sdk_messages.py +1707 -0
- autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
- autocoder/common/international/messages/tool_display_messages.py +1212 -0
- autocoder/common/international/messages/workflow_exception_messages.py +473 -0
- autocoder/common/international/test_international.py +612 -0
- autocoder/common/linter_core/__init__.py +28 -0
- autocoder/common/linter_core/base_linter.py +61 -0
- autocoder/common/linter_core/config_loader.py +271 -0
- autocoder/common/linter_core/formatters/__init__.py +0 -0
- autocoder/common/linter_core/formatters/base_formatter.py +38 -0
- autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
- autocoder/common/linter_core/linter.py +166 -0
- autocoder/common/linter_core/linter_factory.py +216 -0
- autocoder/common/linter_core/linter_manager.py +333 -0
- autocoder/common/linter_core/linters/__init__.py +9 -0
- autocoder/common/linter_core/linters/java_linter.py +342 -0
- autocoder/common/linter_core/linters/python_linter.py +115 -0
- autocoder/common/linter_core/linters/typescript_linter.py +119 -0
- autocoder/common/linter_core/models/__init__.py +7 -0
- autocoder/common/linter_core/models/lint_result.py +91 -0
- autocoder/common/linter_core/models.py +33 -0
- autocoder/common/linter_core/tests/__init__.py +3 -0
- autocoder/common/linter_core/tests/test_config_loader.py +323 -0
- autocoder/common/linter_core/tests/test_config_loading.py +308 -0
- autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
- autocoder/common/linter_core/tests/test_formatters.py +147 -0
- autocoder/common/linter_core/tests/test_integration.py +317 -0
- autocoder/common/linter_core/tests/test_java_linter.py +496 -0
- autocoder/common/linter_core/tests/test_linters.py +265 -0
- autocoder/common/linter_core/tests/test_models.py +81 -0
- autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
- autocoder/common/linter_core/tests/verify_fixes.py +183 -0
- autocoder/common/llm_friendly_package/__init__.py +31 -0
- autocoder/common/llm_friendly_package/base_manager.py +102 -0
- autocoder/common/llm_friendly_package/docs_manager.py +121 -0
- autocoder/common/llm_friendly_package/library_manager.py +171 -0
- autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
- autocoder/common/llm_friendly_package/models.py +40 -0
- autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
- autocoder/common/llms/__init__.py +15 -0
- autocoder/common/llms/demo_error_handling.py +85 -0
- autocoder/common/llms/factory.py +142 -0
- autocoder/common/llms/manager.py +264 -0
- autocoder/common/llms/pricing.py +121 -0
- autocoder/common/llms/registry.py +288 -0
- autocoder/common/llms/schema.py +77 -0
- autocoder/common/llms/simple_demo.py +45 -0
- autocoder/common/llms/test_quick_model.py +116 -0
- autocoder/common/llms/test_remove_functionality.py +182 -0
- autocoder/common/llms/tests/__init__.py +1 -0
- autocoder/common/llms/tests/test_manager.py +330 -0
- autocoder/common/llms/tests/test_registry.py +364 -0
- autocoder/common/mcp_tools/__init__.py +62 -0
- autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
- autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
- autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
- autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
- autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
- autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
- autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
- autocoder/common/mcp_tools/verify_functionality.py +202 -0
- autocoder/common/model_speed_tester.py +32 -26
- autocoder/common/priority_directory_finder/__init__.py +142 -0
- autocoder/common/priority_directory_finder/examples.py +230 -0
- autocoder/common/priority_directory_finder/finder.py +283 -0
- autocoder/common/priority_directory_finder/models.py +236 -0
- autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
- autocoder/common/project_scanner/__init__.py +18 -0
- autocoder/common/project_scanner/compat.py +77 -0
- autocoder/common/project_scanner/scanner.py +436 -0
- autocoder/common/project_tracker/__init__.py +27 -0
- autocoder/common/project_tracker/api.py +228 -0
- autocoder/common/project_tracker/demo.py +272 -0
- autocoder/common/project_tracker/tracker.py +487 -0
- autocoder/common/project_tracker/types.py +53 -0
- autocoder/common/pruner/__init__.py +67 -0
- autocoder/common/pruner/agentic_conversation_pruner.py +651 -102
- autocoder/common/pruner/conversation_message_ids_api.py +386 -0
- autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
- autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
- autocoder/common/pruner/conversation_normalizer.py +347 -0
- autocoder/common/pruner/conversation_pruner.py +26 -6
- autocoder/common/pruner/test_agentic_conversation_pruner.py +554 -112
- autocoder/common/pruner/test_conversation_normalizer.py +502 -0
- autocoder/common/pruner/test_tool_content_detector.py +324 -0
- autocoder/common/pruner/tool_content_detector.py +227 -0
- autocoder/common/pruner/tools/__init__.py +18 -0
- autocoder/common/pruner/tools/query_message_ids.py +264 -0
- autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
- autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
- autocoder/common/pull_requests/__init__.py +9 -1
- autocoder/common/pull_requests/utils.py +122 -1
- autocoder/common/rag_manager/rag_manager.py +36 -40
- autocoder/common/rulefiles/__init__.py +53 -1
- autocoder/common/rulefiles/api.py +250 -0
- autocoder/common/rulefiles/core/__init__.py +14 -0
- autocoder/common/rulefiles/core/manager.py +241 -0
- autocoder/common/rulefiles/core/selector.py +805 -0
- autocoder/common/rulefiles/models/__init__.py +20 -0
- autocoder/common/rulefiles/models/index.py +16 -0
- autocoder/common/rulefiles/models/init_rule.py +18 -0
- autocoder/common/rulefiles/models/rule_file.py +18 -0
- autocoder/common/rulefiles/models/rule_relevance.py +14 -0
- autocoder/common/rulefiles/models/summary.py +16 -0
- autocoder/common/rulefiles/test_rulefiles.py +776 -0
- autocoder/common/rulefiles/utils/__init__.py +34 -0
- autocoder/common/rulefiles/utils/monitor.py +86 -0
- autocoder/common/rulefiles/utils/parser.py +230 -0
- autocoder/common/save_formatted_log.py +67 -10
- autocoder/common/search_replace.py +8 -1
- autocoder/common/search_replace_patch/__init__.py +24 -0
- autocoder/common/search_replace_patch/base.py +115 -0
- autocoder/common/search_replace_patch/manager.py +248 -0
- autocoder/common/search_replace_patch/patch_replacer.py +304 -0
- autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
- autocoder/common/search_replace_patch/string_replacer.py +181 -0
- autocoder/common/search_replace_patch/tests/__init__.py +3 -0
- autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
- autocoder/common/search_replace_patch/tests/test_base.py +188 -0
- autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
- autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
- autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
- autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
- autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
- autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
- autocoder/common/shell_commands/__init__.py +197 -0
- autocoder/common/shell_commands/background_process_notifier.py +346 -0
- autocoder/common/shell_commands/command_executor.py +1127 -0
- autocoder/common/shell_commands/error_recovery.py +541 -0
- autocoder/common/shell_commands/exceptions.py +120 -0
- autocoder/common/shell_commands/interactive_executor.py +476 -0
- autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
- autocoder/common/shell_commands/interactive_process.py +744 -0
- autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
- autocoder/common/shell_commands/monitoring.py +529 -0
- autocoder/common/shell_commands/process_cleanup.py +386 -0
- autocoder/common/shell_commands/process_manager.py +606 -0
- autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
- autocoder/common/shell_commands/tests/__init__.py +6 -0
- autocoder/common/shell_commands/tests/conftest.py +118 -0
- autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
- autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
- autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
- autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
- autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
- autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
- autocoder/common/shell_commands/tests/test_integration.py +664 -0
- autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
- autocoder/common/shell_commands/tests/test_performance.py +632 -0
- autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
- autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
- autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
- autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
- autocoder/common/shell_commands/timeout_config.py +315 -0
- autocoder/common/shell_commands/timeout_manager.py +352 -0
- autocoder/common/terminal_paste/__init__.py +14 -0
- autocoder/common/terminal_paste/demo.py +145 -0
- autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
- autocoder/common/terminal_paste/paste_handler.py +200 -0
- autocoder/common/terminal_paste/paste_manager.py +118 -0
- autocoder/common/terminal_paste/tests/__init__.py +1 -0
- autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
- autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
- autocoder/common/terminal_paste/utils.py +163 -0
- autocoder/common/test_autocoder_args.py +232 -0
- autocoder/common/test_env_manager.py +173 -0
- autocoder/common/test_env_manager_integration.py +159 -0
- autocoder/common/text_similarity/__init__.py +9 -0
- autocoder/common/text_similarity/demo.py +216 -0
- autocoder/common/text_similarity/examples.py +266 -0
- autocoder/common/text_similarity/test_text_similarity.py +306 -0
- autocoder/common/text_similarity/text_similarity.py +194 -0
- autocoder/common/text_similarity/utils.py +125 -0
- autocoder/common/todos/__init__.py +61 -0
- autocoder/common/todos/cache/__init__.py +16 -0
- autocoder/common/todos/cache/base_cache.py +89 -0
- autocoder/common/todos/cache/cache_manager.py +228 -0
- autocoder/common/todos/cache/memory_cache.py +225 -0
- autocoder/common/todos/config.py +155 -0
- autocoder/common/todos/exceptions.py +35 -0
- autocoder/common/todos/get_todo_manager.py +161 -0
- autocoder/common/todos/manager.py +537 -0
- autocoder/common/todos/models.py +239 -0
- autocoder/common/todos/storage/__init__.py +14 -0
- autocoder/common/todos/storage/base_storage.py +76 -0
- autocoder/common/todos/storage/file_storage.py +278 -0
- autocoder/common/tokens/counter.py +24 -2
- autocoder/common/tools_manager/__init__.py +17 -0
- autocoder/common/tools_manager/examples.py +162 -0
- autocoder/common/tools_manager/manager.py +385 -0
- autocoder/common/tools_manager/models.py +39 -0
- autocoder/common/tools_manager/test_tools_manager.py +303 -0
- autocoder/common/tools_manager/utils.py +191 -0
- autocoder/common/v2/agent/agentic_callbacks.py +270 -0
- autocoder/common/v2/agent/agentic_edit.py +2699 -1856
- autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
- autocoder/common/v2/agent/agentic_edit_tools/__init__.py +35 -1
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +10 -1
- autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
- autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
- autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
- autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
- autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
- autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +564 -29
- autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
- autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
- autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
- autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
- autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
- autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
- autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
- autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +243 -50
- autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
- autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
- autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +410 -86
- autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
- autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
- autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
- autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +207 -192
- autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +80 -63
- autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +237 -233
- autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
- autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
- autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
- autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
- autocoder/common/v2/agent/agentic_edit_types.py +343 -9
- autocoder/common/v2/agent/runner/__init__.py +3 -3
- autocoder/common/v2/agent/runner/base_runner.py +12 -26
- autocoder/common/v2/agent/runner/{event_runner.py → file_based_event_runner.py} +3 -2
- autocoder/common/v2/agent/runner/sdk_runner.py +150 -8
- autocoder/common/v2/agent/runner/terminal_runner.py +170 -57
- autocoder/common/v2/agent/runner/tool_display.py +557 -159
- autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
- autocoder/common/v2/agent/test_agentic_edit.py +194 -0
- autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
- autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
- autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
- autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
- autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
- autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
- autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
- autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
- autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
- autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
- autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
- autocoder/common/v2/code_auto_generate.py +136 -78
- autocoder/common/v2/code_auto_generate_diff.py +135 -79
- autocoder/common/v2/code_auto_generate_editblock.py +174 -99
- autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
- autocoder/common/v2/code_auto_merge.py +1 -1
- autocoder/common/v2/code_auto_merge_editblock.py +13 -1
- autocoder/common/v2/code_diff_manager.py +3 -3
- autocoder/common/v2/code_editblock_manager.py +4 -14
- autocoder/common/v2/code_manager.py +1 -1
- autocoder/common/v2/code_strict_diff_manager.py +2 -2
- autocoder/common/wrap_llm_hint/__init__.py +10 -0
- autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
- autocoder/common/wrap_llm_hint/utils.py +432 -0
- autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
- autocoder/completer/__init__.py +8 -0
- autocoder/completer/command_completer_v2.py +1051 -0
- autocoder/default_project/__init__.py +501 -0
- autocoder/dispacher/__init__.py +4 -12
- autocoder/dispacher/actions/action.py +165 -7
- autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
- autocoder/index/entry.py +116 -124
- autocoder/{agent → index/filter}/agentic_filter.py +322 -333
- autocoder/index/filter/normal_filter.py +5 -11
- autocoder/index/filter/quick_filter.py +1 -1
- autocoder/index/index.py +36 -9
- autocoder/index/tests/__init__.py +1 -0
- autocoder/index/tests/run_tests.py +195 -0
- autocoder/index/tests/test_entry.py +303 -0
- autocoder/index/tests/test_index_manager.py +314 -0
- autocoder/index/tests/test_module_integration.py +300 -0
- autocoder/index/tests/test_symbols_utils.py +183 -0
- autocoder/inner/__init__.py +4 -0
- autocoder/inner/agentic.py +932 -0
- autocoder/inner/async_command_handler.py +992 -0
- autocoder/inner/conversation_command_handlers.py +623 -0
- autocoder/inner/merge_command_handler.py +213 -0
- autocoder/inner/queue_command_handler.py +684 -0
- autocoder/models.py +95 -266
- autocoder/plugins/git_helper_plugin.py +31 -29
- autocoder/plugins/token_helper_plugin.py +65 -46
- autocoder/pyproject/__init__.py +32 -29
- autocoder/rag/agentic_rag.py +215 -75
- autocoder/rag/cache/simple_cache.py +1 -2
- autocoder/rag/loaders/image_loader.py +1 -1
- autocoder/rag/long_context_rag.py +42 -26
- autocoder/rag/qa_conversation_strategy.py +1 -1
- autocoder/rag/terminal/__init__.py +17 -0
- autocoder/rag/terminal/args.py +581 -0
- autocoder/rag/terminal/bootstrap.py +61 -0
- autocoder/rag/terminal/command_handlers.py +653 -0
- autocoder/rag/terminal/formatters/__init__.py +20 -0
- autocoder/rag/terminal/formatters/base.py +70 -0
- autocoder/rag/terminal/formatters/json_format.py +66 -0
- autocoder/rag/terminal/formatters/stream_json.py +95 -0
- autocoder/rag/terminal/formatters/text.py +28 -0
- autocoder/rag/terminal/init.py +120 -0
- autocoder/rag/terminal/utils.py +106 -0
- autocoder/rag/test_agentic_rag.py +389 -0
- autocoder/rag/test_doc_filter.py +3 -3
- autocoder/rag/test_long_context_rag.py +1 -1
- autocoder/rag/test_token_limiter.py +517 -10
- autocoder/rag/token_counter.py +3 -0
- autocoder/rag/token_limiter.py +19 -15
- autocoder/rag/tools/__init__.py +26 -2
- autocoder/rag/tools/bochaai_example.py +343 -0
- autocoder/rag/tools/bochaai_sdk.py +541 -0
- autocoder/rag/tools/metaso_example.py +268 -0
- autocoder/rag/tools/metaso_sdk.py +417 -0
- autocoder/rag/tools/recall_tool.py +28 -7
- autocoder/rag/tools/run_integration_tests.py +204 -0
- autocoder/rag/tools/test_all_providers.py +318 -0
- autocoder/rag/tools/test_bochaai_integration.py +482 -0
- autocoder/rag/tools/test_final_integration.py +215 -0
- autocoder/rag/tools/test_metaso_integration.py +424 -0
- autocoder/rag/tools/test_metaso_real.py +171 -0
- autocoder/rag/tools/test_web_crawl_tool.py +639 -0
- autocoder/rag/tools/test_web_search_tool.py +509 -0
- autocoder/rag/tools/todo_read_tool.py +202 -0
- autocoder/rag/tools/todo_write_tool.py +412 -0
- autocoder/rag/tools/web_crawl_tool.py +634 -0
- autocoder/rag/tools/web_search_tool.py +558 -0
- autocoder/rag/tools/web_tools_example.py +119 -0
- autocoder/rag/types.py +16 -0
- autocoder/rag/variable_holder.py +4 -2
- autocoder/rags.py +86 -79
- autocoder/regexproject/__init__.py +23 -21
- autocoder/sdk/__init__.py +46 -190
- autocoder/sdk/api.py +370 -0
- autocoder/sdk/async_runner/__init__.py +26 -0
- autocoder/sdk/async_runner/async_executor.py +650 -0
- autocoder/sdk/async_runner/async_handler.py +356 -0
- autocoder/sdk/async_runner/markdown_processor.py +595 -0
- autocoder/sdk/async_runner/task_metadata.py +284 -0
- autocoder/sdk/async_runner/worktree_manager.py +438 -0
- autocoder/sdk/cli/__init__.py +2 -5
- autocoder/sdk/cli/formatters.py +28 -204
- autocoder/sdk/cli/handlers.py +77 -44
- autocoder/sdk/cli/main.py +154 -171
- autocoder/sdk/cli/options.py +95 -22
- autocoder/sdk/constants.py +139 -51
- autocoder/sdk/core/auto_coder_core.py +484 -109
- autocoder/sdk/core/bridge.py +297 -115
- autocoder/sdk/exceptions.py +18 -12
- autocoder/sdk/formatters/__init__.py +19 -0
- autocoder/sdk/formatters/input.py +64 -0
- autocoder/sdk/formatters/output.py +247 -0
- autocoder/sdk/formatters/stream.py +54 -0
- autocoder/sdk/models/__init__.py +6 -5
- autocoder/sdk/models/options.py +55 -18
- autocoder/sdk/utils/formatters.py +27 -195
- autocoder/suffixproject/__init__.py +28 -25
- autocoder/terminal/__init__.py +14 -0
- autocoder/terminal/app.py +454 -0
- autocoder/terminal/args.py +32 -0
- autocoder/terminal/bootstrap.py +178 -0
- autocoder/terminal/command_processor.py +521 -0
- autocoder/terminal/command_registry.py +57 -0
- autocoder/terminal/help.py +97 -0
- autocoder/terminal/tasks/__init__.py +5 -0
- autocoder/terminal/tasks/background.py +77 -0
- autocoder/terminal/tasks/task_event.py +70 -0
- autocoder/terminal/ui/__init__.py +13 -0
- autocoder/terminal/ui/completer.py +268 -0
- autocoder/terminal/ui/keybindings.py +75 -0
- autocoder/terminal/ui/session.py +41 -0
- autocoder/terminal/ui/toolbar.py +64 -0
- autocoder/terminal/utils/__init__.py +13 -0
- autocoder/terminal/utils/errors.py +18 -0
- autocoder/terminal/utils/paths.py +19 -0
- autocoder/terminal/utils/shell.py +43 -0
- autocoder/terminal_v3/__init__.py +10 -0
- autocoder/terminal_v3/app.py +201 -0
- autocoder/terminal_v3/handlers/__init__.py +5 -0
- autocoder/terminal_v3/handlers/command_handler.py +131 -0
- autocoder/terminal_v3/models/__init__.py +6 -0
- autocoder/terminal_v3/models/conversation_buffer.py +214 -0
- autocoder/terminal_v3/models/message.py +50 -0
- autocoder/terminal_v3/models/tool_display.py +247 -0
- autocoder/terminal_v3/ui/__init__.py +7 -0
- autocoder/terminal_v3/ui/keybindings.py +56 -0
- autocoder/terminal_v3/ui/layout.py +141 -0
- autocoder/terminal_v3/ui/styles.py +43 -0
- autocoder/tsproject/__init__.py +23 -23
- autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
- autocoder/utils/llms.py +88 -80
- autocoder/utils/math_utils.py +101 -0
- autocoder/utils/model_provider_selector.py +16 -4
- autocoder/utils/operate_config_api.py +33 -5
- autocoder/utils/thread_utils.py +2 -2
- autocoder/version.py +4 -2
- autocoder/workflow_agents/__init__.py +84 -0
- autocoder/workflow_agents/agent.py +143 -0
- autocoder/workflow_agents/exceptions.py +573 -0
- autocoder/workflow_agents/executor.py +489 -0
- autocoder/workflow_agents/loader.py +737 -0
- autocoder/workflow_agents/runner.py +267 -0
- autocoder/workflow_agents/types.py +172 -0
- autocoder/workflow_agents/utils.py +434 -0
- autocoder/workflow_agents/workflow_manager.py +211 -0
- auto_coder-1.0.0.dist-info/METADATA +0 -396
- auto_coder-1.0.0.dist-info/RECORD +0 -442
- auto_coder-1.0.0.dist-info/licenses/LICENSE +0 -201
- autocoder/auto_coder_server.py +0 -672
- autocoder/benchmark.py +0 -138
- autocoder/common/ac_style_command_parser/example.py +0 -7
- autocoder/common/cleaner.py +0 -31
- autocoder/common/command_completer_v2.py +0 -615
- autocoder/common/context_pruner.py +0 -477
- autocoder/common/conversation_pruner.py +0 -132
- autocoder/common/directory_cache/__init__.py +0 -1
- autocoder/common/directory_cache/cache.py +0 -192
- autocoder/common/directory_cache/test_cache.py +0 -190
- autocoder/common/file_checkpoint/examples.py +0 -217
- autocoder/common/llm_friendly_package_example.py +0 -138
- autocoder/common/llm_friendly_package_test.py +0 -63
- autocoder/common/pull_requests/test_module.py +0 -1
- autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
- autocoder/common/text.py +0 -30
- autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
- autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
- autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
- autocoder/common/v2/agent/agentic_tool_display.py +0 -183
- autocoder/plugins/dynamic_completion_example.py +0 -148
- autocoder/plugins/sample_plugin.py +0 -160
- autocoder/sdk/cli/__main__.py +0 -26
- autocoder/sdk/cli/completion_wrapper.py +0 -38
- autocoder/sdk/cli/install_completion.py +0 -301
- autocoder/sdk/models/messages.py +0 -209
- autocoder/sdk/session/__init__.py +0 -32
- autocoder/sdk/session/session.py +0 -106
- autocoder/sdk/session/session_manager.py +0 -56
- {auto_coder-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
- /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
|
-
#
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
"
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
177
|
-
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
for
|
|
192
|
-
if "
|
|
193
|
-
|
|
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
|
-
|
|
201
|
-
|
|
99
|
+
lm = _get_llm_manager()
|
|
100
|
+
model = lm.get_model(name.strip())
|
|
202
101
|
|
|
203
|
-
if
|
|
102
|
+
if not model:
|
|
204
103
|
raise Exception(get_message_with_format("model_not_found", model_name=name))
|
|
205
|
-
|
|
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
|
-
|
|
234
|
-
|
|
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
|
-
|
|
270
|
-
|
|
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
|
-
|
|
291
|
-
|
|
292
|
-
for
|
|
293
|
-
|
|
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
|
-
|
|
306
|
-
return
|
|
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
|
-
|
|
197
|
+
lm = _get_llm_manager()
|
|
321
198
|
|
|
322
|
-
#
|
|
323
|
-
|
|
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
|
-
|
|
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
|
-
|
|
235
|
+
lm = _get_llm_manager()
|
|
380
236
|
|
|
381
|
-
#
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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
|
|
416
|
-
|
|
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}]
|
|
48
|
+
print(f"[{self.name}] {get_message('git_not_available_warning')}")
|
|
47
49
|
return True
|
|
48
50
|
|
|
49
|
-
print(f"[{self.name}]
|
|
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, "
|
|
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,
|
|
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, "", "
|
|
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"
|
|
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("
|
|
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"
|
|
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"
|
|
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("
|
|
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"
|
|
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"
|
|
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"
|
|
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"
|
|
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"
|
|
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(
|
|
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(
|
|
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(
|
|
248
|
+
print(get_message_with_format("reset_success", mode=mode, commit=commit))
|
|
247
249
|
else:
|
|
248
|
-
print(f"
|
|
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}]
|
|
254
|
+
print(f"[{self.name}] {get_message('git_helper_shutdown')}")
|