FinBuddy 核心模块与SSE流式

· FinBuddy

今日进展

  1. 新增 finclaw/core/ 子包:权限检查器、用量追踪、内存压缩、插件钩子
  2. 增强 SSE 流式解析:core/api/sse_parser.py + core/api/enhanced_stream.py
  3. 前端新增 SSE 解析器(utils/sseParser.ts)和流式增强(utils/streamEnhancements.ts
  4. 引入 OpenSpace 技能市场作为参考架构
  5. 新增 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 流式体验