FinBuddy 核心模块与SSE流式
· FinBuddy
今日进展
- 新增
finclaw/core/子包:权限检查器、用量追踪、内存压缩、插件钩子 - 增强 SSE 流式解析:
core/api/sse_parser.py+core/api/enhanced_stream.py - 前端新增 SSE 解析器(
utils/sseParser.ts)和流式增强(utils/streamEnhancements.ts) - 引入 OpenSpace 技能市场作为参考架构
- 新增 5 个测试模块:compaction、permission、plugins、sse_parser、usage_tracker
关键代码/伪代码
core 子包结构
# finclaw/core/ — 从各模块抽取的通用能力
core/
api/
sse_parser.py # SSE 流式解析器
enhanced_stream.py # 增强流式响应(重试、超时、背压)
memory/
compaction.py # 对话内存压缩(长对话自动摘要)
permissions/
checker.py # 权限检查器(功能级 + 数据级)
policy.py # 权限策略定义(角色 → 功能映射)
plugins/
hooks.py # 插件钩子系统(生命周期钩子)
usage/
tracker.py # 用量追踪(Token 消耗、API 调用次数)
pricing.py # 计费规则(按模型层级 tier1/tier2/tier3)
types.py # 用量数据类型定义
内存压缩 — 长对话自动摘要
# 对话超过一定长度后,自动压缩历史消息
# 避免 Token 爆炸,同时保留关键上下文
CLASS MemoryCompactor:
"""对话内存压缩器"""
ASYNC DEF compact(self, messages, max_tokens=4000):
# 1. 计算当前消息总 Token 数
total_tokens = self.count_tokens(messages)
IF total_tokens <= max_tokens:
RETURN messages # 不需要压缩
# 2. 保留最近 N 轮对话(不压缩)
recent = messages[-6:] # 最近 3 轮(用户+助手各3条)
# 3. 对历史消息做摘要压缩
history = messages[:-6]
summary = AWAIT self.llm.summarize(history)
# 4. 返回:摘要 + 最近对话
RETURN [{"role": "system", "content": f"历史摘要:{summary}"}] + recent
用量追踪与计费
# 按 LLM 模型层级计费
# tier1(DeepSeek 等):便宜,日常对话
# tier2(GPT-4o 等):中等,分析任务
# tier3(Claude Opus 等):贵,深度研究
TIER_PRICING = {
"tier1": {"input": 0.001, "output": 0.002}, # 元/千Token
"tier2": {"input": 0.03, "output": 0.06},
"tier3": {"input": 0.15, "output": 0.75},
}
CLASS UsageTracker:
DEF track(self, user_id, model_tier, input_tokens, output_tokens):
# 记录每次 LLM 调用的 Token 消耗
cost = (input_tokens * TIER_PRICING[model_tier]["input"]
+ output_tokens * TIER_PRICING[model_tier]["output"])
self.db.record_usage(user_id, model_tier, input_tokens, output_tokens, cost)
遇到的问题
- SSE 解析器在 Electron 渲染进程中需要处理跨域和 CSP 限制,最终通过主进程代理解决
- 内存压缩的摘要质量不稳定,有时候 LLM 会丢失关键数据(如股票代码、具体数值),需要优化 prompt
- OpenSpace 的技能进化图(SkillEvolutionGraph)很酷,但实现复杂度高,暂时只做参考
明日计划
- 继续完善前端组件
- 优化 SSE 流式体验