# Castorini Serve

> Use when serving Anserini retrieval together with any subset of rank_llm, ragnarok, nuggetizer, or umbrela over HTTP, especially for local port planning, direct request payload compatibility, curl or jq pipelines, or sequencing retrieval, reranking, generation, nugget creation, nugget assignment, and passage judging from an Anserini fatjar RestServer.

- Skill: `castorini/castorini-serve` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add castorini/castorini-serve`
- Raw SKILL.md: https://api.skillmd.com/api/skills/castorini/castorini-serve/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: castorini (https://skillmd.com/u/castorini)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/castorini/castorini-serve

---


# Castorini Serve

Serve the Castorini stack as cooperating local HTTP services.

Treat Anserini retrieval as the entry point, then add only the downstream services the user actually needs. Prefer `gpt-4o` as the default OpenAI-backed model for `rank_llm`, `ragnarok`, `nuggetizer`, and `umbrela` unless the user explicitly asks for a different model.

## Default Stack

Use this local port layout unless the user asks for different ports:

- `8081` — Anserini `RestServer`
- `8082` — `rank_llm serve http`
- `8083` — `ragnarok serve`
- `8084` — `umbrela serve`
- `8085` — `nuggetizer serve`

## Service Selection

- Retrieval only: serve Anserini through `io.anserini.api.RestServer`.
- Retrieval + rerank: add `rank_llm`.
- Retrieval + answer generation: use Anserini -> `ragnarok`, or Anserini -> `rank_llm` -> `ragnarok`.
- Retrieval + relevance judgment: use Anserini -> `umbrela`, or Anserini -> `rank_llm` -> `umbrela`.
- Retrieval + nugget creation: use Anserini -> `nuggetizer create`, or Anserini -> `rank_llm` -> `nuggetizer create`.
- Full answer-evaluation flow: keep the original retrieval or rerank payload for `nuggetizer create`, generate answers with `ragnarok`, then join the two envelopes for `nuggetizer assign`.

## Reference Files

- `references/service-recipes.md` — startup commands, port conventions, and per-service defaults
- `references/curl-pipelines.md` — direct curl, pipe, jq, and full multi-step examples

## Gotchas

- `rank_llm` serves HTTP as `rank-llm serve http ...`, not plain `rank-llm serve ...`.
- The Anserini fatjar skill documents standalone `RestServer` on `8080`, but the shared Castorini HTTP stack uses `8081` by convention so the other services can stay on `8082` through `8085`.
- `ragnarok`, `nuggetizer create`, and `umbrela` can accept raw Anserini search payloads directly because they normalize `{query, candidates}` inputs.
- `ragnarok`, `nuggetizer create`, and `umbrela` can also accept the `castorini.cli.v1` envelope returned by `rank_llm`, so a raw pipe from `rank_llm` usually works.
- `nuggetizer create` must consume the retrieval pool, not `ragnarok` answer output.
- `nuggetizer assign` does not consume a bare `ragnarok` envelope by itself; wrap `answer_envelope` plus `nugget_envelope`, or `answers_envelope` plus `nugget_envelope`, with `jq`.
- `umbrela` judges passage relevance, not answer quality. For answer quality, use the `ragnarok` plus `nuggetizer` path instead.

