jarvis-ai-assistant 0.1.74__tar.gz → 0.1.76__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 jarvis-ai-assistant might be problematic. Click here for more details.

Files changed (40) hide show
  1. {jarvis_ai_assistant-0.1.74/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.76}/PKG-INFO +1 -1
  2. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/pyproject.toml +1 -1
  3. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/setup.py +1 -1
  4. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/agent.py +150 -16
  6. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
  7. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/LICENSE +0 -0
  8. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/MANIFEST.in +0 -0
  9. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/README.md +0 -0
  10. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/setup.cfg +0 -0
  11. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/jarvis_codebase/__init__.py +0 -0
  12. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/jarvis_codebase/main.py +0 -0
  13. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/jarvis_coder/__init__.py +0 -0
  14. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/jarvis_coder/main.py +0 -0
  15. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/main.py +0 -0
  16. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/models/__init__.py +0 -0
  17. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/models/ai8.py +0 -0
  18. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/models/base.py +0 -0
  19. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/models/kimi.py +0 -0
  20. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/models/openai.py +0 -0
  21. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/models/oyi.py +0 -0
  22. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/models/registry.py +0 -0
  23. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/tools/__init__.py +0 -0
  24. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/tools/base.py +0 -0
  25. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/tools/codebase_qa.py +0 -0
  26. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/tools/coder.py +0 -0
  27. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/tools/file_ops.py +0 -0
  28. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/tools/generator.py +0 -0
  29. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/tools/methodology.py +0 -0
  30. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/tools/registry.py +0 -0
  31. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/tools/search.py +0 -0
  32. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/tools/shell.py +0 -0
  33. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/tools/sub_agent.py +0 -0
  34. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/tools/webpage.py +0 -0
  35. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis/utils.py +0 -0
  36. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +0 -0
  37. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  38. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  39. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  40. {jarvis_ai_assistant-0.1.74 → jarvis_ai_assistant-0.1.76}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.74
3
+ Version: 0.1.76
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "jarvis-ai-assistant"
7
- version = "0.1.74"
7
+ version = "0.1.76"
8
8
  description = "Jarvis: An AI assistant that uses tools to interact with the system"
9
9
  readme = "README.md"
10
10
  authors = [{ name = "Your Name", email = "your.email@example.com" }]
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name="jarvis-ai-assistant",
5
- version="0.1.74",
5
+ version="0.1.76",
6
6
  author="skyfire",
7
7
  author_email="skyfireitdiy@hotmail.com",
8
8
  description="An AI assistant that uses various tools to interact with the system",
@@ -1,3 +1,3 @@
1
1
  """Jarvis AI Assistant"""
2
2
 
3
- __version__ = "0.1.74"
3
+ __version__ = "0.1.76"
@@ -2,6 +2,9 @@ import time
2
2
  from typing import Dict, List, Optional
3
3
 
4
4
  import yaml
5
+ import numpy as np
6
+ import faiss
7
+ import json
5
8
 
6
9
  from .models.registry import PlatformRegistry
7
10
  from .tools import ToolRegistry
@@ -9,6 +12,7 @@ from .utils import PrettyOutput, OutputType, get_multiline_input, while_success
9
12
  import os
10
13
  from datetime import datetime
11
14
  from prompt_toolkit import prompt
15
+ from sentence_transformers import SentenceTransformer
12
16
 
13
17
  class Agent:
14
18
  def __init__(self, name: str = "Jarvis", is_sub_agent: bool = False):
@@ -26,7 +30,37 @@ class Agent:
26
30
  self.is_sub_agent = is_sub_agent
27
31
  self.prompt = ""
28
32
  self.conversation_turns = 0
29
-
33
+
34
+ # 从环境变量加载嵌入模型配置
35
+ self.embedding_model_name = os.environ.get("JARVIS_EMBEDDING_MODEL", "BAAI/bge-large-zh-v1.5")
36
+ self.embedding_dimension = 1536 # Default for many embedding models
37
+
38
+ # 初始化嵌入模型
39
+ try:
40
+ os.environ["TOKENIZERS_PARALLELISM"] = "false"
41
+ PrettyOutput.print(f"正在加载嵌入模型: {self.embedding_model_name}...", OutputType.INFO)
42
+ self.embedding_model = SentenceTransformer(self.embedding_model_name)
43
+
44
+ # 预热模型并获取正确的维度
45
+ test_text = "这是一段测试文本,用于确保模型完全加载。"
46
+ test_embedding = self.embedding_model.encode(test_text,
47
+ convert_to_tensor=True,
48
+ normalize_embeddings=True)
49
+ self.embedding_dimension = len(test_embedding)
50
+ PrettyOutput.print("嵌入模型加载完成", OutputType.SUCCESS)
51
+
52
+ # 初始化HNSW索引(使用正确的维度)
53
+ hnsw_index = faiss.IndexHNSWFlat(self.embedding_dimension, 16)
54
+ hnsw_index.hnsw.efConstruction = 40
55
+ hnsw_index.hnsw.efSearch = 16
56
+ self.methodology_index = faiss.IndexIDMap(hnsw_index)
57
+
58
+ except Exception as e:
59
+ PrettyOutput.print(f"加载嵌入模型失败: {str(e)}", OutputType.ERROR)
60
+ raise
61
+
62
+ # 初始化方法论相关属性
63
+ self.methodology_data = []
30
64
 
31
65
  @staticmethod
32
66
  def extract_tool_calls(content: str) -> List[Dict]:
@@ -87,16 +121,78 @@ class Agent:
87
121
  sleep_time = 30
88
122
  continue
89
123
 
124
+ def _create_methodology_embedding(self, methodology_text: str) -> np.ndarray:
125
+ """为方法论文本创建嵌入向量"""
126
+ try:
127
+ # 对长文本进行截断
128
+ max_length = 512
129
+ text = ' '.join(methodology_text.split()[:max_length])
130
+
131
+ # 使用sentence_transformers模型获取嵌入向量
132
+ embedding = self.embedding_model.encode([text],
133
+ convert_to_tensor=True,
134
+ normalize_embeddings=True)
135
+ vector = np.array(embedding, dtype=np.float32)
136
+ return vector[0] # 返回第一个向量,因为我们只编码了一个文本
137
+ except Exception as e:
138
+ PrettyOutput.print(f"创建方法论嵌入向量失败: {str(e)}", OutputType.ERROR)
139
+ return np.zeros(self.embedding_dimension, dtype=np.float32)
90
140
 
91
- def _load_methodology(self) -> Dict[str, str]:
92
- """加载方法论"""
141
+ def _load_methodology(self, user_input: str) -> Dict[str, str]:
142
+ """加载方法论并构建向量索引"""
143
+ PrettyOutput.print("加载方法论...", OutputType.PLANNING)
93
144
  user_jarvis_methodology = os.path.expanduser("~/.jarvis_methodology")
94
- if os.path.exists(user_jarvis_methodology):
145
+ if not os.path.exists(user_jarvis_methodology):
146
+ return {}
147
+
148
+ try:
95
149
  with open(user_jarvis_methodology, "r", encoding="utf-8") as f:
96
150
  data = yaml.safe_load(f)
97
- PrettyOutput.print(f"从 {user_jarvis_methodology} 加载方法论: {', '.join(data.keys())}", OutputType.INFO)
98
- return data
99
- return {}
151
+
152
+ # 重置数据结构
153
+ self.methodology_data = []
154
+ vectors = []
155
+ ids = []
156
+
157
+ # 为每个方法论创建嵌入向量
158
+ for i, (key, value) in enumerate(data.items()):
159
+ PrettyOutput.print(f"向量化方法论: {key} ...", OutputType.INFO)
160
+ methodology_text = f"{key}\n{value}"
161
+ embedding = self._create_methodology_embedding(methodology_text)
162
+ vectors.append(embedding)
163
+ ids.append(i)
164
+ self.methodology_data.append({"key": key, "value": value})
165
+
166
+ if vectors:
167
+ vectors_array = np.vstack(vectors)
168
+ self.methodology_index.add_with_ids(vectors_array, np.array(ids))
169
+ query_embedding = self._create_methodology_embedding(user_input)
170
+ k = min(5, len(self.methodology_data))
171
+ PrettyOutput.print(f"检索方法论...", OutputType.INFO)
172
+ distances, indices = self.methodology_index.search(
173
+ query_embedding.reshape(1, -1), k
174
+ )
175
+
176
+ relevant_methodologies = {}
177
+ for dist, idx in zip(distances[0], indices[0]):
178
+ if idx >= 0:
179
+ similarity = 1.0 / (1.0 + float(dist))
180
+ methodology = self.methodology_data[idx]
181
+ PrettyOutput.print(
182
+ f"方法论 '{methodology['key']}' 相似度: {similarity:.3f}",
183
+ OutputType.INFO
184
+ )
185
+ if similarity >= 0.5:
186
+ relevant_methodologies[methodology["key"]] = methodology["value"]
187
+
188
+ if relevant_methodologies:
189
+ return relevant_methodologies
190
+
191
+ return {}
192
+
193
+ except Exception as e:
194
+ PrettyOutput.print(f"加载方法论时发生错误: {str(e)}", OutputType.ERROR)
195
+ return {}
100
196
 
101
197
  def _summarize_and_clear_history(self) -> None:
102
198
  """总结当前对话历史并清空历史记录,只保留系统消息和总结
@@ -195,6 +291,38 @@ class Agent:
195
291
  self.prompt = summary_prompt
196
292
  return self._call_model(self.prompt)
197
293
 
294
+ def choose_tools(self, user_input: str) -> List[Dict]:
295
+ """根据用户输入选择工具"""
296
+ PrettyOutput.print("选择工具...", OutputType.PLANNING)
297
+ tools = self.tool_registry.get_all_tools()
298
+ prompt = f"""你是一个工具选择专家,请根据用户输入选择合适的工具,返回可能使用到的工具的名称。以下是可用工具:
299
+ """
300
+ for tool in tools:
301
+ prompt += f"- {tool['name']}: {tool['description']}\n"
302
+ prompt += f"用户输入: {user_input}\n"
303
+ prompt += f"请返回可能使用到的工具的名称,如果无法确定,请返回空列表。"
304
+ prompt += f"返回的格式为:\n"
305
+ prompt += f"<TOOL_CHOICE_START>\n"
306
+ prompt += f"tool_name1\n"
307
+ prompt += f"tool_name2\n"
308
+ prompt += f"<TOOL_CHOICE_END>\n"
309
+ model = PlatformRegistry.get_global_platform()
310
+ model.set_suppress_output(True)
311
+ try:
312
+ response = model.chat(prompt)
313
+ response = response.replace("<TOOL_CHOICE_START>", "").replace("<TOOL_CHOICE_END>", "")
314
+ tools_name = response.split("\n")
315
+ choosed_tools = []
316
+ for tool_name in tools_name:
317
+ for tool in tools:
318
+ if tool['name'] == tool_name:
319
+ choosed_tools.append(tool)
320
+ break
321
+ return choosed_tools
322
+ except Exception as e:
323
+ PrettyOutput.print(f"工具选择失败: {str(e)}", OutputType.ERROR)
324
+ return []
325
+
198
326
  def run(self, user_input: str, file_list: Optional[List[str]] = None, keep_history: bool = False) -> str:
199
327
  """处理用户输入并返回响应,返回任务总结报告
200
328
 
@@ -207,29 +335,35 @@ class Agent:
207
335
  str: 任务总结报告
208
336
  """
209
337
  try:
338
+ PrettyOutput.section("准备环境", OutputType.PLANNING)
210
339
  if file_list:
211
340
  self.model.upload_files(file_list)
212
341
 
213
342
  # 加载方法论
214
- methodology = self._load_methodology()
343
+ methodology = self._load_methodology(user_input)
215
344
  methodology_prompt = ""
216
345
  if methodology:
217
346
  methodology_prompt = f"""这是以往处理问题的标准方法论,如果当前任务与此类似,可参考:
218
347
  {methodology}
219
348
 
220
349
  """
350
+ tools_prompt = ""
351
+
352
+ # 选择工具
353
+ tools = self.choose_tools(user_input)
354
+ if tools:
355
+ tools_prompt += "可用工具:\n"
356
+ for tool in tools:
357
+ PrettyOutput.print(f"选择工具: {tool['name']}", OutputType.INFO)
358
+ tools_prompt += f"- 名称: {tool['name']}\n"
359
+ tools_prompt += f" 描述: {tool['description']}\n"
360
+ tools_prompt += f" 参数: {tool['parameters']}\n"
221
361
 
222
- self.clear_history()
223
- self.conversation_turns = 0
224
-
225
362
  # 显示任务开始
226
363
  PrettyOutput.section(f"开始新任务: {self.name}", OutputType.PLANNING)
227
364
 
228
- tools_prompt = "可用工具:\n"
229
- for tool in self.tool_registry.get_all_tools():
230
- tools_prompt += f"- 名称: {tool['name']}\n"
231
- tools_prompt += f" 描述: {tool['description']}\n"
232
- tools_prompt += f" 参数: {tool['parameters']}\n"
365
+ self.clear_history()
366
+ self.conversation_turns = 0
233
367
 
234
368
  self.model.set_system_message(f"""你是 {self.name},一个问题处理能力强大的 AI 助手。
235
369
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.74
3
+ Version: 0.1.76
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