Inferred metadata
LLM-generated fields per paper, labelled with the models and prompt version that produced them. Status is pending, ready or failed.
Inferred fields are generated by Claude after the tree is built. They are always labelled as inferred, with the models and prompt version that produced them. Everything else in a response is extracted, not inferred.
v1 fields
| Field | Type | Model | Contents |
|---|---|---|---|
tldr |
string | Claude Haiku 4.5 | One sentence, at most 40 words: what the paper does and its main finding |
contributions |
string[] | Claude Haiku 4.5 | Main claimed contributions, at most 6, in the paper’s order |
paperType |
enum | Claude Haiku 4.5 | method, benchmark, survey, theory, position, dataset, other |
entities |
object | Claude Haiku 4.5 | tasks, methods, datasets, metrics, models: each a string[], at most 15 |
artifacts |
array | Claude Haiku 4.5 | { kind, url, note? }, kind one of code, data, model, project, other; only URLs that appear in the paper |
results |
array | Claude Sonnet 5.5 | { benchmark, metric, value, baseline?, note? }, at most 25; values copied as written |
- Fields the paper does not support come back as an empty string or empty array.
- The input is the paper’s Markdown, cut at a paragraph boundary after 400,000 characters for very long papers.
Status
inferred in .json takes one of three shapes:
status |
Other fields | Meaning |
|---|---|---|
pending |
queuedAt |
Queued; usually ready in 5–40 s |
ready |
models, promptVersion, generatedAt, fields |
Done |
failed |
error, failedAt |
Enrichment failed; content is unaffected |
{
"status": "ready",
"models": [
{
"model": "claude-haiku-4-5",
"fields": ["tldr", "contributions", "paperType", "entities", "artifacts"]
},
{ "model": "claude-sonnet-5-5", "fields": ["results"] }
],
"promptVersion": "2026-10-14.1",
"generatedAt": "2026-10-14T09:00:21.000Z",
"fields": {
"tldr": "The Transformer replaces recurrence with self-attention and sets a new state of the art in machine translation.",
"contributions": ["Proposes the Transformer, built solely on attention", "..."],
"paperType": "method",
"entities": {
"tasks": ["machine translation"],
"methods": ["Transformer", "multi-head attention"],
"datasets": ["WMT 2014 English-German"],
"metrics": ["BLEU"],
"models": ["Transformer (big)"]
},
"results": [{ "benchmark": "WMT 2014 English-German", "metric": "BLEU", "value": "28.4" }],
"artifacts": [{ "kind": "code", "url": "https://github.com/tensorflow/tensor2tensor" }]
}
}
The outline carries a subset: inferred.status, plus tldr, contributions and paperType once ready.
While status is pending, .json, outline.json and metadata.json responses carry Retry-After: 10 and Cache-Control: public, max-age=30. A failed status also gets public, max-age=30 (no Retry-After), so a later re-enrichment shows up. To wait for ready instead of polling, see first request.
Labelling
| Field | Meaning |
|---|---|
models |
[{ model, fields }]: which model produced which fields keys |
promptVersion |
Prompt version, e.g. 2026-10-14.1. Fields may be regenerated when it changes |
generatedAt |
When the fields were generated |
| Model id | Fields |
|---|---|
claude-haiku-4-5 |
tldr, contributions, paperType, entities, artifacts |
claude-sonnet-5-5 |
results |
Treat inferred fields as helpful summaries, not ground truth. Check claims against the cited sections.
Token counts
Token counts are approximate: ceil(characters / 4), labelled as such.
{ "tokens": { "approx": 10240, "method": "chars/4" } }
| Where | Scope |
|---|---|
PaperJson.tokens |
Whole paper, from its Markdown rendering |
Outline.tokens |
Whole paper, from its Markdown rendering |
Outline.sections[].tokens |
One section, from its Markdown rendering |
Use them to budget context, not to bill. Real Claude token counts can differ by 15–20% or more.