jarvis-ai-assistant 0.1.25__py3-none-any.whl → 0.1.27__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.
Potentially problematic release.
This version of jarvis-ai-assistant might be problematic. Click here for more details.
- jarvis/__init__.py +1 -1
- jarvis/__pycache__/__init__.cpython-313.pyc +0 -0
- jarvis/__pycache__/agent.cpython-313.pyc +0 -0
- jarvis/agent.py +18 -60
- jarvis/models/__pycache__/kimi.cpython-313.pyc +0 -0
- jarvis/models/kimi.py +20 -11
- {jarvis_ai_assistant-0.1.25.dist-info → jarvis_ai_assistant-0.1.27.dist-info}/METADATA +1 -1
- {jarvis_ai_assistant-0.1.25.dist-info → jarvis_ai_assistant-0.1.27.dist-info}/RECORD +12 -12
- {jarvis_ai_assistant-0.1.25.dist-info → jarvis_ai_assistant-0.1.27.dist-info}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.25.dist-info → jarvis_ai_assistant-0.1.27.dist-info}/WHEEL +0 -0
- {jarvis_ai_assistant-0.1.25.dist-info → jarvis_ai_assistant-0.1.27.dist-info}/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.1.25.dist-info → jarvis_ai_assistant-0.1.27.dist-info}/top_level.txt +0 -0
jarvis/__init__.py
CHANGED
|
Binary file
|
|
Binary file
|
jarvis/agent.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import subprocess
|
|
3
|
+
import time
|
|
3
4
|
from typing import Dict, Any, List, Optional, Tuple
|
|
4
5
|
|
|
5
6
|
import yaml
|
|
@@ -56,13 +57,13 @@ class Agent:
|
|
|
56
57
|
}]
|
|
57
58
|
else:
|
|
58
59
|
PrettyOutput.print("工具调用缺少必要字段", OutputType.ERROR)
|
|
59
|
-
raise
|
|
60
|
+
raise Exception("工具调用缺少必要字段")
|
|
60
61
|
except yaml.YAMLError as e:
|
|
61
62
|
PrettyOutput.print(f"YAML解析错误: {str(e)}", OutputType.ERROR)
|
|
62
|
-
raise
|
|
63
|
+
raise Exception(f"YAML解析错误: {str(e)}")
|
|
63
64
|
except Exception as e:
|
|
64
65
|
PrettyOutput.print(f"处理工具调用时发生错误: {str(e)}", OutputType.ERROR)
|
|
65
|
-
raise
|
|
66
|
+
raise Exception(f"处理工具调用时发生错误: {str(e)}")
|
|
66
67
|
in_tool_call = False
|
|
67
68
|
continue
|
|
68
69
|
|
|
@@ -74,7 +75,13 @@ class Agent:
|
|
|
74
75
|
def _call_model(self, message: str) -> str:
|
|
75
76
|
"""调用模型获取响应"""
|
|
76
77
|
try:
|
|
77
|
-
|
|
78
|
+
while True:
|
|
79
|
+
ret = self.model.chat(message)
|
|
80
|
+
if not ret:
|
|
81
|
+
PrettyOutput.print("模型返回空值,可能负载过重,5s后重试...", OutputType.WARNING)
|
|
82
|
+
time.sleep(5)
|
|
83
|
+
continue
|
|
84
|
+
return ret
|
|
78
85
|
except Exception as e:
|
|
79
86
|
raise Exception(f"{self.name}: 模型调用失败: {str(e)}")
|
|
80
87
|
|
|
@@ -110,24 +117,21 @@ class Agent:
|
|
|
110
117
|
|
|
111
118
|
核心能力:
|
|
112
119
|
1. 使用现有工具完成任务
|
|
113
|
-
2.
|
|
114
|
-
3. 通过 create_sub_agent 创建子代理处理独立任务
|
|
115
|
-
4. 访问和理解网页内容(无需使用工具)
|
|
120
|
+
2. 访问和理解网页内容(无需使用工具)
|
|
116
121
|
5. 遵循 ReAct (思考-行动-观察) 框架
|
|
117
122
|
|
|
118
123
|
工作流程:
|
|
119
124
|
1. 思考
|
|
120
125
|
- 分析需求和可用工具
|
|
121
|
-
-
|
|
122
|
-
-
|
|
126
|
+
- 评估是否能用现有工具完成
|
|
127
|
+
- 考虑是否需要访问网页
|
|
123
128
|
- 规划解决方案
|
|
124
|
-
- 确定是否需要访问网页
|
|
125
129
|
|
|
126
130
|
2. 行动 (如果需要)
|
|
127
|
-
-
|
|
128
|
-
- 创建新工具
|
|
129
|
-
- 创建子代理
|
|
131
|
+
- 优先使用现有工具
|
|
130
132
|
- 访问网页获取信息
|
|
133
|
+
- 创建新工具(成本高,谨慎使用)
|
|
134
|
+
- 创建子代理(成本高,谨慎使用)
|
|
131
135
|
- 询问更多信息
|
|
132
136
|
|
|
133
137
|
3. 观察
|
|
@@ -135,58 +139,12 @@ class Agent:
|
|
|
135
139
|
- 分析反馈
|
|
136
140
|
- 规划下一步
|
|
137
141
|
|
|
138
|
-
网页访问能力:
|
|
139
|
-
- 可以直接访问和阅读网页内容
|
|
140
|
-
- 无需使用额外工具
|
|
141
|
-
- 可以提取和分析网页信息
|
|
142
|
-
- 支持多种网页格式
|
|
143
|
-
- 注意:仅支持公开访问的网页
|
|
144
|
-
|
|
145
|
-
任务拆分建议:
|
|
146
|
-
- 当任务包含多个独立步骤时
|
|
147
|
-
- 当子任务需要独立的上下文时
|
|
148
|
-
- 当子任务有明确的完成目标时
|
|
149
|
-
- 当需要并行处理多个任务时
|
|
150
|
-
|
|
151
|
-
创建子代理时,必须提供尽可能多的上下文信息,以确保其正确工作。
|
|
152
|
-
|
|
153
|
-
创建子代理示例:
|
|
154
|
-
<START_TOOL_CALL>
|
|
155
|
-
name: create_sub_agent
|
|
156
|
-
arguments:
|
|
157
|
-
agent_name: CodeAnalyzer
|
|
158
|
-
task: 分析项目代码质量
|
|
159
|
-
context: |
|
|
160
|
-
这是一个Python项目
|
|
161
|
-
使用了Flask框架
|
|
162
|
-
需要关注性能和安全性
|
|
163
|
-
goal: 生成代码质量分析报告
|
|
164
|
-
<END_TOOL_CALL>
|
|
165
|
-
|
|
166
|
-
创建新工具示例:
|
|
167
|
-
<START_TOOL_CALL>
|
|
168
|
-
name: generate_tool
|
|
169
|
-
arguments:
|
|
170
|
-
tool_name: custom_tool_name
|
|
171
|
-
class_name: CustomToolName
|
|
172
|
-
description: 详细的工具描述
|
|
173
|
-
parameters:
|
|
174
|
-
type: object
|
|
175
|
-
properties:
|
|
176
|
-
param1:
|
|
177
|
-
type: string
|
|
178
|
-
description: 参数1的描述
|
|
179
|
-
required: [param1]
|
|
180
|
-
<END_TOOL_CALL>
|
|
181
|
-
|
|
182
142
|
工具使用格式:
|
|
183
143
|
<START_TOOL_CALL>
|
|
184
144
|
name: tool_name
|
|
185
145
|
arguments:
|
|
186
146
|
param1: value1
|
|
187
|
-
param2:
|
|
188
|
-
multiline
|
|
189
|
-
value
|
|
147
|
+
param2: value2
|
|
190
148
|
<END_TOOL_CALL>
|
|
191
149
|
|
|
192
150
|
严格规则:
|
|
Binary file
|
jarvis/models/kimi.py
CHANGED
|
@@ -45,11 +45,11 @@ class KimiModel(BaseModel):
|
|
|
45
45
|
PrettyOutput.print(f"Failed to create chat: {e}: Response: {response.text}", OutputType.ERROR)
|
|
46
46
|
return False
|
|
47
47
|
|
|
48
|
-
def _get_presigned_url(self, filename: str) -> Dict:
|
|
48
|
+
def _get_presigned_url(self, filename: str, action: str) -> Dict:
|
|
49
49
|
"""获取预签名上传URL"""
|
|
50
50
|
url = "https://kimi.moonshot.cn/api/pre-sign-url"
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
|
|
52
|
+
|
|
53
53
|
|
|
54
54
|
payload = json.dumps({
|
|
55
55
|
"action": action,
|
|
@@ -75,11 +75,11 @@ class KimiModel(BaseModel):
|
|
|
75
75
|
PrettyOutput.print(f"Failed to upload file: {e}", OutputType.ERROR)
|
|
76
76
|
return False
|
|
77
77
|
|
|
78
|
-
def _get_file_info(self, file_data: Dict, name: str) -> Dict:
|
|
78
|
+
def _get_file_info(self, file_data: Dict, name: str, file_type: str) -> Dict:
|
|
79
79
|
"""获取文件信息"""
|
|
80
80
|
url = "https://kimi.moonshot.cn/api/file"
|
|
81
81
|
payload = json.dumps({
|
|
82
|
-
"type":
|
|
82
|
+
"type": file_type,
|
|
83
83
|
"name": name,
|
|
84
84
|
"object_name": file_data["object_name"],
|
|
85
85
|
"chat_id": self.chat_id,
|
|
@@ -114,6 +114,7 @@ class KimiModel(BaseModel):
|
|
|
114
114
|
continue
|
|
115
115
|
|
|
116
116
|
line = line.decode('utf-8')
|
|
117
|
+
print(data)
|
|
117
118
|
if not line.startswith("data: "):
|
|
118
119
|
continue
|
|
119
120
|
|
|
@@ -149,25 +150,33 @@ class KimiModel(BaseModel):
|
|
|
149
150
|
for index, file_path in enumerate(file_list, 1):
|
|
150
151
|
try:
|
|
151
152
|
PrettyOutput.print(f"处理文件 [{index}/{len(file_list)}]: {file_path}", OutputType.PROGRESS)
|
|
153
|
+
|
|
154
|
+
mime_type, _ = mimetypes.guess_type(file_path)
|
|
155
|
+
action = "image" if mime_type and mime_type.startswith('image/') else "file"
|
|
152
156
|
|
|
153
157
|
# 获取预签名URL
|
|
154
158
|
PrettyOutput.print("获取上传URL...", OutputType.PROGRESS)
|
|
155
|
-
presigned_data = self._get_presigned_url(file_path)
|
|
159
|
+
presigned_data = self._get_presigned_url(file_path, action)
|
|
156
160
|
|
|
157
161
|
# 上传文件
|
|
158
162
|
PrettyOutput.print("上传文件内容...", OutputType.PROGRESS)
|
|
159
163
|
if self._upload_file(file_path, presigned_data["url"]):
|
|
160
164
|
# 获取文件信息
|
|
161
165
|
PrettyOutput.print("获取文件信息...", OutputType.PROGRESS)
|
|
162
|
-
file_info = self._get_file_info(presigned_data, os.path.basename(file_path))
|
|
163
|
-
|
|
166
|
+
file_info = self._get_file_info(presigned_data, os.path.basename(file_path), action)
|
|
164
167
|
# 等待文件解析
|
|
165
168
|
PrettyOutput.print("等待文件解析完成...", OutputType.PROGRESS)
|
|
166
|
-
|
|
169
|
+
|
|
170
|
+
# 只有文件需要解析
|
|
171
|
+
if action == "file":
|
|
172
|
+
if self._wait_for_parse(file_info["id"]):
|
|
173
|
+
uploaded_files.append(file_info)
|
|
174
|
+
PrettyOutput.print(f"✓ 文件处理成功: {file_path}", OutputType.SUCCESS)
|
|
175
|
+
else:
|
|
176
|
+
PrettyOutput.print(f"✗ 文件解析失败: {file_path}", OutputType.ERROR)
|
|
177
|
+
else:
|
|
167
178
|
uploaded_files.append(file_info)
|
|
168
179
|
PrettyOutput.print(f"✓ 文件处理成功: {file_path}", OutputType.SUCCESS)
|
|
169
|
-
else:
|
|
170
|
-
PrettyOutput.print(f"✗ 文件解析失败: {file_path}", OutputType.ERROR)
|
|
171
180
|
else:
|
|
172
181
|
PrettyOutput.print(f"✗ 文件上传失败: {file_path}", OutputType.ERROR)
|
|
173
182
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
jarvis/__init__.py,sha256=
|
|
2
|
-
jarvis/agent.py,sha256=
|
|
1
|
+
jarvis/__init__.py,sha256=Fj_UT_4WMGLEY1mjykZXmNgbvAZS2nJ4td9FdLfDzm0,50
|
|
2
|
+
jarvis/agent.py,sha256=xAOckL7bousDnNPGD_4hHGEiXXel5RDSEPE69EazZsM,9012
|
|
3
3
|
jarvis/main.py,sha256=5_8cFOMfHJskLYj4kIP6yRq589Rvn4oPk1yDE0iMNzQ,7806
|
|
4
4
|
jarvis/utils.py,sha256=YuY8zpfD2kgjjJyWcT62OCq3ADuFuqwStqXFTbq16o8,6603
|
|
5
|
-
jarvis/__pycache__/__init__.cpython-313.pyc,sha256=
|
|
6
|
-
jarvis/__pycache__/agent.cpython-313.pyc,sha256=
|
|
5
|
+
jarvis/__pycache__/__init__.cpython-313.pyc,sha256=5U6YTtU4f-ueIzY1qA5oYSr5RGj98HbxmPDSSleZS8c,209
|
|
6
|
+
jarvis/__pycache__/agent.cpython-313.pyc,sha256=Bpi1WRBOY9_Pg9hSph_4AQDDxK_v9RNXpTEInBqTA8I,12016
|
|
7
7
|
jarvis/__pycache__/main.cpython-313.pyc,sha256=jVqTajUJ1gOKj2cyPWB-D5cddFvTMjeRYcKoSCF7Nws,10343
|
|
8
8
|
jarvis/__pycache__/models.cpython-313.pyc,sha256=uWuRIjGrY4YDB3dGW5PGDLWaS03et8g11O725TjY_eU,5960
|
|
9
9
|
jarvis/__pycache__/tools.cpython-313.pyc,sha256=lAD4LrnnWzNZQmHXGfZ_2l7oskOpr2_2OC-gdFhxQY8,33933
|
|
@@ -11,10 +11,10 @@ jarvis/__pycache__/utils.cpython-313.pyc,sha256=zs6OSkLlBeTHuIrJoRfnzFdJ5VkcdrUm
|
|
|
11
11
|
jarvis/__pycache__/zte_llm.cpython-313.pyc,sha256=kMm9IGundGmOPqjsgrm9oIaWLDagYGCPRAaE3ipkc-0,5662
|
|
12
12
|
jarvis/models/__init__.py,sha256=B_IJFvKTaxdg19FAD1ea288tYp3-bRYRpkeGI0_OcBI,262
|
|
13
13
|
jarvis/models/base.py,sha256=GgVl5N0qDqn-yqRcX_PX3wHjogouE6GPFAWktG40cXg,403
|
|
14
|
-
jarvis/models/kimi.py,sha256=
|
|
14
|
+
jarvis/models/kimi.py,sha256=Kg-GCiRkO-YAfRLxUNAeugksK8JcaoJGx9NaMvTF2Pk,15488
|
|
15
15
|
jarvis/models/__pycache__/__init__.cpython-313.pyc,sha256=jAwySX4diR7EWM_alK75tiIb_J8bVfs4Bh_U3bdjDLo,534
|
|
16
16
|
jarvis/models/__pycache__/base.cpython-313.pyc,sha256=4I9KZlXHvTB7vENA9YWK4Fx0sns_KvIOtWqzE9y_-Co,1094
|
|
17
|
-
jarvis/models/__pycache__/kimi.cpython-313.pyc,sha256=
|
|
17
|
+
jarvis/models/__pycache__/kimi.cpython-313.pyc,sha256=7ZpjS1imnK8urSXnCr-Bz2MhMIdGCZRUCI1oz0sfF18,18018
|
|
18
18
|
jarvis/tools/__init__.py,sha256=AjmFYLXt-_ulZXdYiXya2fD7QCJ-RaK91PEZCNj-UbA,262
|
|
19
19
|
jarvis/tools/base.py,sha256=zILvGZ-V5LH1Zicor4rpc9XZvZ9Q4y6kMauqNtn0_p8,7404
|
|
20
20
|
jarvis/tools/file_ops.py,sha256=KbQLVCCXw-MtJg-12iyMeVGu8BTtLq7Mk7fpVKau40U,4296
|
|
@@ -37,9 +37,9 @@ jarvis/tools/__pycache__/user_confirmation.cpython-313.pyc,sha256=wK3Ev10lHSUSRv
|
|
|
37
37
|
jarvis/tools/__pycache__/user_input.cpython-313.pyc,sha256=JjTFOhObKsKF4Pn8KBRuKfV1_Ssj083fjU7Mfc_5z7c,2531
|
|
38
38
|
jarvis/tools/__pycache__/user_interaction.cpython-313.pyc,sha256=RuVZ-pmiPBDywY3efgXSfohMAciC1avMGPmBK5qlnew,3305
|
|
39
39
|
jarvis/tools/__pycache__/webpage.cpython-313.pyc,sha256=BjzSfnNzsKCrLETCcWjt32lNDLzwnjqcVGg4JfWd9OM,3008
|
|
40
|
-
jarvis_ai_assistant-0.1.
|
|
41
|
-
jarvis_ai_assistant-0.1.
|
|
42
|
-
jarvis_ai_assistant-0.1.
|
|
43
|
-
jarvis_ai_assistant-0.1.
|
|
44
|
-
jarvis_ai_assistant-0.1.
|
|
45
|
-
jarvis_ai_assistant-0.1.
|
|
40
|
+
jarvis_ai_assistant-0.1.27.dist-info/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
|
|
41
|
+
jarvis_ai_assistant-0.1.27.dist-info/METADATA,sha256=R5uxbH_zh24BN8xL0W44U-teN8RZeP_tEqyY5-Zhpl4,10193
|
|
42
|
+
jarvis_ai_assistant-0.1.27.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
43
|
+
jarvis_ai_assistant-0.1.27.dist-info/entry_points.txt,sha256=iKu7OMfew9dtfGhW71gIMTg4wvafuPqKb4wyQOnMAGU,44
|
|
44
|
+
jarvis_ai_assistant-0.1.27.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
|
|
45
|
+
jarvis_ai_assistant-0.1.27.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
{jarvis_ai_assistant-0.1.25.dist-info → jarvis_ai_assistant-0.1.27.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|