ワンクリックで
xdev
当你需要管理提取数据(导入、查看、标注)、运行提取、评估准确率时激活此 skill。这是提取开发的基础工具,所有提取相关任务都从这里开始。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
当你需要管理提取数据(导入、查看、标注)、运行提取、评估准确率时激活此 skill。这是提取开发的基础工具,所有提取相关任务都从这里开始。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
当用户要启动 agentic loop、使用 one-click auto、通过 Python API 调用完整流程、或在运行过程中接收 callback 和 heartbeat 事件时使用此 skill。如果用户当前主要是在准备或维护 `.xdev` 数据,先转到 xdev skill。
当文档内容过长无法一次查看、需要搜索关键词定位信息、或需要按页按节点浏览 DocJSON/PDF 结构时使用此 skill。适合与 xdev、agentic-extract 配合做长文档阅读与定位。
当用户要求更新 extract-agent 版本号、补 changelog、构建 dist、推送代码、或发布到 PyPI 时使用此 skill。只用于维护者发版,不用于日常 workspace 提取。
当用户需要准备或维护 workspace 数据、导入或同步 PDF、查看文档、定义 schema、管理标注、调试 program.py、或运行评估时使用此 skill。如果用户只是想启动 agentic loop 或通过 Python API 一键运行完整流程,转到 agentic-extract skill。
当你需要定义提取 schema、为文档标注数据、分析业务含义、生成业务指导文档时激活此 skill。在评估前必须先完成 schema 定义和数据标注。
当你需要编写或修改 program.py 提取代码、分析评估错误、调试提取逻辑、选择提取策略时激活此 skill。
| name | xdev |
| description | 当你需要管理提取数据(导入、查看、标注)、运行提取、评估准确率时激活此 skill。这是提取开发的基础工具,所有提取相关任务都从这里开始。 |
xdev 管理 .xdev/ 目录中的文档数据、schema、标注,并提供提取评估能力。
使用 uv(推荐):
uv tool install extract-agent
或使用 pip(需要在虚拟环境中):
pip install extract-agent
注意:
extract-agent 发布到 PyPI,默认安装命令不需要指定私有 indexuv tool install 或在虚拟环境中安装安装后可用命令:
xdev — 数据管理和评估工具pdf-ai-explorer — PDF 长文档导航工具agentic-extract — 自动化提取 agentic loop(可选)xdev --help
pdf-ai-explorer --help
xdev 支持三层配置(优先级:环境变量 > 项目配置 > 全局配置 > 默认值)。
创建 ~/.config/xdev/config.json。
在 workspace 创建 .xdev/config.json。
export XDEV_BASE_URL="http://localhost:8008"
export XDEV_CONCURRENT=4
export XDEV_DATA_DIR=".xdev"
export XDEV_MEMECT_API_BASE="http://localhost:6111/api"
| 配置项 | 说明 | 默认值 |
|---|---|---|
data_dir | 数据目录路径 | .xdev |
base_url | 标准集 API 地址(用于 --set-id 导入) | http://localhost:8008 |
concurrent | 提取执行并发数 | 16 |
pdf_parse_concurrent | PPX 批量 PDF 文件级解析并发 | 1 |
memect_api_base | legacy PDF 解析服务地址(默认不再使用) | http://localhost:6111/api |
code_extractor | 透传给 code_executor 的工具配置(覆盖默认 .code_tools.env) | null |
{
"data_dir": ".xdev",
"base_url": "http://localhost:8008",
"concurrent": 16,
"pdf_parse_concurrent": 1,
"memect_api_base": "http://localhost:6111/api",
"code_extractor": {
"enabled_tools": [
"extract",
"llm_select",
"pdf_to_image"
],
"tool_setup": {
"extract_tool": {
"llm": {
"type": "openai",
"config": {
"api_key": "YOUR_API_KEY",
"api_base": "https://api.openai.com/v1",
"model": "gpt-4o-mini"
}
},
"max_content_length": 50000
},
"llm_select_tool": {
"llm": {
"type": "openai",
"config": {
"api_key": "YOUR_API_KEY",
"api_base": "https://api.openai.com/v1",
"model": "gpt-4o-mini"
}
},
"max_content_length": 50000
},
"pdf_to_image_tool": {
"dpi": 150
}
}
}
}
如果提取程序依赖 extract / llm_select / pdf_to_image 等工具,应该在 xdev 配置里显式配置 code_extractor。xdev run / xdev eval 会自动读取配置并把 tool_hub 注入到 extract(document, tool_hub),不要在 program.py 中自行读取 xdev 配置。
仅启用 extract:
{
"code_extractor": {
"enabled_tools": ["extract"],
"tool_setup": {
"extract_tool": {
"llm": {
"type": "openai",
"config": {
"api_key": "YOUR_API_KEY",
"api_base": "https://api.openai.com/v1",
"model": "gpt-4o-mini"
}
},
"max_content_length": 50000
}
}
}
}
仅启用 llm_select:
{
"code_extractor": {
"enabled_tools": ["llm_select"],
"tool_setup": {
"llm_select_tool": {
"llm": {
"type": "openai",
"config": {
"api_key": "YOUR_API_KEY",
"api_base": "https://api.openai.com/v1",
"model": "gpt-4o-mini"
}
},
"max_content_length": 12000
}
}
}
}
仅启用 pdf_to_image:
{
"code_extractor": {
"enabled_tools": ["pdf_to_image"],
"tool_setup": {
"pdf_to_image_tool": {
"dpi": 180
}
}
}
}
字段映射关系:
code_extractor.tool_setup → code_executor.tools.tool_setup.settings.Settings.tool_setupcode_extractor.enabled_tools → code_executor.tools.tool_setup.settings.Settings.enabled_toolsenabled_tools 可选值:
extractllm_selectpdf_to_image环境变量支持说明:
XDEV_*:data_dir / base_url / concurrent / pdf_parse_concurrent / memect_api_basecode_extractor 当前仅支持在 JSON 配置文件中设置,不支持 XDEV_* 环境变量生效时机:
xdev run / xdev eval 在执行前会先应用这套配置,再加载并运行 program.pypdf-ai-explorer 的配置不在 .xdev/config.json,它有自己的配置源:
# ~/.config/pdf-ai-explorer/config.toml
api_url = "http://localhost:6111/api"
或使用环境变量:
export MEMECT_API_URL="http://localhost:6111/api"
优先级:
MEMECT_API_URL~/.config/pdf-ai-explorer/config.tomlhttp://localhost:6111/api建议:
MEMECT_API_URL 与 XDEV_MEMECT_API_BASE 配成同一个地址,避免 xdev import-data --pdfs 和 pdf-ai-explorer 使用不同解析服务。xdev init my_workspace
cd my_workspace
创建的目录结构:
my_workspace/
├── .git/ # git 仓库
├── .gitignore
├── .xdev/ # 数据目录(空)
├── program.py # 提取代码模板
├── tests/ # 测试模板
│ ├── conftest.py
│ └── test_extract.py
└── docs/ # 空文档目录(可选)
# 从远程标准集导入
xdev import-data --set-id <标准集ID>
# 或从本地 PDF 目录导入
xdev import-data --pdfs /path/to/pdfs/
# 或从另一个 .xdev 目录导入
xdev import-data --from-data-dir /path/to/.xdev/
# 列出所有文档
xdev list
# 查看文档内容
xdev doc <doc_id>
编辑 .xdev/schema.json:
{
"type": "object",
"data": {
"公司名称": "str",
"注册资本": "float",
"成立日期": "str"
}
}
编辑 program.py,实现 extract() 函数。
xdev 仅支持 Document 输入,入口签名应为:
from code_executor.document.models import Document
from code_executor.tools import ToolHub
from typing import Any
def extract(document: Document, tool_hub: ToolHub) -> dict[str, Any] | list[dict[str, Any]]:
...
不要使用 extract(article: list[str|Table])。
# 单文档测试
xdev run <doc_id>
# 全量评估(需要先标注数据)
xdev eval
数据目录默认为 .xdev,在 workspace 内工作时无需指定。
.xdev/
├── config.json # 项目配置(可选)
├── manifest.json # 数据源元信息(import 时生成,只读)
├── schema.json # Schema 定义(直接编辑文件)
├── data/
│ ├── docjson/
│ │ ├── <doc_id>.json # DocJSON 文件(PDF 解析结果)
│ │ └── ...
│ └── pdf/
│ ├── <doc_id>.pdf # 原始 PDF 文件
│ └── ...
└── labels/
├── <doc_id>.json # 每个文档的标注(直接编辑文件)
└── ...
data/docjson/report_001.json → doc_id 为 report_001labels/<doc_id>.jsonxdev init — 初始化 workspacexdev init [workspace_path]
创建 workspace 目录结构(git 仓库 + 模板文件 + .xdev/ 空目录)。
xdev import-data — 导入数据四种数据源互斥,必须且只能指定一种:
xdev import-data --set-id <id> # 远程标准集
xdev import-data --pdfs <dir> # 本地 PDF 目录(并发解析)
xdev import-data --from-data-dir <path> # 从另一个 .xdev 目录
xdev import-data --source <source.json> # 从配置文件
xdev sync-pdfs — 同步 PDF 目录xdev sync-pdfs <pdf_dir>
保持 .xdev/data/ 与源 PDF 目录同步:
.xdev/data/ 没有 → 解析并添加.xdev/data/ 有 → 删除 docjson 和 pdf(保留 label)source.pdf_dir 路径和 doc_count前提:manifest.json 必须存在且 source.type 为 "pdfs"。
输出示例:
[sync-pdfs] 同步 PDF: /path/to/pdfs
[sync-pdfs] 检查变更...
[sync-pdfs] 新增: 3 篇
[sync-pdfs] 删除: 1 篇 (保留 label)
[sync-pdfs] 修改: 2 篇 (重新解析)
[sync-pdfs] 不变: 15 篇
[sync-pdfs] 完成。当前文档数: 19
xdev list — 列出文档xdev list
输出数据源信息和所有 doc_id。
xdev doc <doc_id> — 查看文档内容xdev doc <doc_id>
输出 DocJSON 转换后的纯文本(Markdown 格式)。长文档会截断并提示 docjson 路径,此时使用 pdf-ai-explorer 导航。
xdev label-guide — 标注指导xdev label-guide # 通用指导(schema 信息、标注目录、格式说明)
xdev label-guide <doc_id> # 特定文档(文件路径和标注模板)
前提:schema.json 必须已存在。
xdev label-status — 检查标注状态xdev label-status # 输出标注状态摘要
xdev label-status --detail # 输出详细信息(列出每个问题文档)
检查当前标注完整性和 schema 一致性:
前提:schema.json 必须已存在。
xdev eval — 运行评估xdev eval # 全量评估(所有已标注文档)
xdev eval <doc_id> # 单文档评估
| 选项 | 说明 | 默认值 |
|---|---|---|
--workspace PATH | workspace 目录(包含 program.py) | 当前目录 |
前提:schema.json + labels/ 标注 + program.py 必须存在。
并且 program.py 必须使用 Document 输入(extract(document: Document, tool_hub: ToolHub))。
如配置了 code_extractor,会在评估前构造 ToolHub 并注入给 program.py。
xdev run <doc_id> — 执行提取xdev run <doc_id>
| 选项 | 说明 | 默认值 |
|---|---|---|
--workspace PATH | workspace 目录(包含 program.py) | 当前目录 |
在单文档上执行 program.py,输出提取结果 JSON 和程序 stdout。
program.py 必须使用 Document 输入(extract(document: Document, tool_hub: ToolHub))。
如配置了 code_extractor,会在执行前构造 ToolHub 并注入给 program.py。
xdev export-skills — 导出 skillsxdev export-skills -o skills.zip # 导出到指定文件
xdev export-skills --output-dir ./dist/ # 导出到目录(自动命名)
xdev export-skills # 导出到当前目录
导出外部可用 skills(xdev、pdf_ai_explorer、extract_workflow、fact-extract)到 ZIP 文件,供其他 coding agent 使用。
定义提取目标的字段结构。
单条记录(object):每篇文档提取一条记录。
{"type": "object", "data": {"公司名称": "str", "注册资本": "float", "成立日期": "str"}}
多条记录(list_of_objects):每篇文档提取多条同类记录。
{"type": "list_of_objects", "data": {"股东名称": "str", "持股比例": "float"}}
字段类型:"str" / "int" / "float" / "bool" / "list"
约束:只支持扁平一层结构,不支持嵌套。
每个文档的标注数据。
object 模式:
{"公司名称": "XX科技有限公司", "注册资本": 1000.0, "成立日期": "2020-01-15"}
list_of_objects 模式:
[{"股东名称": "张三", "持股比例": 30.0}, {"股东名称": "李四", "持股比例": 20.0}]
约束:
schema.json 的 data key 完全一致"" 或 null.json)必须对应已有的 doc_idimport 时自动生成,记录数据来源,不应手动修改。
from xdev.api import (
list_doc_ids, # 列出所有 doc_id
get_docjson_path, # 获取 docjson 文件路径
get_pdf_path, # 获取 PDF 文件路径
get_label_path, # 获取标注文件路径
get_label, # 读取标注数据
list_labeled_doc_ids, # 列出已标注的 doc_id
get_schema, # 读取 schema
get_manifest, # 读取 manifest
check_label_status, # 检查标注状态,返回 LabelStatusReport
LabelStatusReport, # 标注状态报告
LabelIssue, # 单个标注问题
)
from xdev.import_data import (
sync_pdfs, # 同步 PDF 目录,返回 SyncResult
add_pdfs, # 增量添加 PDF
reparse_docs, # 重新解析文档
SyncResult, # 同步结果(added, removed, modified, unchanged)
)
所有函数都接受 data_dir 参数,默认为 .xdev。
xdev 是数据管理和评估的基础工具。完整的提取开发流程需要配合以下 skills:
| Skill | 说明 |
|---|---|
| extract_workflow | 完整的提取开发工作流(数据分析 → schema → 标注 → 编码 → 评估迭代),开始提取任务时先加载此 skill |
| pdf_ai_explorer | 长文档导航工具,xdev doc 截断时用它按需导航大纲、搜索、翻页 |
| fact-extract | 单文档/多文档 PDF 事实抽取工作流(计划 → 并发抽取 → 合并),用户说”提取 fact”时优先使用 |
fact-extract enrich 是事实提取的后处理阶段,从已提取的事实中抽取结构化知识:实体、属性、关系、事件。
需要先完成事实提取(fact-extract run),产生 manifest.json 和 sources/ 目录。
# 对 manifest 进行 enrich
fact-extract enrich \
--manifest <FACTS_DIR>/manifest.json \
--model <MODEL> \
--api-base <API_BASE> \
--api-key <API_KEY> \
--max-workers 32
# 或对 chunks 进行 enrich
fact-extract enrich \
--chunks <FACTS_DIR>/chunks.json \
--max-workers 32
--manifest 和 --chunks 二选一。
<FACTS_DIR>/enriched/<fact_id>.json(逐条保存,支持断点续跑)<FACTS_DIR>/manifest.enriched.json(manifest 模式)或 <FACTS_DIR>/enriched.json(chunks 模式)每条事实会被扩充以下四个字段:
{
“id”: “fact_0001”,
“summary”: “孙悟空大闹天宫,打败十万天兵”,
“source_ids”: [“e0001”],
“entities”: [
{“name”: “孙悟空”, “type”: “人物”},
{“name”: “天宫”, “type”: “地点”}
],
“attributes”: [
{“entity”: “孙悟空”, “attr”: “能力”, “value”: “七十二变”}
],
“relations”: [
{“subject”: “孙悟空”, “predicate”: “大闹”, “object”: “天宫”},
{“subject”: “孙悟空”, “predicate”: “打败”, “object”: “十万天兵”}
],
“events”: [
{“action”: “大闹天宫”, “agent”: “孙悟空”, “patient”: “天兵天将”, “location”: “天宫”, “time”: null}
]
}
# 1. 事实提取
fact-extract run --pdf book.pdf --facts-dir facts
# 2. 关系提取(enrich)
fact-extract enrich --manifest facts/manifest.json
# 3. 查看结果
jq '.[0] | {summary, entities, relations}' facts/manifest.enriched.json
enrich 支持断点续跑:enriched/ 目录下已完成的 fact 会跳过,中断后重跑只处理剩余部分。