RemoteRolloutProcessor delegates rollout execution to a remote HTTP service
that you control. It’s useful for implementing rollouts with your existing agent
codebase by wrapping it in an HTTP service.
High Level Flow

- /init triggers one rollout: Eval Protocol calls your service’s POST
/initwith the row payload and correlation metadata. - Send logs via
FireworksTracingHttpHandler: Your service emits structured logs tagged with the rollout’s correlation fields. - Send chat completions and store as trace: Your agent’s calls are recorded as traces in Fireworks.
- Once rollout finished, pull full trace and evaluate: Eval Protocol polls Fireworks for a completion signal, then loads the trace and scores it.
Everything inside the dotted box is handled by Eval Protocol — you only need to implement the Remote Server, more on this below.
API Contract
POST /init: We expect the remote service to implement a single /init endpoint that accepts anInitRequest with the following fields:
object
required
Dictionary containing model and optional parameters like temperature, max_tokens, etc.
array
Array of conversation messages
array
Array of available tools for the model
string
Base URL for the remote server to make LLM calls
object
required
Rollout execution metadata for correlation
string
API key to be used by the remote server
Request Example
Request Example
init_request.json
Metadata Correlation
When making model calls in your remote server, include the following metadata in your traces and logs so thateval-protocol can correlate them with the
corresponding EvaluationRows during result collection. RemoteRolloutProcessor
automatically generates this and sends it to the server, so you don’t need to worry
about wrangling metadata.
invocation_idexperiment_idrollout_idrun_idrow_id
Handling InitRequest in your Server
This section shows how to parse the InitRequest fields and call your model. Note: the model_base_url is a tracing.fireworks.ai URL that proxies your model calls so Fireworks can capture full traces for each rollout.
Below is a minimal FastAPI server showing how to wire this together.
remote_server.py
Signaling Rollout Completion
TheRemoteRolloutProcessor detects rollout completion by polling structured logs sent to Fireworks Tracing. Your remote server should use the appropriate SDK for your language to emit structured completion statuses.
- TypeScript / Node (Vercel)
- Python
The
eval-protocol JS/TS SDK provides equivalent helpers:withFireworksLogging: Wraps your handler to automatically send structured logs to Fireworks Tracing.createRolloutLogger: Creates a rollout-scoped logger tagged with the currentrollout_id.Status/mapOpenAIErrorToStatus: Helpers for emitting structured completion and error statuses.
api/init.ts
Alternative: Environment Variable Approach
For the following setups, you can use theEP_ROLLOUT_ID environment variable instead of manual filters:
- One rollout is processed per server instance
remote_server.py
/initspawns separate Python processes
remote_server.py
How RemoteRolloutProcessor uses Fireworks Tracing
- Remote server logs completion: Uses
Status.rollout_finished()orStatus.rollout_error() - RemoteRolloutProcessor polls: Searches logs by
rollout_idtag until completion found - Status extraction: Reads structured status fields (
code,message,details)
Multi-Agent Setup Fine-tuning / Artifact Storage
One other use-case theRemoteRolloutProcessor enables is fine-tuning on multi-agent setups by storing artifacts. For example, let’s say you have a Deep Research multi-agent setup and you want to fine-tune the first subagent, but the evaluation is on the artifact produced at the end of this entire multi-agent pipeline, e.g. the final deep research output. To accomplish this, we must store the artifact and correlate it with the subagent’s output.
Pass custom data in the extras field when logging completion status:
- TypeScript / Node (Vercel)
- Python
api/init.ts
RemoteRolloutProcessor automatically extracts extras from the completion log and stores them in row.execution_metadata.extra. Access them in your evaluation function:
test_deep_research.py
Handling Rollout Failures
Rollouts can fail for various reasons: your remote server might crash, tracing might fail, or the model might not produce an assistant response. TheRemoteRolloutProcessor automatically detects these failures and sets row.rollout_status accordingly.
The most common failure is when the rollout produces no assistant response. The SDK detects this and sets row.rollout_status to Internal (13) with the message “Rollout finished with the same number of messages as the original row”.
Even when a rollout fails, your evaluation function is still called—giving you control over how to handle errors.
row.rollout_status.is_error() at the start of your evaluation function to catch failed rollouts. This method returns True when the status code is INTERNAL:
test_my_eval.py
test_my_eval.py

