jarvis-ai-assistant 0.7.16__py3-none-any.whl → 1.0.2__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.
Files changed (279) hide show
  1. jarvis/__init__.py +1 -1
  2. jarvis/jarvis_agent/__init__.py +567 -222
  3. jarvis/jarvis_agent/agent_manager.py +19 -12
  4. jarvis/jarvis_agent/builtin_input_handler.py +79 -11
  5. jarvis/jarvis_agent/config_editor.py +7 -2
  6. jarvis/jarvis_agent/event_bus.py +24 -13
  7. jarvis/jarvis_agent/events.py +19 -1
  8. jarvis/jarvis_agent/file_context_handler.py +67 -64
  9. jarvis/jarvis_agent/file_methodology_manager.py +38 -24
  10. jarvis/jarvis_agent/jarvis.py +186 -114
  11. jarvis/jarvis_agent/language_extractors/__init__.py +8 -1
  12. jarvis/jarvis_agent/language_extractors/c_extractor.py +7 -4
  13. jarvis/jarvis_agent/language_extractors/cpp_extractor.py +9 -4
  14. jarvis/jarvis_agent/language_extractors/go_extractor.py +7 -4
  15. jarvis/jarvis_agent/language_extractors/java_extractor.py +27 -20
  16. jarvis/jarvis_agent/language_extractors/javascript_extractor.py +22 -17
  17. jarvis/jarvis_agent/language_extractors/python_extractor.py +7 -4
  18. jarvis/jarvis_agent/language_extractors/rust_extractor.py +7 -4
  19. jarvis/jarvis_agent/language_extractors/typescript_extractor.py +22 -17
  20. jarvis/jarvis_agent/language_support_info.py +250 -219
  21. jarvis/jarvis_agent/main.py +19 -23
  22. jarvis/jarvis_agent/memory_manager.py +9 -6
  23. jarvis/jarvis_agent/methodology_share_manager.py +21 -15
  24. jarvis/jarvis_agent/output_handler.py +4 -2
  25. jarvis/jarvis_agent/prompt_builder.py +7 -6
  26. jarvis/jarvis_agent/prompt_manager.py +113 -8
  27. jarvis/jarvis_agent/prompts.py +317 -85
  28. jarvis/jarvis_agent/protocols.py +5 -2
  29. jarvis/jarvis_agent/run_loop.py +192 -32
  30. jarvis/jarvis_agent/session_manager.py +7 -3
  31. jarvis/jarvis_agent/share_manager.py +23 -13
  32. jarvis/jarvis_agent/shell_input_handler.py +12 -8
  33. jarvis/jarvis_agent/stdio_redirect.py +25 -26
  34. jarvis/jarvis_agent/task_analyzer.py +29 -23
  35. jarvis/jarvis_agent/task_list.py +869 -0
  36. jarvis/jarvis_agent/task_manager.py +26 -23
  37. jarvis/jarvis_agent/tool_executor.py +6 -5
  38. jarvis/jarvis_agent/tool_share_manager.py +24 -14
  39. jarvis/jarvis_agent/user_interaction.py +3 -3
  40. jarvis/jarvis_agent/utils.py +9 -1
  41. jarvis/jarvis_agent/web_bridge.py +37 -17
  42. jarvis/jarvis_agent/web_output_sink.py +5 -2
  43. jarvis/jarvis_agent/web_server.py +165 -36
  44. jarvis/jarvis_c2rust/__init__.py +1 -1
  45. jarvis/jarvis_c2rust/cli.py +260 -141
  46. jarvis/jarvis_c2rust/collector.py +37 -18
  47. jarvis/jarvis_c2rust/constants.py +60 -0
  48. jarvis/jarvis_c2rust/library_replacer.py +242 -1010
  49. jarvis/jarvis_c2rust/library_replacer_checkpoint.py +133 -0
  50. jarvis/jarvis_c2rust/library_replacer_llm.py +287 -0
  51. jarvis/jarvis_c2rust/library_replacer_loader.py +191 -0
  52. jarvis/jarvis_c2rust/library_replacer_output.py +134 -0
  53. jarvis/jarvis_c2rust/library_replacer_prompts.py +124 -0
  54. jarvis/jarvis_c2rust/library_replacer_utils.py +188 -0
  55. jarvis/jarvis_c2rust/llm_module_agent.py +98 -1044
  56. jarvis/jarvis_c2rust/llm_module_agent_apply.py +170 -0
  57. jarvis/jarvis_c2rust/llm_module_agent_executor.py +288 -0
  58. jarvis/jarvis_c2rust/llm_module_agent_loader.py +170 -0
  59. jarvis/jarvis_c2rust/llm_module_agent_prompts.py +268 -0
  60. jarvis/jarvis_c2rust/llm_module_agent_types.py +57 -0
  61. jarvis/jarvis_c2rust/llm_module_agent_utils.py +150 -0
  62. jarvis/jarvis_c2rust/llm_module_agent_validator.py +119 -0
  63. jarvis/jarvis_c2rust/loaders.py +28 -10
  64. jarvis/jarvis_c2rust/models.py +5 -2
  65. jarvis/jarvis_c2rust/optimizer.py +192 -1974
  66. jarvis/jarvis_c2rust/optimizer_build_fix.py +286 -0
  67. jarvis/jarvis_c2rust/optimizer_clippy.py +766 -0
  68. jarvis/jarvis_c2rust/optimizer_config.py +49 -0
  69. jarvis/jarvis_c2rust/optimizer_docs.py +183 -0
  70. jarvis/jarvis_c2rust/optimizer_options.py +48 -0
  71. jarvis/jarvis_c2rust/optimizer_progress.py +469 -0
  72. jarvis/jarvis_c2rust/optimizer_report.py +52 -0
  73. jarvis/jarvis_c2rust/optimizer_unsafe.py +309 -0
  74. jarvis/jarvis_c2rust/optimizer_utils.py +469 -0
  75. jarvis/jarvis_c2rust/optimizer_visibility.py +185 -0
  76. jarvis/jarvis_c2rust/scanner.py +229 -166
  77. jarvis/jarvis_c2rust/transpiler.py +531 -2732
  78. jarvis/jarvis_c2rust/transpiler_agents.py +503 -0
  79. jarvis/jarvis_c2rust/transpiler_build.py +1294 -0
  80. jarvis/jarvis_c2rust/transpiler_codegen.py +204 -0
  81. jarvis/jarvis_c2rust/transpiler_compile.py +146 -0
  82. jarvis/jarvis_c2rust/transpiler_config.py +178 -0
  83. jarvis/jarvis_c2rust/transpiler_context.py +122 -0
  84. jarvis/jarvis_c2rust/transpiler_executor.py +516 -0
  85. jarvis/jarvis_c2rust/transpiler_generation.py +278 -0
  86. jarvis/jarvis_c2rust/transpiler_git.py +163 -0
  87. jarvis/jarvis_c2rust/transpiler_mod_utils.py +225 -0
  88. jarvis/jarvis_c2rust/transpiler_modules.py +336 -0
  89. jarvis/jarvis_c2rust/transpiler_planning.py +394 -0
  90. jarvis/jarvis_c2rust/transpiler_review.py +1196 -0
  91. jarvis/jarvis_c2rust/transpiler_symbols.py +176 -0
  92. jarvis/jarvis_c2rust/utils.py +269 -79
  93. jarvis/jarvis_code_agent/after_change.py +233 -0
  94. jarvis/jarvis_code_agent/build_validation_config.py +37 -30
  95. jarvis/jarvis_code_agent/builtin_rules.py +68 -0
  96. jarvis/jarvis_code_agent/code_agent.py +976 -1517
  97. jarvis/jarvis_code_agent/code_agent_build.py +227 -0
  98. jarvis/jarvis_code_agent/code_agent_diff.py +246 -0
  99. jarvis/jarvis_code_agent/code_agent_git.py +525 -0
  100. jarvis/jarvis_code_agent/code_agent_impact.py +177 -0
  101. jarvis/jarvis_code_agent/code_agent_lint.py +283 -0
  102. jarvis/jarvis_code_agent/code_agent_llm.py +159 -0
  103. jarvis/jarvis_code_agent/code_agent_postprocess.py +105 -0
  104. jarvis/jarvis_code_agent/code_agent_prompts.py +46 -0
  105. jarvis/jarvis_code_agent/code_agent_rules.py +305 -0
  106. jarvis/jarvis_code_agent/code_analyzer/__init__.py +52 -48
  107. jarvis/jarvis_code_agent/code_analyzer/base_language.py +12 -10
  108. jarvis/jarvis_code_agent/code_analyzer/build_validator/__init__.py +12 -11
  109. jarvis/jarvis_code_agent/code_analyzer/build_validator/base.py +16 -12
  110. jarvis/jarvis_code_agent/code_analyzer/build_validator/cmake.py +26 -17
  111. jarvis/jarvis_code_agent/code_analyzer/build_validator/detector.py +558 -104
  112. jarvis/jarvis_code_agent/code_analyzer/build_validator/fallback.py +27 -16
  113. jarvis/jarvis_code_agent/code_analyzer/build_validator/go.py +22 -18
  114. jarvis/jarvis_code_agent/code_analyzer/build_validator/java_gradle.py +21 -16
  115. jarvis/jarvis_code_agent/code_analyzer/build_validator/java_maven.py +20 -16
  116. jarvis/jarvis_code_agent/code_analyzer/build_validator/makefile.py +27 -16
  117. jarvis/jarvis_code_agent/code_analyzer/build_validator/nodejs.py +47 -23
  118. jarvis/jarvis_code_agent/code_analyzer/build_validator/python.py +71 -37
  119. jarvis/jarvis_code_agent/code_analyzer/build_validator/rust.py +162 -35
  120. jarvis/jarvis_code_agent/code_analyzer/build_validator/validator.py +111 -57
  121. jarvis/jarvis_code_agent/code_analyzer/build_validator.py +18 -12
  122. jarvis/jarvis_code_agent/code_analyzer/context_manager.py +185 -183
  123. jarvis/jarvis_code_agent/code_analyzer/context_recommender.py +2 -1
  124. jarvis/jarvis_code_agent/code_analyzer/dependency_analyzer.py +24 -15
  125. jarvis/jarvis_code_agent/code_analyzer/file_ignore.py +227 -141
  126. jarvis/jarvis_code_agent/code_analyzer/impact_analyzer.py +321 -247
  127. jarvis/jarvis_code_agent/code_analyzer/language_registry.py +37 -29
  128. jarvis/jarvis_code_agent/code_analyzer/language_support.py +21 -13
  129. jarvis/jarvis_code_agent/code_analyzer/languages/__init__.py +15 -9
  130. jarvis/jarvis_code_agent/code_analyzer/languages/c_cpp_language.py +75 -45
  131. jarvis/jarvis_code_agent/code_analyzer/languages/go_language.py +87 -52
  132. jarvis/jarvis_code_agent/code_analyzer/languages/java_language.py +84 -51
  133. jarvis/jarvis_code_agent/code_analyzer/languages/javascript_language.py +94 -64
  134. jarvis/jarvis_code_agent/code_analyzer/languages/python_language.py +109 -71
  135. jarvis/jarvis_code_agent/code_analyzer/languages/rust_language.py +97 -63
  136. jarvis/jarvis_code_agent/code_analyzer/languages/typescript_language.py +103 -69
  137. jarvis/jarvis_code_agent/code_analyzer/llm_context_recommender.py +271 -268
  138. jarvis/jarvis_code_agent/code_analyzer/symbol_extractor.py +76 -64
  139. jarvis/jarvis_code_agent/code_analyzer/tree_sitter_extractor.py +92 -19
  140. jarvis/jarvis_code_agent/diff_visualizer.py +998 -0
  141. jarvis/jarvis_code_agent/lint.py +223 -524
  142. jarvis/jarvis_code_agent/rule_share_manager.py +158 -0
  143. jarvis/jarvis_code_agent/rules/clean_code.md +144 -0
  144. jarvis/jarvis_code_agent/rules/code_review.md +115 -0
  145. jarvis/jarvis_code_agent/rules/documentation.md +165 -0
  146. jarvis/jarvis_code_agent/rules/generate_rules.md +52 -0
  147. jarvis/jarvis_code_agent/rules/performance.md +158 -0
  148. jarvis/jarvis_code_agent/rules/refactoring.md +139 -0
  149. jarvis/jarvis_code_agent/rules/security.md +160 -0
  150. jarvis/jarvis_code_agent/rules/tdd.md +78 -0
  151. jarvis/jarvis_code_agent/test_rules/cpp_test.md +118 -0
  152. jarvis/jarvis_code_agent/test_rules/go_test.md +98 -0
  153. jarvis/jarvis_code_agent/test_rules/java_test.md +99 -0
  154. jarvis/jarvis_code_agent/test_rules/javascript_test.md +113 -0
  155. jarvis/jarvis_code_agent/test_rules/php_test.md +117 -0
  156. jarvis/jarvis_code_agent/test_rules/python_test.md +91 -0
  157. jarvis/jarvis_code_agent/test_rules/ruby_test.md +102 -0
  158. jarvis/jarvis_code_agent/test_rules/rust_test.md +86 -0
  159. jarvis/jarvis_code_agent/utils.py +36 -26
  160. jarvis/jarvis_code_analysis/checklists/loader.py +21 -21
  161. jarvis/jarvis_code_analysis/code_review.py +64 -33
  162. jarvis/jarvis_data/config_schema.json +285 -192
  163. jarvis/jarvis_git_squash/main.py +8 -6
  164. jarvis/jarvis_git_utils/git_commiter.py +53 -76
  165. jarvis/jarvis_mcp/__init__.py +5 -2
  166. jarvis/jarvis_mcp/sse_mcp_client.py +40 -30
  167. jarvis/jarvis_mcp/stdio_mcp_client.py +27 -19
  168. jarvis/jarvis_mcp/streamable_mcp_client.py +35 -26
  169. jarvis/jarvis_memory_organizer/memory_organizer.py +78 -55
  170. jarvis/jarvis_methodology/main.py +48 -39
  171. jarvis/jarvis_multi_agent/__init__.py +56 -23
  172. jarvis/jarvis_multi_agent/main.py +15 -18
  173. jarvis/jarvis_platform/base.py +179 -111
  174. jarvis/jarvis_platform/human.py +27 -16
  175. jarvis/jarvis_platform/kimi.py +52 -45
  176. jarvis/jarvis_platform/openai.py +101 -40
  177. jarvis/jarvis_platform/registry.py +51 -33
  178. jarvis/jarvis_platform/tongyi.py +68 -38
  179. jarvis/jarvis_platform/yuanbao.py +59 -43
  180. jarvis/jarvis_platform_manager/main.py +68 -76
  181. jarvis/jarvis_platform_manager/service.py +24 -14
  182. jarvis/jarvis_rag/README_CONFIG.md +314 -0
  183. jarvis/jarvis_rag/README_DYNAMIC_LOADING.md +311 -0
  184. jarvis/jarvis_rag/README_ONLINE_MODELS.md +230 -0
  185. jarvis/jarvis_rag/__init__.py +57 -4
  186. jarvis/jarvis_rag/cache.py +3 -1
  187. jarvis/jarvis_rag/cli.py +48 -68
  188. jarvis/jarvis_rag/embedding_interface.py +39 -0
  189. jarvis/jarvis_rag/embedding_manager.py +7 -230
  190. jarvis/jarvis_rag/embeddings/__init__.py +41 -0
  191. jarvis/jarvis_rag/embeddings/base.py +114 -0
  192. jarvis/jarvis_rag/embeddings/cohere.py +66 -0
  193. jarvis/jarvis_rag/embeddings/edgefn.py +117 -0
  194. jarvis/jarvis_rag/embeddings/local.py +260 -0
  195. jarvis/jarvis_rag/embeddings/openai.py +62 -0
  196. jarvis/jarvis_rag/embeddings/registry.py +293 -0
  197. jarvis/jarvis_rag/llm_interface.py +8 -6
  198. jarvis/jarvis_rag/query_rewriter.py +8 -9
  199. jarvis/jarvis_rag/rag_pipeline.py +61 -52
  200. jarvis/jarvis_rag/reranker.py +7 -75
  201. jarvis/jarvis_rag/reranker_interface.py +32 -0
  202. jarvis/jarvis_rag/rerankers/__init__.py +41 -0
  203. jarvis/jarvis_rag/rerankers/base.py +109 -0
  204. jarvis/jarvis_rag/rerankers/cohere.py +67 -0
  205. jarvis/jarvis_rag/rerankers/edgefn.py +140 -0
  206. jarvis/jarvis_rag/rerankers/jina.py +79 -0
  207. jarvis/jarvis_rag/rerankers/local.py +89 -0
  208. jarvis/jarvis_rag/rerankers/registry.py +293 -0
  209. jarvis/jarvis_rag/retriever.py +58 -43
  210. jarvis/jarvis_sec/__init__.py +66 -141
  211. jarvis/jarvis_sec/agents.py +21 -17
  212. jarvis/jarvis_sec/analysis.py +80 -33
  213. jarvis/jarvis_sec/checkers/__init__.py +7 -13
  214. jarvis/jarvis_sec/checkers/c_checker.py +356 -164
  215. jarvis/jarvis_sec/checkers/rust_checker.py +47 -29
  216. jarvis/jarvis_sec/cli.py +43 -21
  217. jarvis/jarvis_sec/clustering.py +430 -272
  218. jarvis/jarvis_sec/file_manager.py +99 -55
  219. jarvis/jarvis_sec/parsers.py +9 -6
  220. jarvis/jarvis_sec/prompts.py +4 -3
  221. jarvis/jarvis_sec/report.py +44 -22
  222. jarvis/jarvis_sec/review.py +180 -107
  223. jarvis/jarvis_sec/status.py +50 -41
  224. jarvis/jarvis_sec/types.py +3 -0
  225. jarvis/jarvis_sec/utils.py +160 -83
  226. jarvis/jarvis_sec/verification.py +411 -181
  227. jarvis/jarvis_sec/workflow.py +132 -21
  228. jarvis/jarvis_smart_shell/main.py +28 -41
  229. jarvis/jarvis_stats/cli.py +14 -12
  230. jarvis/jarvis_stats/stats.py +28 -19
  231. jarvis/jarvis_stats/storage.py +14 -8
  232. jarvis/jarvis_stats/visualizer.py +12 -7
  233. jarvis/jarvis_tools/base.py +5 -2
  234. jarvis/jarvis_tools/clear_memory.py +13 -9
  235. jarvis/jarvis_tools/cli/main.py +23 -18
  236. jarvis/jarvis_tools/edit_file.py +572 -873
  237. jarvis/jarvis_tools/execute_script.py +10 -7
  238. jarvis/jarvis_tools/file_analyzer.py +7 -8
  239. jarvis/jarvis_tools/meta_agent.py +287 -0
  240. jarvis/jarvis_tools/methodology.py +5 -3
  241. jarvis/jarvis_tools/read_code.py +305 -1438
  242. jarvis/jarvis_tools/read_symbols.py +50 -17
  243. jarvis/jarvis_tools/read_webpage.py +19 -18
  244. jarvis/jarvis_tools/registry.py +435 -156
  245. jarvis/jarvis_tools/retrieve_memory.py +16 -11
  246. jarvis/jarvis_tools/save_memory.py +8 -6
  247. jarvis/jarvis_tools/search_web.py +31 -31
  248. jarvis/jarvis_tools/sub_agent.py +32 -28
  249. jarvis/jarvis_tools/sub_code_agent.py +44 -60
  250. jarvis/jarvis_tools/task_list_manager.py +1811 -0
  251. jarvis/jarvis_tools/virtual_tty.py +29 -19
  252. jarvis/jarvis_utils/__init__.py +4 -0
  253. jarvis/jarvis_utils/builtin_replace_map.py +2 -1
  254. jarvis/jarvis_utils/clipboard.py +9 -8
  255. jarvis/jarvis_utils/collections.py +331 -0
  256. jarvis/jarvis_utils/config.py +699 -194
  257. jarvis/jarvis_utils/dialogue_recorder.py +294 -0
  258. jarvis/jarvis_utils/embedding.py +6 -3
  259. jarvis/jarvis_utils/file_processors.py +7 -1
  260. jarvis/jarvis_utils/fzf.py +9 -3
  261. jarvis/jarvis_utils/git_utils.py +71 -42
  262. jarvis/jarvis_utils/globals.py +116 -32
  263. jarvis/jarvis_utils/http.py +6 -2
  264. jarvis/jarvis_utils/input.py +318 -83
  265. jarvis/jarvis_utils/jsonnet_compat.py +119 -104
  266. jarvis/jarvis_utils/methodology.py +37 -28
  267. jarvis/jarvis_utils/output.py +201 -44
  268. jarvis/jarvis_utils/utils.py +986 -628
  269. {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/METADATA +49 -33
  270. jarvis_ai_assistant-1.0.2.dist-info/RECORD +304 -0
  271. jarvis/jarvis_code_agent/code_analyzer/structured_code.py +0 -556
  272. jarvis/jarvis_tools/generate_new_tool.py +0 -205
  273. jarvis/jarvis_tools/lsp_client.py +0 -1552
  274. jarvis/jarvis_tools/rewrite_file.py +0 -105
  275. jarvis_ai_assistant-0.7.16.dist-info/RECORD +0 -218
  276. {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/WHEEL +0 -0
  277. {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/entry_points.txt +0 -0
  278. {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/licenses/LICENSE +0 -0
  279. {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,314 @@
1
+ # RAG 配置指南
2
+
3
+ 本文档介绍如何配置 RAG 系统的嵌入模型和重排模型。
4
+
5
+ ## 配置方式
6
+
7
+ RAG 配置通过 `rag` 环境变量或 `GLOBAL_CONFIG_DATA` 中的 `rag` 键进行设置。
8
+
9
+ ## 配置结构
10
+
11
+ ### 基本配置
12
+
13
+ ```python
14
+ rag = {
15
+ "embedding_model": "BAAI/bge-m3", # 模型名称
16
+ "embedding_type": "LocalEmbeddingModel", # 模型实现类型
17
+ "embedding_max_length": 512, # 嵌入模型最大输入长度(token数)
18
+ "rerank_model": "BAAI/bge-reranker-v2-m3", # 重排模型名称
19
+ "reranker_type": "LocalReranker", # 重排模型实现类型
20
+ "reranker_max_length": 512, # 重排模型最大输入长度(token数)
21
+ "use_bm25": True, # 是否使用BM25
22
+ "use_rerank": True, # 是否使用重排
23
+ }
24
+ ```
25
+
26
+ ### 高级配置(带额外参数)
27
+
28
+ ```python
29
+ rag = {
30
+ "embedding_model": "BAAI/bge-m3",
31
+ "embedding_type": "LocalEmbeddingModel",
32
+ "embedding_config": {
33
+ # 额外的嵌入模型配置参数
34
+ # 这些参数会传递给模型的构造函数
35
+ },
36
+ "rerank_model": "bge-reranker-v2-m3",
37
+ "reranker_type": "EdgeFnReranker",
38
+ "reranker_config": {
39
+ # 额外的重排模型配置参数
40
+ "api_key": "your-api-key", # 如果使用在线模型
41
+ "base_url": "https://api.example.com/v1/rerank",
42
+ },
43
+ "use_bm25": True,
44
+ "use_rerank": True,
45
+ }
46
+ ```
47
+
48
+ ## 配置组
49
+
50
+ 类似于模型组,RAG 也支持配置组:
51
+
52
+ ```python
53
+ rag_group = "text" # 或 "code"
54
+
55
+ rag_groups = [
56
+ {
57
+ "text": {
58
+ "embedding_model": "BAAI/bge-m3",
59
+ "embedding_type": "LocalEmbeddingModel",
60
+ "rerank_model": "BAAI/bge-reranker-v2-m3",
61
+ "reranker_type": "LocalReranker",
62
+ "use_bm25": True,
63
+ "use_rerank": True,
64
+ }
65
+ },
66
+ {
67
+ "code": {
68
+ "embedding_model": "Qodo/Qodo-Embed-1-1.5B",
69
+ "embedding_type": "LocalEmbeddingModel",
70
+ "use_bm25": False,
71
+ "use_rerank": False,
72
+ }
73
+ },
74
+ ]
75
+ ```
76
+
77
+ ## 可用的模型类型
78
+
79
+ ### 嵌入模型类型
80
+
81
+ - `LocalEmbeddingModel` - 本地 HuggingFace 模型(默认)
82
+ - `OpenAIEmbeddingModel` - OpenAI API
83
+ - `CohereEmbeddingModel` - Cohere API
84
+ - `EdgeFnEmbeddingModel` - EdgeFn API
85
+ - 自定义模型(通过动态加载)
86
+
87
+ ### 重排模型类型
88
+
89
+ - `LocalReranker` - 本地 CrossEncoder 模型(默认)
90
+ - `CohereReranker` - Cohere API
91
+ - `JinaReranker` - Jina API
92
+ - `EdgeFnReranker` - EdgeFn API
93
+ - 自定义模型(通过动态加载)
94
+
95
+ ## 配置示例
96
+
97
+ ### 示例 1: 使用本地模型(默认)
98
+
99
+ ```python
100
+ # 使用默认配置,无需设置
101
+ # 或显式设置:
102
+ rag = {
103
+ "embedding_model": "BAAI/bge-m3",
104
+ "embedding_type": "LocalEmbeddingModel",
105
+ "embedding_max_length": 512, # 根据模型调整
106
+ "rerank_model": "BAAI/bge-reranker-v2-m3",
107
+ "reranker_type": "LocalReranker",
108
+ "reranker_max_length": 512, # 根据模型调整
109
+ }
110
+ ```
111
+
112
+ ### 示例 2: 使用 OpenAI 嵌入模型
113
+
114
+ ```python
115
+ rag = {
116
+ "embedding_model": "text-embedding-3-small",
117
+ "embedding_type": "OpenAIEmbeddingModel",
118
+ "embedding_config": {
119
+ "api_key": "your-openai-api-key", # 或设置 OPENAI_API_KEY 环境变量
120
+ },
121
+ "rerank_model": "BAAI/bge-reranker-v2-m3",
122
+ "reranker_type": "LocalReranker",
123
+ }
124
+ ```
125
+
126
+ ### 示例 3: 使用 EdgeFn 在线模型
127
+
128
+ ```python
129
+ rag = {
130
+ "embedding_model": "BAAI/bge-m3",
131
+ "embedding_type": "EdgeFnEmbeddingModel",
132
+ "embedding_config": {
133
+ "api_key": "your-edgefn-api-key", # 或设置 EDGEFN_API_KEY 环境变量
134
+ },
135
+ "rerank_model": "bge-reranker-v2-m3",
136
+ "reranker_type": "EdgeFnReranker",
137
+ "reranker_config": {
138
+ "api_key": "your-edgefn-api-key",
139
+ },
140
+ }
141
+ ```
142
+
143
+ ### 示例 4: 混合使用(本地嵌入 + 在线重排)
144
+
145
+ ```python
146
+ rag = {
147
+ "embedding_model": "BAAI/bge-m3",
148
+ "embedding_type": "LocalEmbeddingModel",
149
+ "rerank_model": "rerank-english-v3.0",
150
+ "reranker_type": "CohereReranker",
151
+ "reranker_config": {
152
+ "api_key": "your-cohere-api-key", # 或设置 COHERE_API_KEY 环境变量
153
+ },
154
+ }
155
+ ```
156
+
157
+ ### 示例 5: 使用自定义模型
158
+
159
+ ```python
160
+ # 首先在 ~/.jarvis/embeddings/ 或 ~/.jarvis/rerankers/ 中创建自定义模型
161
+ # 然后配置使用:
162
+
163
+ rag = {
164
+ "embedding_model": "my-custom-model",
165
+ "embedding_type": "MyCustomEmbeddingModel", # 自定义类名
166
+ "embedding_config": {
167
+ "api_key": "your-api-key",
168
+ "custom_param": "value",
169
+ },
170
+ }
171
+ ```
172
+
173
+ ## 配置优先级
174
+
175
+ 配置的优先级顺序(从高到低):
176
+
177
+ 1. **顶级 rag 设置** - 直接设置的配置项
178
+ 2. **rag_group 组配置** - 通过组名选择的配置
179
+ 3. **代码默认值** - 硬编码的默认值
180
+
181
+ ## 配置函数
182
+
183
+ 系统提供了以下配置函数:
184
+
185
+ ### 嵌入模型配置
186
+
187
+ - `get_rag_embedding_model() -> str`: 获取嵌入模型名称
188
+ - `get_rag_embedding_type() -> str`: 获取嵌入模型类型
189
+ - `get_rag_embedding_max_length() -> int`: 获取嵌入模型最大输入长度(token数)
190
+ - `get_rag_embedding_config() -> Dict[str, Any]`: 获取嵌入模型额外配置
191
+
192
+ ### 重排模型配置
193
+
194
+ - `get_rag_rerank_model() -> str`: 获取重排模型名称
195
+ - `get_rag_reranker_type() -> str`: 获取重排模型类型
196
+ - `get_rag_reranker_max_length() -> int`: 获取重排模型最大输入长度(token数)
197
+ - `get_rag_reranker_config() -> Dict[str, Any]`: 获取重排模型额外配置
198
+
199
+ ### 其他配置
200
+
201
+ - `get_rag_use_bm25() -> bool`: 是否使用BM25
202
+ - `get_rag_use_rerank() -> bool`: 是否使用重排
203
+ - `get_rag_embedding_cache_path() -> str`: 嵌入缓存路径
204
+ - `get_rag_vector_db_path() -> str`: 向量数据库路径
205
+
206
+ ## 在代码中使用配置
207
+
208
+ ### 方式 1: 使用 Registry 从配置创建
209
+
210
+ ```python
211
+ from jarvis.jarvis_rag.embeddings import EmbeddingRegistry
212
+ from jarvis.jarvis_rag.rerankers import RerankerRegistry
213
+
214
+ # 从配置创建模型实例
215
+ embedding = EmbeddingRegistry.create_from_config()
216
+ reranker = RerankerRegistry.create_from_config()
217
+ ```
218
+
219
+ ### 方式 2: 手动创建(覆盖配置)
220
+
221
+ ```python
222
+ from jarvis.jarvis_rag.embeddings import EmbeddingRegistry
223
+
224
+ registry = EmbeddingRegistry.get_global_registry()
225
+ embedding = registry.create_embedding(
226
+ "LocalEmbeddingModel",
227
+ model_name="custom-model",
228
+ cache_dir="/custom/cache"
229
+ )
230
+ ```
231
+
232
+ ### 方式 3: 在 RAG Pipeline 中使用
233
+
234
+ ```python
235
+ from jarvis.jarvis_rag import JarvisRAGPipeline
236
+
237
+ # RAG Pipeline 会自动从配置创建模型
238
+ pipeline = JarvisRAGPipeline()
239
+ # 内部会调用 EmbeddingRegistry.create_from_config() 和 RerankerRegistry.create_from_config()
240
+ ```
241
+
242
+ ## 环境变量
243
+
244
+ 对于在线模型,建议使用环境变量存储 API 密钥:
245
+
246
+ ```bash
247
+ export OPENAI_API_KEY="your-key"
248
+ export COHERE_API_KEY="your-key"
249
+ export EDGEFN_API_KEY="your-key"
250
+ export JINA_API_KEY="your-key"
251
+ ```
252
+
253
+ 然后在配置中只需要指定类型,不需要在 `embedding_config` 或 `reranker_config` 中提供 API 密钥。
254
+
255
+ ## 向后兼容性
256
+
257
+ 如果不指定 `embedding_type` 或 `reranker_type`,系统会:
258
+
259
+ 1. 尝试从配置创建(如果配置了类型)
260
+ 2. 回退到使用 `LocalEmbeddingModel` 和 `LocalReranker`(传统方式)
261
+
262
+ 这确保了现有代码无需修改即可继续工作。
263
+
264
+ ## 调试
265
+
266
+ 如果模型创建失败,检查:
267
+
268
+ 1. 配置中的类型名称是否正确(区分大小写)
269
+ 2. 模型类型是否已在注册表中注册
270
+ 3. 配置参数是否正确(特别是 API 密钥)
271
+ 4. 查看控制台输出的错误信息
272
+
273
+ ## 完整配置示例
274
+
275
+ ```python
276
+ # 在环境变量或配置文件中设置
277
+ rag = {
278
+ # 嵌入模型配置
279
+ "embedding_model": "BAAI/bge-m3",
280
+ "embedding_type": "LocalEmbeddingModel",
281
+ "embedding_max_length": 512, # 模型最大输入token数,用于文档分割
282
+ "embedding_config": {
283
+ # 本地模型通常不需要额外配置
284
+ # 在线模型可能需要 api_key 等
285
+ },
286
+
287
+ # 重排模型配置
288
+ "rerank_model": "bge-reranker-v2-m3",
289
+ "reranker_type": "LocalReranker",
290
+ "reranker_max_length": 512, # 模型最大输入token数
291
+ "reranker_config": {
292
+ # 配置参数
293
+ },
294
+
295
+ # 功能开关
296
+ "use_bm25": True,
297
+ "use_rerank": True,
298
+ }
299
+
300
+ # 或使用配置组
301
+ rag_group = "text"
302
+ rag_groups = [
303
+ {
304
+ "text": {
305
+ "embedding_model": "BAAI/bge-m3",
306
+ "embedding_type": "LocalEmbeddingModel",
307
+ "rerank_model": "BAAI/bge-reranker-v2-m3",
308
+ "reranker_type": "LocalReranker",
309
+ "use_bm25": True,
310
+ "use_rerank": True,
311
+ }
312
+ },
313
+ ]
314
+ ```
@@ -0,0 +1,311 @@
1
+ # 动态加载自定义模型指南
2
+
3
+ 本文档介绍如何使用动态加载功能添加自定义嵌入模型和重排模型。
4
+
5
+ ## 概述
6
+
7
+ Jarvis RAG 框架支持动态加载自定义模型实现,类似于 `jarvis_platform` 的注册表机制。您可以在用户数据目录中创建自定义模型实现,系统会自动发现并加载它们。
8
+
9
+ ## 目录结构
10
+
11
+ 自定义模型应该放在以下目录:
12
+
13
+ - **嵌入模型**: `~/.jarvis/embeddings/` (或通过 `get_data_dir()` 获取的目录下的 `embeddings/`)
14
+ - **重排模型**: `~/.jarvis/rerankers/` (或通过 `get_data_dir()` 获取的目录下的 `rerankers/`)
15
+
16
+ 这些目录会在首次使用时自动创建。
17
+
18
+ ## 实现自定义嵌入模型
19
+
20
+ ### 1. 创建模型文件
21
+
22
+ 在 `~/.jarvis/embeddings/` 目录下创建一个 Python 文件,例如 `my_custom_embedding.py`:
23
+
24
+ ```python
25
+ from typing import List, Optional
26
+ from jarvis.jarvis_rag.embedding_interface import EmbeddingInterface
27
+ from jarvis.jarvis_rag.embeddings.base import OnlineEmbeddingModel
28
+
29
+ class MyCustomEmbeddingModel(OnlineEmbeddingModel):
30
+ """
31
+ 自定义嵌入模型实现示例。
32
+ """
33
+
34
+ def __init__(
35
+ self,
36
+ api_key: Optional[str] = None,
37
+ model_name: str = "my-model",
38
+ base_url: str = "https://api.example.com/v1/embeddings",
39
+ **kwargs,
40
+ ):
41
+ super().__init__(
42
+ api_key=api_key,
43
+ api_key_env="MY_API_KEY", # 环境变量名
44
+ base_url=base_url,
45
+ model_name=model_name,
46
+ **kwargs,
47
+ )
48
+
49
+ def _call_api(
50
+ self, texts: List[str], is_query: bool = False
51
+ ) -> List[List[float]]:
52
+ """
53
+ 实现您的 API 调用逻辑。
54
+ """
55
+ import requests
56
+
57
+ headers = {
58
+ "Authorization": f"Bearer {self.api_key}",
59
+ "Content-Type": "application/json",
60
+ }
61
+
62
+ payload = {
63
+ "model": self.model_name,
64
+ "input": texts if len(texts) > 1 else texts[0],
65
+ }
66
+
67
+ response = requests.post(
68
+ self.base_url, headers=headers, json=payload, timeout=60
69
+ )
70
+ response.raise_for_status()
71
+
72
+ data = response.json()
73
+ # 根据您的 API 响应格式解析嵌入向量
74
+ return data["embeddings"]
75
+ ```
76
+
77
+ ### 2. 必需的方法
78
+
79
+ 自定义嵌入模型必须实现以下方法:
80
+
81
+ - `embed_documents(texts: List[str]) -> List[List[float]]`: 为文档列表计算嵌入
82
+ - `embed_query(text: str) -> List[float]`: 为查询计算嵌入
83
+
84
+ 如果继承自 `OnlineEmbeddingModel`,只需要实现 `_call_api` 方法。
85
+
86
+ ### 3. 使用自定义模型
87
+
88
+ ```python
89
+ from jarvis.jarvis_rag.embeddings import EmbeddingRegistry
90
+
91
+ # 获取注册表
92
+ registry = EmbeddingRegistry.get_global_registry()
93
+
94
+ # 查看可用的模型
95
+ print(registry.get_available_embeddings())
96
+
97
+ # 创建自定义模型实例
98
+ embedding = registry.create_embedding(
99
+ "MyCustomEmbeddingModel",
100
+ api_key="your-api-key",
101
+ model_name="my-model"
102
+ )
103
+
104
+ # 使用模型
105
+ embeddings = embedding.embed_documents(["文档1", "文档2"])
106
+ query_embedding = embedding.embed_query("查询文本")
107
+ ```
108
+
109
+ ## 实现自定义重排模型
110
+
111
+ ### 1. 创建模型文件
112
+
113
+ 在 `~/.jarvis/rerankers/` 目录下创建一个 Python 文件,例如 `my_custom_reranker.py`:
114
+
115
+ ```python
116
+ from typing import List, Optional
117
+ from langchain.docstore.document import Document
118
+ from jarvis.jarvis_rag.reranker_interface import RerankerInterface
119
+ from jarvis.jarvis_rag.rerankers.base import OnlineReranker
120
+
121
+ class MyCustomReranker(OnlineReranker):
122
+ """
123
+ 自定义重排模型实现示例。
124
+ """
125
+
126
+ def __init__(
127
+ self,
128
+ api_key: Optional[str] = None,
129
+ model_name: str = "my-reranker",
130
+ base_url: str = "https://api.example.com/v1/rerank",
131
+ **kwargs,
132
+ ):
133
+ super().__init__(
134
+ api_key=api_key,
135
+ api_key_env="MY_API_KEY",
136
+ base_url=base_url,
137
+ model_name=model_name,
138
+ **kwargs,
139
+ )
140
+
141
+ def _call_api(
142
+ self, query: str, documents: List[str]
143
+ ) -> List[tuple[int, float]]:
144
+ """
145
+ 实现您的 API 调用逻辑。
146
+ 返回 (索引, 分数) 元组列表,按分数降序排序。
147
+ """
148
+ import requests
149
+
150
+ headers = {
151
+ "Authorization": f"Bearer {self.api_key}",
152
+ "Content-Type": "application/json",
153
+ }
154
+
155
+ payload = {
156
+ "model": self.model_name,
157
+ "query": query,
158
+ "documents": documents,
159
+ }
160
+
161
+ response = requests.post(
162
+ self.base_url, headers=headers, json=payload, timeout=60
163
+ )
164
+ response.raise_for_status()
165
+
166
+ data = response.json()
167
+
168
+ # 解析结果,返回 (索引, 分数) 列表
169
+ results = [
170
+ (item["index"], item["score"])
171
+ for item in data["results"]
172
+ ]
173
+ results.sort(key=lambda x: x[1], reverse=True)
174
+
175
+ return results
176
+ ```
177
+
178
+ ### 2. 必需的方法
179
+
180
+ 自定义重排模型必须实现以下方法:
181
+
182
+ - `rerank(query: str, documents: List[Document], top_n: int = 5) -> List[Document]`: 对文档进行重排
183
+
184
+ 如果继承自 `OnlineReranker`,只需要实现 `_call_api` 方法。
185
+
186
+ ### 3. 使用自定义模型
187
+
188
+ ```python
189
+ from jarvis.jarvis_rag.rerankers import RerankerRegistry
190
+ from langchain.docstore.document import Document
191
+
192
+ # 获取注册表
193
+ registry = RerankerRegistry.get_global_registry()
194
+
195
+ # 查看可用的模型
196
+ print(registry.get_available_rerankers())
197
+
198
+ # 创建自定义模型实例
199
+ reranker = registry.create_reranker(
200
+ "MyCustomReranker",
201
+ api_key="your-api-key",
202
+ model_name="my-reranker"
203
+ )
204
+
205
+ # 使用模型
206
+ documents = [
207
+ Document(page_content="文档1", metadata={"source": "doc1"}),
208
+ Document(page_content="文档2", metadata={"source": "doc2"}),
209
+ ]
210
+ reranked = reranker.rerank("查询", documents, top_n=3)
211
+ ```
212
+
213
+ ## 实现本地模型
214
+
215
+ 您也可以实现完全自定义的本地模型(不继承基类):
216
+
217
+ ```python
218
+ from typing import List
219
+ from jarvis.jarvis_rag.embedding_interface import EmbeddingInterface
220
+
221
+ class MyLocalEmbeddingModel(EmbeddingInterface):
222
+ """
223
+ 完全自定义的本地嵌入模型。
224
+ """
225
+
226
+ def __init__(self, model_path: str):
227
+ # 加载您的本地模型
228
+ self.model = load_your_model(model_path)
229
+
230
+ def embed_documents(self, texts: List[str]) -> List[List[float]]:
231
+ # 实现文档嵌入逻辑
232
+ return [self.model.encode(text) for text in texts]
233
+
234
+ def embed_query(self, text: str) -> List[float]:
235
+ # 实现查询嵌入逻辑
236
+ return self.model.encode(text)
237
+ ```
238
+
239
+ ## 验证实现
240
+
241
+ 系统会自动验证您的实现:
242
+
243
+ 1. **方法检查**: 确保实现了所有必需的方法
244
+ 2. **参数检查**: 确保方法参数匹配
245
+ 3. **类型检查**: 确保类继承自正确的接口
246
+
247
+ 如果验证失败,系统会输出错误信息,但不会中断其他模型的加载。
248
+
249
+ ## 注册表 API
250
+
251
+ ### EmbeddingRegistry
252
+
253
+ - `get_global_registry() -> EmbeddingRegistry`: 获取全局注册表实例
254
+ - `get_available_embeddings() -> List[str]`: 获取所有可用的嵌入模型名称
255
+ - `create_embedding(name: str, *args, **kwargs) -> Optional[EmbeddingInterface]`: 创建嵌入模型实例
256
+ - `register_embedding(name: str, embedding_class: Type[EmbeddingInterface])`: 手动注册模型类
257
+
258
+ ### RerankerRegistry
259
+
260
+ - `get_global_registry() -> RerankerRegistry`: 获取全局注册表实例
261
+ - `get_available_rerankers() -> List[str]`: 获取所有可用的重排模型名称
262
+ - `create_reranker(name: str, *args, **kwargs) -> Optional[RerankerInterface]`: 创建重排模型实例
263
+ - `register_reranker(name: str, reranker_class: Type[RerankerInterface])`: 手动注册模型类
264
+
265
+ ## 注意事项
266
+
267
+ 1. **文件命名**: 文件名应该使用下划线命名(如 `my_custom_model.py`),类名使用驼峰命名(如 `MyCustomModel`)
268
+
269
+ 2. **导入依赖**: 确保您的自定义模型所需的依赖已安装
270
+
271
+ 3. **错误处理**: 建议在 `_call_api` 方法中添加适当的错误处理
272
+
273
+ 4. **性能考虑**: 对于批量处理,考虑实现批处理逻辑以提高效率
274
+
275
+ 5. **缓存**: 如果需要缓存,可以在自定义类中添加缓存逻辑
276
+
277
+ ## 示例:完整工作流
278
+
279
+ ```python
280
+ # 1. 创建自定义模型文件 ~/.jarvis/embeddings/my_api.py
281
+ # (参考上面的示例代码)
282
+
283
+ # 2. 在代码中使用
284
+ from jarvis.jarvis_rag.embeddings import EmbeddingRegistry
285
+
286
+ registry = EmbeddingRegistry.get_global_registry()
287
+
288
+ # 检查模型是否已加载
289
+ if "MyApiEmbeddingModel" in registry.get_available_embeddings():
290
+ # 创建实例
291
+ embedding = registry.create_embedding(
292
+ "MyApiEmbeddingModel",
293
+ api_key="your-key"
294
+ )
295
+
296
+ # 使用模型
297
+ result = embedding.embed_query("测试查询")
298
+ print(result)
299
+ else:
300
+ print("模型未找到,请检查文件是否正确放置")
301
+ ```
302
+
303
+ ## 调试
304
+
305
+ 如果模型未加载,检查:
306
+
307
+ 1. 文件是否在正确的目录(`~/.jarvis/embeddings/` 或 `~/.jarvis/rerankers/`)
308
+ 2. 文件是否以 `.py` 结尾且不以 `__` 开头
309
+ 3. 类是否继承自正确的接口
310
+ 4. 是否实现了所有必需的方法
311
+ 5. 查看控制台输出的错误信息