fix: dehydrate优先走API + SQLite缓存, breath/pulse显示bucket_id
Some checks failed
Build & Push Docker Image / build-and-push (push) Has been cancelled
Tests / test (push) Has been cancelled

- dehydrate() 现在仅通过 API 脱水,不再有本地 fallback
- 新增 SQLite 持久缓存 (dehydration_cache.db),避免重复 API 调用
- 删除 _local_dehydrate() 和 _extract_keywords(),移除 jieba 依赖
- breath 三种模式 (surfacing/search/feel) 输出添加 [bucket_id:xxx]
- pulse 输出每行添加 bucket_id:xxx
This commit is contained in:
P0luz
2026-04-19 13:12:44 +08:00
parent 821546d5de
commit d4740f0d1f
2 changed files with 81 additions and 88 deletions

View File

@@ -300,7 +300,7 @@ async def breath(
try:
clean_meta = {k: v for k, v in b["metadata"].items() if k != "tags"}
summary = await dehydrator.dehydrate(strip_wikilinks(b["content"]), clean_meta)
pinned_results.append(f"📌 [核心准则] {summary}")
pinned_results.append(f"📌 [核心准则] [bucket_id:{b['id']}] {summary}")
except Exception as e:
logger.warning(f"Failed to dehydrate pinned bucket / 钉选桶脱水失败: {e}")
continue
@@ -359,7 +359,7 @@ async def breath(
break
# NOTE: no touch() here — surfacing should NOT reset decay timer
score = decay_engine.calculate_score(b["metadata"])
dynamic_results.append(f"[权重:{score:.2f}] {summary}")
dynamic_results.append(f"[权重:{score:.2f}] [bucket_id:{b['id']}] {summary}")
token_budget -= summary_tokens
except Exception as e:
logger.warning(f"Failed to dehydrate surfaced bucket / 浮现脱水失败: {e}")
@@ -387,7 +387,7 @@ async def breath(
results = []
for f in feels:
created = f["metadata"].get("created", "")
entry = f"[{created}]\n{strip_wikilinks(f['content'])}"
entry = f"[{created}] [bucket_id:{f['id']}]\n{strip_wikilinks(f['content'])}"
results.append(entry)
if count_tokens_approx("\n---\n".join(results)) > max_tokens:
break
@@ -453,7 +453,9 @@ async def breath(
break
await bucket_mgr.touch(bucket["id"])
if bucket.get("vector_match"):
summary = f"[语义关联] {summary}"
summary = f"[语义关联] [bucket_id:{bucket['id']}] {summary}"
else:
summary = f"[bucket_id:{bucket['id']}] {summary}"
results.append(summary)
token_used += summary_tokens
except Exception as e:
@@ -829,6 +831,7 @@ async def pulse(include_archive: bool = False) -> str:
resolved_tag = " [已解决]" if meta.get("resolved", False) else ""
lines.append(
f"{icon} [{meta.get('name', b['id'])}]{resolved_tag} "
f"bucket_id:{b['id']} "
f"主题:{domains} "
f"情感:V{val:.1f}/A{aro:.1f} "
f"重要:{meta.get('importance', '?')} "