DOI / 标题精确解析
元数据检索入门

DOI / 标题精确解析

快速拉取元数据、全文和引用证据,科研 Agent 的基础入口

用户场景
用户已有 DOI 或论文标题,只想快速拉取元数据、全文和引用证据。这是科研 Agent 最基础的入口操作。
预估调用量
~3–5 次 API 调用 / 一次解析
适用工具
meta-searchcontent
调用链路
DOI/标题→ meta-search 精确查询→ 元数据→ content 全文

输入示例

用户输入:
"DOI: 10.1038/s41586-021-03819-2"
或:"论文标题: Highly accurate protein structure prediction with AlphaFold"

注意:请替换为你的真实 DOI 或标题

输出示例

{
  "title": "Highly accurate protein structure prediction with AlphaFold",
  "doi": "10.1038/s41586-021-03819-2",
  "venue": "Nature",
  "year": 2021,
  "authors": ["Jumper, J.", "Evans, R.", ...],
  "doc_id": "由 meta-search 返回的真实 ID",
  "full_text_preview": "The prediction of protein three-dimensional structure..."
}

Agent Prompt 示例

你是一个文献解析 Agent。当用户提供 DOI 或标题时:
1. 调用 meta-search 精确查找该文献
2. 返回元数据(标题、作者、年份、期刊、DOI)
3. 调用 content 读取全文摘要
4. 结构化输出

分步实现

Step 1: 环境准备

安装依赖并配置 API Token

!pip install httpx
import os
os.environ["SCIVERSE_API_TOKEN"] = "sv-your-token-here"  # 替换为你的真实值

Step 2: 通过 DOI 精确查找文献

用 meta-search 按 DOI 精确匹配

import os
import asyncio
import httpx

BASE = "https://api.sciverse.space"
TOKEN = os.environ["SCIVERSE_API_TOKEN"]
HEADERS = {"Authorization": f"Bearer {TOKEN}"}

async def resolve_doi(doi: str):
    """\u901a\u8fc7 DOI \u7cbe\u786e\u67e5\u627e\u6587\u732e\u5143\u6570\u636e"""
    async with httpx.AsyncClient(timeout=30) as client:
        resp = await client.post(
            f"{BASE}/meta-search", headers=HEADERS,
            json={
                "query": doi,
                "filters": [{"field": "doi", "operator": "FILTER_OP_EQ", "value": doi}],
                "page": 1, "page_size": 1
            }
        )
        resp.raise_for_status()
        data = resp.json()
        if data.get("total_count", 0) > 0:
            return (data.get("results") or [None])[0]
        return None

async def resolve_title(title: str):
    """\u901a\u8fc7\u6807\u9898\u6a21\u7cca\u67e5\u627e"""
    async with httpx.AsyncClient(timeout=30) as client:
        resp = await client.post(
            f"{BASE}/meta-search", headers=HEADERS,
            json={"query": title, "filters": [], "page": 1, "page_size": 5}
        )
        resp.raise_for_status()
        return (resp.json().get("results") or [])

# \u793a\u4f8b\uff1a\u901a\u8fc7 DOI \u89e3\u6790
paper = await resolve_doi("10.1038/s41586-021-03819-2")
if paper:
    print(f"Title: {paper['title']}")
    print(f"Venue: {paper.get('publication_venue_name_unified', 'N/A')}")
    print(f"Year: {paper.get('publication_published_year', 'N/A')}")
    print(f"Doc ID: {paper.get('doc_id', 'N/A')}")

Step 3: 读取全文摘要

用 content 接口拉取论文开头段落

async def read_abstract(doc_id: str):
    """\u8bfb\u53d6\u8bba\u6587\u5f00\u5934 1500 \u5b57\u7b26\u4f5c\u4e3a\u6458\u8981"""
    async with httpx.AsyncClient(timeout=30) as client:
        resp = await client.get(
            f"{BASE}/content", headers=HEADERS,
            params={"doc_id": doc_id, "offset": 0, "limit": 1500}
        )
        resp.raise_for_status()
        return resp.json()["text"]

if paper and paper.get("doc_id"):
    abstract = await read_abstract(paper["doc_id"])
    print(f"\
Full text preview:\
{abstract[:500]}...")

注意事项

  • DOI 精确查询使用 FILTER_OP_EQ 操作符
  • 如果 DOI 查不到,可回退到标题模糊查询
  • content 接口返回的是 text 字段,非 content
  • 这是科研 Agent 最基础的入口操作,建议封装为通用工具函数

FAQ

DOI 查不到怎么办?

可以回退到标题、作者和年份组合检索。

解析结果要返回什么?

至少返回 title、authors、year、venue、doi、doc_id。

PMID 和 DOI 都有时用哪个?

可同时保留,DOI 适合跨出版商识别,PMID 适合生物医学场景。

解析后下一步做什么?

通常用 doc_id 调 content 读取摘要或全文上下文。

下一步

还没有 API Key?

登录控制台「密钥」即可创建。同一套 API Key 可用于已开通的 Sciverse、点石与 Skills 能力,提供基础试用额度,具体以账号权限为准。

前往控制台