client.prompts.render(slug, options?) resolves a prompt for the client’s projectId and env in a single request. Set format — on the client or per call — to get a result shaped for that provider; omit it to get the neutral result.
{ format?, label?, subject?, variables?, fallback?, onUnknownRole? }: label picks the label to resolve for this call (defaulting to the client’s env — env is a label value), format overrides the client default, subject (a stable id) pins a weighted release to a variant, and fallback is served on a network error. The return shape is fixed by the call’s format, not by the network outcome. Authored developer blocks render as-is; the SDK maps them per provider (OpenAI keeps developer, Anthropic folds them into system). onUnknownRole ("drop" default, "warn", or "error") sets how a message with an unrecognized role is handled during provider conversion — see Unknown roles.
Shaped result
With aformat, render returns a result you can spread straight into a provider request. format: "openai" returns { messages, config, metadata }; format: "anthropic" returns { system, messages, config, metadata } — the authored system and developer instructions are folded into a top-level system string, which Anthropic takes as a separate request field. When the prompt authors tools, the result also carries provider-shaped tools and tool_choice.
Spread the result into the request, and pass the whole result to
turn.headers(prompt) for the provenance headers:
Neutral result and converters
Omitformat (on both the client and the call) to get the neutral RenderedPrompt: messages, tools, toolChoice, promptId, version, versionId, releaseId, variantName, contentHash, label, slug, blockRenderRecord, and modelConfig. This is the path for providers the shaper does not cover (Vercel AI, LangChain) or for driving one prompt through more than one provider.
The @to11ai/sdk/gateway subpath converts a neutral result into a provider’s request shape:
gatewayAuthHeaders and gatewayPromptHeaders are also re-exported from the main @to11ai/sdk entry. With a format, render applies the message conversion for you, so most apps never call the converters directly.
Unknown roles
The message converters recognizesystem, user, assistant, developer, and tool. A message whose role is anything else is handled by the onUnknownRole policy — set it per call, on createClient, or on the converter directly:
render() this matters mainly when you convert your own message arrays (assembled conversation history, messages from another source). onUnknownRole: "error" on render() is a way to assert that invariant explicitly.