auto-coder 0.1.251__tar.gz → 0.1.253__tar.gz

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 (162) hide show
  1. {auto_coder-0.1.251 → auto_coder-0.1.253}/PKG-INFO +2 -2
  2. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/auto_coder.egg-info/PKG-INFO +2 -2
  3. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/auto_coder.egg-info/SOURCES.txt +2 -0
  4. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/auto_coder.egg-info/requires.txt +1 -1
  5. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/auto_coder.py +32 -7
  6. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/auto_coder_rag.py +198 -35
  7. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/chat_auto_coder.py +73 -19
  8. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/chat_auto_coder_lang.py +21 -3
  9. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/__init__.py +2 -0
  10. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/auto_coder_lang.py +6 -4
  11. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/code_auto_merge.py +1 -1
  12. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/code_auto_merge_diff.py +1 -1
  13. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/code_auto_merge_editblock.py +1 -1
  14. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/code_auto_merge_strict_diff.py +1 -1
  15. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/code_modification_ranker.py +3 -3
  16. auto_coder-0.1.253/src/autocoder/common/global_cancel.py +21 -0
  17. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/mcp_server.py +3 -4
  18. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +1 -1
  19. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/dispacher/actions/action.py +29 -8
  20. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +17 -5
  21. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/index/filter/quick_filter.py +4 -6
  22. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/index/index.py +13 -6
  23. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/models.py +87 -6
  24. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/doc_filter.py +2 -4
  25. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/long_context_rag.py +8 -6
  26. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/token_limiter.py +1 -3
  27. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/auto_coder_utils/chat_stream_out.py +40 -17
  28. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/llms.py +15 -1
  29. auto_coder-0.1.253/src/autocoder/utils/thread_utils.py +201 -0
  30. auto_coder-0.1.253/src/autocoder/version.py +1 -0
  31. auto_coder-0.1.251/src/autocoder/version.py +0 -1
  32. {auto_coder-0.1.251 → auto_coder-0.1.253}/LICENSE +0 -0
  33. {auto_coder-0.1.251 → auto_coder-0.1.253}/README.md +0 -0
  34. {auto_coder-0.1.251 → auto_coder-0.1.253}/setup.cfg +0 -0
  35. {auto_coder-0.1.251 → auto_coder-0.1.253}/setup.py +0 -0
  36. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/auto_coder.egg-info/dependency_links.txt +0 -0
  37. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/auto_coder.egg-info/entry_points.txt +0 -0
  38. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/auto_coder.egg-info/top_level.txt +0 -0
  39. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/__init__.py +0 -0
  40. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/agent/__init__.py +0 -0
  41. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/agent/auto_demand_organizer.py +0 -0
  42. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/agent/auto_filegroup.py +0 -0
  43. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/agent/auto_guess_query.py +0 -0
  44. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/agent/auto_review_commit.py +0 -0
  45. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/agent/auto_tool.py +0 -0
  46. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/agent/coder.py +0 -0
  47. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/agent/designer.py +0 -0
  48. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/agent/planner.py +0 -0
  49. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/agent/project_reader.py +0 -0
  50. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/auto_coder_rag_client_mcp.py +0 -0
  51. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/auto_coder_rag_mcp.py +0 -0
  52. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/auto_coder_server.py +0 -0
  53. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/benchmark.py +0 -0
  54. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/chat/__init__.py +0 -0
  55. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/command_args.py +0 -0
  56. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/JupyterClient.py +0 -0
  57. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/ShellClient.py +0 -0
  58. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/anything2images.py +0 -0
  59. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/anything2img.py +0 -0
  60. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/audio.py +0 -0
  61. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/buildin_tokenizer.py +0 -0
  62. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/chunk_validation.py +0 -0
  63. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/cleaner.py +0 -0
  64. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/code_auto_execute.py +0 -0
  65. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/code_auto_generate.py +0 -0
  66. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/code_auto_generate_diff.py +0 -0
  67. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
  68. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
  69. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/command_completer.py +0 -0
  70. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/command_generator.py +0 -0
  71. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/command_templates.py +0 -0
  72. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/const.py +0 -0
  73. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/files.py +0 -0
  74. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/git_utils.py +0 -0
  75. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/image_to_page.py +0 -0
  76. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/interpreter.py +0 -0
  77. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/llm_rerank.py +0 -0
  78. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/mcp_hub.py +0 -0
  79. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/mcp_servers/__init__.py +0 -0
  80. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/mcp_tools.py +0 -0
  81. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/memory_manager.py +0 -0
  82. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/printer.py +0 -0
  83. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/recall_validation.py +0 -0
  84. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/screenshots.py +0 -0
  85. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/search.py +0 -0
  86. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/search_replace.py +0 -0
  87. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/shells.py +0 -0
  88. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/sys_prompt.py +0 -0
  89. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/text.py +0 -0
  90. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/types.py +0 -0
  91. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/common/utils_code_auto_generate.py +0 -0
  92. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/data/tokenizer.json +0 -0
  93. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/db/__init__.py +0 -0
  94. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/db/store.py +0 -0
  95. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/dispacher/__init__.py +0 -0
  96. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/dispacher/actions/__init__.py +0 -0
  97. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/dispacher/actions/copilot.py +0 -0
  98. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
  99. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/dispacher/actions/plugins/action_translate.py +0 -0
  100. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/index/__init__.py +0 -0
  101. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/index/entry.py +0 -0
  102. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/index/filter/__init__.py +0 -0
  103. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/index/filter/normal_filter.py +0 -0
  104. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/index/for_command.py +0 -0
  105. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/index/symbols_utils.py +0 -0
  106. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/index/types.py +0 -0
  107. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/lang.py +0 -0
  108. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/pyproject/__init__.py +0 -0
  109. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/__init__.py +0 -0
  110. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/api_server.py +0 -0
  111. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/cache/__init__.py +0 -0
  112. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/cache/base_cache.py +0 -0
  113. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/cache/byzer_storage_cache.py +0 -0
  114. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/cache/file_monitor_cache.py +0 -0
  115. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/cache/simple_cache.py +0 -0
  116. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/document_retriever.py +0 -0
  117. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/llm_wrapper.py +0 -0
  118. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/loaders/__init__.py +0 -0
  119. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/loaders/docx_loader.py +0 -0
  120. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/loaders/excel_loader.py +0 -0
  121. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
  122. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
  123. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/rag_config.py +0 -0
  124. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/rag_entry.py +0 -0
  125. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/raw_rag.py +0 -0
  126. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/relevant_utils.py +0 -0
  127. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/simple_directory_reader.py +0 -0
  128. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/simple_rag.py +0 -0
  129. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/stream_event/__init__.py +0 -0
  130. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/stream_event/event_writer.py +0 -0
  131. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/stream_event/types.py +0 -0
  132. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/token_checker.py +0 -0
  133. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/token_counter.py +0 -0
  134. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/types.py +0 -0
  135. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/utils.py +0 -0
  136. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/rag/variable_holder.py +0 -0
  137. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/regexproject/__init__.py +0 -0
  138. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/suffixproject/__init__.py +0 -0
  139. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/tsproject/__init__.py +0 -0
  140. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/__init__.py +0 -0
  141. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/_markitdown.py +0 -0
  142. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/auto_coder_utils/__init__.py +0 -0
  143. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/chat_auto_coder_utils/__init__.py +0 -0
  144. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/conversation_store.py +0 -0
  145. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/llm_client_interceptors.py +0 -0
  146. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/log_capture.py +0 -0
  147. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/multi_turn.py +0 -0
  148. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/operate_config_api.py +0 -0
  149. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/print_table.py +0 -0
  150. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/queue_communicate.py +0 -0
  151. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/request_event_queue.py +0 -0
  152. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/request_queue.py +0 -0
  153. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/rest.py +0 -0
  154. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/tests.py +0 -0
  155. {auto_coder-0.1.251 → auto_coder-0.1.253}/src/autocoder/utils/types.py +0 -0
  156. {auto_coder-0.1.251 → auto_coder-0.1.253}/tests/test_action_regex_project.py +0 -0
  157. {auto_coder-0.1.251 → auto_coder-0.1.253}/tests/test_chat_auto_coder.py +0 -0
  158. {auto_coder-0.1.251 → auto_coder-0.1.253}/tests/test_code_auto_merge_editblock.py +0 -0
  159. {auto_coder-0.1.251 → auto_coder-0.1.253}/tests/test_command_completer.py +0 -0
  160. {auto_coder-0.1.251 → auto_coder-0.1.253}/tests/test_planner.py +0 -0
  161. {auto_coder-0.1.251 → auto_coder-0.1.253}/tests/test_queue_communicate.py +0 -0
  162. {auto_coder-0.1.251 → auto_coder-0.1.253}/tests/test_symbols_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.251
3
+ Version: 0.1.253
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -26,7 +26,7 @@ Requires-Dist: tabulate
26
26
  Requires-Dist: jupyter_client
27
27
  Requires-Dist: prompt-toolkit
28
28
  Requires-Dist: tokenizers
29
- Requires-Dist: byzerllm[saas]>=0.1.161
29
+ Requires-Dist: byzerllm[saas]>=0.1.163
30
30
  Requires-Dist: patch
31
31
  Requires-Dist: diff_match_patch
32
32
  Requires-Dist: GitPython
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.251
3
+ Version: 0.1.253
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -26,7 +26,7 @@ Requires-Dist: tabulate
26
26
  Requires-Dist: jupyter_client
27
27
  Requires-Dist: prompt-toolkit
28
28
  Requires-Dist: tokenizers
29
- Requires-Dist: byzerllm[saas]>=0.1.161
29
+ Requires-Dist: byzerllm[saas]>=0.1.163
30
30
  Requires-Dist: patch
31
31
  Requires-Dist: diff_match_patch
32
32
  Requires-Dist: GitPython
@@ -57,6 +57,7 @@ src/autocoder/common/command_templates.py
57
57
  src/autocoder/common/const.py
58
58
  src/autocoder/common/files.py
59
59
  src/autocoder/common/git_utils.py
60
+ src/autocoder/common/global_cancel.py
60
61
  src/autocoder/common/image_to_page.py
61
62
  src/autocoder/common/interpreter.py
62
63
  src/autocoder/common/llm_rerank.py
@@ -144,6 +145,7 @@ src/autocoder/utils/request_event_queue.py
144
145
  src/autocoder/utils/request_queue.py
145
146
  src/autocoder/utils/rest.py
146
147
  src/autocoder/utils/tests.py
148
+ src/autocoder/utils/thread_utils.py
147
149
  src/autocoder/utils/types.py
148
150
  src/autocoder/utils/auto_coder_utils/__init__.py
149
151
  src/autocoder/utils/auto_coder_utils/chat_stream_out.py
@@ -16,7 +16,7 @@ tabulate
16
16
  jupyter_client
17
17
  prompt-toolkit
18
18
  tokenizers
19
- byzerllm[saas]>=0.1.161
19
+ byzerllm[saas]>=0.1.163
20
20
  patch
21
21
  diff_match_patch
22
22
  GitPython
@@ -6,6 +6,7 @@ from autocoder.common import git_utils, code_auto_execute
6
6
  from autocoder.utils.llm_client_interceptors import token_counter_interceptor
7
7
  from autocoder.db.store import Store
8
8
 
9
+ from autocoder.utils.llms import get_llm_names
9
10
  from autocoder.utils.queue_communicate import (
10
11
  queue_communicate,
11
12
  CommunicateEvent,
@@ -765,6 +766,23 @@ def main(input_args: Optional[List[str]] = None):
765
766
  )
766
767
  llm.setup_sub_client("planner_model", planner_model)
767
768
 
769
+ if args.commit_model:
770
+ model_name = args.commit_model.strip()
771
+ model_info = models_module.get_model_by_name(model_name)
772
+ commit_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
773
+ commit_model.deploy(
774
+ model_path="",
775
+ pretrained_model_type=model_info["model_type"],
776
+ udf_name=model_name,
777
+ infer_params={
778
+ "saas.base_url": model_info["base_url"],
779
+ "saas.api_key": model_info["api_key"],
780
+ "saas.model": model_info["model_name"],
781
+ "saas.is_reasoning": model_info["is_reasoning"]
782
+ }
783
+ )
784
+ llm.setup_sub_client("commit_model", commit_model)
785
+
768
786
  if args.designer_model:
769
787
  model_name = args.designer_model.strip()
770
788
  model_info = models_module.get_model_by_name(model_name)
@@ -875,6 +893,11 @@ def main(input_args: Optional[List[str]] = None):
875
893
  designer_model.setup_default_model_name(args.designer_model)
876
894
  llm.setup_sub_client("designer_model", designer_model)
877
895
 
896
+ if args.commit_model:
897
+ commit_model = byzerllm.ByzerLLM()
898
+ commit_model.setup_default_model_name(args.commit_model)
899
+ llm.setup_sub_client("commit_model", commit_model)
900
+
878
901
  else:
879
902
  llm = None
880
903
 
@@ -1086,8 +1109,7 @@ def main(input_args: Optional[List[str]] = None):
1086
1109
  return
1087
1110
 
1088
1111
  elif raw_args.agent_command == "chat":
1089
- from autocoder.rag.rag_entry import RAGFactory
1090
-
1112
+
1091
1113
  memory_dir = os.path.join(args.source_dir, ".auto-coder", "memory")
1092
1114
  os.makedirs(memory_dir, exist_ok=True)
1093
1115
  memory_file = os.path.join(memory_dir, "chat_history.json")
@@ -1312,6 +1334,7 @@ def main(input_args: Optional[List[str]] = None):
1312
1334
  start_time = time.time()
1313
1335
 
1314
1336
  if "rag" in args.action:
1337
+ from autocoder.rag.rag_entry import RAGFactory
1315
1338
  args.enable_rag_search = True
1316
1339
  args.enable_rag_context = False
1317
1340
  rag = RAGFactory.get_rag(llm=chat_llm, args=args, path="")
@@ -1325,7 +1348,8 @@ def main(input_args: Optional[List[str]] = None):
1325
1348
  response = mcp_server.send_request(
1326
1349
  McpRequest(
1327
1350
  query=args.query,
1328
- model=args.inference_model or args.model
1351
+ model=args.inference_model or args.model,
1352
+ product_mode=args.product_mode
1329
1353
  )
1330
1354
  )
1331
1355
  v = [[response.result,None]]
@@ -1348,9 +1372,7 @@ def main(input_args: Optional[List[str]] = None):
1348
1372
  )
1349
1373
 
1350
1374
 
1351
- model_name = getattr(chat_llm, 'default_model_name', None)
1352
- if not model_name:
1353
- model_name = "unknown(without default model name)"
1375
+ model_name = ",".join(get_llm_names(chat_llm))
1354
1376
 
1355
1377
  assistant_response, last_meta = stream_out(
1356
1378
  v,
@@ -1364,10 +1386,13 @@ def main(input_args: Optional[List[str]] = None):
1364
1386
  if last_meta:
1365
1387
  elapsed_time = time.time() - start_time
1366
1388
  printer = Printer()
1389
+ speed = last_meta.generated_tokens_count / elapsed_time
1367
1390
  printer.print_in_terminal("stream_out_stats",
1368
1391
  elapsed_time=elapsed_time,
1392
+ first_token_time=last_meta.first_token_time,
1369
1393
  input_tokens=last_meta.input_tokens_count,
1370
- output_tokens=last_meta.generated_tokens_count)
1394
+ output_tokens=last_meta.generated_tokens_count,
1395
+ speed=round(speed, 2))
1371
1396
 
1372
1397
  chat_history["ask_conversation"].append(
1373
1398
  {"role": "assistant", "content": assistant_response}
@@ -32,7 +32,10 @@ if platform.system() == "Windows":
32
32
  init()
33
33
 
34
34
 
35
- def initialize_system():
35
+ def initialize_system(args):
36
+ if args.product_mode == "lite":
37
+ return
38
+
36
39
  print(f"\n\033[1;34m{get_message('initializing')}\033[0m")
37
40
 
38
41
  def print_status(message, status):
@@ -316,13 +319,30 @@ def main(input_args: Optional[List[str]] = None):
316
319
  action="store_true",
317
320
  help="Whether to return responses without contexts. only works when pro plugin is installed",
318
321
  )
319
- serve_parser.add_argument(
320
- "--data_cells_max_num",
322
+
323
+ serve_parser.add_argument("--data_cells_max_num",
321
324
  type=int,
322
325
  default=2000,
323
326
  help="Maximum number of data cells to process",
324
327
  )
325
328
 
329
+ serve_parser.add_argument(
330
+ "--product_mode",
331
+ type=str,
332
+ default="pro",
333
+ help="The mode of the auto-coder.rag, lite/pro default is pro",
334
+ )
335
+ serve_parser.add_argument(
336
+ "--lite",
337
+ action="store_true",
338
+ help="Run in lite mode (equivalent to --product_mode=lite)",
339
+ )
340
+ serve_parser.add_argument(
341
+ "--pro",
342
+ action="store_true",
343
+ help="Run in pro mode (equivalent to --product_mode=pro)",
344
+ )
345
+
326
346
  serve_parser.add_argument(
327
347
  "--recall_model",
328
348
  default="",
@@ -373,6 +393,22 @@ def main(input_args: Optional[List[str]] = None):
373
393
  # Tools command
374
394
  tools_parser = subparsers.add_parser("tools", help="Various tools")
375
395
  tools_subparsers = tools_parser.add_subparsers(dest="tool", help="Available tools")
396
+ tools_parser.add_argument(
397
+ "--product_mode",
398
+ type=str,
399
+ default="pro",
400
+ help="The mode of the auto-coder.rag, lite/pro default is pro",
401
+ )
402
+ tools_parser.add_argument(
403
+ "--lite",
404
+ action="store_true",
405
+ help="Run in lite mode (equivalent to --product_mode=lite)",
406
+ )
407
+ tools_parser.add_argument(
408
+ "--pro",
409
+ action="store_true",
410
+ help="Run in pro mode (equivalent to --product_mode=pro)",
411
+ )
376
412
 
377
413
  # Count tool
378
414
  count_parser = tools_subparsers.add_parser("count", help="Count tokens in a file")
@@ -431,8 +467,15 @@ def main(input_args: Optional[List[str]] = None):
431
467
  benchmark_byzerllm(args.model, args.parallel, args.rounds, args.query)
432
468
 
433
469
  elif args.command == "serve":
470
+ # Handle lite/pro flags
471
+ if args.lite:
472
+ args.product_mode = "lite"
473
+ elif args.pro:
474
+ args.product_mode = "pro"
475
+
434
476
  if not args.quick:
435
- initialize_system()
477
+ initialize_system(args)
478
+
436
479
  server_args = ServerArgs(
437
480
  **{
438
481
  arg: getattr(args, arg)
@@ -448,7 +491,11 @@ def main(input_args: Optional[List[str]] = None):
448
491
  }
449
492
  )
450
493
 
451
- if auto_coder_args.enable_hybrid_index:
494
+
495
+ if auto_coder_args.enable_hybrid_index and args.product_mode == "lite":
496
+ raise Exception("Hybrid index is not supported in lite mode")
497
+
498
+ if auto_coder_args.enable_hybrid_index and args.product_mode == "pro":
452
499
  # 尝试连接storage
453
500
  try:
454
501
  from byzerllm.apps.byzer_storage.simple_api import ByzerStorage
@@ -460,36 +507,107 @@ def main(input_args: Optional[List[str]] = None):
460
507
  "When enable_hybrid_index is true, ByzerStorage must be started"
461
508
  )
462
509
  logger.error("Please run 'byzerllm storage start' first")
463
- return
464
- else:
465
- byzerllm.connect_cluster(address=args.ray_address)
466
- llm = byzerllm.ByzerLLM()
467
- llm.setup_default_model_name(args.model)
468
-
469
- # Setup sub models if specified
470
- if args.recall_model:
471
- recall_model = byzerllm.ByzerLLM()
472
- recall_model.setup_default_model_name(args.recall_model)
473
- llm.setup_sub_client("recall_model", recall_model)
474
-
475
- if args.chunk_model:
476
- chunk_model = byzerllm.ByzerLLM()
477
- chunk_model.setup_default_model_name(args.chunk_model)
478
- llm.setup_sub_client("chunk_model", chunk_model)
510
+ return
511
+
512
+
479
513
 
480
- if args.qa_model:
481
- qa_model = byzerllm.ByzerLLM()
482
- qa_model.setup_default_model_name(args.qa_model)
483
- llm.setup_sub_client("qa_model", qa_model)
514
+ if args.product_mode == "pro":
515
+ byzerllm.connect_cluster(address=args.ray_address)
516
+ llm = byzerllm.ByzerLLM()
517
+ llm.skip_nontext_check = True
518
+ llm.setup_default_model_name(args.model)
519
+
520
+ # Setup sub models if specified
521
+ if args.recall_model:
522
+ recall_model = byzerllm.ByzerLLM()
523
+ recall_model.setup_default_model_name(args.recall_model)
524
+ recall_model.skip_nontext_check = True
525
+ llm.setup_sub_client("recall_model", recall_model)
526
+
527
+ if args.chunk_model:
528
+ chunk_model = byzerllm.ByzerLLM()
529
+ chunk_model.setup_default_model_name(args.chunk_model)
530
+ llm.setup_sub_client("chunk_model", chunk_model)
531
+
532
+ if args.qa_model:
533
+ qa_model = byzerllm.ByzerLLM()
534
+ qa_model.setup_default_model_name(args.qa_model)
535
+ qa_model.skip_nontext_check = True
536
+ llm.setup_sub_client("qa_model", qa_model)
537
+
538
+ # 当启用hybrid_index时,检查必要的组件
539
+ if auto_coder_args.enable_hybrid_index:
540
+ if not llm.is_model_exist("emb"):
541
+ logger.error(
542
+ "When enable_hybrid_index is true, an 'emb' model must be deployed"
543
+ )
544
+ return
545
+ llm.setup_default_emb_model_name("emb")
546
+
547
+ elif args.product_mode == "lite":
548
+ from autocoder import models as models_module
549
+ model_info = models_module.get_model_by_name(args.model)
550
+ llm = byzerllm.SimpleByzerLLM(default_model_name=args.model)
551
+ llm.deploy(
552
+ model_path="",
553
+ pretrained_model_type=model_info["model_type"],
554
+ udf_name=args.model,
555
+ infer_params={
556
+ "saas.base_url": model_info["base_url"],
557
+ "saas.api_key": model_info["api_key"],
558
+ "saas.model": model_info["model_name"],
559
+ "saas.is_reasoning": model_info["is_reasoning"]
560
+ }
561
+ )
484
562
 
485
- # 当启用hybrid_index时,检查必要的组件
486
- if auto_coder_args.enable_hybrid_index:
487
- if not llm.is_model_exist("emb"):
488
- logger.error(
489
- "When enable_hybrid_index is true, an 'emb' model must be deployed"
563
+ # Setup sub models if specified
564
+ if args.recall_model:
565
+ model_info = models_module.get_model_by_name(args.recall_model)
566
+ recall_model = byzerllm.SimpleByzerLLM(default_model_name=args.recall_model)
567
+ recall_model.deploy(
568
+ model_path="",
569
+ pretrained_model_type=model_info["model_type"],
570
+ udf_name=args.recall_model,
571
+ infer_params={
572
+ "saas.base_url": model_info["base_url"],
573
+ "saas.api_key": model_info["api_key"],
574
+ "saas.model": model_info["model_name"],
575
+ "saas.is_reasoning": model_info["is_reasoning"]
576
+ }
490
577
  )
491
- return
492
- llm.setup_default_emb_model_name("emb")
578
+ llm.setup_sub_client("recall_model", recall_model)
579
+
580
+ if args.chunk_model:
581
+ model_info = models_module.get_model_by_name(args.chunk_model)
582
+ chunk_model = byzerllm.SimpleByzerLLM(default_model_name=args.chunk_model)
583
+ chunk_model.deploy(
584
+ model_path="",
585
+ pretrained_model_type=model_info["model_type"],
586
+ udf_name=args.chunk_model,
587
+ infer_params={
588
+ "saas.base_url": model_info["base_url"],
589
+ "saas.api_key": model_info["api_key"],
590
+ "saas.model": model_info["model_name"],
591
+ "saas.is_reasoning": model_info["is_reasoning"]
592
+ }
593
+ )
594
+ llm.setup_sub_client("chunk_model", chunk_model)
595
+
596
+ if args.qa_model:
597
+ model_info = models_module.get_model_by_name(args.qa_model)
598
+ qa_model = byzerllm.SimpleByzerLLM(default_model_name=args.qa_model)
599
+ qa_model.deploy(
600
+ model_path="",
601
+ pretrained_model_type=model_info["model_type"],
602
+ udf_name=args.qa_model,
603
+ infer_params={
604
+ "saas.base_url": model_info["base_url"],
605
+ "saas.api_key": model_info["api_key"],
606
+ "saas.model": model_info["model_name"],
607
+ "saas.is_reasoning": model_info["is_reasoning"]
608
+ }
609
+ )
610
+ llm.setup_sub_client("qa_model", qa_model)
493
611
 
494
612
  if server_args.doc_dir:
495
613
  auto_coder_args.rag_type = "simple"
@@ -577,16 +695,61 @@ def main(input_args: Optional[List[str]] = None):
577
695
  count_tokens(args.tokenizer_path, args.file)
578
696
  elif args.tool == "recall":
579
697
  from .common.recall_validation import validate_recall
580
-
581
- llm = byzerllm.ByzerLLM.from_default_model(args.model)
698
+ from autocoder import models as models_module
699
+
700
+ # Handle lite/pro flags
701
+ if args.lite:
702
+ args.product_mode = "lite"
703
+ elif args.pro:
704
+ args.product_mode = "pro"
705
+
706
+ if args.product_mode == "pro":
707
+ llm = byzerllm.ByzerLLM.from_default_model(args.model)
708
+ else: # lite mode
709
+ model_info = models_module.get_model_by_name(args.model)
710
+ llm = byzerllm.SimpleByzerLLM(default_model_name=args.model)
711
+ llm.deploy(
712
+ model_path="",
713
+ pretrained_model_type=model_info["model_type"],
714
+ udf_name=args.model,
715
+ infer_params={
716
+ "saas.base_url": model_info["base_url"],
717
+ "saas.api_key": model_info["api_key"],
718
+ "saas.model": model_info["model_name"],
719
+ "saas.is_reasoning": model_info["is_reasoning"]
720
+ }
721
+ )
582
722
 
583
723
  content = None if not args.content else [args.content]
584
724
  result = validate_recall(llm, content=content, query=args.query)
585
725
  print(f"Recall Validation Result:\n{result}")
726
+
586
727
  elif args.tool == "chunk":
587
728
  from .common.chunk_validation import validate_chunk
729
+ from autocoder import models as models_module
730
+
731
+ if args.lite:
732
+ args.product_mode = "lite"
733
+ elif args.pro:
734
+ args.product_mode = "pro"
735
+
736
+ if args.product_mode == "pro":
737
+ llm = byzerllm.ByzerLLM.from_default_model(args.model)
738
+ else: # lite mode
739
+ model_info = models_module.get_model_by_name(args.model)
740
+ llm = byzerllm.SimpleByzerLLM(default_model_name=args.model)
741
+ llm.deploy(
742
+ model_path="",
743
+ pretrained_model_type=model_info["model_type"],
744
+ udf_name=args.model,
745
+ infer_params={
746
+ "saas.base_url": model_info["base_url"],
747
+ "saas.api_key": model_info["api_key"],
748
+ "saas.model": model_info["model_name"],
749
+ "saas.is_reasoning": model_info["is_reasoning"]
750
+ }
751
+ )
588
752
 
589
- llm = byzerllm.ByzerLLM.from_default_model(args.model)
590
753
  content = None if not args.content else [args.content]
591
754
  result = validate_chunk(llm, content=content, query=args.query)
592
755
  print(f"Chunk Model Validation Result:\n{result}")
@@ -49,12 +49,12 @@ from autocoder.common.mcp_server import get_mcp_server, McpRequest, McpInstallRe
49
49
  import byzerllm
50
50
  from byzerllm.utils import format_str_jinja2
51
51
  from autocoder.common.memory_manager import get_global_memory_file_paths
52
- from autocoder import models
52
+ from autocoder import models as models_module
53
53
  import shlex
54
54
  from autocoder.utils.llms import get_single_llm
55
55
  import pkg_resources
56
56
  from autocoder.common.printer import Printer
57
- from byzerllm.utils.langutil import run_in_thread,run_in_raw_thread
57
+ from autocoder.utils.thread_utils import run_in_thread,run_in_raw_thread
58
58
 
59
59
  class SymbolItem(BaseModel):
60
60
  symbol_name: str
@@ -136,6 +136,8 @@ commands = [
136
136
 
137
137
 
138
138
  def show_help():
139
+ print(f"\033[1m{get_message('official_doc')}\033[0m")
140
+ print()
139
141
  print(f"\033[1m{get_message('supported_commands')}\033[0m")
140
142
  print()
141
143
  print(
@@ -1537,11 +1539,12 @@ def mcp(query: str):
1537
1539
  if os.path.exists(temp_yaml):
1538
1540
  os.remove(temp_yaml)
1539
1541
 
1540
- mcp_server = get_mcp_server()
1542
+ mcp_server = get_mcp_server()
1541
1543
  response = mcp_server.send_request(
1542
1544
  McpRequest(
1543
1545
  query=query,
1544
- model=args.inference_model or args.model
1546
+ model=args.inference_model or args.model,
1547
+ product_mode=args.product_mode
1545
1548
  )
1546
1549
  )
1547
1550
 
@@ -1562,19 +1565,19 @@ def mcp(query: str):
1562
1565
  file_path = os.path.join(mcp_dir, f"{timestamp}.md")
1563
1566
 
1564
1567
  # Format response as markdown
1565
- markdown_content = f"# {printer.get_message_from_key('mcp_response_title')}\n\n{response.result}"
1568
+ markdown_content = response.result
1566
1569
 
1567
1570
  # Save to file
1568
1571
  with open(file_path, "w", encoding="utf-8") as f:
1569
1572
  f.write(markdown_content)
1570
1573
 
1571
- # Print with markdown formatting
1572
- printer.print_panel(
1573
- Markdown(markdown_content),
1574
- text_options={"justify": "left"},
1575
- panel_options={
1576
- "border_style": "green"
1577
- }
1574
+ console = Console()
1575
+ console.print(
1576
+ Panel(
1577
+ Markdown(markdown_content, justify="left"),
1578
+ title=printer.get_message_from_key('mcp_response_title'),
1579
+ border_style="green"
1580
+ )
1578
1581
  )
1579
1582
 
1580
1583
 
@@ -1713,7 +1716,7 @@ def commit(query: str):
1713
1716
  if os.path.exists(temp_yaml):
1714
1717
  os.remove(temp_yaml)
1715
1718
 
1716
- target_model = args.code_model or args.model
1719
+ target_model = args.commit_model or args.model
1717
1720
  llm = get_single_llm(target_model, product_mode)
1718
1721
  printer = Printer()
1719
1722
  printer.print_in_terminal("commit_generating", style="yellow", model_name=target_model)
@@ -1739,7 +1742,7 @@ def commit(query: str):
1739
1742
  md5 = hashlib.md5(file_content.encode("utf-8")).hexdigest()
1740
1743
  file_name = os.path.basename(execute_file)
1741
1744
  commit_result = git_utils.commit_changes(
1742
- ".", f"auto_coder_{file_name}_{md5}"
1745
+ ".", f"auto_coder_{file_name}_{md5}\n{commit_message}"
1743
1746
  )
1744
1747
  git_utils.print_commit_info(commit_result=commit_result)
1745
1748
  if commit_message:
@@ -2171,7 +2174,7 @@ def manage_models(params, query: str):
2171
2174
  printer.print_in_terminal("models_lite_only", style="red")
2172
2175
  return
2173
2176
 
2174
- models_data = models.load_models()
2177
+ models_data = models_module.load_models()
2175
2178
  subcmd = ""
2176
2179
  if "/list" in query:
2177
2180
  subcmd = "/list"
@@ -2208,6 +2211,9 @@ def manage_models(params, query: str):
2208
2211
  table.add_column("Name", style="cyan", width=40, no_wrap=False)
2209
2212
  table.add_column("Model Name", style="magenta", width=30, overflow="fold")
2210
2213
  table.add_column("Base URL", style="white", width=50, overflow="fold")
2214
+ table.add_column("Input Price (M)", style="magenta", width=15)
2215
+ table.add_column("Output Price (M)", style="magenta", width=15)
2216
+ table.add_column("Speed (s/req)", style="blue", width=15)
2211
2217
  for m in models_data:
2212
2218
  # Check if api_key_path exists and file exists
2213
2219
  is_api_key_set = "api_key" in m
@@ -2221,19 +2227,67 @@ def manage_models(params, query: str):
2221
2227
  table.add_row(
2222
2228
  name,
2223
2229
  m.get("model_name", ""),
2224
- m.get("base_url", "")
2230
+ m.get("base_url", ""),
2231
+ f"{m.get('input_price', 0.0):.2f}",
2232
+ f"{m.get('output_price', 0.0):.2f}",
2233
+ f"{m.get('average_speed', 0.0):.3f}"
2225
2234
  )
2226
2235
  console.print(table)
2227
2236
  else:
2228
2237
  printer.print_in_terminal("models_no_models", style="yellow")
2229
2238
 
2239
+ elif subcmd == "/input_price":
2240
+ args = query.strip().split()
2241
+ if len(args) >= 2:
2242
+ name = args[0]
2243
+ try:
2244
+ price = float(args[1])
2245
+ if models_module.update_model_input_price(name, price):
2246
+ printer.print_in_terminal("models_input_price_updated", style="green", name=name, price=price)
2247
+ else:
2248
+ printer.print_in_terminal("models_not_found", style="red", name=name)
2249
+ except ValueError as e:
2250
+ printer.print_in_terminal("models_invalid_price", style="red", error=str(e))
2251
+ else:
2252
+ printer.print_in_terminal("models_input_price_usage", style="red")
2253
+
2254
+ elif subcmd == "/output_price":
2255
+ args = query.strip().split()
2256
+ if len(args) >= 2:
2257
+ name = args[0]
2258
+ try:
2259
+ price = float(args[1])
2260
+ if models_module.update_model_output_price(name, price):
2261
+ printer.print_in_terminal("models_output_price_updated", style="green", name=name, price=price)
2262
+ else:
2263
+ printer.print_in_terminal("models_not_found", style="red", name=name)
2264
+ except ValueError as e:
2265
+ printer.print_in_terminal("models_invalid_price", style="red", error=str(e))
2266
+ else:
2267
+ printer.print_in_terminal("models_output_price_usage", style="red")
2268
+
2269
+ elif subcmd == "/speed":
2270
+ args = query.strip().split()
2271
+ if len(args) >= 2:
2272
+ name = args[0]
2273
+ try:
2274
+ speed = float(args[1])
2275
+ if models_module.update_model_speed(name, speed):
2276
+ printer.print_in_terminal("models_speed_updated", style="green", name=name, speed=speed)
2277
+ else:
2278
+ printer.print_in_terminal("models_not_found", style="red", name=name)
2279
+ except ValueError as e:
2280
+ printer.print_in_terminal("models_invalid_speed", style="red", error=str(e))
2281
+ else:
2282
+ printer.print_in_terminal("models_speed_usage", style="red")
2283
+
2230
2284
  elif subcmd == "/add":
2231
2285
  # Support both simplified and legacy formats
2232
2286
  args = query.strip().split(" ")
2233
2287
  if len(args) == 2:
2234
2288
  # Simplified: /models /add <name> <api_key>
2235
2289
  name, api_key = args[0], args[1]
2236
- result = models.update_model_with_api_key(name, api_key)
2290
+ result = models_module.update_model_with_api_key(name, api_key)
2237
2291
  if result:
2238
2292
  printer.print_in_terminal("models_added", style="green", name=name)
2239
2293
  else:
@@ -2275,7 +2329,7 @@ def manage_models(params, query: str):
2275
2329
  }
2276
2330
 
2277
2331
  models_data.append(final_model)
2278
- models.save_models(models_data)
2332
+ models_module.save_models(models_data)
2279
2333
  printer.print_in_terminal("models_add_model_success", style="green", name=data_dict["name"])
2280
2334
 
2281
2335
  elif subcmd == "/remove":
@@ -2288,7 +2342,7 @@ def manage_models(params, query: str):
2288
2342
  if len(filtered_models) == len(models_data):
2289
2343
  printer.print_in_terminal("models_add_model_remove", style="yellow", name=name)
2290
2344
  return
2291
- models.save_models(filtered_models)
2345
+ models_module.save_models(filtered_models)
2292
2346
  printer.print_in_terminal("models_add_model_removed", style="green", name=name)
2293
2347
 
2294
2348
  else: