- 新增动作工具: create_signal_strategy(白名单声明式条件落盘信号库+失效缓存链),
add_to_watchlist(复用 watchlist 服务, 重复标的不重复添加), 既有 run_backtest
纳入闸门(spawn 子进程重计算)
- 确认闸门 actions.py: 进程内 PendingRegistry(call_id→asyncio.Event),
action_confirm NDJSON 事件 + POST /actions/{call_id}/decision 决策端点,
120s 未决策视为拒绝; 拒绝/超时按 ok=False 回填模型, 不重试不打断流
- 前端: 确认卡(风险说明+完整待执行参数+确认/取消按钮), 足迹卡 awaiting 态
强制展开, 决策后由 tool_result 终态覆盖; client/store 事件与 decideAction
- 系统提示词: 只读边界改为动作工具确认语义与策略生成引导; 快捷指令新增
帮我生成一个信号
- 测试: 14 项(registry 批准/拒绝/超时/未知id、闸门事件序、写工具往返、
决策端点 404、摘要); 全套 2422 passed; 线上经 mock 供应商完成
批准/拒绝/写入三链路与浏览器 UI 点击验收
42 lines
2.0 KiB
Python
42 lines
2.0 KiB
Python
"""AI 对话助手扩展 — 完全解耦的 L2 二开模块。
|
|
|
|
通过 AI 对话调用面板已有能力(因子目录 / 策略目录 / 数据能力 / 策略回测)。
|
|
删除本目录即可整体卸载, 不影响核心功能; 详见模块内 README 说明与
|
|
docs/secondary-development.md 的扩展契约。
|
|
|
|
事件流协议(NDJSON, 每行一个 JSON):
|
|
{"type":"notice","message":"..."} 历史截断等提示
|
|
{"type":"tool_call","call_id","name","args"} 工具调用开始(前端足迹卡)
|
|
{"type":"tool_result","call_id","name","ok","summary","elapsed_ms","charts?"}
|
|
charts=可绘图数据列表(分时/日K, 前端自动附图)
|
|
{"type":"action_confirm","call_id","name","label","risk","expires_in"}
|
|
动作工具确认卡(创建信号/回测/加自选);
|
|
前端按钮 POST /actions/{call_id}/decision
|
|
{approve:bool}, 超时视为拒绝
|
|
{"type":"delta","content":"..."} 最终正文(M1 整段一次)
|
|
{"type":"error","kind","message","hint?"} no_key/provider/input_too_long/rounds/model
|
|
{"type":"done"} 本轮结束(含失败)
|
|
{"type":"ping"} 心跳保活(空闲 >15s)
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from app.extensions import (
|
|
BACKEND_EXTENSION_API_VERSION,
|
|
BackendExtensionRegistrar,
|
|
ExtensionContext,
|
|
)
|
|
|
|
EXTENSION_ID = "assistant.chat"
|
|
EXTENSION_API_VERSION = BACKEND_EXTENSION_API_VERSION
|
|
|
|
|
|
def setup(registrar: BackendExtensionRegistrar) -> None:
|
|
from app.custom.assistant.routes import build_router
|
|
|
|
registrar.include_router(build_router())
|
|
|
|
|
|
def startup(context: ExtensionContext) -> None:
|
|
# 对话无状态, 无需启动期初始化; 策略引擎与数据目录在请求期从 app.state 获取。
|
|
_ = context
|