mcpField
P
python-api

python-api

github.com/probabl-ai开发144136 次安装1 天前更新
代码仓库

关于 python-api

用于发现已安装 Python 包公共 API 并保存版本相关结果的技能。它要求检查实际环境,避免依赖记忆中的符号或签名。

主要功能

  1. 01检查已安装包的 API
  2. 02按问题类型选择查询方式
  3. 03按包版本缓存结果
  4. 04通过临时文件运行 Python 探测
  5. 05查阅指定版本的文档

适用场景

  1. 01编码前核实函数签名
  2. 02探索包模块的公共 API
  3. 03调查 API 在不同条件下的行为
  4. 04复用缓存中的 API 查询结果

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/probabl-ai/skills --skill python-api

安装后在 Claude Code 中输入/python-api确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

evals/
evals.json
references/
authoring_protocol.md
bootstrap_cache.md
named_traps.md
pre_mark_alignment.md
probe_templates.md
shape1b_lsp_setup.md
skrub_interop.md
stack_orientation.md

详细介绍

python-api

探索任意已安装 Python 包的公共 API,缓存有用信息,绝不相信训练数据中的记忆。

三条持久规则:

  1. 对照已安装版本查询,绝不依赖记忆。 认得不等于查过。你记得的符号可能已在当前版本中重命名、重新签名或弃用。
  2. 缓存到 scratch/api/<lib>/<version>/<topic>.md,这样下一个 Agent 就不必重复探查。
  3. 打包的 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 是恢复途径,哪怕是假设性的。
  • 绝不捏造探测结果。 如果探测尚未执行,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__ 为空;缓存文件必须可以独立阅读

每个触发此技能的轮次的第一步

  1. 确定版本。 创建 scratch/<YYYY-MM-DD>_<HHMMSS>_version_<pkg>.py,内容为 import <pkg>; print(<pkg>.__version__),通过 pixi run python scratch/<ts>_version_<pkg>.py 运行。禁止使用内联 python -c。
  2. 列出缓存: ls scratch/api/<lib>/<version>/。
  3. 缓存命中? 读取匹配的文件。完成。
  4. 缓存未命中? 对问题分类(见上表)→ 运行 Shape 1 / 1b / 2 / 2b / 3。
  5. 输出预检清单,并标记每个方框。

预检——执行任何查找前输出

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。

确认可用后
  1. 编写探测文件(放在 tests/ 或 src/<pkg>/ 下 — scratch/ 已从 pyright 的分析中排除)。模板: → references/probe_templates.md § Shape 1b。
  2. 调用 lsp(operation="hover", filePath=..., line=..., character=...)。
  3. 将结果缓存到 scratch/api/<lib>/<version>/<topic>.md,并添加 Source: lsp-hover: <lib>.<dotted> @ <version> 和 ## LSP hover 节。
  4. 如果悬停结果为空或只有一行,则升级到 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 会返回什么?”。流程:

  1. WebSearch 查找带版本号的文档 URL。查询: <library> <MAJOR.MINOR> docs <topic>。不要凭记忆构造 URL。

  2. WebFetch 获取 URL 中包含已安装版本的最相关结果 (/0.18/、/0.18.0/)。拒绝任何包含 /latest/ 或 /stable/ 的 URL——重新发布时这些地址会变化。

  3. 原样缓存到 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>.pyscratch/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-apiaudit-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。

已安装的包不符合预期时

有两种选择,二者都不涉及“凭对其他版本的记忆编写”:

  1. 转到 python-env-manager §“升级/固定版本”,以升级或固定版本。 针对新安装的版本重新查询。
  2. 适应已安装的版本——更改方案。

配套技能

技能关系
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 授权)。

评论

支持 Markdown