jarvis-ai-assistant 0.3.4__py3-none-any.whl → 0.3.6__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.
jarvis/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  """Jarvis AI Assistant"""
3
3
 
4
- __version__ = "0.3.4"
4
+ __version__ = "0.3.6"
@@ -163,11 +163,13 @@ class MemoryOrganizer:
163
163
  )
164
164
  all_tags.update(memory.get("tags", []))
165
165
 
166
+ memory_contents_str = (("="*50) + "\n").join(memory_contents)
167
+
166
168
  prompt = f"""请将以下{len(memories)}个相关记忆合并成一个综合性的记忆。
167
169
 
168
170
  原始记忆(按时间从新到旧排序):
169
171
  {"="*50}
170
- {(("="*50) + "\n").join(memory_contents)}
172
+ {memory_contents_str}
171
173
  {"="*50}
172
174
 
173
175
  原始标签集合:{', '.join(sorted(all_tags))}
@@ -278,8 +280,23 @@ tags:
278
280
  # 从高重叠度开始处理
279
281
  max_tags = max(len(m.get("tags", [])) for m in memories)
280
282
 
283
+ # 创建一个标记已删除记忆的集合
284
+ deleted_indices = set()
285
+
281
286
  for overlap_count in range(min(max_tags, 5), min_overlap - 1, -1):
282
- overlap_groups = self._find_overlapping_memories(memories, overlap_count)
287
+ # 过滤掉已删除的记忆
288
+ active_memories = [
289
+ (i, mem) for i, mem in enumerate(memories) if i not in deleted_indices
290
+ ]
291
+ if not active_memories:
292
+ break
293
+
294
+ # 创建索引映射:原始索引 -> 活跃索引
295
+ active_memory_list = [mem for _, mem in active_memories]
296
+
297
+ overlap_groups = self._find_overlapping_memories(
298
+ active_memory_list, overlap_count
299
+ )
283
300
 
284
301
  if overlap_count in overlap_groups:
285
302
  groups = overlap_groups[overlap_count]
@@ -289,7 +306,13 @@ tags:
289
306
  )
290
307
 
291
308
  for group in groups:
292
- group_memories = [memories[i] for i in group]
309
+ # 将活跃索引转换回原始索引
310
+ original_indices = set()
311
+ for active_idx in group:
312
+ original_idx = active_memories[active_idx][0]
313
+ original_indices.add(original_idx)
314
+
315
+ group_memories = [memories[i] for i in original_indices]
293
316
 
294
317
  # 显示将要合并的记忆
295
318
  PrettyOutput.print(
@@ -315,16 +338,17 @@ tags:
315
338
 
316
339
  # 保存新记忆
317
340
  self._save_merged_memory(
318
- merged_memory, memory_type, [memories[i] for i in group]
341
+ merged_memory,
342
+ memory_type,
343
+ [memories[i] for i in original_indices],
319
344
  )
320
345
 
321
346
  stats["processed_groups"] += 1
322
- stats["merged_memories"] += len(group)
347
+ stats["merged_memories"] += len(original_indices)
323
348
  stats["created_memories"] += 1
324
349
 
325
- # 从列表中移除已合并的记忆
326
- for i in sorted(group, reverse=True):
327
- del memories[i]
350
+ # 标记这些记忆已被删除
351
+ deleted_indices.update(original_indices)
328
352
  else:
329
353
  PrettyOutput.print(" [模拟运行] 跳过实际合并", OutputType.INFO)
330
354
 
@@ -376,11 +400,18 @@ tags:
376
400
  for orig_memory in original_memories:
377
401
  if "file_path" in orig_memory:
378
402
  try:
379
- Path(orig_memory["file_path"]).unlink()
380
- PrettyOutput.print(
381
- f"删除原始记忆: {orig_memory.get('id', '未知')}",
382
- OutputType.INFO,
383
- )
403
+ file_path = Path(orig_memory["file_path"])
404
+ if file_path.exists():
405
+ file_path.unlink()
406
+ PrettyOutput.print(
407
+ f"删除原始记忆: {orig_memory.get('id', '未知')}",
408
+ OutputType.INFO,
409
+ )
410
+ else:
411
+ PrettyOutput.print(
412
+ f"原始记忆文件已不存在,跳过删除: {orig_memory.get('id', '未知')}",
413
+ OutputType.INFO,
414
+ )
384
415
  except Exception as e:
385
416
  PrettyOutput.print(
386
417
  f"删除记忆文件失败 {orig_memory['file_path']}: {str(e)}",
@@ -607,6 +638,9 @@ def organize(
607
638
  else:
608
639
  raise typer.Exit(0) # 即使没有处理也是正常退出
609
640
 
641
+ except typer.Exit:
642
+ # typer.Exit 是正常的退出方式,直接传播
643
+ raise
610
644
  except Exception as e:
611
645
  PrettyOutput.print(f"记忆整理失败: {str(e)}", OutputType.ERROR)
612
646
  raise typer.Exit(1)
@@ -142,20 +142,9 @@ class BasePlatform(ABC):
142
142
  live.update(panel)
143
143
  end_time = time.time()
144
144
  duration = end_time - start_time
145
- char_count = len(response)
146
- # Calculate token count and tokens per second
147
- try:
148
- token_count = get_context_token_count(response)
149
- tokens_per_second = (
150
- token_count / duration if duration > 0 else 0
151
- )
152
- except Exception as e:
153
- PrettyOutput.print(
154
- f"Tokenization failed: {str(e)}", OutputType.WARNING
155
- )
156
- token_count = 0
157
- tokens_per_second = 0
158
- panel.subtitle = f"[bold green]✓ 对话完成耗时: {duration:.2f}秒, 输入字符数: {len(message)}, 输入Token数量: {input_token_count}, 输出字符数: {char_count}, 输出Token数量: {token_count}, 每秒Token数量: {tokens_per_second:.2f}[/bold green]"
145
+ panel.subtitle = (
146
+ f"[bold green]✓ 对话完成耗时: {duration:.2f}秒[/bold green]"
147
+ )
159
148
  live.update(panel)
160
149
  else:
161
150
  for s in self.chat(message):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.3.4
3
+ Version: 0.3.6
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
@@ -1,4 +1,4 @@
1
- jarvis/__init__.py,sha256=OeCDz6Z11rF2cp6sXEe7CwvIdTZ_EPzUJwW35kFF6BY,73
1
+ jarvis/__init__.py,sha256=1uSGtB9vMIaVHsdbxj-kXL0H2jqGhCOqcL6yp5wEM-U,73
2
2
  jarvis/jarvis_agent/__init__.py,sha256=NF_eUF85RRplGJyLmInIsTn-09aEPtjj4utYvEALvJw,31802
3
3
  jarvis/jarvis_agent/agent_manager.py,sha256=YzpMiF0H2-eyk2kn2o24Bkj3bXsQx7Pv2vfD4gWepo0,2893
4
4
  jarvis/jarvis_agent/builtin_input_handler.py,sha256=Qs4LAr4xdKLBJpQE81YP4CkucAop86ms0iVoKa1nnso,2468
@@ -54,13 +54,13 @@ jarvis/jarvis_mcp/sse_mcp_client.py,sha256=neKrgFxwLDPWjVrl9uDt1ricNwbLZbv1ZEFh0
54
54
  jarvis/jarvis_mcp/stdio_mcp_client.py,sha256=APYUksYKlMx7AVNODKOLrTkKZPnp4kqTQIYIuNDDKko,11286
55
55
  jarvis/jarvis_mcp/streamable_mcp_client.py,sha256=sP0KEsxVcXGht0eA7a_m-ECtZAk39s4PL9OUdm35x2Y,14467
56
56
  jarvis/jarvis_memory_organizer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
- jarvis/jarvis_memory_organizer/memory_organizer.py,sha256=TP-h3CCoQh9E3kdCDbrKORKneRZYnoaWm-JOZqDY1B0,25178
57
+ jarvis/jarvis_memory_organizer/memory_organizer.py,sha256=nUySOLUfWtGTu92XH2w5Jez46HZl_CFIdxEE_feFqpQ,26502
58
58
  jarvis/jarvis_methodology/main.py,sha256=6QF8hH3vB6rfxim0fPR34uVPf41zVpb4ZLqrFN2qONg,10983
59
59
  jarvis/jarvis_multi_agent/__init__.py,sha256=kCgtAX7VvliyEOQxIj2DvNjRAuh6bpNaOtDn60nzph4,6089
60
60
  jarvis/jarvis_multi_agent/main.py,sha256=Wbarez48QxXexlKEOcRsoMbcQEOP5rv_DzGkNk0SfpY,1779
61
61
  jarvis/jarvis_platform/__init__.py,sha256=WLQHSiE87PPket2M50_hHzjdMIgPIBx2VF8JfB_NNRk,105
62
62
  jarvis/jarvis_platform/ai8.py,sha256=W3947AGMpk3RRBfsfZmf222sEP0VIGoSU0vPkgiVnl0,11683
63
- jarvis/jarvis_platform/base.py,sha256=XfazAKRE9HnLCqoYaRG38HlEkCWHRWGcAftHsaMN-Tc,10179
63
+ jarvis/jarvis_platform/base.py,sha256=VyZhXgtGbUTrhXaDwA3kYUo03mfM-nNCYaTGgpY_TZQ,9365
64
64
  jarvis/jarvis_platform/human.py,sha256=jWjW8prEag79e6ddqTPV4nz_Gz6zFBfO4a1EbvP8QWA,4908
65
65
  jarvis/jarvis_platform/kimi.py,sha256=imbH575fazyDai5pxB6zbHmzwzS4Ig0RP7WVpni-ooI,15175
66
66
  jarvis/jarvis_platform/openai.py,sha256=0YSeDGHRSPQP2haEzFARx_aZH_d_UZ-HSCsJLh2hW5k,8037
@@ -119,9 +119,9 @@ jarvis/jarvis_utils/methodology.py,sha256=IIMU17WVSunsWXsnXROd4G77LxgYs4xEC_xm_0
119
119
  jarvis/jarvis_utils/output.py,sha256=QRLlKObQKT0KuRSeZRqYb7NlTQvsd1oZXZ41WxeWEuU,10894
120
120
  jarvis/jarvis_utils/tag.py,sha256=f211opbbbTcSyzCDwuIK_oCnKhXPNK-RknYyGzY1yD0,431
121
121
  jarvis/jarvis_utils/utils.py,sha256=ZyLL-X0EGi8fnofAdP5Qd99lYlP5U5qGY50elR4uS08,44291
122
- jarvis_ai_assistant-0.3.4.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
123
- jarvis_ai_assistant-0.3.4.dist-info/METADATA,sha256=rgbEn1DYq_u7mcMyId7rgP4s3oJJwdCc0IQdppTU2_4,18184
124
- jarvis_ai_assistant-0.3.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
125
- jarvis_ai_assistant-0.3.4.dist-info/entry_points.txt,sha256=4GcWKFxRJD-QU14gw_3ZaW4KuEVxOcZK9i270rwPdjA,1395
126
- jarvis_ai_assistant-0.3.4.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
127
- jarvis_ai_assistant-0.3.4.dist-info/RECORD,,
122
+ jarvis_ai_assistant-0.3.6.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
123
+ jarvis_ai_assistant-0.3.6.dist-info/METADATA,sha256=4mXgTnz8af0Ep74zSji4PXqlIkzFSOlCgtnKAejz_gA,18184
124
+ jarvis_ai_assistant-0.3.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
125
+ jarvis_ai_assistant-0.3.6.dist-info/entry_points.txt,sha256=4GcWKFxRJD-QU14gw_3ZaW4KuEVxOcZK9i270rwPdjA,1395
126
+ jarvis_ai_assistant-0.3.6.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
127
+ jarvis_ai_assistant-0.3.6.dist-info/RECORD,,