数据库
需要查询/下载 openFDA 药品、器械、食品等 FDA…
适用于通过 openFDA API 检索药物、器械、食品、烟草、化妆品、兽药等 28 个端点的安全/监管数据,并进行计数、下载和字段解析。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要查询/下载 openFDA 药品、器特定
解决思路
- 安装并确保 uv 在 PATH:阅读 uv 技能并按其 Setup 安装/配置 uv。
- 许可证通知:若工作区根目录不存在 .licenses/openfda_database_LICENSE.txt,先显著通知用户查看 https://open.fda.gov/apis/ 和 https://open.fda.gov/license 条款,再创建该文件记录通知文本与时间戳。
- .env 文件:确保 home 目录存在 .env,不存在则创建。
- FDA_API_KEY(可选但推荐):免费 key 可将每日请求上限从 1,000 提升到 120,000;在 https://open.fda.gov/apis/authentication/ 注册;若技能与用户请求相关,必须使用 credentials 技能的安全凭据协议检查并请求该 key。
- 始终使用包装脚本:不要直接访问数据库,执行 scripts/openfda_query.py 查询,脚本会自动优雅地控制速率限制。
- 遵守 openFDA 限流:无 API key:240 requests/min、1,000 requests/day/IP;有 API key:240 requests/min、120,000 requests/day/key;多查询工作流前始终设置 API key。
- 警告:自动化 agent 可能在单次研究会话耗尽 1,000/日限流;运行多查询工作流前始终设置 API key。
- 若技能相关,必须使用 credentials 技能的安全凭据协议帮助用户把 FDA_API_KEY 添加到 .env;脚本检测不到 key 时会向 stderr 输出警告。
- 所有子命令必须使用 --output <file> 把结果写入文件,防止大输出淹没上下文;用 jq 或代码读取输出文件。
- 如果使用了本技能,确保在输出中提及。
- 统一入口命令:uv run scripts/openfda_query.py {search,count,download} --output <file> [options]。
- search:搜索 28 个端点之一并保存 JSON 结果到文件;示例:uv run scripts/openfda_query.py search --category drug --endpoint event --search "patient.drug.medicinalproduct:aspirin" --limit 5 --output /tmp/fda_results.json。
- search 的 stdout 打印紧凑摘要:{"status": "success", "output": "/tmp/fda_results.json", "results_in_file": 5, "total_matching": 601477}。
- search 选项:--output 输出完整 JSON 结果文件(必填)。
- search 选项:--category API 类别——drug、device、food、tobacco、other、animalandveterinary、cosmetic、transparency。
- search 选项:--endpoint 类别内端点(如 event、label、510k);完整列表见 references/api_endpoints.md。
- search 选项:--search 查询字符串(如 patient.drug.medicinalproduct:aspirin+AND+serious:1)。
- search 选项:--sort 排序字段和顺序(如 receivedate:desc)。
- search 选项:--limit 最大结果数(默认 10,最大 1000)。
- search 选项:--skip 分页偏移量(默认 0)。
- search 选项:--api_key API key(也会读取 FDA_API_KEY 环境变量)。
- count:统计匹配结果中某个字段的唯一值;示例:uv run scripts/openfda_query.py count --category drug --endpoint event --search "patient.drug.medicinalproduct:aspirin" --count_field "patient.reaction.reactionmeddrapt.exact" --summary 10 --output /tmp/aspirin_reactions.json。
- count 的 stdout 打印含 top 5 术语的摘要,完整数据在输出文件中。
- count 选项:--count_field 要统计的字段;追加 .exact 可按整句统计。
- count 选项:--summary N 只返回前 N 个最常见术语,避免上下文被数百个低频术语淹没。
- download:下载多页结果到文件;示例:uv run scripts/openfda_query.py download --category drug --endpoint event --search "patient.drug.medicinalproduct:aspirin" --limit 100 --max_pages 5 --output /tmp/aspirin_events.json。
- download 选项:--max_pages 最多获取页数(默认 10)。
- download 选项:--all_results 自动分页获取所有匹配结果;每次下载安全上限 25,000 条记录,防止失控下载和过度 API 使用。
- download 提示:常见药物可能有过多报告;使用日期范围限制下载量,例如 receivedate:[20250101+TO+20250131]。
- 实体解析:搜索具体产品名、药物名或分类术语时,字段始终使用 .exact 后缀获取精确匹配;不加时 API 会分词多词值并返回嘈杂的部分匹配;示例:uv run scripts/openfda_query.py search --category drug --endpoint label --search 'openfda.brand_name.exact:"ADVIL"' --limit 5 --output /tmp/advil_label.json。
- 实体解析注意:FDA 数据库中许多品牌名含变体后缀(如 "TYLENOL Extra Strength" 而非仅 "TYLENOL");如果 .exact 搜索返回 0 结果,试试不加 .exact 查看可用品牌名变体,再用完整精确名重新查询。
- 使用 --count_field 聚合整句而非单个词时,也需要 .exact 后缀。
- NDC 查询:连字符 NDC 始终加引号;openFDA 搜索语法中未加引号的连字符(-)是布尔 NOT 运算符(如 51285-092 会搜索 51285 AND NOT 092);始终用转义双引号包裹连字符 NDC 字符串;示例:uv run scripts/openfda_query.py search --category drug --endpoint ndc --search 'product_ndc:"51285-092"' --limit 5 --output /tmp/ndc.json。
- 停用药品回退(drug/label):drug/ndc 端点只包含当前活跃/上市产品;如果有效 NDC 在 drug/ndc 返回 0 结果,用精确短语引号查询 drug/label 端点(--search '"51285-092"')。
- 停用药品注意:对于停用药品,openfda 元数据块可能为空({});从标签文本字段读取品牌名、活性成分和标签商,如 package_label_principal_display_panel、description 或 spl_product_data_elements。
- MedDRA 术语解析:openFDA 不良事件数据使用 MedDRA 术语表示反应;API 报告 Preferred Terms(PTs),但不提供 MedDRA 层级(System Organ Class、High Level Terms 等)。
- MedDRA 注意:MedDRA 是专有本体,未索引在 EMBL-EBI OLS 中;为近似 MedDRA 层级查询,使用 Human Phenotype Ontology (HP) 或 NCI Thesaurus (NCIT) 作为代理本体——它们交叉引用 MedDRA ID 并提供父/祖先关系。
- MedDRA 第 1 步:用 count 从 openFDA 获取 top reactions;示例:uv run scripts/openfda_query.py count --category drug --endpoint event --search "patient.drug.medicinalproduct:metformin" --count_field "patient.reaction.reactionmeddrapt.exact" --summary 5 --output /tmp/metformin_reactions.json。
- MedDRA 第 2 步:用生物医学本体服务技能(如 embl-ebi-ols 技能)查询 top reaction 术语;MedDRA 不在 OLS 中;使用 Human Phenotype Ontology (HP) 或 NCI Thesaurus (NCIT) 作为代理,查找该反应术语的层级分类。
- 可用端点(共 28 个):drug:event、label、ndc、enforcement、drugsfda、shortages;device:510k、classification、enforcement、event、pma、recall、registrationlisting、udi、covid19serology;food:enforcement、event;tobacco:problem、researchpreventionads、researchdigitalads、researchsmokefree;other:historicaldocument、nsde、substance、unii;animalandveterinary:event;cosmetic:event;transparency:crl。
- 参考:查询语法和所有端点见 references/api_endpoints.md,包含字段名、搜索语法、日期范围和布尔运算符。
- Recipes:药物、器械、食品、烟草、化妆品、动物和兽医产品、物质、透明度数据、不良事件、召回、标签、批准、短缺、510(k) clearance、NDC 查询等常见查询模式见 references/recipes.md。
- 工作流 1:使用 search 配合 --output 搜索记录;读取输出文件。
- 工作流 2:使用 count 配合 --summary 10 --output 汇总字段分布。
- 工作流 3:使用 download(配合 --all_results 做穷举拉取)获取更大数据集。
- 工作流 4:用标准工具读取和分析输出文件。
- 工作流 5:对于 MedDRA 术语层级问题,使用生物医学本体服务技能(如 EMBL-EBI OLS 技能配合 HP 或 NCIT 本体)查询术语。
适用边界 · 注意事项
- 查询非 FDA/openFDA 数据,或需要 MedDRA 官方完整层级/专有本体数据时不适用(openFDA 不提供,只能以 HP/NCIT 近似)。
- 环境无法安装/运行 uv、不能执行包装脚本,或不能写 .env/输出文件时不适用。
- 需要突破 openFDA 速率限制,或单次下载超过 25,000 条全量记录时不适用。