SylphxModels

Use Claude Code with Sylphx AI

Claude Code speaks the Anthropic Messages API, and Sylphx AI serves it at POST /v1/messages. Change two environment variables and Claude Code runs on any model in the catalog, with your Sylphx key, your Sylphx bill, and the same streaming, tools, and caching you expect.

Set it upLink to this section

Two variables. Create a Sylphx API key with the ai:inference scope in the Sylphx console at sylphx.com.

Environment
export ANTHROPIC_BASE_URL=https://api.sylphx.ai
export ANTHROPIC_AUTH_TOKEN=sylphx_sk_...   # or ANTHROPIC_API_KEY
claude

Claude Code adds /v1/messages itself, so the base URL has no path. Both ANTHROPIC_AUTH_TOKEN (sent as a bearer token) and ANTHROPIC_API_KEY (sent as x-api-key) are accepted.

Pick a modelLink to this section

Use any catalog model id, for the main model and for subagents. You are not limited to Claude models.

Choose the model
claude --model openai/gpt-5.5

# or in your shell profile
export ANTHROPIC_MODEL=openai/gpt-5.5
export ANTHROPIC_SMALL_FAST_MODEL=openai/gpt-5.5

Browse ids and live prices in the model catalog. Claude Code's own model names work as they are: claude-opus-5-5 reaches anthropic/claude-opus-5-5, and a [1m] suffix names the same model. Switching the model never changes what Claude Code sends.

What Claude Code sends, and what it becomesLink to this section

Every field Claude Code uses is honoured, and each one is mapped onto the chosen model's own controls. The request is checked field by field, so nothing is quietly rewritten.

FieldTypeWhat it does
thinking.type = adaptiveobjectReasoning is on and the model's own reasoning control decides how hard to think. The depth comes from output_config.effort (medium when absent).
thinking.type = enabledobjectReasoning on. Effort is output_config.effort when set, otherwise high. budget_tokens is accepted; depth rides the effort ladder.
thinking.type = disabledobjectNo reasoning is requested.
thinking.display"omitted" | "summarized"summarized asks the model for a reasoning summary and returns it as thinking blocks. omitted asks for none; you get empty thinking blocks (or none) and a normal answer.
output_config.effortlow | medium | high | xhigh | maxBecomes the model's reasoning effort. A level the chosen model does not offer is handled as on Responses: clamped where the model has a nearest level, refused with a typed error otherwise.
messages[i].output_config.effortlow | medium | high | xhigh | maxPer-turn effort. Claude Code puts it on individual turns; the last one in the conversation wins and overrides the top-level output_config.effort. Only effort is allowed there.
messages[i].role: "system"messageA system (or developer) message in the middle of the conversation stays exactly where you put it, as a developer-level instruction. Text blocks only, with cache_control kept.
output_config.format{ type: "json_schema", schema }Structured output, delivered as the model’s JSON-schema output.
context_management.editsclear_thinking_*keep: "all" keeps every earlier thinking block (the default behaviour). keep: { type: "thinking_turns", value: N } keeps thinking only in the last N assistant turns.
tools, tool_choicearrayCustom tools and tool results work as on any Messages request, in parallel or one at a time.
streambooleanAnthropic server-sent events, including thinking, text, and tool-use blocks.
cache_controlobjectAccepted on system blocks, tools, and content blocks. Models that cache automatically need nothing from you.
?beta=true, anthropic-betaquery, headerAccepted. Beta flags are advisory and unknown flags are ignored; the request body decides what is used.

Accepted and not forwardedLink to this section

Three things are accepted on purpose and never sent to the model. They are documented no-ops, not silent losses.

  • safeguards: advisory client-side data (Claude Code sends a list of permission-classifier entries). Any JSON shape is accepted; it is not forwarded to the model.
  • cache_control.scope: global or org is accepted and dropped; the cache breakpoint itself is kept.
  • clear_thinking edits with keep: "all": already satisfied, because earlier thinking is replayed only to the model that produced it.

What returns a 400Link to this section

Anything Sylphx cannot honour is refused before any model runs, with a typed error that names the field, for example $.output_config.verbosity.

  • A field Sylphx does not support: an unknown top-level field, an unknown key inside thinking, output_config, or context_management.
  • thinking.display other than omitted or summarized, or an output_config.effort outside the list above, including the per-turn one. A per-turn output_config key other than effort, and a system message with anything but text blocks, are refused too.
  • context_management edits other than clear_thinking_* (for example clear_tool_uses_*), and a thinking_turns value that is not a positive integer.
  • output_config.format other than json_schema, and non-empty stop_sequences.
  • An unsupported anthropic-version.
NoteSame rules everywhere
These rules apply to every caller of POST /v1/messages, not only Claude Code.