POST /v1/chat/completions is the OpenAI-compatible form for Claude. Set the Guard address, key and exact model in the SDK; other fields must follow the contract below. A server prompt is configured separately and does not require a different endpoint.
python
from openai import OpenAI
client = OpenAI(
api_key=KEY,
base_url="https://api.guardrelay.ai/v1",
)
resp = client.chat.completions.create(
model="claude-sonnet-5",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"},
],
)
print(resp.choices[0].message.content)All four families work here. Kimi passes unknown fields upstream as they are on this surface only: on the other two its field list is closed. Kimi fields are covered separately on the Kimi · Chat Completions page.
python
from openai import OpenAI
client = OpenAI(
api_key=KEY,
base_url="https://api.guardrelay.ai/v1",
)
resp = client.chat.completions.create(
model="k3",
messages=[{"role": "user", "content": "Hello!"}],
max_tokens=512,
)
print(resp.choices[0].message.content)python
from openai import OpenAI
client = OpenAI(
api_key=KEY,
base_url="https://api.guardrelay.ai/v1",
)
resp = client.chat.completions.create(
model="cursor-grok-4.6-medium",
messages=[{"role": "user", "content": "Hello!"}],
max_tokens=512,
)
print(resp.choices[0].message.content)python
from openai import OpenAI
client = OpenAI(
api_key=KEY,
base_url="https://api.guardrelay.ai/v1",
)
resp = client.chat.completions.create(
model="composer-2.5",
messages=[{"role": "user", "content": "Hello!"}],
max_tokens=512,
)
print(resp.choices[0].message.content)| What | How it works for Composer and Grok |
|---|---|
| Request fields | model, messages, max_tokens or max_completion_tokens, stream, tools |
| Both limits at once | max_tokens and max_completion_tokens in one request return 400; send one |
| Roles | user, assistant, plus system and developer as ordinary messages in the array |
| Content blocks | text blocks with exactly the type and text keys; Grok also takes image_url with inline base64 |
| Response | the ordinary OpenAI shape: choices[0].message.content, finish_reason: "stop", cache in usage.prompt_tokens_details.cached_tokens |
| Response with a tool call | choices[0].message.tool_calls with id, name and arguments, and finish_reason is tool_calls. You answer such a turn with a message whose role is tool |