jarvis-ai-assistant 0.1.224__tar.gz → 0.2.0__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.
Files changed (117) hide show
  1. {jarvis_ai_assistant-0.1.224/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.2.0}/PKG-INFO +49 -12
  2. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/README.md +47 -10
  3. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/pyproject.toml +6 -2
  4. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/setup.py +2 -2
  5. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/__init__.py +1 -1
  6. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_agent/__init__.py +33 -11
  7. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_agent/jarvis.py +87 -32
  8. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_agent/main.py +13 -2
  9. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_agent/code_agent.py +17 -4
  10. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/loader.py +20 -6
  11. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/code_review.py +14 -3
  12. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_data/config_schema.json +41 -0
  13. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_git_utils/git_commiter.py +9 -2
  14. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_mcp/sse_mcp_client.py +9 -7
  15. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +2 -2
  16. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_platform/base.py +28 -13
  17. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_platform_manager/main.py +18 -6
  18. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_rag/llm_interface.py +1 -3
  19. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_smart_shell/main.py +18 -12
  20. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_tools/ask_user.py +1 -0
  21. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_tools/generate_new_tool.py +1 -0
  22. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_tools/registry.py +17 -9
  23. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_tools/search_web.py +19 -9
  24. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -1
  25. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_utils/config.py +80 -21
  26. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_utils/git_utils.py +2 -2
  27. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_utils/globals.py +17 -11
  28. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_utils/methodology.py +37 -23
  29. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_utils/output.py +2 -2
  30. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_utils/utils.py +138 -3
  31. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0/src/jarvis_ai_assistant.egg-info}/PKG-INFO +49 -12
  32. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis_ai_assistant.egg-info/requires.txt +1 -1
  33. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/LICENSE +0 -0
  34. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/MANIFEST.in +0 -0
  35. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/setup.cfg +0 -0
  36. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  37. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_agent/edit_file_handler.py +0 -0
  38. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  39. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_agent/prompt_builder.py +0 -0
  40. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_agent/prompts.py +0 -0
  41. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_agent/protocols.py +0 -0
  42. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_agent/session_manager.py +0 -0
  43. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  44. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_agent/tool_executor.py +0 -0
  45. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  46. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_agent/lint.py +0 -0
  47. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  48. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  49. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  50. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  51. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  52. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  53. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  54. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  55. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  56. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  57. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  58. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  59. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  60. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  61. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  62. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  63. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  64. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  65. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  66. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  67. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_git_details/__init__.py +0 -0
  68. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_git_details/main.py +0 -0
  69. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  70. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_git_squash/main.py +0 -0
  71. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  72. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
  73. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_methodology/main.py +0 -0
  74. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  75. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  76. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_platform/__init__.py +0 -0
  77. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_platform/ai8.py +0 -0
  78. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_platform/human.py +0 -0
  79. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_platform/kimi.py +0 -0
  80. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_platform/openai.py +0 -0
  81. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_platform/oyi.py +0 -0
  82. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_platform/registry.py +0 -0
  83. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_platform/tongyi.py +0 -0
  84. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  85. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  86. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_platform_manager/service.py +0 -0
  87. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_rag/__init__.py +0 -0
  88. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_rag/cache.py +0 -0
  89. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_rag/cli.py +0 -0
  90. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_rag/embedding_manager.py +0 -0
  91. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_rag/query_rewriter.py +0 -0
  92. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_rag/rag_pipeline.py +0 -0
  93. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_rag/reranker.py +0 -0
  94. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_rag/retriever.py +0 -0
  95. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  96. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_tools/__init__.py +0 -0
  97. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_tools/base.py +0 -0
  98. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
  99. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_tools/cli/main.py +0 -0
  100. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_tools/edit_file.py +0 -0
  101. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  102. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  103. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_tools/methodology.py +0 -0
  104. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_tools/read_code.py +0 -0
  105. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  106. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
  107. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  108. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_utils/__init__.py +0 -0
  109. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_utils/embedding.py +0 -0
  110. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  111. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_utils/http.py +0 -0
  112. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_utils/input.py +0 -0
  113. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis/jarvis_utils/tag.py +0 -0
  114. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +0 -0
  115. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  116. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  117. {jarvis_ai_assistant-0.1.224 → jarvis_ai_assistant-0.2.0}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.224
3
+ Version: 0.2.0
4
4
  Summary: Jarvis: An AI assistant that uses tools to interact with the system
5
5
  Home-page: https://github.com/skyfireitdiy/Jarvis
6
6
  Author: skyfire
@@ -57,8 +57,8 @@ Requires-Dist: pyte==0.8.2
57
57
  Requires-Dist: httpx>=0.28.1
58
58
  Requires-Dist: pyyaml>=5.3.1
59
59
  Requires-Dist: ddgs==9.0.2
60
- Requires-Dist: beautifulsoup4==4.13.4
61
60
  Requires-Dist: lxml==6.0.0
61
+ Requires-Dist: markdownify>=1.1.0
62
62
  Provides-Extra: dev
63
63
  Requires-Dist: pytest; extra == "dev"
64
64
  Requires-Dist: black; extra == "dev"
@@ -158,6 +158,7 @@ jarvis --llm_type thinking -t "初始任务"
158
158
  | `-t/--task` | 直接从命令行输入任务内容 |
159
159
  | `-f/--config` | 自定义配置文件的路径 |
160
160
  | `--restore-session` | 从 .jarvis/saved_session.json 恢复会话 |
161
+ | `-e/--edit` | 编辑配置文件 |
161
162
 
162
163
  #### 4. 工作流程
163
164
  1. 初始化环境
@@ -507,9 +508,9 @@ ENV:
507
508
  #### Kimi
508
509
  ```yaml
509
510
  JARVIS_PLATFORM: kimi
510
- JARVIS_MODEL: kimi
511
+ JARVIS_MODEL: k1.5
511
512
  JARVIS_THINKING_PLATFORM: kimi
512
- JARVIS_THINKING_MODEL: k1
513
+ JARVIS_THINKING_MODEL: k1.5-thinking
513
514
  ENV:
514
515
  KIMI_API_KEY: <Kimi API KEY>
515
516
  ```
@@ -534,19 +535,55 @@ OPENAI_API_KEY: <OpenAI API Key>
534
535
  OPENAI_API_BASE: https://api.openai.com/v1
535
536
  ```
536
537
 
537
- ### 2. 配置项说明
538
+ ### 2. 模型组配置 (高级)
539
+
540
+ 除了单独配置每个模型参数,您还可以定义和使用**模型组**来快速切换不同的模型组合。这对于需要在不同任务或平台间频繁切换的场景非常有用。
541
+
542
+ **配置示例** (`~/.jarvis/config.yaml`):
543
+
544
+ ```yaml
545
+ # 定义模型组
546
+ JARVIS_MODEL_GROUPS:
547
+ - kimi:
548
+ JARVIS_PLATFORM: kimi
549
+ JARVIS_MODEL: k1.5
550
+ JARVIS_THINKING_PLATFORM: kimi
551
+ JARVIS_THINKING_MODEL: k1.5-thinking
552
+ JARVIS_MAX_TOKEN_COUNT: 8192
553
+ - ai8:
554
+ JARVIS_PLATFORM: ai8
555
+ JARVIS_MODEL: gemini-2.5-pro
556
+ # 如果不指定思考模型,将自动使用常规模型
557
+ # JARVIS_THINKING_PLATFORM: ai8
558
+ # JARVIS_THINKING_MODEL: gemini-2.5-pro
559
+
560
+ # 选择要使用的模型组
561
+ JARVIS_MODEL_GROUP: kimi
562
+ ```
563
+
564
+ **配置优先级规则:**
565
+
566
+ Jarvis 会按照以下顺序解析模型配置,序号越小优先级越高:
567
+
568
+ 1. **独立配置**: 直接设置的 `JARVIS_PLATFORM`, `JARVIS_MODEL`, `JARVIS_THINKING_PLATFORM`, `JARVIS_THINKING_MODEL` 环境变量。这些配置会**覆盖**任何模型组中的设置。
569
+ 2. **模型组配置**: 通过 `JARVIS_MODEL_GROUP` 选中的模型组配置。
570
+ 3. **默认值**: 如果以上均未配置,则使用代码中定义的默认模型(如 `yuanbao` 和 `deep_seek_v3`)。
571
+
572
+ ### 3. 全部配置项说明
538
573
  | 变量名称 | 默认值 | 说明 |
539
574
  |----------|--------|------|
540
575
  | `ENV` | {} | 环境变量配置 |
541
- | `JARVIS_MAX_TOKEN_COUNT` | 960000 | 上下文窗口的最大token数量 |
542
- | `JARVIS_MAX_INPUT_TOKEN_COUNT` | 32000 | 输入的最大token数量 |
543
- | `JARVIS_PLATFORM` | yuanbao | 默认AI平台 |
544
- | `JARVIS_MODEL` | deep_seek_v3 | 默认模型 |
545
- | `JARVIS_THINKING_PLATFORM` | JARVIS_PLATFORM | 推理任务使用的平台 |
546
- | `JARVIS_THINKING_MODEL` | JARVIS_MODEL | 推理任务使用的模型 |
576
+ | `JARVIS_MODEL_GROUPS` | `[]` | 预定义的模型配置组列表 |
577
+ | `JARVIS_MODEL_GROUP` | `null` | 选择要激活的模型组名称 |
578
+ | `JARVIS_MAX_TOKEN_COUNT` | 960000 | 上下文窗口的最大token数量 (可被模型组覆盖) |
579
+ | `JARVIS_MAX_INPUT_TOKEN_COUNT` | 32000 | 输入的最大token数量 (可被模型组覆盖) |
580
+ | `JARVIS_PLATFORM` | yuanbao | 默认AI平台 (可被模型组覆盖) |
581
+ | `JARVIS_MODEL` | deep_seek_v3 | 默认模型 (可被模型组覆盖) |
582
+ | `JARVIS_THINKING_PLATFORM` | JARVIS_PLATFORM | 推理任务使用的平台 (可被模型组覆盖) |
583
+ | `JARVIS_THINKING_MODEL` | JARVIS_MODEL | 推理任务使用的模型 (可被模型组覆盖) |
547
584
  | `JARVIS_EXECUTE_TOOL_CONFIRM` | false | 执行工具前是否需要确认 |
548
585
  | `JARVIS_CONFIRM_BEFORE_APPLY_PATCH` | false | 应用补丁前是否需要确认 |
549
- | `JARVIS_MAX_BIG_CONTENT_SIZE` | 160000 | 最大大内容大小 |
586
+ | `JARVIS_MAX_BIG_CONTENT_SIZE` | 160000 | 最大大内容大小 (可被模型组覆盖) |
550
587
  | `JARVIS_PRETTY_OUTPUT` | false | 是否启用PrettyOutput |
551
588
  | `JARVIS_GIT_COMMIT_PROMPT` | "" | 自定义git提交信息生成提示模板 |
552
589
  | `JARVIS_PRINT_PROMPT` | false | 是否打印提示 |
@@ -74,6 +74,7 @@ jarvis --llm_type thinking -t "初始任务"
74
74
  | `-t/--task` | 直接从命令行输入任务内容 |
75
75
  | `-f/--config` | 自定义配置文件的路径 |
76
76
  | `--restore-session` | 从 .jarvis/saved_session.json 恢复会话 |
77
+ | `-e/--edit` | 编辑配置文件 |
77
78
 
78
79
  #### 4. 工作流程
79
80
  1. 初始化环境
@@ -423,9 +424,9 @@ ENV:
423
424
  #### Kimi
424
425
  ```yaml
425
426
  JARVIS_PLATFORM: kimi
426
- JARVIS_MODEL: kimi
427
+ JARVIS_MODEL: k1.5
427
428
  JARVIS_THINKING_PLATFORM: kimi
428
- JARVIS_THINKING_MODEL: k1
429
+ JARVIS_THINKING_MODEL: k1.5-thinking
429
430
  ENV:
430
431
  KIMI_API_KEY: <Kimi API KEY>
431
432
  ```
@@ -450,19 +451,55 @@ OPENAI_API_KEY: <OpenAI API Key>
450
451
  OPENAI_API_BASE: https://api.openai.com/v1
451
452
  ```
452
453
 
453
- ### 2. 配置项说明
454
+ ### 2. 模型组配置 (高级)
455
+
456
+ 除了单独配置每个模型参数,您还可以定义和使用**模型组**来快速切换不同的模型组合。这对于需要在不同任务或平台间频繁切换的场景非常有用。
457
+
458
+ **配置示例** (`~/.jarvis/config.yaml`):
459
+
460
+ ```yaml
461
+ # 定义模型组
462
+ JARVIS_MODEL_GROUPS:
463
+ - kimi:
464
+ JARVIS_PLATFORM: kimi
465
+ JARVIS_MODEL: k1.5
466
+ JARVIS_THINKING_PLATFORM: kimi
467
+ JARVIS_THINKING_MODEL: k1.5-thinking
468
+ JARVIS_MAX_TOKEN_COUNT: 8192
469
+ - ai8:
470
+ JARVIS_PLATFORM: ai8
471
+ JARVIS_MODEL: gemini-2.5-pro
472
+ # 如果不指定思考模型,将自动使用常规模型
473
+ # JARVIS_THINKING_PLATFORM: ai8
474
+ # JARVIS_THINKING_MODEL: gemini-2.5-pro
475
+
476
+ # 选择要使用的模型组
477
+ JARVIS_MODEL_GROUP: kimi
478
+ ```
479
+
480
+ **配置优先级规则:**
481
+
482
+ Jarvis 会按照以下顺序解析模型配置,序号越小优先级越高:
483
+
484
+ 1. **独立配置**: 直接设置的 `JARVIS_PLATFORM`, `JARVIS_MODEL`, `JARVIS_THINKING_PLATFORM`, `JARVIS_THINKING_MODEL` 环境变量。这些配置会**覆盖**任何模型组中的设置。
485
+ 2. **模型组配置**: 通过 `JARVIS_MODEL_GROUP` 选中的模型组配置。
486
+ 3. **默认值**: 如果以上均未配置,则使用代码中定义的默认模型(如 `yuanbao` 和 `deep_seek_v3`)。
487
+
488
+ ### 3. 全部配置项说明
454
489
  | 变量名称 | 默认值 | 说明 |
455
490
  |----------|--------|------|
456
491
  | `ENV` | {} | 环境变量配置 |
457
- | `JARVIS_MAX_TOKEN_COUNT` | 960000 | 上下文窗口的最大token数量 |
458
- | `JARVIS_MAX_INPUT_TOKEN_COUNT` | 32000 | 输入的最大token数量 |
459
- | `JARVIS_PLATFORM` | yuanbao | 默认AI平台 |
460
- | `JARVIS_MODEL` | deep_seek_v3 | 默认模型 |
461
- | `JARVIS_THINKING_PLATFORM` | JARVIS_PLATFORM | 推理任务使用的平台 |
462
- | `JARVIS_THINKING_MODEL` | JARVIS_MODEL | 推理任务使用的模型 |
492
+ | `JARVIS_MODEL_GROUPS` | `[]` | 预定义的模型配置组列表 |
493
+ | `JARVIS_MODEL_GROUP` | `null` | 选择要激活的模型组名称 |
494
+ | `JARVIS_MAX_TOKEN_COUNT` | 960000 | 上下文窗口的最大token数量 (可被模型组覆盖) |
495
+ | `JARVIS_MAX_INPUT_TOKEN_COUNT` | 32000 | 输入的最大token数量 (可被模型组覆盖) |
496
+ | `JARVIS_PLATFORM` | yuanbao | 默认AI平台 (可被模型组覆盖) |
497
+ | `JARVIS_MODEL` | deep_seek_v3 | 默认模型 (可被模型组覆盖) |
498
+ | `JARVIS_THINKING_PLATFORM` | JARVIS_PLATFORM | 推理任务使用的平台 (可被模型组覆盖) |
499
+ | `JARVIS_THINKING_MODEL` | JARVIS_MODEL | 推理任务使用的模型 (可被模型组覆盖) |
463
500
  | `JARVIS_EXECUTE_TOOL_CONFIRM` | false | 执行工具前是否需要确认 |
464
501
  | `JARVIS_CONFIRM_BEFORE_APPLY_PATCH` | false | 应用补丁前是否需要确认 |
465
- | `JARVIS_MAX_BIG_CONTENT_SIZE` | 160000 | 最大大内容大小 |
502
+ | `JARVIS_MAX_BIG_CONTENT_SIZE` | 160000 | 最大大内容大小 (可被模型组覆盖) |
466
503
  | `JARVIS_PRETTY_OUTPUT` | false | 是否启用PrettyOutput |
467
504
  | `JARVIS_GIT_COMMIT_PROMPT` | "" | 自定义git提交信息生成提示模板 |
468
505
  | `JARVIS_PRINT_PROMPT` | false | 是否打印提示 |
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "jarvis-ai-assistant"
7
- version = "0.1.224"
7
+ version = "0.2.0"
8
8
  description = "Jarvis: An AI assistant that uses tools to interact with the system"
9
9
  readme = "README.md"
10
10
  authors = [{ name = "skyfire", email = "skyfireitdiy@hotmail.com" }]
@@ -39,8 +39,8 @@ dependencies = [
39
39
  "httpx>=0.28.1",
40
40
  "pyyaml>=5.3.1",
41
41
  "ddgs==9.0.2",
42
- "beautifulsoup4==4.13.4",
43
42
  "lxml==6.0.0",
43
+ "markdownify>=1.1.0",
44
44
  ]
45
45
  requires-python = ">=3.9"
46
46
 
@@ -89,3 +89,7 @@ jarvis-methodology = "jarvis.jarvis_methodology.main:main"
89
89
  jm = "jarvis.jarvis_methodology.main:main"
90
90
  jarvis-rag = "jarvis.jarvis_rag.cli:main"
91
91
  jrg = "jarvis.jarvis_rag.cli:main"
92
+
93
+ [[tool.uv.index]]
94
+ url = "https://artsz.zte.com.cn/artifactory/api/pypi/public-pypi-virtual/simple"
95
+ default = true
@@ -3,7 +3,7 @@ from setuptools import setup, find_packages # type: ignore
3
3
 
4
4
  setup(
5
5
  name="jarvis-ai-assistant",
6
- version="0.1.224",
6
+ version="0.2.0",
7
7
  author="skyfire",
8
8
  author_email="skyfireitdiy@hotmail.com",
9
9
  description="An AI assistant that uses various tools to interact with the system",
@@ -34,8 +34,8 @@ setup(
34
34
  "httpx>=0.28.1",
35
35
  "pyyaml>=5.3.1",
36
36
  "ddgs==9.0.2",
37
- "beautifulsoup4==4.13.4",
38
37
  "lxml==6.0.0",
38
+ "markdownify>=1.1.0",
39
39
  ],
40
40
  extras_require={
41
41
  "dev": ["pytest", "black", "isort", "mypy", "build", "twine"],
@@ -1,4 +1,4 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  """Jarvis AI Assistant"""
3
3
 
4
- __version__ = "0.1.224"
4
+ __version__ = "0.2.0"
@@ -102,6 +102,7 @@ class Agent:
102
102
  name: str = "Jarvis",
103
103
  description: str = "",
104
104
  llm_type: str = "normal",
105
+ model_group: Optional[str] = None,
105
106
  summary_prompt: Optional[str] = None,
106
107
  auto_complete: bool = False,
107
108
  output_handler: List[OutputHandlerProtocol] = [],
@@ -137,11 +138,11 @@ class Agent:
137
138
  self.description = description
138
139
  # 初始化平台和模型
139
140
  if llm_type == "thinking":
140
- platform_name = get_thinking_platform_name()
141
- model_name = get_thinking_model_name()
141
+ platform_name = get_thinking_platform_name(model_group)
142
+ model_name = get_thinking_model_name(model_group)
142
143
  else: # 默认为 normal
143
- platform_name = get_normal_platform_name()
144
- model_name = get_normal_model_name()
144
+ platform_name = get_normal_platform_name(model_group)
145
+ model_name = get_normal_model_name(model_group)
145
146
 
146
147
  self.model = PlatformRegistry().create_platform(platform_name)
147
148
  if self.model is None:
@@ -153,6 +154,8 @@ class Agent:
153
154
  if model_name:
154
155
  self.model.set_model_name(model_name)
155
156
 
157
+ self.model.set_model_group(model_group)
158
+
156
159
  self.user_data: Dict[str, Any] = {}
157
160
 
158
161
  self.model.set_suppress_output(False)
@@ -197,7 +200,7 @@ class Agent:
197
200
  summary_prompt if summary_prompt else DEFAULT_SUMMARY_PROMPT
198
201
  )
199
202
 
200
- self.max_token_count = get_max_token_count()
203
+ self.max_token_count = get_max_token_count(model_group)
201
204
  self.auto_complete = auto_complete
202
205
  welcome_message = f"{name} 初始化完成 - 使用 {self.model.name()} 模型"
203
206
 
@@ -213,6 +216,7 @@ class Agent:
213
216
  """
214
217
  )
215
218
  self.first = True
219
+ self.run_input_handlers_next_turn = False
216
220
 
217
221
  def set_user_data(self, key: str, value: Any):
218
222
  """Sets user data in the session."""
@@ -236,6 +240,10 @@ class Agent:
236
240
  """Sets the addon prompt in the session."""
237
241
  self.session.set_addon_prompt(addon_prompt)
238
242
 
243
+ def set_run_input_handlers_next_turn(self, value: bool):
244
+ """Sets the flag to run input handlers on the next turn."""
245
+ self.run_input_handlers_next_turn = value
246
+
239
247
  def set_after_tool_call_cb(self, cb: Callable[[Any], None]): # type: ignore
240
248
  """设置工具调用后回调函数。
241
249
 
@@ -264,7 +272,9 @@ class Agent:
264
272
  return handler
265
273
  return None
266
274
 
267
- def _call_model(self, message: str, need_complete: bool = False) -> str:
275
+ def _call_model(
276
+ self, message: str, need_complete: bool = False, run_input_handlers: bool = True
277
+ ) -> str:
268
278
  """调用AI模型并实现重试逻辑
269
279
 
270
280
  参数:
@@ -280,10 +290,11 @@ class Agent:
280
290
  3. 会自动添加附加提示
281
291
  4. 会检查并处理上下文长度限制
282
292
  """
283
- for handler in self.input_handler:
284
- message, need_return = handler(message, self)
285
- if need_return:
286
- return message
293
+ if run_input_handlers:
294
+ for handler in self.input_handler:
295
+ message, need_return = handler(message, self)
296
+ if need_return:
297
+ return message
287
298
 
288
299
  if self.session.addon_prompt:
289
300
  message += f"\n\n{self.session.addon_prompt}"
@@ -478,12 +489,20 @@ class Agent:
478
489
  try:
479
490
  set_agent(self.name, self)
480
491
 
492
+ run_input_handlers = True
481
493
  while True:
494
+ if self.run_input_handlers_next_turn:
495
+ run_input_handlers = True
496
+ self.run_input_handlers_next_turn = False
497
+
482
498
  if self.first:
483
499
  self._first_run()
484
500
  try:
485
- current_response = self._call_model(self.session.prompt, True)
501
+ current_response = self._call_model(
502
+ self.session.prompt, True, run_input_handlers
503
+ )
486
504
  self.session.prompt = ""
505
+ run_input_handlers = False
487
506
 
488
507
  if get_interrupt():
489
508
  set_interrupt(False)
@@ -491,6 +510,7 @@ class Agent:
491
510
  f"模型交互期间被中断,请输入用户干预信息:"
492
511
  )
493
512
  if user_input:
513
+ run_input_handlers = True
494
514
  # 如果有工具调用且用户确认继续,则将干预信息和工具执行结果拼接为prompt
495
515
  if any(
496
516
  handler.can_handle(current_response)
@@ -502,6 +522,7 @@ class Agent:
502
522
  self.session.prompt = (
503
523
  f"{user_input}\n\n{current_response}"
504
524
  )
525
+ run_input_handlers = False
505
526
  continue
506
527
  self.session.prompt += f"{user_input}"
507
528
  continue
@@ -529,6 +550,7 @@ class Agent:
529
550
 
530
551
  if user_input:
531
552
  self.session.prompt = user_input
553
+ run_input_handlers = True
532
554
  continue
533
555
 
534
556
  if not user_input:
@@ -1,8 +1,11 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  import argparse
3
3
  import os
4
+ import shutil
5
+ import subprocess
4
6
  import sys
5
- from typing import Dict
7
+ from pathlib import Path
8
+ from typing import Dict, Optional
6
9
 
7
10
  import yaml # type: ignore
8
11
  from prompt_toolkit import prompt # type: ignore
@@ -106,8 +109,8 @@ def _select_task(tasks: Dict[str, str]) -> str:
106
109
  PrettyOutput.print(f"选择任务失败: {str(val_err)}", OutputType.ERROR)
107
110
 
108
111
 
109
- def main() -> None:
110
-
112
+ def _parse_args() -> argparse.Namespace:
113
+ """Parse command line arguments."""
111
114
  parser = argparse.ArgumentParser(description="Jarvis AI assistant")
112
115
  parser.add_argument(
113
116
  "--llm_type",
@@ -122,6 +125,11 @@ def main() -> None:
122
125
  type=str,
123
126
  help="Directly input task content from command line",
124
127
  )
128
+ parser.add_argument(
129
+ "--model_group",
130
+ type=str,
131
+ help="Model group to use, overriding config",
132
+ )
125
133
  parser.add_argument("-f", "--config", type=str, help="Path to custom config file")
126
134
  parser.add_argument(
127
135
  "--restore-session",
@@ -129,44 +137,91 @@ def main() -> None:
129
137
  help="Restore session from .jarvis/saved_session.json",
130
138
  default=False,
131
139
  )
132
- args = parser.parse_args()
133
- init_env(
134
- "欢迎使用 Jarvis AI 助手,您的智能助理已准备就绪!", config_file=args.config
140
+ parser.add_argument(
141
+ "-e", "--edit", action="store_true", help="Edit the configuration file"
135
142
  )
143
+ return parser.parse_args()
136
144
 
137
- try:
138
- agent = Agent(
139
- system_prompt=origin_agent_system_prompt,
140
- llm_type=args.llm_type,
141
- input_handler=[shell_input_handler, builtin_input_handler],
142
- output_handler=[ToolRegistry()],
143
- need_summary=False,
144
- )
145
145
 
146
- # 尝试恢复会话
147
- if args.restore_session:
148
- if agent.restore_session():
149
- PrettyOutput.print("会话已成功恢复。", OutputType.SUCCESS)
150
- else:
151
- PrettyOutput.print("无法恢复会话。", OutputType.WARNING)
146
+ def _handle_edit_mode(args: argparse.Namespace) -> None:
147
+ """If edit flag is set, open config file in editor and exit."""
148
+ if not args.edit:
149
+ return
150
+
151
+ config_file_path = (
152
+ Path(args.config)
153
+ if args.config
154
+ else Path(os.path.expanduser("~/.jarvis/config.yaml"))
155
+ )
156
+ editors = ["nvim", "vim", "vi"]
157
+ editor = next((e for e in editors if shutil.which(e)), None)
152
158
 
153
- # 优先处理命令行直接传入的任务
154
- if args.task:
155
- agent.run(args.task)
159
+ if editor:
160
+ try:
161
+ subprocess.run([editor, str(config_file_path)], check=True)
156
162
  sys.exit(0)
163
+ except (subprocess.CalledProcessError, FileNotFoundError) as e:
164
+ PrettyOutput.print(f"Failed to open editor: {e}", OutputType.ERROR)
165
+ sys.exit(1)
166
+ else:
167
+ PrettyOutput.print(
168
+ "No suitable editor found (nvim, vim, vi).", OutputType.ERROR
169
+ )
170
+ sys.exit(1)
157
171
 
158
- if agent.first:
159
- tasks = _load_tasks()
160
- if tasks and (selected_task := _select_task(tasks)):
161
- PrettyOutput.print(f"开始执行任务: \n{selected_task}", OutputType.INFO)
162
- agent.run(selected_task)
163
- sys.exit(0)
164
172
 
165
- user_input = get_multiline_input("请输入你的任务(输入空行退出):")
166
- if user_input:
167
- agent.run(user_input)
173
+ def _initialize_agent(args: argparse.Namespace) -> Agent:
174
+ """Initialize the agent and restore session if requested."""
175
+ agent = Agent(
176
+ system_prompt=origin_agent_system_prompt,
177
+ llm_type=args.llm_type,
178
+ model_group=args.model_group,
179
+ input_handler=[shell_input_handler, builtin_input_handler],
180
+ output_handler=[ToolRegistry()], # type: ignore
181
+ need_summary=False,
182
+ )
183
+
184
+ # 尝试恢复会话
185
+ if args.restore_session:
186
+ if agent.restore_session():
187
+ PrettyOutput.print("会话已成功恢复。", OutputType.SUCCESS)
188
+ else:
189
+ PrettyOutput.print("无法恢复会话。", OutputType.WARNING)
190
+ return agent
191
+
192
+
193
+ def _get_and_run_task(agent: Agent, task_content: Optional[str] = None) -> None:
194
+ """Get task from various sources and run it."""
195
+ # 优先处理命令行直接传入的任务
196
+ if task_content:
197
+ agent.run(task_content)
168
198
  sys.exit(0)
169
199
 
200
+ if agent.first:
201
+ tasks = _load_tasks()
202
+ if tasks and (selected_task := _select_task(tasks)):
203
+ PrettyOutput.print(f"开始执行任务: \n{selected_task}", OutputType.INFO)
204
+ agent.run(selected_task)
205
+ sys.exit(0)
206
+
207
+ user_input = get_multiline_input("请输入你的任务(输入空行退出):")
208
+ if user_input:
209
+ agent.run(user_input)
210
+ sys.exit(0)
211
+
212
+
213
+ def main() -> None:
214
+ """Main function for Jarvis AI assistant."""
215
+ args = _parse_args()
216
+ _handle_edit_mode(args)
217
+
218
+ init_env(
219
+ "欢迎使用 Jarvis AI 助手,您的智能助理已准备就绪!", config_file=args.config
220
+ )
221
+
222
+ try:
223
+ agent = _initialize_agent(args)
224
+ _get_and_run_task(agent, args.task)
170
225
  except Exception as err: # pylint: disable=broad-except
171
226
  PrettyOutput.print(f"初始化错误: {str(err)}", OutputType.ERROR)
172
227
  sys.exit(1)
@@ -20,7 +20,9 @@ def load_config(config_path: str) -> dict:
20
20
  dict: 配置字典
21
21
  """
22
22
  if not os.path.exists(config_path):
23
- PrettyOutput.print(f"配置文件 {config_path} 不存在,使用默认配置", OutputType.WARNING)
23
+ PrettyOutput.print(
24
+ f"配置文件 {config_path} 不存在,使用默认配置", OutputType.WARNING
25
+ )
24
26
  return {}
25
27
 
26
28
  with open(config_path, "r", encoding="utf-8", errors="ignore") as f:
@@ -50,10 +52,17 @@ def main():
50
52
  choices=["normal", "thinking"],
51
53
  help="LLM type to use, overriding config",
52
54
  )
55
+ parser.add_argument(
56
+ "--model_group",
57
+ type=str,
58
+ help="Model group to use, overriding config",
59
+ )
53
60
  args = parser.parse_args()
54
61
 
55
62
  # Initialize environment
56
- init_env("欢迎使用 Jarvis AI 助手,您的智能助理已准备就绪!", config_file=args.config)
63
+ init_env(
64
+ "欢迎使用 Jarvis AI 助手,您的智能助理已准备就绪!", config_file=args.config
65
+ )
57
66
 
58
67
  # Load configuration
59
68
  config = load_config(args.agent_definition) if args.agent_definition else {}
@@ -61,6 +70,8 @@ def main():
61
70
  # Override config with command-line arguments if provided
62
71
  if args.llm_type:
63
72
  config["llm_type"] = args.llm_type
73
+ if args.model_group:
74
+ config["model_group"] = args.model_group
64
75
 
65
76
  # Create and run agent
66
77
  try:
@@ -18,7 +18,10 @@ from jarvis.jarvis_code_agent.lint import get_lint_tools
18
18
  from jarvis.jarvis_git_utils.git_commiter import GitCommitTool
19
19
  from jarvis.jarvis_platform.registry import PlatformRegistry
20
20
  from jarvis.jarvis_tools.registry import ToolRegistry
21
- from jarvis.jarvis_utils.config import is_confirm_before_apply_patch, is_enable_static_analysis
21
+ from jarvis.jarvis_utils.config import (
22
+ is_confirm_before_apply_patch,
23
+ is_enable_static_analysis,
24
+ )
22
25
  from jarvis.jarvis_utils.git_utils import (
23
26
  confirm_add_new_files,
24
27
  find_git_root_and_cd,
@@ -44,6 +47,7 @@ class CodeAgent:
44
47
  def __init__(
45
48
  self,
46
49
  llm_type: str = "normal",
50
+ model_group: Optional[str] = None,
47
51
  need_summary: bool = True,
48
52
  ):
49
53
  self.root_dir = os.getcwd()
@@ -54,7 +58,6 @@ class CodeAgent:
54
58
  "search_web",
55
59
  "ask_user",
56
60
  "read_code",
57
- "methodology",
58
61
  "rewrite_file",
59
62
  ]
60
63
  )
@@ -116,8 +119,9 @@ class CodeAgent:
116
119
  system_prompt=code_system_prompt,
117
120
  name="CodeAgent",
118
121
  auto_complete=False,
119
- output_handler=[tool_registry, EditFileHandler()],
122
+ output_handler=[tool_registry, EditFileHandler()], # type: ignore
120
123
  llm_type=llm_type,
124
+ model_group=model_group,
121
125
  input_handler=[shell_input_handler, builtin_input_handler],
122
126
  need_summary=need_summary,
123
127
  use_methodology=False, # 禁用方法论
@@ -409,6 +413,11 @@ def main() -> None:
409
413
  choices=["normal", "thinking"],
410
414
  help="LLM type to use",
411
415
  )
416
+ parser.add_argument(
417
+ "--model_group",
418
+ type=str,
419
+ help="Model group to use, overriding config",
420
+ )
412
421
  parser.add_argument(
413
422
  "-r", "--requirement", type=str, help="Requirement to process", default=None
414
423
  )
@@ -425,7 +434,11 @@ def main() -> None:
425
434
  PrettyOutput.print(f"当前目录: {git_dir}", OutputType.INFO)
426
435
 
427
436
  try:
428
- agent = CodeAgent(llm_type=args.llm_type, need_summary=False)
437
+ agent = CodeAgent(
438
+ llm_type=args.llm_type,
439
+ model_group=args.model_group,
440
+ need_summary=False,
441
+ )
429
442
 
430
443
  # 尝试恢复会话
431
444
  if args.restore_session:
@@ -5,12 +5,26 @@ Utility module for loading language-specific code review checklists.
5
5
  from typing import Dict, Optional
6
6
 
7
7
  # Import checklist modules
8
- from jarvis.jarvis_code_analysis.checklists import (c_cpp, csharp, data_format,
9
- devops, docs, go,
10
- infrastructure, java,
11
- javascript, kotlin, php,
12
- python, ruby, rust, shell,
13
- sql, swift, web)
8
+ from jarvis.jarvis_code_analysis.checklists import (
9
+ c_cpp,
10
+ csharp,
11
+ data_format,
12
+ devops,
13
+ docs,
14
+ go,
15
+ infrastructure,
16
+ java,
17
+ javascript,
18
+ kotlin,
19
+ php,
20
+ python,
21
+ ruby,
22
+ rust,
23
+ shell,
24
+ sql,
25
+ swift,
26
+ web,
27
+ )
14
28
 
15
29
  # Map of language identifiers to their checklist content
16
30
  CHECKLIST_MAP = {