我想基于整个网站的资源,看看实现构建一个关于新能源汽车行业知识库+数据库的想法
我想基于整个网站的资源,看看实现构建一个关于新能源汽车行业知识库+数据库的想法
可行。做成一个 skill 下的两层:上层知识库放定性材料和实体关系,下层数据库放可回溯的指标宽表。 站内现成的资源不少,但有一点要先说明:新能源车的行业产销指标,DataHub 里没有现成的数据库。…

执行过程 · 20 步
盘点站内可用的数据/技能/方法资源,给出"新能源汽车行业知识库+数据库"的可行方案(含知识库结构、数据库字段与取数路径、实施步骤、缺口),必要时落到可建的 skill 规格 · 一份方案说明(资源盘点{"key": "c1793003979322", "goal": "盘点站内可用的数据/技能/方法资源,给出\"新能源汽车行业知识库+数据库\"的可行方案(含知识库结构、数据库字段与取数路径、实施步骤、缺口),必要时落到可建的 skill 规格", "deliverable": "一份方案说明(资源盘点表 + 知识库新能源汽车 产业链 销量 产量{"query": "新能源汽车 产业链 销量 产量", "results": [], "groups": {"个券数据": 4, "收益率曲线": 2, "债券指数": 2, "股票/基金/境外指数": 1, "公募基金": 2, "ETF": 1, "未分组": 42, "发行人/主体": 2, "财务横截面": 行业知识库 数据库 产业链研究{"query": "行业知识库 数据库 产业链研究", "results": [{"id": "internal-db-middleware", "name": "内部·数据库中间件方法", "one_line": "把数据库/底稿做成 SKILL.md + data_contract + fetcher + tem汽车 乘用车 销量 中汽协 月度{"query": "汽车 乘用车 销量 中汽协 月度", "results": [{"id": "gequan_trade", "title": "个券成交(月度+区间增量)", "group": "个券数据", "use": "银行间+交易所个券成交明细(成交量/成交额/净价/全价),按月分片。做成交活跃度、换手、行业财务指标 上市公司 所属行业 成分股{"query": "行业财务指标 上市公司 所属行业 成分股", "results": [], "groups": {"个券数据": 4, "收益率曲线": 2, "债券指数": 2, "股票/基金/境外指数": 1, "公募基金": 2, "ETF": 1, "未分组": 42, "发行人/主体": 2, "财务横建数据库 skill 中间件 数据契约 fetcher 验收{"query": "建数据库 skill 中间件 数据契约 fetcher 验收", "results": [{"id": "internal-db-middleware", "name": "内部·数据库中间件方法", "one_line": "把数据库/底稿做成 SKILL.md + data_contract 汽车 新能源 锂电 产业链 公司研究{"query": "汽车 新能源 锂电 产业链 公司研究", "results": [{"id": "skill-regional-industry-discovery", "name": "区域产业研究深化引擎", "one_line": "区域产业研究报告\"最有价值发现\"逐条深化引擎——从已有看板+JSON提car_market_total_cpca · [object Object] · 5{"source": "akshare", "func": "car_market_total_cpca", "total": 12, "columns": ["月份", "2025年", "2026年"], "count": 5, "rows": [{"月份": "1月", "2025年": 209.2576, "2car_energy_sale_cpca · 5{"error": "akshare_func_missing", "func": "car_energy_sale_cpca", "note": "先查 AKShare 接口名;不要用网页抓取替代。"}6 · industry knowledge base database supply chain EV automotive{"count": 6, "results": [{"platform": "mcp-registry", "id": "ai.meacheal/mrc-data", "name": "MRC Data — China's Apparel Supply Chain Infrastructure", "one_line"car_market_cate_cpca · 6{"error": "akshare_call_failed", "func": "car_market_cate_cpca", "detail": "'2026年'", "note": "接口可能被上游反爬/参数不符;换接口或稍后再试,不要编数。"}car_market_man_rank_cpca · 4{"source": "akshare", "func": "car_market_man_rank_cpca", "total": 10, "columns": ["厂商", "2025年9月", "2026年9月"], "count": 4, "rows": [{"厂商": "比亚迪汽车", "2025年9月": 新能源汽车行业月度销量与产量数据 · 5{"tool": "FinQuery", "query": "新能源汽车行业月度销量与产量数据", "blocks": [], "count": 0, "api_names": [], "asof": null, "asof_basis": "", "asof_note": "接口没有返回可识别的日期字段;不要猜批次日新能源汽车 产业链 销量 电池 · 6{"query": "新能源汽车 产业链 销量 电池", "asof": "2026-09-15", "partial": false, "corpus_docs": 147113, "indexed_terms": 8, "note": "", "items": [{"i": 5825, "title": "【万联电盘站内数据资源:新能源车相关数据集、分片、字段(search_data / datahub_manifest) · done · DataHub manifest 全表:仅有债券/基金/ETF/指数/{"key": "c1793003979322", "goal": "盘点站内可用的数据/技能/方法资源,给出\"新能源汽车行业知识库+数据库\"的可行方案(含知识库结构、数据库字段与取数路径、实施步骤、缺口),必要时落到可建的 skill 规格", "deliverable": "一份方案说明(资源盘点表 + 知识库盘站内技能与方法:行业知识库类 skill、检索/取数方法(search_skills / search_private_skills) · done · 可借模板:industry-quant-pr{"key": "c1793003979322", "goal": "盘点站内可用的数据/技能/方法资源,给出\"新能源汽车行业知识库+数据库\"的可行方案(含知识库结构、数据库字段与取数路径、实施步骤、缺口),必要时落到可建的 skill 规格", "deliverable": "一份方案说明(资源盘点表 + 知识库盘外部可取路径:AKShare 产业链接口、聚源行业接口、资讯公告口,跑几个真样本验证 · done · 实测通过:car_market_total_cpca(中汽协月度总量,万辆)、car_mark{"key": "c1793003979322", "goal": "盘点站内可用的数据/技能/方法资源,给出\"新能源汽车行业知识库+数据库\"的可行方案(含知识库结构、数据库字段与取数路径、实施步骤、缺口),必要时落到可建的 skill 规格", "deliverable": "一份方案说明(资源盘点表 + 知识库方案 · 新能源车知识库+数据库方案要点:双层(知识库K1政策/K2技术/K3公司供给/K4事件时间线;数据库D1产销/D2材料价量/D3装机/D4公司财务/D5市场表现)。已验证通道:AKShare{"ok": true, "path": "/app/quickanswer/var/agent_notes/2dff8b1a5f9b708d.md", "bytes": 622}可行。做成一个 skill 下的两层:上层知识库放定性材料和实体关系,下层数据库放可回溯的指标宽表。
站内现成的资源不少,但有一点要先说明:新能源车的行业产销指标,DataHub 里没有现成的数据库。我查了全部清单,只有债券、基金、ETF、指数、主体、财务这几类,没有行业产销,也没有产业链量价表。所以数据库这一层要自己接外部源,而且我实测只跑通了 2 个接口,其余都是缺口,不能当成已经有了。
站内已有的基础
| 层 | 现成资源 | 能干什么 | 证据 |
|---|---|---|---|
| 主体底表 | DataHub issuer_master(含 A股主体申万行业分类 2021版、公司简介、预警通合并表) | 把整车、电池、材料、零部件公司按行业+概念挂成实体清单 | datahub_manifest |
| 财务 | bond_master_extra(主体与 A股财务指标) | 公司层营收、毛利率、capex、应收,做产能与盈利跟踪 | datahub_manifest |
| 市场 | index_eod、etf_master、fund_master | 申万汽车/电力设备指数、新能源车 ETF 的行情净值 | datahub_manifest |
| 定性语料 | 公众号检索(14.7 万篇,含万联证券行业跟踪、绿色金融研究等) | 政策解读、材料价格点评、出海动态,按周增量进知识库 | search_wechat:2026-09-15《智能网联新能源汽车产业发展"十五五"规划》等 |
| 方法模板 | 行业量价数据库中间件("行业×指标×时间"宽表 + 景气分位)、多模态文档→Markdown 知识库、Financial Analyzer(按行业归集知识库)、研究方向热度(关注度/交易活跃度两轴) | 直接照结构抄,不重造 | search_skills |
数据库层实测取数
已跑通的两个:
- 中汽协月度总销量
car_market_total_cpca:2026年5月 221.39 万辆,2025年5月 227.92 万辆(单位万辆,口径=中汽协月度,累计到该月)。 - 中汽协厂商销量排行
car_market_man_rank_cpca:2026年9月比亚迪 45.51 万辆、吉利 29.01、奇瑞 28.17、长安 12.80(万辆)。
没跑通的,别当成已有:
car_market_cate_cpca(车型分类销量)报错'2026年',接口对新年度列不适配。- 聚源 FinQuery 问“新能源车月度销量产量”返回 0 行 + param_error,MCP 与裸 API 双向空结果。
- 未验证:乘联会零售、批发,上险量,动力电池装机(GWh),碳酸锂等材料价格,出口量。
按站内规矩,这些一律标 pending 写进缺口清单,不填 0,不拿近似值顶。
建议的产品结构
知识库(K,定性,按月增量):
- K1 政策与法规:购置税、双积分、十五五规划、欧盟电池法规、回收办法,可以挂原文 PDF 或公众号全文。
- K2 技术路线:磷酸铁锂和三元、800V、固态电池、智驾分级,每条一个卡片式“定义+现状+争议”。
- K3 公司与产能图谱:车企、电池厂、材料厂、设备厂之间的供应关系。实体表加关系表,主键统一用聚源内码或统一社会信用代码。
- K4 事件时间线:涨价、扩产、召回、出海建厂,按日期索引。
- K5 指标口径词典:每个指标的定义、单位、来源、更新频率。这是知识库和数据库之间的对应说明,缺了必然乱。
数据库(D,定量,宽表):
统一结构 行业/环节 × 指标 × 时间 × 口径标签,字段带 value / unit / source / asof / status。
- D1 产销:月度总量、厂商、车型段、零售、批发
- D2 材料价量:碳酸锂、正极、电解液、隔膜、六氟磷酸锂
- D3 装机与产能:电池装机 GWh、产能利用率、capex
- D4 公司财务:按实体清单批量拉三表指标
- D5 市场表现:指数、ETF、估值分位
高频问题清单
验收题就从这里出:
- 上个月新能源车渗透率多少、同比怎么走 → D1
- 比亚迪和吉利的月度销量差在扩大还是收窄 → D1
- 碳酸锂跌了之后,正极和电池环节谁受益 → D2+K2
- 某电池厂产能利用率现在处于历史什么位置 → D3+D4
- 这一轮政策(购置税、双积分)对哪类车型影响最大 → K1+K2
- 出海建厂进展到哪一步 → K4+K3
- 汽车板块估值分位、ETF 资金流 → D5
- 某公司毛利率下滑是价格战还是成本 → D4+D2
每条答案都要能回指“哪张表、哪篇文章、哪个接口+哪一天”。
实施路线
分三段走,别一次全建。
第 0 段(1 次会话):定 K5 指标词典、实体主键、5 张表的字段定义,先跑通 D1(已实测 2 个接口)加 D5(站内现成)。验收用上面第 1、2、7 题跑出真数字。
第 1 段:补 D2、D3 的取数通道。通不了就明确降级为客户 Wind、iFinD、DM 账户或手工底稿导入,不许造。验收第 3、4 题。
第 2 段:公众号语料和研报 PDF 批量转 Markdown 建索引,实体关系串起来。验收第 5、6 题能给出带出处的定性和定量组合答案。
需要你定的三件事
定完我就开工。
- 覆盖范围:只做整车,还是整车、电池、四大材料、设备全链?全链字段量大约 3 倍,取数通道也翻倍。
- 数据源:你有没有 Wind、iFinD、DM、聚源账户?有的话 D2、D3 走账户接口,能补上我实测没通的那几块;没有就只靠 AKShare 加站内底表,缺口写清楚。
- 更新频率:月度跟中汽协、乘联会,还是周度跟材料价格?
你确认后,我按“规格单、任务、写、检查、实际运行、打包”的流程建 skill,第 0 段先跑通再说下一段。
边界说明:方案里的“没通”“未验证”都是真实失败记录,不是我保守。我只测了 AKShare 3 个汽车接口和聚源 1 次查询,不代表站外没有其他通道,但没验证的我不写进可用清单。方案底稿已存会话笔记,未落成包,因为范围和更新频率你还没定,现在建包会建错。
我有本地 wind 账户和本地数据库,初步给我个 skill 吧,我去本地跑把这些数据接入
继续
继续
执行过程 · 89 步
20{"text": "用假源验证状态打标与「缺失不打 0」。\n", "path": "/app/quickanswer/var/agent_notes/2dff8b1a5f9b708d.md", "bytes": 1439}50{"text": " ok 行不得覆盖已有 ok 行;selftest 全程离线用假源验证状态打标与「缺失不打 0」。\n", "path": "/app/quickanswer/var/agent_notes/2dff8b1a5f9b708d.md", "bytes": 1439}b33dcfd6fed66333{"ok": false, "mode": "real", "steps": [{"step": "fetcher", "ok": false, "output": "Command '['/usr/bin/setpriv', '--reuid=65534', '--regid=65534', '--clear-groindustry knowledge base database skill wind data pipeline indicator dictionary · 8{"count": 8, "results": [{"platform": "mcp-registry", "id": "ai.b77/knowledge-base", "name": "Knowledge Base", "one_line": null, "url": "https://b77.ai/apps/knodify-marketplace · majinkai/database_to_knowledge{"platform": "dify-marketplace", "id": "majinkai/database_to_knowledge", "name": "Database to knowledge", "url": "https://marketplace.dify.ai/plugin/majinkai/da新能源车 Wind 适配器 指标词典 本地数据库 skill 建包 · 3{"query": "新能源车 Wind 适配器 指标词典 本地数据库 skill 建包", "hits": [], "total": 0}skill · 新能源汽车行业知识库+数据库 skill:接入本地 Wind(wsd/wss/edb)与本地数据库(sqlite/mysql/clickhouse/csv),指标词典驱动取数,长表落库{"session_id": "842e7777241e4430832f4ff0580f4bc3", "kind": "db-middleware", "kind_label": "数据型(数据库中间件)", "round": 0, "max_rounds": 8, "questions": [{"id": "prob842e7777241e4430832f4ff0580f4bc3 · [object Object]{"session_id": "842e7777241e4430832f4ff0580f4bc3", "kind": "db-middleware", "round": 1, "max_rounds": 8, "complete": false, "needs_manual": false, "missing": ["[object Object] · 842e7777241e4430832f4ff0580f4bc3{"session_id": "842e7777241e4430832f4ff0580f4bc3", "kind": "db-middleware", "round": 2, "max_rounds": 8, "complete": true, "needs_manual": false, "missing": [],842e7777241e4430832f4ff0580f4bc3{"ok": true, "dir": "/app/quickanswer/var/factory_agent/842e7777241e4430832f4ff0580f4bc3", "must_write": [], "auto_filled": ["README-先看我.md", "config/config.exa842e7777241e4430832f4ff0580f4bc3{"ok": false, "missing": ["data_contract.yaml", "fetcher/README.md", "fetcher/fetch.py"], "compile_errors": [], "import_errors": [], "entry_errors": [], "functi842e7777241e4430832f4ff0580f4bc3 · config/config.example.json{"path": "config/config.example.json", "bytes": 1314, "text": "{\n \"_说明\": \"客户机本地配置;复制成 config.json 后填。⛔ 不要提交版本库、不要上传。\",\n \"who_fills\": \"客户\",\n \"data842e7777241e4430832f4ff0580f4bc3 · SKILL.md{"path": "SKILL.md", "bytes": 1729, "text": "---\nname: nev-chain-kb-db\ndescription: 把新能源汽车产业链(整车/电池/四大材料/设备)的产销、装机、材料价格与公司财务指标,从本地 Wind 与本地数据库接入,落成「指标词典驱动的长表 scripts/run_all.py · 842e7777241e4430832f4ff0580f4bc3{"error": "文件不存在", "path": "scripts/run_all.py"}scripts/selftest.py · 842e7777241e4430832f4ff0580f4bc3{"error": "文件不存在", "path": "scripts/selftest.py"}run_all.py · 842e7777241e4430832f4ff0580f4bc3{"error": "文件不存在", "path": "run_all.py"}coverage.md · 842e7777241e4430832f4ff0580f4bc3{"path": "coverage.md", "bytes": 646, "text": "# 数据覆盖率(交付前核对)\n\n- 数据来源:主源1 本地 Wind 终端(WindPy:wsd/wss/edb),需本机装有 Wind 且已登录;主源2 本地数据库(sqlite / mysql / clickhouseinit_setup.py · 842e7777241e4430832f4ff0580f4bc3{"path": "init_setup.py", "bytes": 2767, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"init_setup.py —— 配置自检(客户第一次跑先执行)。\n\n用法:\n python3 idata/indicators.yaml · 842e7777241e4430832f4ff0580f4bc3{"error": "文件不存在", "path": "data/indicators.yaml"}README-先看我.md · 842e7777241e4430832f4ff0580f4bc3{"path": "README-先看我.md", "bytes": 1949, "text": "# 先看我 · 新能源车产业链库\n\n这包东西是给客户自用的:一个 skill 目录,解压即用,不需要我方任何凭据、不联网跑、没有后台服务。\n\n## 里面是什么\n\n| 文件 | 用途 |\n|---|---|\acceptance.md · 842e7777241e4430832f4ff0580f4bc3{"path": "acceptance.md", "bytes": 377, "text": "# 验收清单\n\n- [ ] 1) selftest 全程离线跑通(假源),验证状态打标与缺失不填0\n- [ ] 2) 任一指标被标 ok 必须带 asof 与 source\n- [ ] 3) 未接通通道的输出里必须lib/pipeline.py · 842e7777241e4430832f4ff0580f4bc3{"error": "文件不存在", "path": "lib/pipeline.py"}fetcher/fetch.py · 842e7777241e4430832f4ff0580f4bc3{"error": "文件不存在", "path": "fetcher/fetch.py"}lib/dataface.py · 842e7777241e4430832f4ff0580f4bc3{"error": "文件不存在", "path": "lib/dataface.py"}scripts/userstate_check.py · 842e7777241e4430832f4ff0580f4bc3{"path": "scripts/userstate_check.py", "bytes": 1597, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"userstate_check.py —— Phase 4.0 用户态四拔管(本机先manifest.json · 842e7777241e4430832f4ff0580f4bc3{"error": "文件不存在", "path": "manifest.json"}install.md · 842e7777241e4430832f4ff0580f4bc3{"path": "install.md", "bytes": 609, "text": "# 安装 · 新能源车产业链库\n\n三步,不需要网络、不需要装我方任何组件、不需要管理员权限。\n\n## 1. 解压\n\n解到一个只在客户自己手上的目录。⛔ 不要放共享盘、不要进 git 仓库。\n\n## 2. 填模板\lib/sources/local.py · 842e7777241e4430832f4ff0580f4bc3{"error": "文件不存在", "path": "lib/sources/local.py"}SHA256SUMS · 842e7777241e4430832f4ff0580f4bc3{"error": "文件不存在", "path": "SHA256SUMS"}842e7777241e4430832f4ff0580f4bc3 · [内网],output.tables,pipeline,test.doc{"ok": true, "written": ["lib/source_eastmoney.py", "scripts/fetch_reports.py", "lib/source_http.py", "lib/source_local.py", "lib/parse_pdf.py", "scripts/parse_lib/source_local.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/source_local.py", "bytes": 835, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"source_local —— 本地 PDF 库来源。\n\n在 raw/ 下按 代码/报告期.pdlib/pipeline.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/pipeline.py", "bytes": 5339, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"pipeline —— 取数 / 解析 / 抽取 / 汇总的执行编排。\n\n每个阶段都可单独跑,也可 rdata_contract.yaml · 842e7777241e4430832f4ff0580f4bc3{"path": "data_contract.yaml", "bytes": 2142, "text": "# 数据契约(模板态)——由 Skill Factory 按客户规格生成\n# 口径:每个数据集 × 每个字段都要写清「来源 / 单位 / 缺失怎么办」;⛔ 包内不写任何真实凭据。\n# YAML 提醒:占位符scripts/selftest.py · 842e7777241e4430832f4ff0580f4bc3{"path": "scripts/selftest.py", "bytes": 4448, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"selftest —— 不联网的全功能自测:抽取 + 汇总两张表。\n\n工厂在打包前会跑这个文件lib/runtime.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/runtime.py", "bytes": 3376, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"runtime.py —— 交付件运行底座:配置、网络、清单、日志。\n\n这一层只做通用能力,不含任何领域scripts/run_all.py · 842e7777241e4430832f4ff0580f4bc3{"path": "scripts/run_all.py", "bytes": 870, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"执行编排(断点续跑/失败清单/退出码) —— 框架生成的入口;实现见 lib/pipeline.py。842e7777241e4430832f4ff0580f4bc3 · data/indicators.yaml · # 指标词典 —— 知识库(KB)与数据库(DB)之间的桥梁
# 每一行 = 一个可{"ok": true, "written": ["data/indicators.yaml"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}# 客户机本地配置模板
# 复制成 config/config.json 再填。⛔ 真凭据不进包、不进日志、不进版本库。
# 全部 {{待填}} 由客户在自己机器上填。
{
"_who_fill{"ok": true, "written": ["config/config.example.json"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}{
"meta": {
"version": 2,
"updated": "2026-10-26",
"machine_source_of_truth": true,
{"ok": true, "written": ["data/indicators.json"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""adapter_wind —— 本地 Wind 终端取数(WindPy)。
设计要点:
1. Wi{"ok": true, "written": ["lib/adapter_wind.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""runtime —— 交付件运行底座:配置、路径、指标词典、日志。
约定:本层不做任何领域判断,只{"ok": true, "written": ["lib/runtime.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""adapter_db —— 本地数据库取数(sqlite / mysql / clickhouse){"ok": true, "written": ["lib/adapter_db.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""adapter_csv —— 客户手工导出 CSV 取数。
用于那些没有稳定接口的指标(电池装机、{"ok": true, "written": ["lib/adapter_csv.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""store —— 长表落库(sqlite)与状态覆盖规则。
主键:(indicator_id, e{"ok": true, "written": ["lib/store.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""derive —— 派生指标计算(渗透率、占比、分位等)。
硬规则:
- 缺任一分项,整条派生结果{"ok": true, "written": ["lib/derive.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""qa —— 质检:单位缺失、期间不连续、值域异常、未取到指标清单。
质检只报告,不改数。任何一条 {"ok": true, "written": ["lib/qa.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""wide —— 分层宽表 + 同形状 status 宽表 + 看板。
为什么必须有 status {"ok": true, "written": ["lib/wide.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""dashboard —— 生成一个离线可打开的结果页(内联 SVG,不依赖外网)。
页面分三块:
{"ok": true, "written": ["lib/dashboard.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""pipeline —— probe / fetch / derive / validate / wi{"ok": true, "written": ["lib/pipeline.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""run_all —— 统一入口。
用法:
python3 scripts/run_all.py{"ok": true, "written": ["scripts/run_all.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""run_all —— 统一入口。
用法:
python3 scripts/run_all.py{"ok": true, "written": ["scripts/run_all.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""selftest —— 全程离线全功能自测(不联网、不需要 Wind、不需要真库)。
验的是「防造{"ok": true, "written": ["scripts/selftest.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}842e7777241e4430832f4ff0580f4bc3{"ok": false, "missing": ["fetcher/README.md", "fetcher/fetch.py"], "compile_errors": [{"file": "config/config.example.json", "error": "JSON 解析失败:Expecting valulib/__init__.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/__init__.py", "bytes": 42, "text": "# 本件运行期只依赖标准库;Excel 读取才用 pandas/openpyxl。\n", "truncated": false}MODULES.md · 842e7777241e4430832f4ff0580f4bc3{"path": "MODULES.md", "bytes": 732, "text": "# 模块清单(框架生成)\n\n本件由模块组装,接口与实现分开;换数据源/换输出只改模块与配置,不改入口脚本。\n\n| 模块 | 作用 | 实现 | 入口 |\n|---|---|---|---|\n| `source.easlib/wide.py · 842e7777241e4430832f4ff0580f4bc3{"error": "文件不存在", "path": "lib/wide.py"}#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""wide —— 分层宽表 + 同形状 status 宽表 + 实体宽表。
为什么必须有 statu{"ok": true, "written": ["lib/wide.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}{
"_who_fills": "客户",
"_note": "复制成 config/config.json 再填。真凭据不进包、不进日志、不进版本库。Wind 需本机已安装终端并已登录;数据{"ok": true, "written": ["config/config.example.json"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""fetch —— 取数入口(薄封装)。
真正实现按 provider 分发在 lib/pipeli{"ok": true, "written": ["fetcher/fetch.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}# fetcher —— 取数层说明
这一层只做一件事:把指标词典里声明的每个指标,按它的 `provider` 分发到对应适配器,取回长表行。
## 分发规则
| provider | 适配器{"ok": true, "written": ["fetcher/README.md"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}842e7777241e4430832f4ff0580f4bc3{"ok": false, "missing": [], "compile_errors": [], "import_errors": [], "entry_errors": [{"file": "scripts/selftest.py", "error": " 原因:wind=ModuleNotFoundErro#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""selftest —— 全程离线全功能自测(不联网、不需要 Wind、不需要真库)。
验的是「防造{"ok": true, "written": ["scripts/selftest.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}842e7777241e4430832f4ff0580f4bc3{"ok": false, "missing": [], "compile_errors": [], "import_errors": [], "entry_errors": [{"file": "scripts/selftest.py", "error": "一个通道不可用被识别\n ok 每个不可用通道都带原#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""wide —— 分层宽表 + 同形状 status 宽表 + 实体宽表。
为什么必须有 statu{"ok": true, "written": ["lib/wide.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}842e7777241e4430832f4ff0580f4bc3{"ok": false, "missing": [], "compile_errors": [], "import_errors": [], "entry_errors": [{"file": "scripts/selftest.py", "error": "际 '')\n[8] 无通道 → 明确报错并退出码 2,不#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""selftest —— 全程离线全功能自测(不联网、不需要 Wind、不需要真库)。
验的是「防造{"ok": true, "written": ["scripts/selftest.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}842e7777241e4430832f4ff0580f4bc3{"ok": true, "missing": [], "compile_errors": [], "import_errors": [], "entry_errors": [], "functional_errors": [], "gates_verdict": "CLEAN", "failures": [], "f842e7777241e4430832f4ff0580f4bc3{"ok": false, "mode": "real", "steps": [{"step": "run_all", "ok": false, "output": "缺配置 config/config.json。下一步:cp config/config.example.json config/config.json car_market_total_cpca · [object Object] · 30{"source": "akshare", "func": "car_market_total_cpca", "total": 12, "columns": ["月份", "2025年", "2026年"], "count": 12, "rows": [{"月份": "1月", "2025年": 209.2576, "car_market_energy_cpca · 20{"error": "akshare_func_missing", "func": "car_market_energy_cpca", "note": "先查 AKShare 接口名;不要用网页抓取替代。"}car_market_cate_cpca · 10{"error": "akshare_call_failed", "func": "car_market_cate_cpca", "detail": "'2026年'", "note": "接口可能被上游反爬/参数不符;换接口或稍后再试,不要编数。"}car_market_new_energy_cpca · 10{"error": "akshare_func_missing", "func": "car_market_new_energy_cpca", "note": "先查 AKShare 接口名;不要用网页抓取替代。"}car_market_man_rank_cpca · 10{"source": "akshare", "func": "car_market_man_rank_cpca", "total": 10, "columns": ["厂商", "2025年9月", "2026年9月"], "count": 10, "rows": [{"厂商": "比亚迪汽车", "2025年9月":#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""adapter_csv —— 客户手工导出 CSV 取数(含公开数据底稿)。
用于没有稳定接口的指{"ok": true, "written": ["lib/adapter_csv.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}period,value,note
2025-01,209.2576,中汽协月度汽车总销量
2025-02,173.6659,中汽协月度汽车总销量
2025-03,248.5014,中汽协月度汽车总销{"ok": true, "written": ["data/raw/cpca_total_sales.csv"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}period,entity,value,note
2026-09,比亚迪汽车,45.5113,中汽协厂商销量排行
2026-09,吉利汽车,29.0100,中汽协厂商销量排行
2026-09,奇瑞汽车{"ok": true, "written": ["data/raw/cpca_oem_sales_202609.csv"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}{
"_who_fills": "客户",
"_note": "复制成 config/config.json 再填。真凭据不进包、不进日志、不进版本库。此份为跑通用示例:CSV 通道打开,指向{"ok": true, "written": ["config/config.json"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}{
"meta": {
"version": 3,
"updated": "2026-10-26",
"machine_source_of_truth": true,
{"ok": true, "written": ["data/indicators.json"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}842e7777241e4430832f4ff0580f4bc3{"ok": true, "mode": "real", "steps": [{"step": "run_all", "ok": true, "output": "g\",\n \"rows\": 0,\n \"reason\": \"找不到 CSV:battery_install.csv(请放到 providoutput/wide/D1_value.csv · 842e7777241e4430832f4ff0580f4bc3{"error": "文件不存在", "path": "output/wide/D1_value.csv"}output/qa_report.md · 842e7777241e4430832f4ff0580f4bc3{"error": "文件不存在", "path": "output/qa_report.md"}entity_id,code,name,segment,sw_industry
· data/entities.csv · 842e7777241e4430832f4ff0580f4bc3{"ok": true, "written": ["data/entities.csv"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}# 新能源车产业链 · 知识库索引
知识库(K)与数据库(D)是两层,靠**指标口径词典**打通(`data/indicators.json`)。
知识库回答「为什么、什么口径、谁说的」;数据库回答{"ok": true, "written": ["knowledge/README.md"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}# K5 指标口径词典
这是知识库与数据库的桥。**任何数字要进库,先在这里有口径条目。**
每条写清六件事:定义、单位、频率、口径来源、计算方式、已知坑。
---
## D1 产销
###{"ok": true, "written": ["knowledge/k5_caliber_dict.md"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}# K1 政策与法规
> 维护要求:每条必须有**发布日**与**生效日**,两者常不同;引用文件写文号。
> 没有原文出处的条目一律标「待核实」,不当事实使用。
## 已核实条目(客户需自行补原{"ok": true, "written": ["knowledge/k1_policy.md"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}# K2 技术路线
> 每条写「定义 + 现状 + 争议点」。只写优点会误导判断。
> 与技术路线相关的量价证据都在 D2(材料)与 D3(装机结构)。
## 正极:磷酸铁锂(LFP) vs 三元{"ok": true, "written": ["knowledge/k2_tech_route.md"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}# K3 公司与产能图谱
链接:实体主键用统一代码(A股 6 位 / 港股 5 位),与 `data/entities.csv` 的 `entity_id` 一致。
关系表建议字段:`from_en{"ok": true, "written": ["knowledge/k3_entity_map.md"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}(这一轮已停止,没有结果)
执行过程 · 9 步
10{"text": "「缺失不打 0」。\n", "path": "/app/quickanswer/var/agent_notes/2dff8b1a5f9b708d.md", "bytes": 1439}842e7777241e4430832f4ff0580f4bc3{"ok": false, "missing": [], "compile_errors": [], "import_errors": [], "entry_errors": [], "functional_errors": [], "gates_verdict": "DIRTY", "failures": ["cre842e7777241e4430832f4ff0580f4bc3 · config/config.json{"path": "config/config.json", "bytes": 1073, "text": "{\n \"_who_fills\": \"客户\",\n \"_note\": \"复制成 config/config.json 再填。真凭据不进包、不进日志、不进版本库。此份为跑通用示例:CSV 通道打842e7777241e4430832f4ff0580f4bc3 · install.md{"path": "install.md", "bytes": 609, "text": "# 安装 · 新能源车产业链库\n\n三步,不需要网络、不需要装我方任何组件、不需要管理员权限。\n\n## 1. 解压\n\n解到一个只在客户自己手上的目录。⛔ 不要放共享盘、不要进 git 仓库。\n\n## 2. 填模板\842e7777241e4430832f4ff0580f4bc3 · [object Object]{"ok": true, "written": ["config/config.json"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}842e7777241e4430832f4ff0580f4bc3{"ok": false, "missing": [], "compile_errors": [{"file": "config/config.json", "error": "JSON 解析失败:Expecting value: line 1 column 1 (char 0)"}], "import_errors"842e7777241e4430832f4ff0580f4bc3 · [object Object]{"ok": true, "written": ["config/config.json"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}(这一轮没有产出)
执行过程 · 15 步
10{"text": "「缺失不打 0」。\n", "path": "/app/quickanswer/var/agent_notes/2dff8b1a5f9b708d.md", "bytes": 1439}842e7777241e4430832f4ff0580f4bc3{"ok": false, "missing": [], "compile_errors": [], "import_errors": [], "entry_errors": [], "functional_errors": [], "gates_verdict": "DIRTY", "failures": ["cre842e7777241e4430832f4ff0580f4bc3 · config/config.json{"path": "config/config.json", "bytes": 1073, "text": "{\n \"_who_fills\": \"客户\",\n \"_note\": \"复制成 config/config.json 再填。真凭据不进包、不进日志、不进版本库。此份为跑通用示例:CSV 通道打842e7777241e4430832f4ff0580f4bc3 · install.md{"path": "install.md", "bytes": 609, "text": "# 安装 · 新能源车产业链库\n\n三步,不需要网络、不需要装我方任何组件、不需要管理员权限。\n\n## 1. 解压\n\n解到一个只在客户自己手上的目录。⛔ 不要放共享盘、不要进 git 仓库。\n\n## 2. 填模板\842e7777241e4430832f4ff0580f4bc3 · [object Object]{"ok": true, "written": ["config/config.json"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}842e7777241e4430832f4ff0580f4bc3{"ok": false, "missing": [], "compile_errors": [{"file": "config/config.json", "error": "JSON 解析失败:Expecting value: line 1 column 1 (char 0)"}], "import_errors"842e7777241e4430832f4ff0580f4bc3 · [object Object]{"ok": true, "written": ["config/config.json"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}config/config.json · 842e7777241e4430832f4ff0580f4bc3{"path": "config/config.json", "bytes": 4, "text": "None", "truncated": false}[object Object] · 842e7777241e4430832f4ff0580f4bc3{"error": "写文件失败:[Errno 17] File exists: '/app/quickanswer/var/factory_agent/842e7777241e4430832f4ff0580f4bc3/config/config.json'"}[object Object] · 842e7777241e4430832f4ff0580f4bc3{"ok": true, "written": ["config/config.json"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}842e7777241e4430832f4ff0580f4bc3{"ok": false, "missing": [], "compile_errors": [], "import_errors": [], "entry_errors": [], "functional_errors": [], "gates_verdict": "DIRTY", "failures": ["cre[object Object] · 842e7777241e4430832f4ff0580f4bc3{"ok": true, "written": ["__delete__"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}842e7777241e4430832f4ff0580f4bc3{"ok": false, "missing": [], "compile_errors": [], "import_errors": [], "entry_errors": [], "functional_errors": [], "gates_verdict": "DIRTY", "failures": ["cre模型调用失败:模型接口 400:{"error":{"message":"The request is invalid: the request was rejected by an internal MaaS component. Please check the request body, required fields, and request format.","type":"invalid_request_error","param":"","code":"400001"}}
继续
执行过程 · 14 步
20{"text": "用假源验证状态打标与「缺失不打 0」。\n", "path": "/app/quickanswer/var/agent_notes/2dff8b1a5f9b708d.md", "bytes": 1439}842e7777241e4430832f4ff0580f4bc3{"ok": false, "missing": [], "compile_errors": [], "import_errors": [], "entry_errors": [], "functional_errors": [], "gates_verdict": "DIRTY", "failures": ["cre842e7777241e4430832f4ff0580f4bc3 · config/config.json{"path": "config/config.json", "bytes": 195, "text": "{\n \"_readme\": \"这是占位说明文件,不含任何凭据。真实配置请在客户机自行创建 config/[内网].json,并以此为模板(cp config/config.example842e7777241e4430832f4ff0580f4bc3 · __delete__{"path": "__delete__", "bytes": 22, "text": "['config/config.json']", "truncated": false}lib/runtime.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/runtime.py", "bytes": 5157, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"runtime —— 交付件运行底座:配置、路径、指标词典、日志。\n\n约定:本层不做任何领域判断,只提供config/config.example.json · 842e7777241e4430832f4ff0580f4bc3{"path": "config/config.example.json", "bytes": 1025, "text": "{\n \"_who_fills\": \"客户\",\n \"_note\": \"复制成 config/config.json 再填。真凭据不进包、不进日志、不进版本库。Wind 需本机scripts/selftest.py · 842e7777241e4430832f4ff0580f4bc3{"path": "scripts/selftest.py", "bytes": 14813, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"selftest —— 全程离线全功能自测(不联网、不需要 Wind、不需要真库)。\n\n验的lib/pipeline.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/pipeline.py", "bytes": 8721, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"pipeline —— probe / fetch / derive / validate / wide 842e7777241e4430832f4ff0580f4bc3{"ok": false, "missing": [], "compile_errors": [], "import_errors": [], "entry_errors": [], "functional_errors": [], "gates_verdict": "DIRTY", "failures": ["crescripts/run_all.py · 842e7777241e4430832f4ff0580f4bc3{"path": "scripts/run_all.py", "bytes": 1407, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"run_all —— 统一入口。\n\n用法:\n python3 scripts/run_allinstall.md · 842e7777241e4430832f4ff0580f4bc3{"path": "install.md", "bytes": 609, "text": "# 安装 · 新能源车产业链库\n\n三步,不需要网络、不需要装我方任何组件、不需要管理员权限。\n\n## 1. 解压\n\n解到一个只在客户自己手上的目录。⛔ 不要放共享盘、不要进 git 仓库。\n\n## 2. 填模板\842e7777241e4430832f4ff0580f4bc3{"ok": false, "mode": "real", "steps": [{"step": "run_all", "ok": false, "output": "[FAIL] 没有可用取数通道。\n 原因:wind=config 里 provider.wind.enabled=false; db=co(这一轮已停止,没有结果)
给我下 skill
执行过程 · 70 步
842e7777241e4430832f4ff0580f4bc3{"ok": true, "missing": [], "compile_errors": [], "import_errors": [], "entry_errors": [], "functional_errors": [], "gates_verdict": "CLEAN", "failures": [], "f842e7777241e4430832f4ff0580f4bc3 · README-先看我.md{"path": "README-先看我.md", "bytes": 1949, "text": "# 先看我 · 新能源车产业链库\n\n这包东西是给客户自用的:一个 skill 目录,解压即用,不需要我方任何凭据、不联网跑、没有后台服务。\n\n## 里面是什么\n\n| 文件 | 用途 |\n|---|---|\842e7777241e4430832f4ff0580f4bc3 · RUN.json{"path": "RUN.json", "bytes": 85, "text": "{\n \"mode\": \"real\",\n \"at\": 1793009999.45762,\n \"steps\": [\n \"run_all\"\n ],\n \"ok\": true\n}", "truncatedRUN.json · 842e7777241e4430832f4ff0580f4bc3{"path": "RUN.json", "bytes": 85, "text": "{\n \"mode\": \"real\",\n \"at\": 1793009999.45762,\n \"steps\": [\n \"run_all\"\n ],\n \"ok\": true\n}", "truncatedSKILL.md · 842e7777241e4430832f4ff0580f4bc3{"path": "SKILL.md", "bytes": 1729, "text": "---\nname: nev-chain-kb-db\ndescription: 把新能源汽车产业链(整车/电池/四大材料/设备)的产销、装机、材料价格与公司财务指标,从本地 Wind 与本地数据库接入,落成「指标词典驱动的长表 842e7777241e4430832f4ff0580f4bc3{"ok": false, "mode": "real", "steps": [{"step": "run_all", "ok": false, "output": "缺配置。下一步:cp config/config.example.json config/[内网].json 后填掉全部 {{待填}} lib/adapter_wind.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/adapter_wind.py", "bytes": 6575, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"adapter_wind —— 本地 Wind 终端取数(WindPy)。\n\n设计要点:\n1config/config.example.json · 842e7777241e4430832f4ff0580f4bc3{"path": "config/config.example.json", "bytes": 1025, "text": "{\n \"_who_fills\": \"客户\",\n \"_note\": \"复制成 config/config.json 再填。真凭据不进包、不进日志、不进版本库。Wind 需本机data/indicators.yaml · 842e7777241e4430832f4ff0580f4bc3{"path": "data/indicators.yaml", "bytes": 6497, "text": "# 指标词典 —— 知识库(KB)与数据库(DB)之间的桥梁\n# 每一行 = 一个可取的指标。取数器只认这里,不认代码里的硬编码。\n#\n# provider 取值:\n# wind_wsd Wiknowledge/k5_caliber_dict.md · 842e7777241e4430832f4ff0580f4bc3{"path": "knowledge/k5_caliber_dict.md", "bytes": 2632, "text": "# K5 指标口径词典\n\n这是知识库与数据库的桥。**任何数字要进库,先在这里有口径条目。**\n\n每条写清六件事:定义、单位、频率、口径来源、计算方式、已知坑。\n\n---\n\nacceptance.md · 842e7777241e4430832f4ff0580f4bc3{"path": "acceptance.md", "bytes": 377, "text": "# 验收清单\n\n- [ ] 1) selftest 全程离线跑通(假源),验证状态打标与缺失不填0\n- [ ] 2) 任一指标被标 ok 必须带 asof 与 source\n- [ ] 3) 未接通通道的输出里必须lib/pipeline.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/pipeline.py", "bytes": 8721, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"pipeline —— probe / fetch / derive / validate / wide data/entities.csv · 842e7777241e4430832f4ff0580f4bc3{"path": "data/entities.csv", "bytes": 40, "text": "entity_id,code,name,segment,sw_industry\n", "truncated": false}lib/connectors/akshare.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/connectors/akshare.py", "bytes": 468, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"akshare.py —— 免费公开源连接器;函数名由 config 指定。\"\"\"lib/runtime.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/runtime.py", "bytes": 6029, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"runtime —— 交付件运行底座:配置、路径、指标词典、日志。\n\n约定:本层不做任何领域判断,只提供car_market_total_cpca · [object Object] · 30{"source": "akshare", "func": "car_market_total_cpca", "total": 12, "columns": ["月份", "2025年", "2026年"], "count": 12, "rows": [{"月份": "1月", "2025年": 209.2576, "car_market_man_rank_cpca · [object Object] · 15{"source": "akshare", "func": "car_market_man_rank_cpca", "total": 10, "columns": ["厂商", "2025年9月", "2026年9月"], "count": 10, "rows": [{"厂商": "比亚迪汽车", "2025年9月":car_market_cate_cpca · 20 · [object Object]{"error": "akshare_call_failed", "func": "car_market_cate_cpca", "detail": "'2026年'", "note": "接口可能被上游反爬/参数不符;换接口或稍后再试,不要编数。"}car_market_energy_cpca · 20 · [object Object]{"error": "akshare_func_missing", "func": "car_market_energy_cpca", "note": "先查 AKShare 接口名;不要用网页抓取替代。"}car_market_new_energy_cpca · 20 · [object Object]{"error": "akshare_func_missing", "func": "car_market_new_energy_cpca", "note": "先查 AKShare 接口名;不要用网页抓取替代。"}car_market_nev_cpca · 20 · [object Object]{"error": "akshare_func_missing", "func": "car_market_nev_cpca", "note": "先查 AKShare 接口名;不要用网页抓取替代。"}car_market_fuel_cpca · 20 · [object Object]{"source": "akshare", "func": "car_market_fuel_cpca", "total": 12, "columns": ["月份", "2025年", "2026年"], "count": 12, "rows": [{"月份": "1月", "2025年": 74.4462, "20car_energy_sale_cpca · 20 · [object Object]{"error": "akshare_func_missing", "func": "car_energy_sale_cpca", "note": "先查 AKShare 接口名;不要用网页抓取替代。"}knowledge/k3_entity_map.md · 842e7777241e4430832f4ff0580f4bc3{"path": "knowledge/k3_entity_map.md", "bytes": 1306, "text": "# K3 公司与产能图谱\n\n链接:实体主键用统一代码(A股 6 位 / 港股 5 位),与 `data/entities.csv` 的 `entity_id` 一致。\n关系表建议字段:`fdata_contract.yaml · 842e7777241e4430832f4ff0580f4bc3{"path": "data_contract.yaml", "bytes": 2142, "text": "# 数据契约(模板态)——由 Skill Factory 按客户规格生成\n# 口径:每个数据集 × 每个字段都要写清「来源 / 单位 / 缺失怎么办」;⛔ 包内不写任何真实凭据。\n# YAML 提醒:占位符6000{"source": "akshare-sina", "total": 5576, "count": 5576, "rows": [{"code": "bj920000", "name": "安徽凤凰", "price": 13.26, "pb": null, "pe_ttm": null, "div_yield": scripts/selftest.py · 842e7777241e4430832f4ff0580f4bc3{"path": "scripts/selftest.py", "bytes": 14813, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"selftest —— 全程离线全功能自测(不联网、不需要 Wind、不需要真库)。\n\n验的stock_info_a_code_name · 5 · [object Object]{"source": "akshare", "func": "stock_info_a_code_name", "total": 5577, "columns": ["code", "name"], "count": 5, "rows": [{"code": "000001", "name": "平安银行"}, {"clib/adapter_csv.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/adapter_csv.py", "bytes": 2852, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"adapter_csv —— 客户手工导出 CSV 取数(含公开数据底稿)。\n\n用于没有稳定接口lib/derive.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/derive.py", "bytes": 4176, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"derive —— 派生指标计算(渗透率、占比、分位等)。\n\n硬规则:\n- 缺任一分项,整条派生结果判 data/indicators.json · 842e7777241e4430832f4ff0580f4bc3{"path": "data/indicators.json", "bytes": 6292, "text": "{\n \"meta\": {\n \"version\": 3,\n \"updated\": \"2026-10-26\",\n \"machine_source_of_truth\StockValueAnalysis · 比亚迪 · 2{"ok": true, "api_name": "StockValueAnalysis", "param_name": "stockObject", "keyword": "比亚迪", "candidates": [{"caption": "比亚迪", "code": "13527", "ref_code": "00StockValueAnalysis · 长安汽车 · 2{"ok": true, "api_name": "StockValueAnalysis", "param_name": "stockObject", "keyword": "长安汽车", "candidates": [{"caption": "长安汽车", "code": "311", "ref_code": "00StockValueAnalysis · 长城汽车 · 2{"ok": true, "api_name": "StockValueAnalysis", "param_name": "stockObject", "keyword": "长城汽车", "candidates": [{"caption": "长城汽车", "code": "7389", "ref_code": "6StockValueAnalysis · 宁德时代 · 2{"ok": true, "api_name": "StockValueAnalysis", "param_name": "stockObject", "keyword": "宁德时代", "candidates": [{"caption": "宁德时代", "code": "152211", "ref_code": StockValueAnalysis · 上汽集团 · 1{"ok": true, "api_name": "StockValueAnalysis", "param_name": "stockObject", "keyword": "上汽集团", "candidates": [{"caption": "上汽集团", "code": "1229", "ref_code": "6StockValueAnalysis · 广汽集团 · 1{"ok": true, "api_name": "StockValueAnalysis", "param_name": "stockObject", "keyword": "广汽集团", "candidates": [{"caption": "广汽集团", "code": "16915", "ref_code": "scripts/run_all.py · 842e7777241e4430832f4ff0580f4bc3{"path": "scripts/run_all.py", "bytes": 1407, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"run_all —— 统一入口。\n\n用法:\n python3 scripts/run_all842e7777241e4430832f4ff0580f4bc3 · [object Object]{"ok": true, "written": ["data/raw/cpca_total_sales.csv", "data/raw/cpca_fuel_sales.csv", "data/raw/cpca_oem_sales_202609.csv"], "errors": [], "remaining": [], lib/pipeline.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/pipeline.py", "bytes": 8721, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"pipeline —— probe / fetch / derive / validate / wide data/indicators.json · 842e7777241e4430832f4ff0580f4bc3{"path": "data/indicators.json", "bytes": 6292, "text": "{\n \"meta\": {\n \"version\": 3,\n \"updated\": \"2026-10-26\",\n \"machine_source_of_truth\842e7777241e4430832f4ff0580f4bc3 · lib/derive.py · #!/usr/bin/env python3
# -*- coding: utf-8 -*-
""{"ok": true, "written": ["lib/derive.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""adapter_csv —— 客户手工导出 CSV 取数(含包内自带公开底稿)。
用于没有稳定接口{"ok": true, "written": ["lib/adapter_csv.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}lib/pipeline.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/pipeline.py", "bytes": 8721, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"pipeline —— probe / fetch / derive / validate / wide lib/store.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/store.py", "bytes": 6364, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"store —— 长表落库(sqlite)与状态覆盖规则。\n\n主键:(indicator_id, entitlib/wide.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/wide.py", "bytes": 3565, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"wide —— 分层宽表 + 同形状 status 宽表 + 实体宽表。\n\n为什么必须有 status 宽表:lib/pipeline.py · 842e7777241e4430832f4ff0580f4bc3{"path": "lib/pipeline.py", "bytes": 8721, "text": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"pipeline —— probe / fetch / derive / validate / wide {
"meta": {
"version": 4,
"updated": "2026-10-26",
"machine_source_of_truth": true,
{"ok": true, "written": ["data/indicators.json"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}842e7777241e4430832f4ff0580f4bc3 · [object Object]{"ok": true, "written": ["data/entities.csv", "data/oem_entity_map.csv"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"842e7777241e4430832f4ff0580f4bc3 · [object Object]{"ok": true, "written": ["config/config.example.json", "config/thresholds.example.json"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调842e7777241e4430832f4ff0580f4bc3{"ok": true, "missing": [], "compile_errors": [], "import_errors": [], "entry_errors": [], "functional_errors": [], "gates_verdict": "CLEAN", "failures": [], "f#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""runtime —— 交付件运行底座:配置、路径、指标词典、日志。
约定:本层不做任何领域判断,只{"ok": true, "written": ["lib/runtime.py"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}842e7777241e4430832f4ff0580f4bc3{"ok": true, "mode": "real", "steps": [{"step": "run_all", "ok": true, "output": "},\n {\n \"indicator_id\": \"D3.BATTERY_INSTALL_GWH_M\",\n \"status\": \"output/wide/D1_value.csv · 842e7777241e4430832f4ff0580f4bc3{"error": "文件不存在", "path": "output/wide/D1_value.csv"}842e7777241e4430832f4ff0580f4bc3{"ok": true, "missing": [], "compile_errors": [], "import_errors": [], "entry_errors": [], "functional_errors": [], "gates_verdict": "CLEAN", "failures": [], "foutput/qa_report.md · 842e7777241e4430832f4ff0580f4bc3{"error": "文件不存在", "path": "output/qa_report.md"}# 验收清单
十条,逐条可勾。第 1–5 条不需要任何凭据,解压即可验;第 6–10 条在你自己机器上验。
## 开箱即可验(不联网、不需要 Wind)
- [ ] **1) 自测通过**:`p{"ok": true, "written": ["acceptance.md"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}---
name: nev-chain-kb-db
description: 新能源汽车产业链知识库+数据库:以指标词典驱动,从本地 Wind(WindPy wsd/edb/wss)、本地数据库(sq{"ok": true, "written": ["SKILL.md"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}# 先看我 · 新能源车产业链库(知识库 + 数据库)
这是一件 skill:解压即用,不联网也能跑通一部分真数据,不需要我方任何凭据,没有后台服务。
## 一句话
指标词典驱动取数 → 落 s{"ok": true, "written": ["README-先看我.md"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}842e7777241e4430832f4ff0580f4bc3{"ok": true, "mode": "real", "steps": [{"step": "run_all", "ok": true, "output": "},\n {\n \"indicator_id\": \"D3.BATTERY_INSTALL_GWH_M\",\n \"status\": \"# 指标词典(阅读版)—— 机器可读源是 data/indicators.json,改口径只改 json
# 本文件与 json 保持一致,只为方便阅读;两处冲突时以 json 为准。
#
# pro{"ok": true, "written": ["data/indicators.yaml"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}# K3 公司与产能图谱
链接:实体主键用统一代码(A股 6 位 / 港股 5 位),与 `data/entities.csv` 的 `entity_id` 一致。
关系表建议字段:`from_en{"ok": true, "written": ["knowledge/k3_entity_map.md"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}# K5 指标口径词典
这是知识库与数据库的桥。**任何数字要进库,先在这里有口径条目。**
每条写清六件事:定义、单位、频率、口径来源、计算方式、已知坑。
---
## D1 产销
###{"ok": true, "written": ["knowledge/k5_caliber_dict.md"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}# 数据契约 —— 逐数据集 × 逐字段的取数口径与缺失处理
# 口径:每个字段写清「来源 / 单位 / 缺失怎么办」;⛔ 包内不写任何真实凭据。
# YAML 提醒:占位符一律写在引号里(裸花括号会{"ok": true, "written": ["data_contract.yaml"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}# 安装(三步)
## 0. 环境
- Python 3.8+
- 包内只用标准库(sqlite3 / csv / json / urllib),**不需要 pip install 任何东西**就{"ok": true, "written": ["install.md"], "errors": [], "remaining": [], "remaining_count": 0, "next": "必写文件已齐,调 factory_check。"}842e7777241e4430832f4ff0580f4bc3{"ok": true, "mode": "real", "steps": [{"step": "run_all", "ok": true, "output": "},\n {\n \"indicator_id\": \"D3.BATTERY_INSTALL_GWH_M\",\n \"status\": \"842e7777241e4430832f4ff0580f4bc3{"ok": true, "missing": [], "compile_errors": [], "import_errors": [], "entry_errors": [], "functional_errors": [], "gates_verdict": "CLEAN", "failures": [], "fmanifest.json · 842e7777241e4430832f4ff0580f4bc3{"error": "文件不存在", "path": "manifest.json"}842e7777241e4430832f4ff0580f4bc3{"ok": true, "code": "5df0bfc00a735d4e", "zip_name": "5df0bfc00a735d4e.zip", "bytes": 108294, "sha256": "6392a2ea8cdeb66f3c651286a7cd7ace1df7393c35930acf05a3484skill 已经打包完成,下载和说明页在这里:
- 下载:[[attach:1]]
- 说明页:[[attach:2]]
(73 个文件,108KB,sha256 6392a2ea…df14a,14 天有效)
实测读数如下,是刚跑出来的,不是估计。scripts/selftest.py 退出码 0;scripts/run_all.py 用真实数据跑通。
- 24 条指标:ok=3 / missing=2 / pending=19 / error=0
- D1 产销宽表 21 期,实体宽表 20 行
- 已取到真数:2026-09 汽车总销量 259.0388 万辆、比亚迪 45.5113 万辆、吉利 29.01、奇瑞 28.1738
- 没取到(标 pending,不是 0):新能源销量、渗透率、电池装机、材料价格、公司财务、市场指数
解压后跑三步:
python3 scripts/selftest.py # 防造假主链,不联网
python3 scripts/run_all.py # 用包内中汽协底稿直接出真数据
python3 scripts/run_all.py --probe # 接你 Wind 前先探针,逐指标报通没通第 2 步不需要任何配置:包里自带 data/raw/ 中汽协公开底稿,csv 通道默认指过去。
接入你本地 Wind 和数据库时,只改两个文件:
config/[内网].json(由config.example.json复制):开 wind、填 db 只读 dsn、指 csv 目录data/indicators.json:把 D2/D4/D5 里的{{待填}}换成你自己的 Wind 代码或表名
改完先跑 --probe,通了的才变 ok;没通的会写明原因(code/field 仍为待填、No module named WindPy、wsd 返回空序列),进 output/qa_report.md。
这版比上一版补了三处。上一版包壳完整但里面是空的,我核实后修了:
knowledge里写着“已接data/raw/底稿”,但包里根本没这些文件,是空引用;现已补入真实底稿(总销量、燃油、车企销量)data/entities.csv只有表头;已填入聚源召回核过的 6 家代码(比亚迪 002594.SZ、长安 000625.SZ、长城 601633.SH、上汽 600104.SH、广汽 601238.SH、宁德 300750.SZ)- 配置模板不会被自动采用,导致解压即报“缺配置”;已改为 example 兜底,现在解压就能跑通
另外新增 data/oem_entity_map.csv:把中汽协厂商名映射到上市主体,并标明状态。上汽乘用车是 group_only、上汽通用五菱是 joint_venture、一汽大众与特斯拉中国是 unmapped、吉利/奇瑞/零跑是 pending_listing,这些情况都没有猜代码。
边界:
- 新能源销量和渗透率在本包里仍是 pending。我没有用「总销量减燃油」去推算,因为中汽协总量含商用车,而燃油分项口径没有核实,相减结果不是新能源口径。接上 Wind EDB 代码后会自动变为 ok。
- 电池装机需要你自己放
battery_install.csv/lfg_install.csv到底稿目录。 - Wind 通道的真实取数我无法在这台机器上验证;我测试的是它从“未安装”状态正确降级为 pending,而不是假装成功。你本地跑
--probe才能确认。 - 不做买卖建议、不预测销量。
- 看板(本次真跑读数):[[attach:0]]
补记(2026-10-30):这份包当时少带了包内 data/raw/ 的三份中汽协底稿,客户解压后 24 个指标全是 pending、看板一片空白;现已补回并重打包(还用同一下载短码),另外 scripts/selftest.py 不再重写 sample_output/dashboard.html,跑完自测 sha256sum -c SHA256SUMS 也不会报不一致。现在这份:76 个文件、108.3 KB、sha256 5e11c243…19f6e2;解压后 python3 scripts/run_all.py 实测 ok=3 / missing=2 / pending=19 / error=0,宽表 21 期、车企 20 行,上面的看板就是这次跑出来的。
想得到同样的一段对话?
打开快答,直接问你的问题——答案带出处、日期与边界,需要成品时当场打包。
打开快答 · 问一句