jarvis-ai-assistant 0.1.57__py3-none-any.whl → 0.1.59__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/agent.py +98 -50
- jarvis/jarvis_coder/main.py +417 -243
- jarvis/models/ai8.py +9 -10
- jarvis/models/base.py +5 -0
- jarvis/models/kimi.py +18 -8
- jarvis/models/openai.py +9 -4
- jarvis/models/oyi.py +7 -1
- jarvis/models/registry.py +3 -3
- jarvis/tools/coder.py +66 -0
- jarvis/tools/search.py +33 -1
- {jarvis_ai_assistant-0.1.57.dist-info → jarvis_ai_assistant-0.1.59.dist-info}/METADATA +56 -36
- jarvis_ai_assistant-0.1.59.dist-info/RECORD +29 -0
- jarvis/tools/bing_search.py +0 -38
- jarvis_ai_assistant-0.1.57.dist-info/RECORD +0 -29
- {jarvis_ai_assistant-0.1.57.dist-info → jarvis_ai_assistant-0.1.59.dist-info}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.57.dist-info → jarvis_ai_assistant-0.1.59.dist-info}/WHEEL +0 -0
- {jarvis_ai_assistant-0.1.57.dist-info → jarvis_ai_assistant-0.1.59.dist-info}/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.1.57.dist-info → jarvis_ai_assistant-0.1.59.dist-info}/top_level.txt +0 -0
jarvis/__init__.py
CHANGED
jarvis/agent.py
CHANGED
|
@@ -25,6 +25,7 @@ class Agent:
|
|
|
25
25
|
self.name = name
|
|
26
26
|
self.is_sub_agent = is_sub_agent
|
|
27
27
|
self.prompt = ""
|
|
28
|
+
self.conversation_turns = 0 # 添加对话轮次计数器
|
|
28
29
|
|
|
29
30
|
|
|
30
31
|
@staticmethod
|
|
@@ -99,6 +100,75 @@ class Agent:
|
|
|
99
100
|
PrettyOutput.print(f"从 {user_jarvis_methodology} 加载经验总结: {', '.join(data.keys())}", OutputType.INFO)
|
|
100
101
|
return ret
|
|
101
102
|
|
|
103
|
+
def _summarize_and_clear_history(self) -> None:
|
|
104
|
+
"""总结当前对话历史并清空历史记录,只保留系统消息和总结
|
|
105
|
+
|
|
106
|
+
这个方法会:
|
|
107
|
+
1. 请求模型总结当前对话的关键信息
|
|
108
|
+
2. 清空对话历史
|
|
109
|
+
3. 保留系统消息
|
|
110
|
+
4. 添加总结作为新的上下文
|
|
111
|
+
5. 重置对话轮数
|
|
112
|
+
"""
|
|
113
|
+
# 创建一个新的模型实例来做总结,避免影响主对话
|
|
114
|
+
|
|
115
|
+
PrettyOutput.print("总结对话历史,准备生成总结,开始新的对话...", OutputType.PLANNING)
|
|
116
|
+
|
|
117
|
+
prompt = """请总结之前对话中的关键信息,包括:
|
|
118
|
+
1. 当前任务目标
|
|
119
|
+
2. 已经确认的关键信息
|
|
120
|
+
3. 已经尝试过的方案
|
|
121
|
+
4. 当前进展
|
|
122
|
+
5. 待解决的问题
|
|
123
|
+
|
|
124
|
+
请用简洁的要点形式描述,突出重要信息。不要包含对话细节。
|
|
125
|
+
"""
|
|
126
|
+
|
|
127
|
+
try:
|
|
128
|
+
summary = self.model.chat(prompt)
|
|
129
|
+
|
|
130
|
+
# 清空当前对话历史,但保留系统消息
|
|
131
|
+
self.model.delete_chat()
|
|
132
|
+
|
|
133
|
+
# 添加总结作为新的上下文
|
|
134
|
+
self.prompt = f"""以下是之前对话的关键信息总结:
|
|
135
|
+
|
|
136
|
+
{summary}
|
|
137
|
+
|
|
138
|
+
请基于以上信息继续完成任务。
|
|
139
|
+
"""
|
|
140
|
+
|
|
141
|
+
# 重置对话轮数
|
|
142
|
+
self.conversation_turns = 0
|
|
143
|
+
|
|
144
|
+
except Exception as e:
|
|
145
|
+
PrettyOutput.print(f"总结对话历史失败: {str(e)}", OutputType.ERROR)
|
|
146
|
+
|
|
147
|
+
def _complete_task(self) -> str:
|
|
148
|
+
"""完成任务并生成总结
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
str: 任务总结或完成状态
|
|
152
|
+
"""
|
|
153
|
+
PrettyOutput.section("任务完成", OutputType.SUCCESS)
|
|
154
|
+
|
|
155
|
+
if not self.is_sub_agent:
|
|
156
|
+
return "Task completed"
|
|
157
|
+
|
|
158
|
+
# 生成任务总结
|
|
159
|
+
summary_prompt = f"""请对以上任务执行情况生成一个简洁的总结报告,包括:
|
|
160
|
+
|
|
161
|
+
1. 任务目标: 任务重述
|
|
162
|
+
2. 执行结果: 成功/失败
|
|
163
|
+
3. 关键信息: 提取执行过程中的重要信息
|
|
164
|
+
4. 重要发现: 任何值得注意的发现
|
|
165
|
+
5. 后续建议: 如果有的话
|
|
166
|
+
|
|
167
|
+
请用简洁的要点形式描述,突出重要信息。
|
|
168
|
+
"""
|
|
169
|
+
self.prompt = summary_prompt
|
|
170
|
+
return self._call_model(self.prompt)
|
|
171
|
+
|
|
102
172
|
def run(self, user_input: str, file_list: Optional[List[str]] = None, keep_history: bool = False) -> str:
|
|
103
173
|
"""处理用户输入并返回响应,返回任务总结报告
|
|
104
174
|
|
|
@@ -112,6 +182,7 @@ class Agent:
|
|
|
112
182
|
"""
|
|
113
183
|
try:
|
|
114
184
|
self.clear_history()
|
|
185
|
+
self.conversation_turns = 0 # 重置对话轮次
|
|
115
186
|
|
|
116
187
|
if file_list:
|
|
117
188
|
self.model.upload_files(file_list)
|
|
@@ -146,8 +217,8 @@ class Agent:
|
|
|
146
217
|
6. 制定行动计划:根据目前可以使用的工具制定行动计划
|
|
147
218
|
7. 执行行动计划:每步执行一个步骤,最多使用一个工具(工具执行完成后,等待工具结果再执行下一步)
|
|
148
219
|
8. 监控与调整:如果执行结果与预期不符,则反思并调整行动计划,迭代之前的步骤
|
|
149
|
-
9.
|
|
150
|
-
|
|
220
|
+
9. 经验总结:如果当前任务具有通用性且执行过程中遇到了值得记录的经验,使用经验总结工具记录经验总结,以提升后期处理类似问题的能力
|
|
221
|
+
10. 任务结束:如果任务已经完成,使用任务结束指令结束任务
|
|
151
222
|
-------------------------------------------------------------
|
|
152
223
|
|
|
153
224
|
经验总结模板:
|
|
@@ -184,6 +255,12 @@ arguments:
|
|
|
184
255
|
|
|
185
256
|
-------------------------------------------------------------
|
|
186
257
|
|
|
258
|
+
特殊指令:
|
|
259
|
+
1. !<<SUMMARIZE>>! - 当你发现对话历史过长可能导致token超限时,可以使用此指令总结当前对话要点并清空历史。使用方法:直接回复"!<<SUMMARIZE>>!"即可。
|
|
260
|
+
2. !<<FINISHED>>! - 当你确认任务已经完成时,使用此指令结束任务。使用方法:在回复中包含"!<<FINISHED>>!"即可。
|
|
261
|
+
|
|
262
|
+
-------------------------------------------------------------
|
|
263
|
+
|
|
187
264
|
{methodology_prompt}
|
|
188
265
|
|
|
189
266
|
-------------------------------------------------------------
|
|
@@ -196,8 +273,20 @@ arguments:
|
|
|
196
273
|
# 显示思考状态
|
|
197
274
|
PrettyOutput.print("分析任务...", OutputType.PROGRESS)
|
|
198
275
|
|
|
276
|
+
# 增加对话轮次
|
|
277
|
+
self.conversation_turns += 1
|
|
278
|
+
|
|
279
|
+
# 如果对话超过10轮,在提示中添加提醒
|
|
280
|
+
if self.conversation_turns > 10:
|
|
281
|
+
self.prompt = f"{self.prompt}\n(提示:当前对话已超过10轮,建议使用 !<<SUMMARIZE>>! 指令总结对话历史,避免token超限)"
|
|
282
|
+
|
|
199
283
|
current_response = self._call_model(self.prompt)
|
|
200
284
|
|
|
285
|
+
# 检查是否需要总结对话历史
|
|
286
|
+
if "!<<SUMMARIZE>>!" in current_response:
|
|
287
|
+
self._summarize_and_clear_history()
|
|
288
|
+
continue
|
|
289
|
+
|
|
201
290
|
try:
|
|
202
291
|
result = Agent.extract_tool_calls(current_response)
|
|
203
292
|
except Exception as e:
|
|
@@ -206,7 +295,6 @@ arguments:
|
|
|
206
295
|
continue
|
|
207
296
|
|
|
208
297
|
if len(result) > 0:
|
|
209
|
-
|
|
210
298
|
PrettyOutput.print("执行工具调用...", OutputType.PROGRESS)
|
|
211
299
|
tool_result = self.tool_registry.handle_tool_calls(result)
|
|
212
300
|
PrettyOutput.print(tool_result, OutputType.RESULT)
|
|
@@ -214,6 +302,10 @@ arguments:
|
|
|
214
302
|
self.prompt = tool_result
|
|
215
303
|
continue
|
|
216
304
|
|
|
305
|
+
# 检查是否完成任务
|
|
306
|
+
if "!<<FINISHED>>!" in current_response:
|
|
307
|
+
return self._complete_task()
|
|
308
|
+
|
|
217
309
|
# 获取用户输入
|
|
218
310
|
user_input = get_multiline_input(f"{self.name}: 您可以继续输入,或输入空行结束当前任务")
|
|
219
311
|
if user_input == "__interrupt__":
|
|
@@ -225,34 +317,7 @@ arguments:
|
|
|
225
317
|
continue
|
|
226
318
|
|
|
227
319
|
if not user_input:
|
|
228
|
-
|
|
229
|
-
choice = prompt("是否需要手动为此任务生成经验总结以提升Jarvis对类似任务的处理能力?(y/n), 回车跳过: ")
|
|
230
|
-
if choice == "y":
|
|
231
|
-
self._make_methodology()
|
|
232
|
-
break
|
|
233
|
-
elif choice == "n" or choice == "":
|
|
234
|
-
break
|
|
235
|
-
else:
|
|
236
|
-
PrettyOutput.print("请输入y或n", OutputType.ERROR)
|
|
237
|
-
continue
|
|
238
|
-
PrettyOutput.section("任务完成", OutputType.SUCCESS)
|
|
239
|
-
if self.is_sub_agent:
|
|
240
|
-
# 生成任务总结
|
|
241
|
-
summary_prompt = f"""请对以上任务执行情况生成一个简洁的总结报告,包括:
|
|
242
|
-
|
|
243
|
-
1. 任务目标: 任务重述
|
|
244
|
-
2. 执行结果: 成功/失败
|
|
245
|
-
3. 关键信息: 提取执行过程中的重要信息
|
|
246
|
-
4. 重要发现: 任何值得注意的发现
|
|
247
|
-
5. 后续建议: 如果有的话
|
|
248
|
-
|
|
249
|
-
请用简洁的要点形式描述,突出重要信息。
|
|
250
|
-
"""
|
|
251
|
-
self.prompt = summary_prompt
|
|
252
|
-
summary = self._call_model(self.prompt)
|
|
253
|
-
return summary
|
|
254
|
-
else:
|
|
255
|
-
return "Task completed"
|
|
320
|
+
return self._complete_task()
|
|
256
321
|
|
|
257
322
|
except Exception as e:
|
|
258
323
|
PrettyOutput.print(str(e), OutputType.ERROR)
|
|
@@ -274,23 +339,6 @@ arguments:
|
|
|
274
339
|
"""清除对话历史,只保留系统提示"""
|
|
275
340
|
self.prompt = ""
|
|
276
341
|
self.model.reset()
|
|
342
|
+
self.conversation_turns = 0 # 重置对话轮次
|
|
343
|
+
|
|
277
344
|
|
|
278
|
-
def _make_methodology(self):
|
|
279
|
-
"""生成经验总结"""
|
|
280
|
-
current_response = self._call_model("""请根据之前的对话内容,判断是否有必要更新、添加、删除现有经验总结,如果有,使用methodology工具进行管理。
|
|
281
|
-
经验总结模板:
|
|
282
|
-
1. 问题重述
|
|
283
|
-
2. 最优解决方案
|
|
284
|
-
3. 最优方案执行步骤(失败的行动不需要体现)
|
|
285
|
-
""")
|
|
286
|
-
|
|
287
|
-
try:
|
|
288
|
-
result = Agent.extract_tool_calls(current_response)
|
|
289
|
-
except Exception as e:
|
|
290
|
-
PrettyOutput.print(f"工具调用错误: {str(e)}", OutputType.ERROR)
|
|
291
|
-
return
|
|
292
|
-
if len(result) > 0:
|
|
293
|
-
PrettyOutput.print("执行工具调用...", OutputType.PROGRESS)
|
|
294
|
-
tool_result = self.tool_registry.handle_tool_calls(result)
|
|
295
|
-
PrettyOutput.print(tool_result, OutputType.RESULT)
|
|
296
|
-
|