jarvis-ai-assistant 0.1.219__py3-none-any.whl → 0.1.220__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.
@@ -0,0 +1,201 @@
1
+ import os
2
+ import pickle
3
+ from typing import Any, Dict, List, cast
4
+
5
+ import chromadb
6
+ from langchain.docstore.document import Document
7
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
8
+ from rank_bm25 import BM25Okapi # type: ignore
9
+
10
+ from .embedding_manager import EmbeddingManager
11
+
12
+
13
+ class ChromaRetriever:
14
+ """
15
+ A retriever class that combines dense vector search (ChromaDB) and
16
+ sparse keyword search (BM25) for hybrid retrieval.
17
+ """
18
+
19
+ def __init__(
20
+ self,
21
+ embedding_manager: EmbeddingManager,
22
+ db_path: str,
23
+ collection_name: str = "jarvis_rag_collection",
24
+ ):
25
+ """
26
+ Initializes the ChromaRetriever.
27
+
28
+ Args:
29
+ embedding_manager: An instance of EmbeddingManager.
30
+ db_path: The file path for ChromaDB's persistent storage.
31
+ collection_name: The name of the collection within ChromaDB.
32
+ """
33
+ self.embedding_manager = embedding_manager
34
+ self.db_path = db_path
35
+ self.collection_name = collection_name
36
+
37
+ # Initialize ChromaDB client
38
+ self.client = chromadb.PersistentClient(path=self.db_path)
39
+ self.collection = self.client.get_or_create_collection(
40
+ name=self.collection_name
41
+ )
42
+ print(
43
+ f"✅ ChromaDB 客户端已在 '{db_path}' 初始化,集合为 '{collection_name}'。"
44
+ )
45
+
46
+ # BM25 Index setup
47
+ self.bm25_index_path = os.path.join(self.db_path, f"{collection_name}_bm25.pkl")
48
+ self._load_or_initialize_bm25()
49
+
50
+ def _load_or_initialize_bm25(self):
51
+ """Loads the BM25 index from disk or initializes a new one."""
52
+ if os.path.exists(self.bm25_index_path):
53
+ print("🔍 正在加载现有的 BM25 索引...")
54
+ with open(self.bm25_index_path, "rb") as f:
55
+ data = pickle.load(f)
56
+ self.bm25_corpus = data["corpus"]
57
+ self.bm25_index = BM25Okapi(self.bm25_corpus)
58
+ print("✅ BM25 索引加载成功。")
59
+ else:
60
+ print("⚠️ 未找到 BM25 索引,将初始化一个新的。")
61
+ self.bm25_corpus = []
62
+ self.bm25_index = None
63
+
64
+ def _save_bm25_index(self):
65
+ """Saves the BM25 index to disk."""
66
+ if self.bm25_index:
67
+ print("💾 正在保存 BM25 索引...")
68
+ with open(self.bm25_index_path, "wb") as f:
69
+ pickle.dump({"corpus": self.bm25_corpus, "index": self.bm25_index}, f)
70
+ print("✅ BM25 索引保存成功。")
71
+
72
+ def add_documents(
73
+ self, documents: List[Document], chunk_size=1000, chunk_overlap=100
74
+ ):
75
+ """
76
+ Splits, embeds, and adds documents to both ChromaDB and the BM25 index.
77
+ """
78
+ text_splitter = RecursiveCharacterTextSplitter(
79
+ chunk_size=chunk_size, chunk_overlap=chunk_overlap
80
+ )
81
+ chunks = text_splitter.split_documents(documents)
82
+
83
+ print(f"📄 已将 {len(documents)} 个文档拆分为 {len(chunks)} 个块。")
84
+
85
+ if not chunks:
86
+ return
87
+
88
+ # Extract content, metadata, and generate IDs
89
+ chunk_texts = [chunk.page_content for chunk in chunks]
90
+ metadatas = [chunk.metadata for chunk in chunks]
91
+ start_id = self.collection.count()
92
+ ids = [f"doc_{i}" for i in range(start_id, start_id + len(chunks))]
93
+
94
+ # Add to ChromaDB
95
+ embeddings = self.embedding_manager.embed_documents(chunk_texts)
96
+ self.collection.add(
97
+ ids=ids,
98
+ embeddings=cast(Any, embeddings),
99
+ documents=chunk_texts,
100
+ metadatas=cast(Any, metadatas),
101
+ )
102
+ print(f"✅ 成功将 {len(chunks)} 个块添加到 ChromaDB 集合中。")
103
+
104
+ # Update and save BM25 index
105
+ tokenized_chunks = [doc.split() for doc in chunk_texts]
106
+ self.bm25_corpus.extend(tokenized_chunks)
107
+ self.bm25_index = BM25Okapi(self.bm25_corpus)
108
+ self._save_bm25_index()
109
+
110
+ def retrieve(self, query: str, n_results: int = 5) -> List[Document]:
111
+ """
112
+ Performs hybrid retrieval using both vector search and BM25,
113
+ then fuses the results using Reciprocal Rank Fusion (RRF).
114
+ """
115
+ # 1. Vector Search (ChromaDB)
116
+ query_embedding = self.embedding_manager.embed_query(query)
117
+ vector_results = self.collection.query(
118
+ query_embeddings=cast(Any, [query_embedding]),
119
+ n_results=n_results * 2, # Retrieve more results for fusion
120
+ )
121
+
122
+ # 2. Keyword Search (BM25)
123
+ bm25_docs = []
124
+ if self.bm25_index:
125
+ tokenized_query = query.split()
126
+ doc_scores = self.bm25_index.get_scores(tokenized_query)
127
+
128
+ # Get all documents from Chroma to match with BM25 scores
129
+ all_docs_in_collection = self.collection.get()
130
+ all_documents = all_docs_in_collection.get("documents")
131
+ all_metadatas = all_docs_in_collection.get("metadatas")
132
+
133
+ bm25_results_with_docs = []
134
+ if all_documents and all_metadatas:
135
+ # Create a mapping from index to document
136
+ bm25_results_with_docs = [
137
+ (
138
+ all_documents[i],
139
+ all_metadatas[i],
140
+ score,
141
+ )
142
+ for i, score in enumerate(doc_scores)
143
+ if score > 0
144
+ ]
145
+
146
+ # Sort by score and take top results
147
+ bm25_results_with_docs.sort(key=lambda x: x[2], reverse=True)
148
+
149
+ for doc_text, metadata, _ in bm25_results_with_docs[: n_results * 2]:
150
+ bm25_docs.append(Document(page_content=doc_text, metadata=metadata))
151
+
152
+ # 3. Reciprocal Rank Fusion (RRF)
153
+ fused_scores: Dict[str, float] = {}
154
+ k = 60 # RRF ranking constant
155
+
156
+ # Process vector results
157
+ if vector_results and vector_results["ids"] and vector_results["documents"]:
158
+ vec_ids = vector_results["ids"][0]
159
+ vec_texts = vector_results["documents"][0]
160
+
161
+ for rank, doc_id in enumerate(vec_ids):
162
+ fused_scores[doc_id] = fused_scores.get(doc_id, 0) + 1 / (k + rank)
163
+
164
+ # Create a map from document text to its ID for BM25 fusion
165
+ doc_text_to_id = {text: doc_id for text, doc_id in zip(vec_texts, vec_ids)}
166
+
167
+ for rank, doc in enumerate(bm25_docs):
168
+ bm25_doc_id = doc_text_to_id.get(doc.page_content)
169
+ if bm25_doc_id:
170
+ fused_scores[bm25_doc_id] = fused_scores.get(bm25_doc_id, 0) + 1 / (
171
+ k + rank
172
+ )
173
+
174
+ # Sort fused results
175
+ sorted_fused_results = sorted(
176
+ fused_scores.items(), key=lambda x: x[1], reverse=True
177
+ )
178
+
179
+ # Get the final documents from ChromaDB based on fused ranking
180
+ final_doc_ids = [item[0] for item in sorted_fused_results[:n_results]]
181
+
182
+ if not final_doc_ids:
183
+ return []
184
+
185
+ final_docs_data = self.collection.get(ids=final_doc_ids)
186
+
187
+ retrieved_docs = []
188
+ if final_docs_data:
189
+ final_documents = final_docs_data.get("documents")
190
+ final_metadatas = final_docs_data.get("metadatas")
191
+
192
+ if final_documents and final_metadatas:
193
+ for doc_text, metadata in zip(final_documents, final_metadatas):
194
+ if doc_text is not None and metadata is not None:
195
+ retrieved_docs.append(
196
+ Document(
197
+ page_content=cast(str, doc_text), metadata=metadata
198
+ )
199
+ )
200
+
201
+ return retrieved_docs
@@ -3,6 +3,7 @@ import os
3
3
  from functools import lru_cache
4
4
  from typing import Any, Dict, List
5
5
 
6
+ import torch
6
7
  import yaml # type: ignore
7
8
 
8
9
  from jarvis.jarvis_utils.builtin_replace_map import BUILTIN_REPLACE_MAP
@@ -248,3 +249,73 @@ def get_mcp_config() -> List[Dict[str, Any]]:
248
249
  List[Dict[str, Any]]: MCP配置项列表,如果未配置则返回空列表
249
250
  """
250
251
  return GLOBAL_CONFIG_DATA.get("JARVIS_MCP", [])
252
+
253
+
254
+ # ==============================================================================
255
+ # RAG Framework Configuration
256
+ # ==============================================================================
257
+
258
+ EMBEDDING_MODELS = {
259
+ "performance": {
260
+ "model_name": "BAAI/bge-base-zh-v1.5",
261
+ "model_kwargs": {"device": "cuda" if torch.cuda.is_available() else "cpu"},
262
+ "encode_kwargs": {"normalize_embeddings": True},
263
+ "show_progress": True,
264
+ },
265
+ "accuracy": {
266
+ "model_name": "BAAI/bge-large-zh-v1.5",
267
+ "model_kwargs": {"device": "cuda" if torch.cuda.is_available() else "cpu"},
268
+ "encode_kwargs": {"normalize_embeddings": True},
269
+ "show_progress": True,
270
+ },
271
+ }
272
+
273
+
274
+ def get_rag_config() -> Dict[str, Any]:
275
+ """
276
+ 获取RAG框架的配置。
277
+
278
+ 返回:
279
+ Dict[str, Any]: RAG配置字典
280
+ """
281
+ return GLOBAL_CONFIG_DATA.get("JARVIS_RAG", {})
282
+
283
+
284
+ def get_rag_embedding_models() -> Dict[str, Any]:
285
+ """
286
+ 获取RAG嵌入模型的定义。
287
+
288
+ 返回:
289
+ Dict[str, Any]: 嵌入模型配置字典
290
+ """
291
+ return EMBEDDING_MODELS
292
+
293
+
294
+ def get_rag_embedding_mode() -> str:
295
+ """
296
+ 获取RAG嵌入模型的模式。
297
+
298
+ 返回:
299
+ str: 'performance' 或 'accuracy'
300
+ """
301
+ return get_rag_config().get("embedding_mode", "performance")
302
+
303
+
304
+ def get_rag_embedding_cache_path() -> str:
305
+ """
306
+ 获取RAG嵌入缓存的路径。
307
+
308
+ 返回:
309
+ str: 缓存路径
310
+ """
311
+ return get_rag_config().get("embedding_cache_path", ".jarvis/rag/embeddings")
312
+
313
+
314
+ def get_rag_vector_db_path() -> str:
315
+ """
316
+ 获取RAG向量数据库的路径。
317
+
318
+ 返回:
319
+ str: 数据库路径
320
+ """
321
+ return get_rag_config().get("vector_db_path", ".jarvis/rag/vectordb")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.219
3
+ Version: 0.1.220
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
@@ -33,11 +33,11 @@ Classifier: Intended Audience :: Developers
33
33
  Classifier: License :: OSI Approved :: MIT License
34
34
  Classifier: Operating System :: POSIX :: Linux
35
35
  Classifier: Programming Language :: Python :: 3
36
- Classifier: Programming Language :: Python :: 3.8
37
36
  Classifier: Programming Language :: Python :: 3.9
38
37
  Classifier: Programming Language :: Python :: 3.10
39
38
  Classifier: Programming Language :: Python :: 3.11
40
- Requires-Python: >=3.8
39
+ Classifier: Programming Language :: Python :: 3.12
40
+ Requires-Python: >=3.9
41
41
  Description-Content-Type: text/markdown
42
42
  License-File: LICENSE
43
43
  Requires-Dist: requests==2.32.3
@@ -56,9 +56,19 @@ Requires-Dist: tabulate==0.9.0
56
56
  Requires-Dist: pyte==0.8.2
57
57
  Requires-Dist: httpx>=0.28.1
58
58
  Requires-Dist: pyyaml>=5.3.1
59
- Requires-Dist: ddgs==6.1.8
60
- Requires-Dist: beautifulsoup4==4.12.3
61
- Requires-Dist: lxml==5.2.2
59
+ Requires-Dist: ddgs==9.0.2
60
+ Requires-Dist: beautifulsoup4==4.13.4
61
+ Requires-Dist: lxml==6.0.0
62
+ Requires-Dist: langchain
63
+ Requires-Dist: langchain-community
64
+ Requires-Dist: langchain-huggingface
65
+ Requires-Dist: chromadb
66
+ Requires-Dist: diskcache
67
+ Requires-Dist: sentence-transformers==2.7.0
68
+ Requires-Dist: torch>=2.6
69
+ Requires-Dist: typer
70
+ Requires-Dist: unstructured[md]
71
+ Requires-Dist: rank-bm25
62
72
  Provides-Extra: dev
63
73
  Requires-Dist: pytest; extra == "dev"
64
74
  Requires-Dist: black; extra == "dev"
@@ -553,7 +563,76 @@ OPENAI_API_BASE: https://api.openai.com/v1
553
563
  | search_web | 使用互联网搜索 |
554
564
  | virtual_tty | 控制虚拟终端执行操作 |
555
565
 
556
- ### 2. 命令替换功能
566
+ ### 2. 🧠 RAG增强知识库 (`jarvis-rag`)
567
+
568
+ `jarvis-rag` 是一个强大的命令行工具,用于构建、管理和查询本地化的RAG(检索增强生成)知识库。它允许您将自己的文档(代码、笔记、文章等)作为外部知识源,让AI能够基于这些具体内容进行回答,而不是仅仅依赖其通用训练数据。
569
+
570
+ #### 核心功能
571
+
572
+ - **本地化知识库**:所有文档索引和数据都存储在本地,确保数据隐私和安全。
573
+ - **智能文档加载**:自动识别并加载多种文本文件,无需关心文件后缀。
574
+ - **灵活的查询**:支持使用项目默认的“思考”模型或动态指定任意已注册的LLM进行查询。
575
+ - **配置驱动**:通过 `config.toml` 或 `.jarvis/config.yaml` 进行集中配置。
576
+
577
+ #### 子命令说明
578
+
579
+ ##### 2.1 添加文档到知识库 (`add`)
580
+
581
+ 此命令用于将文件、目录或符合通配符模式的文档添加到知识库中。
582
+
583
+ ```bash
584
+ # 基本用法
585
+ jarvis-rag add <文件路径/目录路径/通配符模式>...
586
+
587
+ # 示例
588
+ # 1. 添加单个文件
589
+ jarvis-rag add ./docs/my_document.md
590
+
591
+ # 2. 添加整个目录(将递归扫描所有文本文件)
592
+ jarvis-rag add ./src/
593
+
594
+ # 3. 使用通配符添加所有Python文件
595
+ jarvis-rag add 'src/**/*.py'
596
+
597
+ # 4. 混合添加
598
+ jarvis-rag add README.md ./docs/ 'src/jarvis/jarvis_rag/*.py'
599
+ ```
600
+
601
+ **参数与选项:**
602
+
603
+ | 参数/选项 | 描述 |
604
+ |---|---|
605
+ | `paths` | **[必需]** 一个或多个文件路径、目录路径或用引号包裹的通配符模式。 |
606
+ | `--collection` | 指定知识库的集合名称(默认为 `jarvis_rag_collection`)。 |
607
+ | `--embedding-mode` | 覆盖全局配置,强制使用特定嵌入模式 (`performance` 或 `accuracy`)。 |
608
+ | `--db-path` | 覆盖全局配置,指定向量数据库的存储路径。 |
609
+
610
+ ##### 2.2 查询知识库 (`query`)
611
+
612
+ 此命令用于向已建立的知识库提出问题。
613
+
614
+ ```bash
615
+ # 基本用法
616
+ jarvis-rag query "你的问题"
617
+
618
+ # 示例
619
+ # 1. 使用默认配置进行查询
620
+ jarvis-rag query "请总结一下我添加的文档的核心内容"
621
+
622
+ # 2. 指定使用Kimi模型进行查询
623
+ jarvis-rag query "代码中的 'PlatformRegistry' 类是做什么用的?" --platform kimi --model moonshot-v1-8k
624
+ ```
625
+
626
+ **参数与选项:**
627
+
628
+ | 参数/选项 | 描述 |
629
+ |---|---|
630
+ | `question` | **[必需]** 你要向知识库提出的问题。 |
631
+ | `--collection` | 指定要查询的知识库集合名称。 |
632
+ | `--platform` | 指定一个平台名称来回答问题,覆盖默认的“思考”模型。 |
633
+ | `--model` | 指定一个模型名称来回答问题,需要与 `--platform` 同时使用。 |
634
+
635
+ ### 3. 命令替换功能
557
636
  支持使用特殊标记`'<tag>'`触发命令替换功能:
558
637
 
559
638
  | 标记 | 功能 |
@@ -568,7 +647,7 @@ OPENAI_API_BASE: https://api.openai.com/v1
568
647
  | `'Check'` | 执行静态代码检查,包括错误和风格问题 |
569
648
  | `'SaveSession'` | 保存当前会话并退出 |
570
649
 
571
- ### 3. 自定义替换配置
650
+ ### 4. 自定义替换配置
572
651
  在`~/.jarvis/config.yaml`中添加:
573
652
  ```yaml
574
653
  JARVIS_REPLACE_MAP:
@@ -1,5 +1,5 @@
1
- jarvis/__init__.py,sha256=x-8iFMYvuXxwrK7rGOft1XoFsZ5u3LFR6I6NWuFOq0s,75
2
- jarvis/jarvis_agent/__init__.py,sha256=9R4dx4Y-DJRNiRPhzp16ih3Jkkc6VIFmyWg_AloW6KU,33198
1
+ jarvis/__init__.py,sha256=0ON7ERLL2QcDALpdR5gdhdn4WyjDQsqfLGVfq5qjuTU,75
2
+ jarvis/jarvis_agent/__init__.py,sha256=AfWzPW1TQbfpgTK8P5yIf1pvMfv1dut6iMumRag1B2w,32289
3
3
  jarvis/jarvis_agent/builtin_input_handler.py,sha256=lcw-VBm8-CVcblxEbGU4dVD6IixgXTLz9uBrv9Y6p20,2710
4
4
  jarvis/jarvis_agent/edit_file_handler.py,sha256=vKx26I4yOQwiQHNfkqMJ44Ybf90n37mojTcXNQQy-hw,17382
5
5
  jarvis/jarvis_agent/jarvis.py,sha256=4LBtAh9_AuQcjvqBFInqY19eyEJVJtGH4py32yu8olc,6287
@@ -30,7 +30,7 @@ jarvis/jarvis_code_analysis/checklists/shell.py,sha256=aRFYhQQvTgbYd-uY5pc8UHIUA
30
30
  jarvis/jarvis_code_analysis/checklists/sql.py,sha256=vR0T6qC7b4dURjJVAd7kSVxyvZEQXPG1Jqc2sNTGp5c,2355
31
31
  jarvis/jarvis_code_analysis/checklists/swift.py,sha256=TPx4I6Gupvs6tSerRKmTSKEPQpOLEbH2Y7LXg1uBgxc,2566
32
32
  jarvis/jarvis_code_analysis/checklists/web.py,sha256=25gGD7pDadZQybNFvALYxWvK0VRjGQb1NVJQElwjyk0,3943
33
- jarvis/jarvis_data/config_schema.json,sha256=BeaihTD2eYRZq65-tbmCIx7lBdS5U0V1FOQGIc6XCq0,5849
33
+ jarvis/jarvis_data/config_schema.json,sha256=5pkd_5GBUvrsIPbVKb7dE-r67Zcv4EgNJGqKFhssHsI,6861
34
34
  jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4,sha256=Ijkht27pm96ZW3_3OFE-7xAPtR0YyTWXoRO8_-hlsqc,1681126
35
35
  jarvis/jarvis_git_details/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
36
  jarvis/jarvis_git_details/main.py,sha256=MjpUHB4ErR_SKPBx1TLLK_XLkH427RTtsyVn6EUd88Y,8907
@@ -53,10 +53,19 @@ jarvis/jarvis_platform/openai.py,sha256=ccGqsU2cFfd5324P7SH1tSmFABpvto8fytmxQGkr
53
53
  jarvis/jarvis_platform/oyi.py,sha256=GvVooV8ScRqDb9QxJdINtdZwsx6PUIdo1-bt9k0hmqY,12604
54
54
  jarvis/jarvis_platform/registry.py,sha256=1bMy0YZUa8NLzuZlKfC4CBtpa0iniypTxUZk0Hv6g9Y,8415
55
55
  jarvis/jarvis_platform/tongyi.py,sha256=vSK1b4NhTeHbNhTgGRj4PANXptwCAwitczwK8VXwWwU,22921
56
- jarvis/jarvis_platform/yuanbao.py,sha256=W4yEsjkxnwi681UnAX0hV8vVPuNRmn6lRGZ3G-d74nw,23007
56
+ jarvis/jarvis_platform/yuanbao.py,sha256=AIGQ0VOD_IAwWLnU9G19OG0XAbHpcJDzVWX2VazsyAI,23092
57
57
  jarvis/jarvis_platform_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
58
  jarvis/jarvis_platform_manager/main.py,sha256=LxlXSfIfmkYNcajOG_XvvlmwlSWSGb0DmbzIDSHHYOU,18330
59
59
  jarvis/jarvis_platform_manager/service.py,sha256=hQGWQ2qAlzm_C_lNQDuLORQ4rmjR1P1-V3ou7l2Bv0s,13622
60
+ jarvis/jarvis_rag/__init__.py,sha256=_-uyfhhKbuwfIbyl0OOyq2QdTXu0LB9-ZhxyU8L27kQ,326
61
+ jarvis/jarvis_rag/cache.py,sha256=e4k3qJxgscqunvIsn5q7AUj_hiMqlvaO5Uznx9KuIbQ,2787
62
+ jarvis/jarvis_rag/cli.py,sha256=PvRtkbU7BETJ_tLpx6ODQVU3nejIcobB4GIZyi8sZDs,10109
63
+ jarvis/jarvis_rag/embedding_manager.py,sha256=ldHxm2E-EoHdmQk2oryH7nbtfwkpTE14-lAHkVbYPlM,4035
64
+ jarvis/jarvis_rag/llm_interface.py,sha256=I4yJOIWO4XdceZBcmRxDFZOj7yGKBNhdrxI7FO2KfRw,4576
65
+ jarvis/jarvis_rag/query_rewriter.py,sha256=bPYtFlTBai0V9bXSmW3zlJ2IbwUtuVbVniFG1G-l4vE,2246
66
+ jarvis/jarvis_rag/rag_pipeline.py,sha256=Bhhl6sponge9ylNHYFsRgu0vj-Jb7qwPXwC4sgpcZ_A,6582
67
+ jarvis/jarvis_rag/reranker.py,sha256=ZwrPxr0NxkGm7KIc5kpsj08AmyyES6TDmnw5AYm4m-Y,1829
68
+ jarvis/jarvis_rag/retriever.py,sha256=MNPETffQxwj7bOoQKveVhvnHKnCb_-XOQgZZITf66C8,7719
60
69
  jarvis/jarvis_smart_shell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
70
  jarvis/jarvis_smart_shell/main.py,sha256=DbhRSP1sZfSIaTltP1YWVDSQOTYEsbiOnfO9kSYwcNs,6959
62
71
  jarvis/jarvis_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -77,7 +86,7 @@ jarvis/jarvis_tools/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
77
86
  jarvis/jarvis_tools/cli/main.py,sha256=Mg6TQDxMdzB1Ua1UrZ2EE-uQWsbaeojWaEGHJp2HimA,6375
78
87
  jarvis/jarvis_utils/__init__.py,sha256=67h0ldisGlh3oK4DAeNEL2Bl_VsI3tSmfclasyVlueM,850
79
88
  jarvis/jarvis_utils/builtin_replace_map.py,sha256=EI8JnHqr-ZpAhpwocTu48DhHUMHNd8tNUpDNYI47OLE,1717
80
- jarvis/jarvis_utils/config.py,sha256=MO2-1z_7f3KkSrv7heGK1650Zb0SjnljO2hzLE2jA5c,6598
89
+ jarvis/jarvis_utils/config.py,sha256=9rPmyggYBeDUoLv7IE8mPeXjn50n_VqUt5NXQtHeMUQ,8357
81
90
  jarvis/jarvis_utils/embedding.py,sha256=oEOEM2qf16DMYwPsQe6srET9BknyjOdY2ef0jsp3Or8,2714
82
91
  jarvis/jarvis_utils/file_processors.py,sha256=XiM248SHS7lLgQDCbORVFWqinbVDUawYxWDOsLXDxP8,3043
83
92
  jarvis/jarvis_utils/git_utils.py,sha256=4mNbEgV0icMnB1UL1RWhE9Nxik3mwam2qcGMpd1ODJM,21707
@@ -88,9 +97,9 @@ jarvis/jarvis_utils/methodology.py,sha256=-cvM6pwgJK7BXCYg2uVjIId_j3v5RUh2z2PBcK
88
97
  jarvis/jarvis_utils/output.py,sha256=PRCgudPOB8gMEP3u-g0FGD2c6tBgJhLXUMqNPglfjV8,10813
89
98
  jarvis/jarvis_utils/tag.py,sha256=f211opbbbTcSyzCDwuIK_oCnKhXPNK-RknYyGzY1yD0,431
90
99
  jarvis/jarvis_utils/utils.py,sha256=ojupkZQfFIE6ysTyCy0jUdePucpwpvZlZJSXkGsdyQE,15263
91
- jarvis_ai_assistant-0.1.219.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
92
- jarvis_ai_assistant-0.1.219.dist-info/METADATA,sha256=Dn-M7q32tMW3ATjIl1ZhI42MDnBPsAkAytgwef8abzM,19706
93
- jarvis_ai_assistant-0.1.219.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
94
- jarvis_ai_assistant-0.1.219.dist-info/entry_points.txt,sha256=SF46ViTZcQVZEfbqzJDKKVc9TrN1x-P1mQ6wup7u2HY,875
95
- jarvis_ai_assistant-0.1.219.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
96
- jarvis_ai_assistant-0.1.219.dist-info/RECORD,,
100
+ jarvis_ai_assistant-0.1.220.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
101
+ jarvis_ai_assistant-0.1.220.dist-info/METADATA,sha256=fCmHnmrvl-GuwHSUer0rox7iZNdRjJ-eXqV8lLPC5R4,22619
102
+ jarvis_ai_assistant-0.1.220.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
103
+ jarvis_ai_assistant-0.1.220.dist-info/entry_points.txt,sha256=L-9EE1kKoCdzxY9iMT7dGgBad-ytc3rso4if8C19SQU,915
104
+ jarvis_ai_assistant-0.1.220.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
105
+ jarvis_ai_assistant-0.1.220.dist-info/RECORD,,
@@ -9,6 +9,7 @@ jarvis-git-squash = jarvis.jarvis_git_squash.main:main
9
9
  jarvis-methodology = jarvis.jarvis_methodology.main:main
10
10
  jarvis-multi-agent = jarvis.jarvis_multi_agent.main:main
11
11
  jarvis-platform-manager = jarvis.jarvis_platform_manager.main:main
12
+ jarvis-rag = jarvis.jarvis_rag.cli:main
12
13
  jarvis-smart-shell = jarvis.jarvis_smart_shell.main:main
13
14
  jarvis-tool = jarvis.jarvis_tools.cli.main:main
14
15
  jca = jarvis.jarvis_code_agent.code_agent:main