dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DeepSeek Harness finance plugin: direct market HTTP APIs, portfolio settings, model tools
让 DeepSeek Harness 从“查一条行情”走向“看懂市场、管理组合、组织研究”。
DSH Finance 是一个面向 DeepSeek Harness 的金融插件:它把 A 股、港股、美股、基金、宏观数据和财经新闻接入模型,同时提供一个可停靠的本地金融面板。行情通过公开 HTTP 接口直连,持仓和自选股保存在本地 JSON 中,适合个人研究、组合复盘和多智能体协作。
新增建档 → 投资理由/验证指标/证伪条件 → 有来源的周复盘 → 用户复核流程。持仓导入和观点修改须到首页预览确认;面板任务先明确选择目标会话。收益按原币展示,缺汇率不合并。当前周复盘需主动触发,尚非后台自动调度。
面板导航现分为「我的工作台 / 市场研究 / 数据与设置」,首页采用概览、档案与判断、每周复盘、待确认四个分区。正确性回归可运行 npm run test:personal、npm run test:regressions 和 npm run test:offline;交付边界与验证说明见 个人首页说明。
安全变更: API默认仅本机访问。远程部署需认证代理、受保护的后端端口及 DSH_FINANCE_TRUSTED_ORIGIN 配置;不能将Origin检查当作登录鉴权。详见实现范围、指标定义与验收边界。以下旧功能说明中的直接写入和跨币种模拟,以此处新约束为准。
<vault>/<年>/<id>-<slug>.md),目录被实时监听——在编辑器/文件工具里新建或改动文件会自动回灌索引,面板里改正文也会写回同一个文件。add_research_note / update_research 回写资料库,形成「对话收集 → 资料沉淀 → 面板维护 → 继续追问」闭环。从侧边栏打开 📈 金融面板,可在以下标签页之间切换:
| 标签页 | 内容 |
|---|---|
| 面板宽度 | 默认 480px,左边缘可拖动(360–820),自动记忆 |
| 行情 | 指数、自选股走势、迷你 K 线和实时刷新 |
| 市场 | 领涨/领跌行业板块,快速定位当日风险 |
| 持仓 | 持仓盈亏、组合市值、股票/基金配置和集中度 |
| 基金 | 开放式基金排行、净值和加入自选 |
| K线 | 本地历史库日 K 线,财报/分红/自定义事件标记 |
| 宏观 | CPI、PPI、PMI、GDP、货币供应量及趋势 |
| 快讯 | 全球财经电报,以及按持仓/自选筛选的个股新闻 |
| 资料 | 投研资料库:按时间/标的分组浏览,按类型/状态/标的/关键词检索;详情为「元数据 + 正文」双栏,可编辑正文并写回本地文件、追加带时间戳的观点、归档;顶部显示本地目录与监听状态,可一键同步 |
| 深度 | 个股深度档案:一致预期/评分/ESG/机构评级/资金流向/融资融券/龙虎榜/股东/分红回购/风险事件/公告/产业链,一次并发取回 |
| 发现 | 市场情绪与注意力:涨跌分布、热搜股票/热门板块、机构龙虎榜(WeStock) |
| 数据源 | 按 capability 选择 provider,选择顺序即调用优先级 |
| 技能 | 本地 playbook 与盈米金融场景 skill 的启停管理 |
| 接口 | 数据源健康状态与当前 provider、数据源性能(缓存命中率/平均耗时/各源成败与耗时/熔断列表)、MCP 外部源开关 |
| 顶部铃铛 | 观点触发式提醒:行情异动(默认 ±5%)与「观点需复核」(默认 ±8%),点击直达 AI 解读 |
面板开关(panelOpen / panelDocked)是 volatile 配置:优先写回 profile;若当前 profile 不可写(本版本 configForms.set 会返回不可写),客户端自动退回 localStorage(dsh-finance:panelPrefs),并在面板顶部提示,保证面板打得开、刷新后状态保留。默认以浮层抽屉打开(dev_web.sh 生成 panelDocked: false;停靠页需要宿主 dock 容器,未选择工作区时可能不渲染),可在面板内一键切换为停靠。
持仓截图也可以交给 Agent 识别,再通过 import_holdings 批量写入本地文件;面板会自动刷新。点击持仓或自选中的股票/基金即可打开完整 AI 解读,首次主动点击后才生成,报告会缓存到本地并支持重新生成。插件只修改本地持仓数据,不执行真实交易。
面板与模型之间是双向实时的:
GET api/events,SSE)即时推送到面板,无需等待轮询;模型还可以调用 panel_navigate 把面板切到指定标签页、聚焦某只股票的 K 线,或直接打开 AI 解读。simulate_rebalance 基于本地持仓做纯模拟推演,不修改持仓文件、不下单:
| 领域 | 工具 | 能力 |
|---|---|---|
| A 股 | get_realtime_quote · get_stock_kline · search_stock · get_stock_list | 行情、日/周/月 K 线、列表搜索 |
| A 股 | get_market_overview · get_financial_indicators · get_sector_board | 指数、财务指标、行业板块 |
| 港股 | get_hk_quote · get_hk_kline · get_hk_list | 港股报价、K 线和列表样本 |
| 美股 | get_us_quote · get_us_kline | Yahoo 优先、东财兜底的报价与 K 线 |
| 基金 | get_fund_quote · get_fund_kline · get_fund_rank | 净值、历史走势和分类排行 |
| 通用 | search_symbol · get_stock_info | 跨市场代码解析、个股档案与市值 |
| 研究 | calculate_technical_indicators · get_macro_china | MA/MACD/RSI/KDJ 与中国宏观序列 |
| 新闻 | get_market_news · get_stock_news · web_search | 市场快讯、个股新闻、免费网页搜索 |
| 研报 | get_research_reports · get_research_report_detail | 券商研报列表(机构/评级/时间)与正文 |
| 资料 | save_research · list_research · get_research · update_research · add_research_note · archive_research · collect_research · sync_research · research_overview | 投研资料库:入库、检索、追加观点、归档、从数据源批量收集、扫描本地文件同步、总览 |
| 资金/股东 | get_money_flow · get_margin_trade · get_dragon_tiger · get_north_holding · get_shareholder · get_dividend · get_buyback | 主力资金流、两融、龙虎榜、北向持仓、十大股东、分红、回购 |
| 研究 | get_consensus · get_institution_rating · get_stock_score · get_chip_distribution | 一致预期/目标价、机构评级、综合评分、筹码分布 |
| 事件/公告 | get_stock_events · get_risk_events · get_disclosure_calendar · get_notice_list · get_market_calendar | 个股事件、风险事件、财报披露日历、公告、新股/停复牌/交易日历 |
| 市场/选股 | get_market_breadth · get_hot_rank · screen_stocks · get_minute_data | 涨跌分布、热搜榜、智能选股(排行/条件/策略/标签/事件)、分时 |
| 通用 | westock_capabilities · westock_call | 列出 55 个 WeStock 能力;按 capability 或直接给 CLI argv 调用(只读白名单) |
| 组合 | get_portfolio · analyze_portfolio · upsert_holding · import_holdings · remove_holding · save_position_analysis | 持仓 CRUD、批量导入、盈亏、风险分析和解读缓存 |
| 模拟 | simulate_rebalance | What-if 再平衡推演(交易列表或目标权重),前后权重/HHI/分币种对比 |
| 面板 | panel_navigate | 对话中把金融面板切到指定标签页、聚焦代码或打开 AI 解读 |
| 自选 | add_watchlist · remove_watchlist · get_portfolio_file | 自选股/基金和本地文件管理 |
| 运维 | probe_finance_sources | 串行探测端点并生成 provider 降级顺序 |
需要 Node.js ^22.19、>=24.2(dsh 的 bin 依赖 import.meta.main,24.0/24.1 会让 CLI 静默退出):
cd dsh-finance-lab
npm install
npm run build
安装必须解析 peer 依赖:dsh 把服务定义包(dsh-jobs、dsh-attachment、dsh-session-persistence …)声明为实现包的 peer。仓库内 .npmrc 显式设置 legacy-peer-deps=false,否则本地安装不是完整的 dsh 运行时,profile 中每个条目都会 failed to import。
东财、腾讯、Yahoo 和 DuckDuckGo 都是公开源,可能受到网络波动、风控或限流影响。首次运行建议先探测,插件启动时会读取报告并优先使用健康的 provider:
npm run probe
# 指定输出和请求间隔
npx tsx scripts/probe_sources.ts \
--out data/probe-report.json \
--gap-sec 3
# 只探测某个 capability.provider
npx tsx scripts/probe_sources.ts --only kline.em_kline
报告默认写入 data/probe-report.json。全部公开源不可用时,行情工具会返回不可用信息;本地持仓 CRUD 仍然可以使用。
将当前项目目录注册到 web profile(dsh plugin 在 profile 目录里执行 pnpm;CLI 版本需与插件依赖一致,对本仓库即 0.2.0-rc.2):
npx @deepseek-ai/dsh@0.2.0-rc.2 plugin \
--profile web add /absolute/path/to/dsh-finance-lab
npx @deepseek-ai/dsh@0.2.0-rc.2 web
dsh web 等价于 dsh --profile web;profile 由第一个位置参数选择,其余参数转发给应用。
本地开发也可以直接运行(scripts/dev_web.sh,多应用并行安全):
bash scripts/dev_web.sh
# 可选环境变量:DSH_HOME(默认 <repo>/.dsh-home)、DSH_PORT(默认 0 = OS 分配)、
# DSH_PROFILE(默认 web)、DSH_NODE、WESTOCK_BIN、LLM_BASE_URL/LLM_MODEL
该脚本按顺序保证隔离:① 每个应用独立 $DSH_HOME(profile/session/存储/数据互不干扰)→
② 挑选支持 import.meta.main 的 Node(读 .nvmrc,挑不到直接报错而不是静默退出)→
③ 端口默认 0 由 OS 分配(避免与其他插件应用抢端口)→
④ 生成 $DSH_HOME/dsh-finance.overlay.yml(插件依赖、dataDir、数据源与 LLM provider 一律写在 profile 层,经 --patch 应用)→
⑤ dsh plugin add 后启动。
WeStock CLI 未安装时,行情/财报/资讯会回落到 HTTP 源,仅研报不可用;安装(pinned + SHA256 校验):
npm run westock:install # → <repo>/.dsh-home/bin/westock,脚本自动识别
如果需要使用开发期的绝对路径 overlay(只挂载宿主半,不含面板客户端 bundle):
npx @deepseek-ai/dsh@0.2.0-rc.2 web --patch ./cordis.dev.yml
注册插件后,从 Harness 左下角的 📈 金融面板 打开 UI;模型工具会自动出现在工具列表中。
默认配置位于 cordis.patch.yml:
| 配置项 | 默认值 | 说明 |
|---|---|---|
cacheTtlSec | 300 | provider 缓存时间 |
requestGapMs | 3000 | 相邻公开请求的间隔 |
httpTimeoutMs | 30000 | 单次请求超时 |
logLevel | info | 日志级别(debug/info/warn/error);结构化日志写入 <dataDir>/logs/dsh-finance.jsonl,可在面板接口页//api/logs 查看 |
westock.enabled | true | 是否启用 WeStock CLI 数据源(腾讯自选股,免鉴权) |
westock.binPath | 空 → 自动探测 | CLI 路径($WESTOCK_BIN → PATH → 常见安装位置) |
westock.timeoutMs | 20000 | 单次 CLI 调用超时 |
westock.autoUpgrade | false | 允许 CLI 自升级(默认关闭,保持 pinned 版本可复现) |
research.enabled | true | 是否启用投研资料库 |
research.dir | 空 → <dataDir>/research | 资料库根目录;正文落盘为 <年>/<id>-<slug>.md,可被宿主文件工具直接读写 |
dataDir | data | 插件全部落盘数据的根目录(持仓/自选、探测报告、分析缓存、历史库、资料库、日志、provider/skill 策略、MCP 密钥) |
probeReportPath | 空 → <dataDir>/probe-report.json | provider 探测报告 |
portfolioPath | 空 → <dataDir>/portfolio.json | 本地持仓/自选文件 |
mcpSources | 预置 妙想 / 盈米 | 外部 MCP 数据源列表(见「多来源数据」) |
panelOpen | 未设置 | 是否打开金融面板(volatile,见下) |
panelDocked | 未设置 | 是否默认停靠为侧栏页(volatile,见下) |
dataDir 的相对路径以插件包目录为基准。同一份源码被注册进多个 dsh profile 时,请在 profile 层把 dataDir 指到各自的目录(或给 portfolioPath / probeReportPath 绝对路径),否则几个 profile 会共用同一份数据。这些文件属于本地运行数据,不会被提交。
panelOpen / panelDocked 在 Config schema 中声明为 volatile:dsh 0.2.0 的配置面板只暴露 volatile 字段,并把它们的值写到 profile 用户层($DSH_HOME/profiles/<name>/cordis.patch.yml)。面板开关按钮经 ctx.configForms 读写该条目,因此重启后开关状态仍然保留;其余字段属于组合配置,改动后由 Loader 重新应用条目。
测试分两层:功能正确性(离线、可重复,必须全绿)与数据源可用性(真实网络,允许失败但标注原因)。
npm run build
npm run test:offline # 离线功能正确性:解析/映射/持久化/校验/日志/registry/能力目录/K线数学/请求校验
npm run test:quant # 量化金样本:确定性回测/稳健性/搜索/策略库/分币种采样(手工推演基准)
npm run test:personal # 个人工作台:档案、观点版本、每周证据任务
npm run test:regressions # 跨模块回归(总线/确认/历史/分析引用契约等)
npm run test:ui # UI 冒烟(真实浏览器):无浏览器/无 DSH_UI_URL 时诚实 SKIPPED
npm run test:westock # WeStock 可用性(真实网络):精选用例 + 能力全量扫描
npm run test:avail # 全量数据源 + 资料库真实收集
# 只测试某个分组
npm run test:avail -- --group westock
# 可选分组:ashare、hk、us、tools、westock、search
详细结果与已知限制见 docs/self-test-report.md;优化方向见 docs/analysis-report.md。
akshare;接口形状参考 AkShare 源码,并在 src/data/providers.ts 中保留来源注释。除公开免费源外,可通过 mcpSources 接入需要凭证的外部数据源,其工具会被桥接进模型工具集,并显示在金融面板「接口」标签页。支持三类:
| kind | 说明 | 桥接后的工具名 |
|---|---|---|
mcp-http | Streamable HTTP MCP Server | mcp__<name>__* |
mcp-stdio | 子进程 stdio MCP Server | mcp__<name>__* |
cli | 遵循 <command> mcp list/schema/call 约定的 CLI | <name>_list / _schema / _call |
默认预置两个(需自备 token):
mx,mcp-http,东方财富):A股/港股/美股/基金/债券/指数板块/宏观/新闻/公告的自然语言查询。yingmi,cli):基金详情、风险与资产配置等能力,依赖全局安装的 yingmi-skill-cli。Token 解析优先级:环境变量(apiKeyEnv,如 EM_API_KEY)→ 本地 data/mcp-secrets.json(不提交,见 data/mcp-secrets.example.json)→ 配置内联 apiKey。也可在面板「接口」页点 🔑 直接填写 token:写入 data/mcp-secrets.json 并即时热重载(断开旧连接、重新桥接工具,无需重启)。
CLI 自带 40+ 子命令。为避免"插件设计把数据源用窄了",这里用表驱动的 capability 目录
(src/data/westock-capabilities.ts)成建制接入,再加一个通用 CLI 桥兜底:
| 分组 | 能力(capability) |
|---|---|
| 行情 / 技术 | minute 分时 · technical 指标 · chip 筹码分布 |
| 市场 | market_breadth 涨跌分布 · market_summary 总览画像 · market_lhb 龙虎榜 · ipo_calendar 新股 · connect_list 陆股通 · trade_calendar 交易日历 |
| 指数 / 板块 | index_list · index_constituent · sector_constituent · sector_valuation · sector_finance · sector_forecast · sector_oper · sector_info |
| 资金 | money_flow · margin_trade · block_trade · dragon_tiger · north_holding · south_holding · short_selling · disclosure_calendar |
| 公司 / 研究 | shareholder · dividend · buyback · consensus · institution_rating · stock_score · esg |
| 资讯 / 事件 | news_detail · notice_list · notice_detail · stock_events · risk_events · invest_calendar · suspension |
| ETF / 宏观 / 其他 | etf_overview · etf_nav · etf_holdings · macro_catalog · macro_indicator · industry_chain · futures_detail · forex_list · bond_detail |
| 智能选股 | screen_ranking · screen_condition · screen_strategy · screen_label · screen_event |
westock_call 可直接执行任意只读 CLI 参数(如 ["fund","flow","sh600519"]),
白名单拒绝 update/upgrade/config/login 等写操作与 shell 元字符。npm run test:westock 会遍历整个目录真实调用(55 项),输出分组通过率与失败原因。典型投研链路:screen_stocks 初筛 → get_realtime_quote/get_stock_kline → get_consensus/get_financial_indicators
→ get_money_flow/get_north_holding → collect_research 沉淀研报 → add_research_note 记录观点。
面板「数据源」页可按 capability 选择使用哪些 provider(quote/kline/hk_*/us_*/web_search 等常有多个来源共存):多选、点击顺序即调用优先级,绿点=探测可用。选择保存到本地 data/provider-policy.json 并即时生效(用户选择优先于探测顺序)。妙想/盈米作为整体数据源在「接口」页开关。
面板「K线」页可把日 K 线与事件落地到本地库并追加更新(data/history/<code>.json):
sync_history(工具)/ POST api/history/sync:抓取日 K 线(A股/港股/美股/基金)并按日期去重合并,股票同时把财报日期存为事件。add_market_event / get_history / list_history:追加分红/公告等自定义事件、读取、列出。面板「技能」页统一管理技能(类似工具):本插件 playbook 技能可启用/停用(进入系统提示);盈米的 11 个金融场景 skill(标准 SKILL.md)可勾选可见范围,写入 remote-skill scope。选择保存到 data/skills-policy.json。
src/ 插件服务、provider、模型工具和金融面板
src/panel-bus.ts 面板 ↔ 对话双向通道的事件总线(SSE 推送)
src/rebalance.ts What-if 再平衡模拟引擎(纯函数,不改持仓)
src/mcp/ 外部 MCP 数据源桥接(妙想 HTTP / 盈米 CLI)+ token 热重载
src/history/ 本地历史库(K线/财报/分红)与同步
src/log.ts 结构化日志(JSONL,级别可配,替代原先静默的 catch)
src/data/westock.ts WeStock CLI 数据源(Markdown 表格解析、symbol 映射、研报、通用 CLI 桥)
src/data/westock-capabilities.ts WeStock 能力目录(表驱动)+ provider 工厂
src/tools/westock.ts WeStock 工具集(资金/股东/研究/事件/选股 + westock_call 通用调用)
src/research/ 投研资料库(Markdown 落盘 + 索引 + 收集/观点/归档)
skills/ 财务分析、组合、策略、风控与研究团队 playbook
scripts/ provider 探测、可用性测试和本地 Web 启动脚本
cordis.patch.yml Harness 插件注册与默认配置
插件内部就是「spawn westock 二进制 + 解析 Markdown 表格」,因此可以直接在终端/Agent bash 里敲:
./scripts/westock.sh quote sh600519 # 透传原生子命令(输出 CLI 原文)
./scripts/westock.sh kline sh600519 --period day --limit 10
./scripts/westock.sh fund flow sh600519 --json # 表格解析成 JSON
./scripts/westock.sh --cap consensus --args '{"code":"600519"}' # 走能力目录:缓存 + 多源回落 + JSON
./scripts/westock.sh --list --group 研究 # 能力目录
./scripts/westock.sh --status # 二进制与版本
npm run westock -- quote sh600519 # 等价写法
--bin / WESTOCK_BIN / <包>/.dsh-home/bin/westock / ~/.westock/bin/westock;未安装时提示 npm run westock:install。WESTOCK_TIMEOUT_MS 控制(默认 20000)。westock_call(传 argv 或 capability+args)即可,同样是只读白名单。