关于 python-api
用于发现已安装 Python 包公共 API 并保存版本相关结果的技能。它要求检查实际环境,避免依赖记忆中的符号或签名。
主要功能
- 01检查已安装包的 API
- 02按问题类型选择查询方式
- 03按包版本缓存结果
- 04通过临时文件运行 Python 探测
- 05查阅指定版本的文档
适用场景
- 01编码前核实函数签名
- 02探索包模块的公共 API
- 03调查 API 在不同条件下的行为
- 04复用缓存中的 API 查询结果
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ probabl-ai/ skills --skill python-api安装后在 Claude Code 中输入/python-api确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
evals/evals.jsonreferences/authoring_protocol.mdbootstrap_cache.mdnamed_traps.mdpre_mark_alignment.mdprobe_templates.mdshape1b_lsp_setup.mdskrub_interop.mdstack_orientation.md详细介绍
python-api
探索任意已安装 Python 包的公共 API,缓存有用信息,绝不相信训练数据中的记忆。
三条持久规则:
- 对照已安装版本查询,绝不依赖记忆。 认得不等于查过。你记得的符号可能已在当前版本中重命名、重新签名或弃用。
- 缓存到
scratch/api/<lib>/<version>/<topic>.md,这样下一个 Agent 就不必重复探查。 - 打包的
references/≠ 工作区缓存。 打包的参考资料是持久的工作流模式;缓存文件则是按版本提取的内容。
本轮约定(包括无工具评估)
清单框只能是 [x]、[ ] 或 [n/a]。绝不能使用 [~]、
“pending” 或 “deferred”。
缓存命中绝不算 BLOCKED。 如果工作区状态已列出磁盘上的 scratch/api/<lib>/<version>/<topic>.md,即使本轮无法运行 Read,也将 Cache file lands on disk 标记为
[n/a] — cache hit, file already on disk。下一步:写明
Read scratch/api/<lib>/<version>/<topic>.md。不要输出 BLOCKED。工作区状态中给出的版本视为已解析。
缺少工具时,仍要写出计划。 写明 Shape、探查路径(scratch/<ts>_….py——版本检查必须严格使用 scratch/<ts>_version_<pkg>.py)、缓存目标,以及(Shape 3)带版本号的 WebSearch 查询。BLOCKED 的含义是:不要输出查到的事实(签名、参数列表、返回类型、导入、调用)。这不意味着可以省略这些路径的名称。
不要预先给出记忆中的答案。 不要根据训练数据记忆写出返回类型或签名。只有探查完成或缓存文件存在后,才能引用这些内容。探查完成后,回复中的用法必须与查到的签名一致。
所有 Python 代码都必须通过 scratch 文件运行。 禁止使用内联 python -c,包括单行 __version__ 检查。拒绝 -c 形式;改为提出 scratch/<ts>_version_<pkg>.py(或 Shape 1 探查)。这种拒绝不算 BLOCKED。
有 write_file / run_python 时,必须在本轮运行探查。 不要只停留在代码块中的 pixi run python scratch/… 操作指令。先写入 scratch 文件,再运行,然后引用查到的内容。仅当缺少这些工具时,才适用 BLOCKED / 仅列计划。
列出的陷阱只是线索,不是查询结果。 此技能中的重命名(tabular_learner → tabular_pipeline)不能确认安装情况。仍须先提出 Shape 1(或 Shape 2 dir),才能确认替代项。不要仅凭陷阱表断言 ImportError。条目名称可以在说明文字中体现栈的方向;提出探查方案之前,不要输出调用。
后续步骤指引
| 来此目的… | 查询后下一步… |
|---|---|
| 即将编写的代码需要符号签名 | → 继续调用方的流程(例如 build-ml-pipeline § 下一步) |
| “哪个库/哪个入口?” | → 继续使用选定的符号;缓存已写入 |
| 引导轮次(首个工作区) | → 写入所需的最少缓存;参见 references/bootstrap_cache.md |
| 故障调试(KeyError / AttributeError) | → 参见停止条件“查询失败 ≠ 构件缺失” |
问题属于哪种类型?→ 形状
先根据问题类型选择形状,再选择工具。形状选错会生成错误格式的缓存文件,还会浪费一次交互。
| 用户的问题类似于…… | 形状 |
|---|---|
“scratch/api/<lib>/<version>/ 中有什么?”(始终先检查) | 0 缓存命中 |
| “<task> 应使用哪个入口点?” | 先看下面的技术栈概览,再用形状 1 / 1b 确认 |
| “X 的签名是什么?”/“X 接受哪些参数?”/“返回类型是什么?” | 1b LSP 悬停(快速)→ 如果悬停信息稀疏,则转到 1 |
| “X 有什么作用?”/“X 的完整文档字符串是什么?”(需要参数 / 示例 / 另请参阅) | 1 符号卡片(pydoc) |
| “模块 Y 中有什么?”(开放式探索) | 2 模块概览 |
“在整个环境中搜索与 foo* 匹配的符号” | 2b LSP 工作区符号 |
| “X 的工作原理是什么?”/“A 和 B 我该用哪个?” | 3 叙述性文档 |
“当 <arg> 为 <value> 时,X 会返回什么?” | 3 叙述性文档 |
| “……的推荐模式是什么?” | 3 叙述性文档 |
问题涉及参数的某个条件时,形状 3 才是正确答案。 help() 包含 Returns 部分,但通常不会逐一列出不同参数值对应的分派行为——这些内容要查阅叙述性文档。
形状 1 不能解决形状 3 的问题。 本轮探查可能会在待处理缓存中记录返回类型的联合(EstimatorReport | CrossValidationReport | …)。但不能据此断定“当 <arg> 为 <value> 时,X 会返回什么”——无论依据是 pydoc,还是从文档字符串推断出的分派表。在通过版本固定的 WebFetch 生成 scratch/api/<lib>/<version>/<topic>.md 之前,该分派行为都处于受阻状态。本轮不要使用 WebSearch → 制定计划并停止;不要用形状 1 来敲定答案。
形状 1b 与形状 1 的区别。 Pyright 悬停会给出类型签名(比 inspect.signature 推断出的返回类型更丰富)以及文档字符串的第一段——速度快,且无需执行 Python。Pydoc 会提供包含所有部分的完整文档字符串——速度较慢,但更权威。默认升级路径:对于“签名是什么”这类问题,先用 1b;如果悬停结果为空或只有一句话,则转到 1。
形状 1b / 2b 的前提条件(LSP 形状)。 opencode LSP 中提供 Pyright,且 pyrightconfig.json 指向 lsp 环境。如果缺少其中任一项,则无法使用 LSP 形状——直接使用形状 1 / 2。JOURNAL.md 中 Workspace decisions 的 Status 下,agent feature: installed 这一行是前提条件;参见 python-env-manager § Agent feature。
停止条件——执行任何查询前请先阅读
- 不得凭记忆使用符号。 每个函数、类、方法和参数都必须来自本轮查询:
inspect.signature、scratch/api/<lib>/<version>/文件,或新执行的 WebFetch。仅凭熟悉程度不算。固定命名案例——完整列表见references/named_traps.md:- skrub:在 0.7+ 中,
tabular_learner→tabular_pipeline。 - skrub:在 0.9+ 中,
mark_as_y(target_column)的签名已移除位置参数;应在标记前使用.skb.select("...")。 - skore:
Project.get(...)按 id 查询,而不是面向用户的key;先通过project.summarize()枚举。然后停止。不要提及experiments/NN_*.py是恢复途径,哪怕是假设性的。
- skrub:在 0.7+ 中,
- 绝不捏造探测结果。 如果探测尚未执行,
Signature/help()部分必须留空或标记为<pending probe execution>。Shape 3 也适用同一规则:不得凭记忆转述文档;缓存文件必须保存逐字摘录。 - 捆绑的
references/绝不能作为签名或答案来源。 它们承载的是持久的工作流模式,不是已安装版本的 API 表面。不得从中引用、转述或“粗略勾勒”签名、参数列表或返回类型。这一规则同样适用于答案文本和缓存文件。 - 加上保留措辞并不能让内容变得合规。 “请把它当作线索,而不是签名”、“⚠️ 未验证”、“不要把它粘贴到脚本中”——读者复制的是代码块,而不是警告。输出未经验证的签名或返回类型就是违规;免责声明不能撤销违规。如果本轮未执行查询,答案部分必须保持为
<pending probe execution>,并在本轮报告 BLOCKED(见 § 阻塞的查询)。 - 拒绝某个来源,并不意味着可以引用它。 解释为何记忆或捆绑的参考资料不合格时,只需指出来源并就此打住——“捆绑的概览草图”、“训练记忆”。绝不要复述其中的片段,即使是作为拒绝引用的示例也不行。拒绝说明中的参数列表仍然是可复制的参数列表。
- 先确保版本正确。 在任何查询之前解析
<pkg>.__version__。版本子目录是缓存新鲜度的判定依据。 - 先检查缓存,再执行新获取。 在 Shape 1 / 2 / 3 之前,先列出
scratch/api/<lib>/<version>/。 - 查询失败 ≠ 产物缺失。 在注册表风格的 API(
project.get(key)、getattr(obj, name)、dict[key])中出现KeyError/AttributeError,几乎总是查询方式有误(id 与 key 混淆、访问器错误),而不是产物缺失。具名示例:skore.Project.get(...)按 id 查询,而非面向用户的key;project.summarize()会枚举(key, id)对。绝不要通过重新创建产物来替代查询——那会产生重复行。 - 所有 Python 执行都必须写入
scratch/<YYYY-MM-DD>_<HHMMSS>_<short>.py。无一例外。 禁止使用任何 Python 命令——包括pixi run python -c、python -c、heredoc 风格的python << 'EOF',以及任何内联 Python,无论代码多短。使用write_file写入文件,然后在本轮使用run_python执行。若这些工具可用,不能只留下代码围栏脚本和pixi run python scratch/<ts>_<short>.py——那只是操作步骤,不是查询。版本检查、导入测试、签名查询、模块 API 表面转储、文档字符串提取等都适用此规则。如果发现自己正在输入python -c——立即停止,改为写入文件并运行。 - 内联执行
inspect.signature/dir(...)/pydoc.render_doc/help(...)不算咨询 python-api。 这些正是此技能封装的 API。通过python -c运行它们,不满足同级技能中“已咨询 python-api”的预检要求。交付物必须是本轮写入的scratch/api/<lib>/<version>/<topic>.md文件。 - 使用
pydoc.render_doc,而非__doc__。 对于属性、描述符、装饰后的可调用对象和访问器,__doc__可能为空或产生误导——这些正是缓存需要加以区分的情况。 - 将叙述性发现写入缓存。 读取 WebFetch 结果后丢弃是禁止的。必须将结果写入
scratch/api/<lib>/<version>/<topic>.md,并将来源 URL 放在首行。 - 没有写入缓存的探测不算完成的查询。 探测记录的是调查过程;缓存文件记录的是结论。若本轮结束时磁盘上没有
scratch/api/<lib>/<version>/<topic>.md,则查询尚未完成。
受阻的查找
如果本轮无法执行必需的查找——没有可用工具、探查无法运行、获取内容时无法连接——请输出:
BLOCKED: <symbol> needs a python-api lookup that cannot run this
turn (<why>). Run <probe or fetch> first.
然后说明计划(Shape、scratch/<ts>_….py、缓存路径、WebSearch 查询)。到此为止:不要提供签名、参数列表、返回类型、导入或调用——即使是带保留语气的说法,或“获取内容后将确认什么”,也不行。无法运行的查找不代表可以从其他来源作答。
[~]、“待处理”、“推迟到实际运行的轮次”都不是有效的方框状态。仍然适用的行应保持 [ ],直到有证据为止。
n/a 是有效的方框状态;BLOCKED 不能代替它。 本轮不适用的行应标记为 [n/a] — <原因>。最常见的情况是缓存命中:主题文件已在磁盘上,因此无需运行探查,也无需获取内容;该行应标记为 n/a,而不是未勾选。不要把不适用的行重新定义为失败的行(“本轮要读取缓存文件”→未勾选→BLOCKED),以便将本轮报告为受阻。缓存命中表示查找已满足。
缺少输入时才标记受阻,而不是对已经能完成的工作如此处理。 BLOCKED 用于无法访问的工具或尚未掌握的事实。如果本轮已提供所需内容——缓存命中、提示词中粘贴的内容、工作区描述中提供的状态——你就没有受阻;如果你本可以作答,却在答案前加上 BLOCKED 横幅,那是拒绝作答,而不是保护措施。
禁止走捷径
| 捷径 | 错误原因 |
|---|---|
| 根据训练数据认出符号名称 → 写出调用 | 记忆对应的版本可能随意变动;安装的版本可能已重命名该符号或更改其签名 |
| 探查已运行,答案已显示在屏幕上 → 不写入缓存就结束 | 探查是调查;缓存是结论。下个会话会重复探查 |
已存在随包附带的 references/X.md → 将其视为缓存 | 参考资料是工作流模式;缓存是按版本提取的内容。两者都必须存在 |
从 references/X.md 中引用签名,并用“仅供参考”来保留余地 | 这与依赖记忆有同样的问题,只是换了来源。参考资料不对应已安装的版本;保留余地的说法也无法阻止读者照抄 |
| 缺少版本子目录 → 写入最新的已有目录 | 子目录是新鲜度标识。创建正确的目录 |
多个符号 → 在一条内联 python -c 命令中串联多个 inspect.signature | 所有 Python 执行都必须写入 scratch——不允许内联 -c。多个符号 → 一个 scratch 文件 → 一个汇总缓存文件 |
为快速检查版本而使用 python -c "import <pkg>; print(<pkg>.__version__)" | 规则无条件适用。长度不是标准,可追溯性才是。版本检查应写入 scratch/<ts>_version_<pkg>.py |
主题缓存已存在;运行内联 inspect.signature(X) 重新确认某个参数名 | 不存在内联单签名的例外。每项 Shape 1 查找都必须使用探查模板 |
使用 python -c "...inspect.signature...",而不是编写 Shape 1 探查脚本 | 探查记录调查过程;缓存记录结论。下个会话需要的是文件,而不是你的转录内容 |
| 用户粘贴了文档 URL → 将其视为答案 | 查找仍需通过 inspect 或 WebFetch 完成,并写入缓存。URL 只是线索 |
使用 __doc__ 而不是 pydoc.render_doc | 许多访问器的 __doc__ 为空;缓存文件必须可以独立阅读 |
每个触发此技能的轮次的第一步
- 确定版本。 创建
scratch/<YYYY-MM-DD>_<HHMMSS>_version_<pkg>.py,内容为import <pkg>; print(<pkg>.__version__),通过pixi run python scratch/<ts>_version_<pkg>.py运行。禁止使用内联python -c。 - 列出缓存:
ls scratch/api/<lib>/<version>/。 - 缓存命中? 读取匹配的文件。完成。
- 缓存未命中? 对问题分类(见上表)→ 运行 Shape 1 / 1b / 2 / 2b / 3。
- 输出预检清单,并标记每个方框。
预检——执行任何查找前输出
Pre-flight (python-api):
- [ ] Package version resolved this turn: <lib> <version>
Evidence: Write scratch/<ts>_version_<lib>.py (this turn) +
`pixi run python scratch/<ts>_version_<lib>.py` output.
**Inline `python -c "..."` is NOT evidence.**
- [ ] Cache listed this turn (Shape 0): `ls scratch/api/<lib>/<version>/`
Evidence: tool output (paste the listing, even if empty)
- [ ] Question shape classified: signature | module surface | narrative
Evidence: name the shape + one phrase from the question
- [ ] Lookup decision: cache hit (Read <file>) | Shape 1 | 1b | 2 | 2b | 3
Evidence: name the file Read, probe script written, LSP
operation requested, or URL fetched
- [ ] (Shape 1b / 2b only) LSP preconditions confirmed:
`agent feature: installed` in JOURNAL.md AND
`pyrightconfig.json` at project root pointing at the `lsp` env
Evidence: Read journal/JOURNAL.md + Read pyrightconfig.json
(this turn) | "n/a — not an LSP shape"
- [ ] Cache file lands on disk before turn end
Evidence: Write scratch/api/<lib>/<version>/<topic>.md (this turn)
| "n/a — cache hit, already on disk + Read this turn"
| "n/a — Shape 2b ad-hoc discovery"
**Inline `inspect.signature(...)` / `dir(...)` / `pydoc.render_doc(...)`
WITHOUT a corresponding cache file is NOT evidence. Re-do as Shape 1.**
- [ ] If Shape 1 / 1b: Usage section filled in (Call / Don't call / Trap / Returns)
Evidence: Edit scratch/api/<lib>/<version>/<topic>.md (this turn)
| "n/a — cache hit / Shape 2 / 2b / 3"
- [ ] Pre-flight re-emitted with evidence before final message.
Evidence: this checklist appears in the end-of-turn summary.
四种形态
Shape 0 — 缓存命中
ls scratch/api/<lib>/<version>/ 2>/dev/null
存在主题匹配的文件 → Read 该文件。第一行包含源 URL 或 inspect: 引用;如果文件看起来可疑,请根据实时文档重新验证。未命中缓存 → Shape 1 / 2 / 3。
Shape 1 — 符号卡片(pydoc → 缓存文件)
一个探测脚本完成两件事:自省符号,并在单次执行中写入缓存文件。后续只需用小幅 Edit 补全 Usage 条目(Call / Don't call / Trap / Returns)。
探测模板:→ references/probe_templates.md § Shape 1。
合并多个符号。 多个共享主题的符号(例如,project_local 下的 Project.put / Project.get / Project.summarize)→ 在探测脚本中遍历一组带点号的路径,并将各部分合并到一个 <topic>.md 中。每个 主题 一个主题文件,而非每个符号一个。 这三个 Project 方法应放在同一个文件 scratch/api/skore/<ver>/project_local.md(或 project.md)中。绝不能分别放在 put.md / get.md / summarize.md 中。
单签名检查也不例外。 即使已有缓存,且你只想重新确认一个参数,也要运行新的探测(或 Read 现有缓存)。
Shape 1b — LSP 悬停(不执行 Python)
Pyright 通过 opencode LSP 返回某个符号在 file:line:character 位置的悬停信息(类型签名 + 文档字符串的第一段)。当本次会话已确认 Shape 1b 可用时(见下方 Step 0),对于“签名是什么”这类问题,应优先使用 Shape 1b;否则回退到 Shape 1,或在悬停输出信息稀少时回退。
Step 0 — 探测 LSP 是否可用(必需,每个会话执行一次)
opencode LSP 服务在会话启动时读取一次 pyrightconfig.json。会话中途的编辑不会触发重新加载。如果 LSP 对每个外部库都返回 (import) <name>: Unknown,说明配置是在 LSP 初始化后写入的 — 本次会话无法使用 Shape 1b。此决定在会话期间保持不变:直到下一个 opencode 会话,所有签名问题都使用 Shape 1。
探测步骤 + 结果解读表 + 所有注意事项
(会话启动顺序、conda 风格的环境、字符偏移、
被排除在 scratch 之外的路径、C 扩展类型):
→ references/shape1b_lsp_setup.md。
确认可用后
- 编写探测文件(放在
tests/或src/<pkg>/下 —scratch/已从 pyright 的分析中排除)。模板: →references/probe_templates.md§ Shape 1b。 - 调用
lsp(operation="hover", filePath=..., line=..., character=...)。 - 将结果缓存到
scratch/api/<lib>/<version>/<topic>.md,并添加Source: lsp-hover: <lib>.<dotted> @ <version>和## LSP hover节。 - 如果悬停结果为空或只有一行,则升级到 Shape 1。
Shape 2 — 模块概览
Scratch 探测会转储顶层概览和子模块列表,然后直接写入 surface.md。不要使用内联 python -c。
探测模板:→ references/probe_templates.md § Shape 2。
每个文件对应一个主题。仅在版本升级时替换。
Shape 2b — LSP 工作区符号(跨包搜索)
给定查询字符串,返回 lsp 环境 site-packages 中所有匹配的符号。用于确定带点号的路径之前进行探索;比对每个候选模块调用 dir() 更快。
lsp(
operation="workspaceSymbol",
filePath="<any-existing-Python-file>",
line=1, character=1,
query="<symbol substring>",
)
(pyright 会忽略 workspaceSymbol 的 filePath/line/character 参数;它们仅用于选择 LSP 服务。)
返回:(name, kind, location) 元组列表。不能替代 Shape 2(不会枚举完整的模块概览)。请将其作为在正确的带点号路径上运行 Shape 1 / Shape 2 之前的探索辅助工具。仅当搜索成为常规操作时才缓存。
形态 3 — 叙述性问题
签名本身无法回答的概念性问题——
“X 是如何工作的?”,“A/B 中我应该用哪个?”,“当 <arg> 为 <value> 时,X
会返回什么?”。流程:
-
WebSearch 查找带版本号的文档 URL。查询:
<library> <MAJOR.MINOR> docs <topic>。不要凭记忆构造 URL。 -
WebFetch 获取 URL 中包含已安装版本的最相关结果 (
/0.18/、/0.18.0/)。拒绝任何包含/latest/或/stable/的 URL——重新发布时这些地址会变化。 -
原样缓存到
scratch/api/<lib>/<version>/<topic>.md。 文件的第一行是源 URL。 然后:<full URL> # <topic> Source: <full URL> Fetched: <YYYY-MM-DD> <paste salient sections verbatim — do NOT paraphrase from memory. Skip nav chrome; keep prose that answers the question.>
缓存文件名:将文档 URL 路径片段转换为 snake_case,保持对应关系。每个文件只包含一个主题。仅在版本升级时替换。
文件存在之前,不要断言条件返回类型 (KFold 还是 holdout,相同还是不同)。形态 1 的输出不能替代 WebFetch。
缓存文件约定
每个 scratch/api/<lib>/<version>/<topic>.md 都遵循包含四个部分的结构:
# <topic>
Source: inspect: <lib>.<dotted> @ <version> | <docs URL>
Probed: <YYYY-MM-DD>
## Signature
<fenced block — exactly as inspect.signature returned it, Shape 1 only>
## help() (or "## Docs extract" for Shape 3, "## LSP hover" for 1b)
<verbatim pydoc.render_doc / WebFetch extract / hover output.
Never paraphrase.>
## Usage (agent synthesis)
- **Call:** import path + arg shape (2-3 line snippet)
- **Don't call:** named substitutes that look right from memory
- **Trap:** version-specific rename / deprecation / footgun (empty if none)
- **Returns:** return type + the one accessor the next caller needs
引导轮次必须留下最低限度的缓存——文件列表和审计流程:→ references/bootstrap_cache.md。
缓存布局与生命周期
scratch/api/
├── skrub/0.9.0/
│ ├── data_ops.md # Shape 3 narrative
│ ├── tabular_pipeline.md
│ └── surface.md # Shape 2 dir() dump
├── skore/0.18.0/
│ ├── evaluate.md
│ └── project_local.md
└── sklearn/1.8.0/
└── cv_splitters.md
- 版本子文件夹必须与
<pkg>.__version__完全一致。 不得缩写(0.18.0≠0.18)。 - 第一行是源 URL 或
inspect:引用。 - 由现有的
scratch/*规则加入 Git 忽略。 可重新生成。 - 成功后追加。 写入后即冻结。仅在版本升级时替换(版本子文件夹约定会处理这一点)。
- 按构造方式,不可能在过时的子文件夹中缓存未命中。 形态 0 按版本读取;旧子文件夹内容不可见。
scratch/ 约定——探查与缓存
scratch/ 有两种结构化用途,且都加入 Git 忽略:
| 临时探查 | API 文档缓存 | |
|---|---|---|
| 路径 | scratch/<YYYY-MM-DD>_<HHMMSS>_<short>.py | scratch/api/<lib>/<version>/<topic>.md |
| 内容 | 多行 inspect 遍历、合理性检查、指标提取 | 按主题提取签名 / help() / 文档 |
| 命名 | 带时间戳(按时间顺序) | 按主题组织 |
| 生命周期 | 成功后只追加;同一循环中出错时覆盖 | 成功后追加;版本升级时替换 |
| 内联上限 | 不得内联使用 python -c。所有执行都写入 scratch | 不适用(探查会写入缓存) |
切勿为了检查而编辑实验脚本,添加仅供 Agent 使用的 print(...)
调用。 检查内容写入 scratch/。
切勿从 scratch 探查中重新运行实验 / project.put。
对 skore Project 的操作仅限读取(使用
project.summarize(),然后使用 project.get(id))。
只读规则也适用于 audit/。 审计流程会将每个实验放入一个
audit/<NN>_<short_name>.py # %% 文件中,并通过捆绑的运行器执行。
同样遵循 summarize() → get(id)
→ report.* 的规范。已执行的摘要写入
scratch/audit/<stem>/(已加入 Git 忽略)。两种产物,两种
生命周期:
| API 文档缓存 | 审计执行摘要 | |
|---|---|---|
| 所有者 | python-api | audit-ml-pipeline |
| 来源 | inspect.signature / pydoc.render_doc / WebFetch | 执行 audit/<stem>.py |
| 生命周期 | 成功后追加;版本升级时替换 | 每次重新执行审计时覆盖 |
| 读取者 | 任何需要某个符号签名 / 约定的技能 | Agent 在 iterate-ml-experiment § 4 叙述性工作期间 |
工作区的 scratch/ 文件夹不包含 README.md——如此重要的规则应放在使用时加载的技能中。
技术栈概览——各部分的位置
Tier-1 命名入口。在针对“X 在哪里?”进行形态 2 表面转储之前先查阅——命名入口往往就是正确答案。本节说明符号位于何处。这并不意味着可以据此编写导入 / 调用代码,也不能依据此列表回答形态 3 返回类型问题。在说明文字中写出符号名称,然后进行探查——在提出形态 1 探查之前,不要写 from <lib> import … / fit / predict。
scikit-learn
sklearn.metrics— 评分(accuracy_score、roc_auc_score、mean_absolute_error、make_scorer)。sklearn.preprocessing— 有状态的缩放器/编码器/插补器 (StandardScaler、OneHotEncoder、KBinsDiscretizer)。sklearn.pipeline/sklearn.compose—Pipeline、make_pipeline、ColumnTransformer。sklearn.model_selection— 划分器(KFold、GroupKFold、TimeSeriesSplit、train_test_split)+搜索(GridSearchCV)。- 估算器:
sklearn.linear_model/sklearn.ensemble/ 等。
skrub
- 一键特征化器/学习器:
skrub.tabular_pipeline(顶层函数——不是tabular_learner,也不是TabularLearner;在 0.7+ 中更名)。 - 按列编码器(顶层):
TableVectorizer、DatetimeEncoder、TextEncoder、StringEncoder。 - DataOps DSL(惰性流水线图):每个节点上的
.skb命名空间——X.skb.apply、X.skb.apply_func、X.skb.mark_as_X、X.skb.mark_as_y、X.skb.make_learner、.skb.preview、.skb.full_report。 - 数据源/变量:
skrub.var(name, value=...)、skrub.as_data_op({...})。 - 选择器:
skrub.selectors.{numeric, categorical, string, ...}。
skore
- 评估:
skore.evaluate— 查阅其签名以及 Shape 1 / Shape 3 的返回类型分发。请勿从此列表中列出报告类。 - 项目:
skore.Project(name, *, mode="local", **kwargs)(各模式的 kwargs:本地目录/Hub 工作区名称使用workspace=, mlflow 使用tracking_uri=),以及put(key, report)/summarize()(以 id 为索引、包含key列的 DataFrame,行按date升序排列)/get(id)——get按 id 获取,而非按key获取;以及静态方法Project.delete(name, *, mode, **kwargs)。
各库完整的 API 映射(少见子模块、访问器速查表):
→ references/stack_orientation.md。
已安装的包不符合预期时
有两种选择,二者都不涉及“凭对其他版本的记忆编写”:
- 转到
python-env-manager§“升级/固定版本”,以升级或固定版本。 针对新安装的版本重新查询。 - 适应已安装的版本——更改方案。
配套技能
| 技能 | 关系 |
|---|---|
python-env-manager | 负责版本(其解析版本所对应的键为 scratch/api/<lib>/<version>/) |
data-science-python-stack | 负责选择哪一个库;此技能将库视为已确定 |
build-ml-pipeline / evaluate-ml-pipeline / iterate-from-skore / smoke-test-ml-pipeline | 工作流技能;需要符号时会转到此处 |
此技能不做什么
- 不在技能文件夹中维护预先整理的签名列表。 按版本提取的内容存放在工作区缓存中;技能文件夹保存的是持久的工作流模式。
- 安装时不生成缓存文件。缓存按需生成。
- 不深入讲解库的 API——那是库自身文档的职责。此技能会指向相关文档,并缓存值得保留的内容。
- 不自动编写参考资料。新增的
references/<topic>.md文件需经用户许可,并通过AskUserQuestion进行(参见references/authoring_protocol.md)。
参考资料(按需加载)
持久化工作流模式(随技能附带):
references/probe_templates.md— Shape 1(pydoc 符号卡片)、Shape 1b(LSP 悬停探测文件)和 Shape 2(模块接口转储)的完整代码。复制并编辑LIB/DOTTED/TOPIC。references/shape1b_lsp_setup.md— 第 0 步:可用性探测、解读表、易踩的坑(会话启动顺序、conda 风格的环境、字符偏移、scratch 排除路径、C 扩展类型)。references/stack_orientation.md— 各库的完整接口映射(sklearn / skrub / skore)。references/pre_mark_alignment.md— 用于依赖历史记录的管道的 3 层 skrub DataOps 模式。编写依赖历史记录的代码前请阅读。references/skrub_interop.md—SkrubLearner与skore.evaluate的集成方式。编写experiments/NN_*.py前请阅读。references/bootstrap_cache.md— 引导回合所需的最少缓存文件及审计流程。references/named_traps.md— Agent 在真实跟踪记录中遇到的特定版本重命名和弃用情况。references/authoring_protocol.md— 添加新参考文档的时机和方式(须由用户通过AskUserQuestion授权)。