Saltar para o conteúdo principal

OpenAPI 3.1

Referência da API de cliente

Esta página descreve o pedido e a resposta de inferência de cliente suportados. Descarregue o documento OpenAPI legível por máquina para utilizar com ferramentas.

Descarregar JSON OpenAPI

Exemplos de API para modelos

Escolha um identificador de modelo publicado, protocolo de API e idioma para ver um exemplo de pedido. Mantenha as chaves de API dos clientes num servidor de confiança.

Requisitos do protocolo

Os pedidos compatíveis com OpenAI usam POST /chat/completions no URL base de API do cliente configurado (por predefinição https://fusionpointai.com/api/v1). Autentique com Authorization: Bearer e uma chave de cliente com acesso à inferência. O URL completo predefinido é https://fusionpointai.com/api/v1/chat/completions.

Capacidades suportadas

O endpoint atual de chat compatível com OpenAI processa mensagens de texto síncronas. Este endpoint não suporta streaming nem chamadas a ferramentas.

Instalar um cliente

Instale os clientes de Python e Node.js como pacotes separados:

Python: pip install openai anthropic

Node.js: npm install openai @anthropic-ai/sdk

cURL
curl 'https://fusionpointai.com/api/v1/chat/completions' \
  -H "Authorization: Bearer $FUSIONPOINTAI_API_KEY" \
  -H "Content-Type: application/json" \
  --data '{
    "model": "Astra 6",
    "messages": [
        {
            "role": "user",
            "content": "Summarize this in one sentence."
        }
    ],
    "temperature": 0.7,
    "max_tokens": 300
}'

Padrões de pedido

Configurar chaves de API em segurança

Crie uma chave de API de cliente com acesso à inferência e disponibilize-a a um processo no servidor através do gestor de segredos ou do ambiente.

  1. Defina FUSIONPOINTAI_API_KEY no ambiente do servidor; não inclua a chave no código do browser nem a submeta no controlo de versões.
  2. Use HTTPS e limite a chave à conta e às permissões de inferência necessárias à aplicação.
  3. Oculte os cabeçalhos authorization e x-api-key em registos, rastos e pedidos de suporte; revogue uma chave se puder ter sido exposta.
Bash
export FUSIONPOINTAI_API_KEY="YOUR_CUSTOMER_API_KEY"

Selecionar um identificador exato de modelo

O campo model é um valor de encaminhamento, não um rótulo de apresentação. Escolha um identificador publicado no catálogo atual de modelos.

  1. Selecione um modelo ativo ou legado marcado como disponível para inferência.
  2. Copie o identificador exatamente, incluindo pontuação e sufixos de versão; nunca o deduza do nome do modelo.
  3. Se não houver identificador publicado, aguarde que o catálogo o forneça em vez de adivinhar um valor.
Python
model_id = "Astra 6"
# Use this exact identifier with either protocol.

Enviar mensagens de sistema e de várias interações

Mantenha as mensagens da conversa pela ordem original e use apenas as funções e estruturas de conteúdo suportadas pelo protocolo e modelo selecionados.

  1. Nos pedidos compatíveis com OpenAI, envie mensagens system, user e assistant ordenadas, com conteúdo em texto.
  2. Em Claude Messages, envie a instrução de sistema suportada e os turnos user/assistant ordenados nos campos nativos do protocolo.
  3. Conserve apenas o contexto de conversa necessário à aplicação e respeite os limites de contexto do modelo.
Python
response = client.messages.create(
    model="Astra 6",
    max_tokens=512,
    system="Answer in clear, concise German.",
    messages=[
        {"role": "user", "content": "What is an API?"},
        {"role": "assistant", "content": "An API lets software exchange requests and responses."},
        {"role": "user", "content": "Give a practical example."},
    ],
)
for block in response.content:
    if block.type == "text":
        print(block.text)

Pedir respostas JSON

Quando a aplicação precisar de saída estruturada, valide a resposta face ao seu próprio esquema antes de a utilizar.

  1. Use os controlos de saída estruturada suportados pelo protocolo escolhido e pelo modelo upstream selecionado.
  2. Trate o JSON gerado como entrada não fiável: analise-o, valide campos e tipos obrigatórios e trate saídas inválidas.
  3. Não presuma que uma combinação de modelo e protocolo suporta modo JSON sem confirmação na documentação do modelo.
Python
import json

# JSON is generated content, not trusted application input.
response = client.messages.create(
    model="Astra 6", max_tokens=256,
    messages=[{"role": "user", "content": 'Return only JSON with a string field named "summary". Explain an API in one sentence.'}],
)
text = "".join(block.text for block in response.content if block.type == "text")
try:
    result = json.loads(text)
    if not isinstance(result, dict) or not isinstance(result.get("summary"), str):
        raise ValueError("Unexpected response schema")
    print(result["summary"])
except (json.JSONDecodeError, ValueError) as error:
    print("Handle invalid model output:", error)

Receber saída SSE em tempo real

O streaming depende do protocolo e do modelo upstream selecionados; uma resposta JSON normal não é um fluxo.

  1. O chat compatível com OpenAI devolve atualmente texto síncrono e não fornece streaming.
  2. Em Claude Messages, use o modo stream quando o modelo upstream o suportar; o proxy encaminha eventos nativos enviados pelo servidor.
  3. Consuma eventos à medida que chegam, termine corretamente ao concluir ou ocorrer um erro e não trate saída parcial como resposta completa.
Python
# client is the Anthropic client configured above.
with client.messages.stream(
    model="Astra 6", max_tokens=512,
    messages=[{"role": "user", "content": "Explain API authentication."}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)
    final_message = stream.get_final_message()
print("\nStop reason:", final_message.stop_reason)

Tratar ferramentas, blocos de conteúdo e erros

Mantenha intactas as estruturas nativas do protocolo e defina explicitamente o comportamento da aplicação para chamadas a ferramentas, conteúdo multimodal e falhas.

  1. O chat compatível com OpenAI não suporta atualmente chamadas a ferramentas nem blocos de conteúdo não textual.
  2. Claude preserva blocos nativos e dados de utilização/resultados de ferramentas quando o modelo upstream os suporta; valide nomes e argumentos antes de executar ferramentas.
  3. Verifique o estado HTTP e o corpo da resposta, distinga falhas de autenticação, permissão, validação e limite e repita erros transitórios com espera crescente.
Python
import json
from datetime import datetime, timezone
from anthropic import APIError

messages = [{"role": "user", "content": "What time is it in UTC?"}]
tools = [{
    "name": "current_utc_time", "description": "Read the current UTC time.",
    "input_schema": {"type": "object", "properties": {}, "additionalProperties": False},
}]
try:
    reply = client.messages.create(model="Astra 6", max_tokens=256, messages=messages, tools=tools)
    results = []
    for block in reply.content:
        if block.type == "tool_use":
            if block.name != "current_utc_time" or block.input != {}:
                raise ValueError("Unapproved tool request")
            results.append({"type": "tool_result", "tool_use_id": block.id,
                            "content": json.dumps({"utc": datetime.now(timezone.utc).isoformat()})})
    if results:
        messages.append({"role": "assistant", "content": reply.content})
        messages.append({"role": "user", "content": results})
        reply = client.messages.create(model="Astra 6", max_tokens=256, messages=messages, tools=tools)
    print("".join(block.text for block in reply.content if block.type == "text"))
except APIError as error:
    # Log status only; never log keys or private prompts.
    print("API request failed:", getattr(error, "status_code", None))

Perguntas frequentes

Posso usar o nome apresentado do modelo num pedido?

Use apenas o identificador exato publicado para inferência. O nome apresentado não é um valor de encaminhamento e nunca deve adivinhar um identificador não publicado.

Que variável de ambiente contém a chave do cliente?

Use FUSIONPOINTAI_API_KEY nos dois protocolos. Mantenha o valor num ambiente de servidor de confiança, fora do código cliente e dos registos.

Que URL deve usar o cliente OpenAI?

Use o URL base configurado para a API do cliente, cujo valor predefinido é https://fusionpointai.com/api/v1. O endpoint de chat acrescenta /chat/completions.

Porque difere o URL base do Claude SDK do usado em cURL?

O Anthropic SDK acrescenta /v1/messages; defina o URL base como https://fusionpointai.com/api. Um pedido HTTP direto usa o URL completo /api/v1/messages.

O chat compatível com OpenAI suporta streaming ou ferramentas?

Não. O endpoint atual suporta apenas mensagens de texto síncronas; streaming e chamadas a ferramentas não estão disponíveis.

Todos os modelos Claude suportam blocos, ferramentas ou streaming?

Não. Estas funcionalidades nativas são preservadas quando o modelo upstream selecionado as suporta. Consulte as capacidades do modelo e trate pedidos não suportados.

Claude Messages · POST /messages

Os pedidos Claude Messages usam POST /api/v1/messages. Envie a chave do cliente em x-api-key e defina anthropic-version como 2023-06-01. O URL base do Anthropic SDK é https://fusionpointai.com/api, porque o SDK acrescenta /v1/messages; também é suportada autenticação bearer.

O proxy Claude Messages preserva blocos de conteúdo nativos, dados de ferramentas e streaming real de eventos enviados pelo servidor quando o modelo upstream selecionado os suporta.

CampoTipoObrigatórioRestrições
model string Sim {"minLength":1,"maxLength":160}
max_tokens integer Sim {"minimum":1,"maximum":100000}
messages array Sim {"minItems":1,"maxItems":100,"items":{"type":"object","required":["role","content"],"properties":{"role":{"type":"string","enum":["user","assistant"]},"content":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"object","required":["type"],"properties":{"type":{"type":"string","maxLength":80}},"additionalProperties":true}}]}}}}
system string | array Não {"oneOf":[{"type":"string"},{"type":"array","items":{"type":"object","required":["type","text"],"properties":{"type":{"const":"text"},"text":{"type":"string"}},"additionalProperties":true}}]}
stream boolean Não {"default":false}
temperature number Não {"minimum":0,"maximum":1}
top_p number Não {"minimum":0,"maximum":1}
top_k integer Não {"minimum":0,"maximum":100000}
stop_sequences array Não {"items":{"type":"string"}}
tools array Não {"items":{"type":"object","additionalProperties":true}}
tool_choice object Não {"additionalProperties":true}
thinking object Não {"additionalProperties":true}
metadata object Não {"additionalProperties":true}
output_config object Não {"additionalProperties":true}
service_tier string Não []
Claude Messages · Exemplo
{
    "id": "msg_example",
    "type": "message",
    "role": "assistant",
    "model": "Astra 6",
    "content": [
        {
            "type": "text",
            "text": "A concise answer to the supplied question."
        }
    ],
    "stop_reason": "end_turn",
    "stop_sequence": null,
    "usage": {
        "input_tokens": 12,
        "output_tokens": 10
    }
}
{"type":"error","error":{"type":"authentication_error","message":"Invalid or missing API key."}}

Início rápido com SDK

Utilize o URL base de produção com um cliente Python ou Node.js compatível, ou envie o mesmo pedido JSON com cURL.

URL base da API: https://fusionpointai.com/api/v1

Envie a chave de API de cliente no cabeçalho Authorization: Bearer. A chave tem de ter o âmbito ai:inference e acesso da conta ao serviço. Guarde-a num servidor de confiança.

Shell
# Install the client for your application language.
# Python:
python -m pip install openai
# Node.js:
npm install openai

# Bash: enter the key without storing it in shell history.
read -rs -p 'FusionPointAI API key: ' FUSIONPOINTAI_API_KEY
export FUSIONPOINTAI_API_KEY
printf '\n'
# After finishing:
# unset FUSIONPOINTAI_API_KEY
cURL
curl 'https://fusionpointai.com/api/v1/chat/completions' \
  -H "Authorization: Bearer $FUSIONPOINTAI_API_KEY" \
  -H "Content-Type: application/json" \
  --data '{
    "model": "Jurassic-2",
    "messages": [
        {
            "role": "user",
            "content": "Summarize this in one sentence."
        }
    ],
    "temperature": 0.7,
    "max_tokens": 300
}'
Python
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["FUSIONPOINTAI_API_KEY"],
    base_url="https://fusionpointai.com/api/v1",
)

response = client.chat.completions.create(
    model="Jurassic-2",
    messages=[{"role": "user", "content": "Summarize this in one sentence."}],
    temperature=0.7,
    max_tokens=300,
)
print(response.choices[0].message.content)
Node.js
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.FUSIONPOINTAI_API_KEY,
  baseURL: "https://fusionpointai.com/api/v1",
});

const response = await client.chat.completions.create({
  model: "Jurassic-2",
  messages: [{ role: "user", content: "Summarize this in one sentence." }],
  temperature: 0.7,
  max_tokens: 300,
});
console.log(response.choices[0].message.content);

OpenAI · Campos do pedido

Os valores de modelo são os identificadores exatos registados e atualmente publicados para inferência. Se não houver nenhum publicado, consulte o catálogo de fornecedores antes de enviar um pedido.

CampoTipoObrigatórioRestrições
modelstringSimNo máximo, 160 caracteres; utilize um identificador exato publicado.
messagesarraySim1 a 100 mensagens, enviadas pela ordem indicada.
messages[].rolestringSimsystem, user ou assistant.
messages[].contentstringSimNo máximo, 100 000 caracteres por mensagem.
temperaturenumberNãoEntre 0 e 2.
max_tokensintegerNãoEntre 1 e 100 000; o modelo pode impor um limite inferior.

Resposta bem-sucedida

Uma resposta JSON bem-sucedida contém id, object (chat.completion), created, model e choices. Uma opção inclui index, uma mensagem assistant e finish_reason. Também podem ser devolvidos dados de utilização de tokens.

Exemplo · JSON
{
    "id": "chatcmpl_example",
    "object": "chat.completion",
    "created": 1700000000,
    "model": "Jurassic-2",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "A concise summary of the supplied text."
            },
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 12,
        "completion_tokens": 10,
        "total_tokens": 22
    }
}
CampoTipoSignificado
idstringIdentificador único da conclusão.
objectstringTipo de resposta: chat.completion.
createdintegerHora de criação em formato de carimbo de data/hora Unix.
modelstringIdentificador do modelo utilizado para a conclusão.
choicesarrayAlternativas de conclusão com uma mensagem assistant e um motivo de conclusão.
usageobjectContagens de tokens, quando devolvidas.

Limites de pedidos e erros

As subscrições de clientes em produção não contabilizam pedidos nem tokens face a uma quota; as chaves sandbox usam a franquia mensal publicada. Continuam a aplicar-se janelas de contexto, limites de saída e controlos temporários de tráfego. Chat Completions é texto síncrono; Claude Messages preserva blocos de conteúdo nativos, ferramentas e SSE suportados. Consulte os esquemas de cada operação antes de enviar pedidos.

A operação de conversação devolve as falhas de validação e do fornecedor num objeto de erro. O middleware de autenticação e de âmbito pode, em alternativa, devolver um campo message no nível superior; o estado e o formato da resposta dependem da camada que rejeitou o pedido.

Estado HTTPSignificado
200Conclusão criada com êxito.
400Corpo do pedido ou parâmetro inválido.
401Chave de API bearer em falta ou inválida.
403Falta o âmbito obrigatório da chave ou o acesso à conta.
429Foi aplicado um limite da aplicação ou um controlo temporário de tráfego a montante; volte a tentar com intervalos crescentes.
500O serviço não conseguiu devolver uma conclusão utilizável.
Descarregar JSON OpenAPI
{
    "openapi": "3.1.0",
    "info": {
        "title": "FusionPointAI Customer API",
        "version": "1.0.0",
        "description": "OpenAI-compatible synchronous text Chat Completions and native Claude Messages. Use https://fusionpointai.com/api/v1 as the production HTTP base URL. Claude SDKs use the base without /v1 because they append /v1/messages. Model capabilities, subscription permissions and technical limits still apply. Native streaming and content blocks belong to the Messages operation, not Chat Completions."
    },
    "servers": [
        {
            "url": "https://fusionpointai.com/api/v1",
            "description": "FusionPointAI Production API"
        }
    ],
    "security": [
        {
            "bearerAuth": []
        }
    ],
    "tags": [
        {
            "name": "Inference",
            "description": "Synchronous JSON chat completion"
        }
    ],
    "x-rateLimitPolicy": {
        "type": "unmetered_subscription",
        "summary": "Live subscriptions do not meter request or token usage against a quota; sandbox keys use their published monthly allowance.",
        "technical_constraints": "Model context windows, maximum output sizes, and temporary traffic controls may still apply according to the selected model or upstream provider."
    },
    "x-errorReference": [
        {
            "status": 200,
            "description": "The completion was created successfully."
        },
        {
            "status": 400,
            "description": "The request body or one of its parameters is invalid."
        },
        {
            "status": 401,
            "description": "The bearer API key is missing or invalid."
        },
        {
            "status": 403,
            "description": "The key lacks the required inference scope or account access."
        },
        {
            "status": 429,
            "description": "The request was limited by application throttling or an upstream provider."
        },
        {
            "status": 500,
            "description": "The service could not complete the request."
        }
    ],
    "paths": {
        "/chat/completions": {
            "post": {
                "tags": [
                    "Inference"
                ],
                "summary": "Create a chat completion",
                "operationId": "createChatCompletion",
                "description": "Create a synchronous JSON completion. Messages support system, user, and assistant roles with string content. Use the separate Messages operation for native Claude content blocks and SSE.",
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "x-codeSamples": [
                    {
                        "lang": "cURL",
                        "label": "cURL",
                        "source": "curl 'https://fusionpointai.com/api/v1/chat/completions' \\\n  -H \"Authorization: Bearer $FUSIONPOINTAI_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  --data '{\n    \"model\": \"Jurassic-2\",\n    \"messages\": [\n        {\n            \"role\": \"user\",\n            \"content\": \"Summarize this in one sentence.\"\n        }\n    ],\n    \"temperature\": 0.7,\n    \"max_tokens\": 300\n}'"
                    },
                    {
                        "lang": "Python",
                        "label": "Python",
                        "source": "import os\nfrom openai import OpenAI\n\nclient = OpenAI(\n    api_key=os.environ[\"FUSIONPOINTAI_API_KEY\"],\n    base_url=\"https://fusionpointai.com/api/v1\",\n)\n\nresponse = client.chat.completions.create(\n    model=\"Jurassic-2\",\n    messages=[{\"role\": \"user\", \"content\": \"Summarize this in one sentence.\"}],\n    temperature=0.7,\n    max_tokens=300,\n)\nprint(response.choices[0].message.content)"
                    },
                    {
                        "lang": "Node.js",
                        "label": "Node.js",
                        "source": "import OpenAI from \"openai\";\n\nconst client = new OpenAI({\n  apiKey: process.env.FUSIONPOINTAI_API_KEY,\n  baseURL: \"https://fusionpointai.com/api/v1\",\n});\n\nconst response = await client.chat.completions.create({\n  model: \"Jurassic-2\",\n  messages: [{ role: \"user\", content: \"Summarize this in one sentence.\" }],\n  temperature: 0.7,\n  max_tokens: 300,\n});\nconsole.log(response.choices[0].message.content);"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ChatCompletionRequest"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Completion created",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ChatCompletionResponse"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/BadRequest"
                    },
                    "401": {
                        "$ref": "#/components/responses/Unauthorised"
                    },
                    "403": {
                        "$ref": "#/components/responses/Forbidden"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimited"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerError"
                    }
                }
            }
        },
        "/messages": {
            "post": {
                "tags": [
                    "Inference"
                ],
                "summary": "Create a Claude Messages response",
                "operationId": "createMessage",
                "description": "Native Messages format. The model must support the requested content blocks, tools and streaming options. The gateway forwards provider-native JSON or real SSE without translating it into Chat Completions. A configured native upstream is required. Maximum JSON request size: 12 MiB.",
                "security": [
                    {
                        "claudeApiKey": []
                    },
                    {
                        "bearerAuth": []
                    }
                ],
                "parameters": [
                    {
                        "in": "header",
                        "name": "anthropic-version",
                        "schema": {
                            "type": "string",
                            "maxLength": 64
                        },
                        "example": "2023-06-01"
                    },
                    {
                        "in": "header",
                        "name": "anthropic-beta",
                        "schema": {
                            "type": "string",
                            "maxLength": 512
                        }
                    }
                ],
                "x-codeSamples": [
                    {
                        "lang": "cURL",
                        "label": "cURL",
                        "source": "curl 'https://fusionpointai.com/api/v1/messages' \\\n  -H \"x-api-key: $FUSIONPOINTAI_API_KEY\" \\\n  -H \"anthropic-version: 2023-06-01\" \\\n  -H \"Content-Type: application/json\" \\\n  --data '{\n    \"model\": \"Jurassic-2\",\n    \"max_tokens\": 300,\n    \"messages\": [\n        {\n            \"role\": \"user\",\n            \"content\": \"Summarize this in one sentence.\"\n        }\n    ]\n}'"
                    },
                    {
                        "lang": "Python",
                        "label": "Python",
                        "source": "import os\nfrom anthropic import Anthropic\n\nclient = Anthropic(\n    api_key=os.environ[\"FUSIONPOINTAI_API_KEY\"],\n    base_url=\"https://fusionpointai.com/api\",\n)\n\nresponse = client.messages.create(\n    model=\"Jurassic-2\",\n    max_tokens=300,\n    messages=[{\"role\": \"user\", \"content\": \"Summarize this in one sentence.\"}],\n)\nprint(response.content)"
                    },
                    {
                        "lang": "Node.js",
                        "label": "Node.js",
                        "source": "import Anthropic from \"@anthropic-ai/sdk\";\n\nconst client = new Anthropic({\n  apiKey: process.env.FUSIONPOINTAI_API_KEY,\n  baseURL: \"https://fusionpointai.com/api\",\n});\n\nconst response = await client.messages.create({\n  model: \"Jurassic-2\",\n  max_tokens: 300,\n  messages: [{ role: \"user\", content: \"Summarize this in one sentence.\" }],\n});\nconsole.log(response.content);"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ClaudeMessagesRequest"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Native message or incremental native SSE events.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ClaudeMessage"
                                }
                            },
                            "text/event-stream": {
                                "schema": {
                                    "type": "string",
                                    "description": "message_start, content_block_start/delta/stop, message_delta/stop and provider error events as delivered upstream."
                                }
                            }
                        }
                    },
                    "201": {
                        "description": "Invalid JSON, message structure, field type or bounds.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ClaudeError"
                                }
                            }
                        }
                    },
                    "202": {
                        "description": "Missing, invalid, conflicting or query-string credentials.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ClaudeError"
                                }
                            }
                        }
                    },
                    "203": {
                        "description": "Scope, account or training-reference permission denied.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ClaudeError"
                                }
                            }
                        }
                    },
                    "204": {
                        "description": "Request exceeds 12 MiB.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ClaudeError"
                                }
                            }
                        }
                    },
                    "205": {
                        "description": "Application or upstream rate limit.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ClaudeError"
                                }
                            }
                        }
                    },
                    "206": {
                        "description": "Inference provider or service failure.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ClaudeError"
                                }
                            }
                        }
                    },
                    "207": {
                        "description": "Inference provider or service failure.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ClaudeError"
                                }
                            }
                        }
                    },
                    "208": {
                        "description": "Native upstream or server credentials are not configured.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ClaudeError"
                                }
                            }
                        }
                    },
                    "209": {
                        "description": "Upstream overloaded.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ClaudeError"
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    "components": {
        "securitySchemes": {
            "bearerAuth": {
                "type": "http",
                "scheme": "bearer",
                "bearerFormat": "API key"
            },
            "claudeApiKey": {
                "type": "apiKey",
                "in": "header",
                "name": "x-api-key"
            }
        },
        "schemas": {
            "ChatCompletionRequest": {
                "type": "object",
                "required": [
                    "model",
                    "messages"
                ],
                "properties": {
                    "model": {
                        "type": "string",
                        "maxLength": 160,
                        "enum": [
                            "Jurassic-2",
                            "Claude Fable 5.1",
                            "claude-opus-5-5",
                            "claude-sonnet-5-5",
                            "claude-haiku-5-5",
                            "Claude Opus 5",
                            "Claude Fable 5",
                            "Claude Mythos 5",
                            "Claude Sonnet 5",
                            "Claude Opus 4.8",
                            "Claude Haiku 4.5",
                            "command-a-plus-05-2026",
                            "command-a-reasoning-08-2025",
                            "command-a-vision-07-2025",
                            "command-a-translate-08-2025",
                            "embed-v5.0-pro",
                            "embed-v5.0-fast",
                            "rerank-v5.0-pro",
                            "rerank-v5.0-fast",
                            "Command R",
                            "Command R+",
                            "Embed",
                            "Rerank",
                            "deepseek-flash",
                            "DeepSeek V4",
                            "GLM-5.3",
                            "glm-5.3-flashx",
                            "GLM-5.3 Flash",
                            "GLM-4.7",
                            "kimi-k3.1-pro",
                            "kimi-k3.1-pro-highspeed",
                            "Kimi K3",
                            "Kimi K2.7 Code",
                            "Kimi K2.6",
                            "Kimi K2.5",
                            "Astra 6",
                            "gpt-6.1-sol",
                            "gpt-6.1-terra",
                            "gpt-6-luna",
                            "GPT-5.6 Sol",
                            "GPT-5.6 Terra",
                            "GPT-5.6 Luna",
                            "GPT-5.5",
                            "GPT-5.4",
                            "GPT-5.4 mini",
                            "GPT-5.4 nano",
                            "qwen3.8-max",
                            "qwen3.8-flash",
                            "qwen3.8-omni-flash",
                            "qwen3.7-plus",
                            "Qwen3.8",
                            "Qwen3 Coder Next",
                            "Qwen3-VL"
                        ],
                        "description": "An exact registered model identifier currently published for inference."
                    },
                    "messages": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 100,
                        "items": {
                            "$ref": "#/components/schemas/ChatMessage"
                        }
                    },
                    "temperature": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 2
                    },
                    "max_tokens": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100000,
                        "description": "The selected model may impose a lower output limit."
                    }
                }
            },
            "ChatMessage": {
                "type": "object",
                "required": [
                    "role",
                    "content"
                ],
                "properties": {
                    "role": {
                        "type": "string",
                        "enum": [
                            "system",
                            "user",
                            "assistant"
                        ]
                    },
                    "content": {
                        "type": "string",
                        "maxLength": 100000
                    }
                }
            },
            "ChatCompletionResponse": {
                "type": "object",
                "required": [
                    "id",
                    "object",
                    "model",
                    "choices"
                ],
                "properties": {
                    "id": {
                        "type": "string"
                    },
                    "object": {
                        "type": "string",
                        "example": "chat.completion"
                    },
                    "created": {
                        "type": "integer"
                    },
                    "model": {
                        "type": "string"
                    },
                    "choices": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ChatChoice"
                        }
                    },
                    "usage": {
                        "$ref": "#/components/schemas/TokenUsage"
                    }
                }
            },
            "ChatChoice": {
                "type": "object",
                "properties": {
                    "index": {
                        "type": "integer"
                    },
                    "message": {
                        "$ref": "#/components/schemas/ChatMessage"
                    },
                    "finish_reason": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "TokenUsage": {
                "type": "object",
                "properties": {
                    "prompt_tokens": {
                        "type": "integer"
                    },
                    "completion_tokens": {
                        "type": "integer"
                    },
                    "total_tokens": {
                        "type": "integer"
                    }
                }
            },
            "Error": {
                "oneOf": [
                    {
                        "$ref": "#/components/schemas/OperationError"
                    },
                    {
                        "$ref": "#/components/schemas/MiddlewareError"
                    }
                ]
            },
            "OperationError": {
                "type": "object",
                "required": [
                    "error"
                ],
                "properties": {
                    "error": {
                        "type": "object",
                        "required": [
                            "message",
                            "type",
                            "code"
                        ],
                        "properties": {
                            "message": {
                                "type": "string"
                            },
                            "type": {
                                "type": "string"
                            },
                            "code": {
                                "type": [
                                    "string",
                                    "integer",
                                    "null"
                                ]
                            },
                            "details": {
                                "type": "object",
                                "additionalProperties": {
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "MiddlewareError": {
                "type": "object",
                "required": [
                    "message"
                ],
                "properties": {
                    "message": {
                        "type": "string"
                    }
                },
                "additionalProperties": true
            },
            "ClaudeMessagesRequest": {
                "type": "object",
                "required": [
                    "model",
                    "max_tokens",
                    "messages"
                ],
                "properties": {
                    "model": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 160,
                        "enum": [
                            "Jurassic-2",
                            "Claude Fable 5.1",
                            "claude-opus-5-5",
                            "claude-sonnet-5-5",
                            "claude-haiku-5-5",
                            "Claude Opus 5",
                            "Claude Fable 5",
                            "Claude Mythos 5",
                            "Claude Sonnet 5",
                            "Claude Opus 4.8",
                            "Claude Haiku 4.5",
                            "command-a-plus-05-2026",
                            "command-a-reasoning-08-2025",
                            "command-a-vision-07-2025",
                            "command-a-translate-08-2025",
                            "embed-v5.0-pro",
                            "embed-v5.0-fast",
                            "rerank-v5.0-pro",
                            "rerank-v5.0-fast",
                            "Command R",
                            "Command R+",
                            "Embed",
                            "Rerank",
                            "deepseek-flash",
                            "DeepSeek V4",
                            "GLM-5.3",
                            "glm-5.3-flashx",
                            "GLM-5.3 Flash",
                            "GLM-4.7",
                            "kimi-k3.1-pro",
                            "kimi-k3.1-pro-highspeed",
                            "Kimi K3",
                            "Kimi K2.7 Code",
                            "Kimi K2.6",
                            "Kimi K2.5",
                            "Astra 6",
                            "gpt-6.1-sol",
                            "gpt-6.1-terra",
                            "gpt-6-luna",
                            "GPT-5.6 Sol",
                            "GPT-5.6 Terra",
                            "GPT-5.6 Luna",
                            "GPT-5.5",
                            "GPT-5.4",
                            "GPT-5.4 mini",
                            "GPT-5.4 nano",
                            "qwen3.8-max",
                            "qwen3.8-flash",
                            "qwen3.8-omni-flash",
                            "qwen3.7-plus",
                            "Qwen3.8",
                            "Qwen3 Coder Next",
                            "Qwen3-VL"
                        ]
                    },
                    "max_tokens": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100000
                    },
                    "messages": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 100,
                        "items": {
                            "type": "object",
                            "required": [
                                "role",
                                "content"
                            ],
                            "properties": {
                                "role": {
                                    "type": "string",
                                    "enum": [
                                        "user",
                                        "assistant"
                                    ]
                                },
                                "content": {
                                    "oneOf": [
                                        {
                                            "type": "string"
                                        },
                                        {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "required": [
                                                    "type"
                                                ],
                                                "properties": {
                                                    "type": {
                                                        "type": "string",
                                                        "maxLength": 80
                                                    }
                                                },
                                                "additionalProperties": true
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "system": {
                        "oneOf": [
                            {
                                "type": "string"
                            },
                            {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "required": [
                                        "type",
                                        "text"
                                    ],
                                    "properties": {
                                        "type": {
                                            "const": "text"
                                        },
                                        "text": {
                                            "type": "string"
                                        }
                                    },
                                    "additionalProperties": true
                                }
                            }
                        ]
                    },
                    "stream": {
                        "type": "boolean",
                        "default": false
                    },
                    "temperature": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                    },
                    "top_p": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                    },
                    "top_k": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 100000
                    },
                    "stop_sequences": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "tools": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "additionalProperties": true
                        }
                    },
                    "tool_choice": {
                        "type": "object",
                        "additionalProperties": true
                    },
                    "thinking": {
                        "type": "object",
                        "additionalProperties": true
                    },
                    "metadata": {
                        "type": "object",
                        "additionalProperties": true
                    },
                    "output_config": {
                        "type": "object",
                        "additionalProperties": true
                    },
                    "service_tier": {
                        "type": "string"
                    }
                },
                "additionalProperties": true
            },
            "ClaudeMessage": {
                "type": "object",
                "required": [
                    "type",
                    "content"
                ],
                "properties": {
                    "id": {
                        "type": "string"
                    },
                    "type": {
                        "const": "message"
                    },
                    "role": {
                        "const": "assistant"
                    },
                    "content": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "required": [
                                "type"
                            ],
                            "properties": {
                                "type": {
                                    "type": "string",
                                    "maxLength": 80
                                }
                            },
                            "additionalProperties": true
                        }
                    },
                    "model": {
                        "type": "string"
                    },
                    "stop_reason": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "usage": {
                        "type": "object",
                        "properties": {
                            "input_tokens": {
                                "type": "integer"
                            },
                            "output_tokens": {
                                "type": "integer"
                            }
                        },
                        "additionalProperties": true
                    }
                },
                "additionalProperties": true
            },
            "ClaudeError": {
                "type": "object",
                "required": [
                    "type",
                    "error"
                ],
                "properties": {
                    "type": {
                        "const": "error"
                    },
                    "error": {
                        "type": "object",
                        "required": [
                            "type",
                            "message"
                        ],
                        "properties": {
                            "type": {
                                "type": "string"
                            },
                            "message": {
                                "type": "string"
                            }
                        }
                    }
                }
            }
        },
        "responses": {
            "BadRequest": {
                "description": "Invalid request body or parameter.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            },
            "Unauthorised": {
                "description": "Missing or invalid bearer API key.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            },
            "Forbidden": {
                "description": "The key lacks the required inference scope or account access.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            },
            "RateLimited": {
                "description": "Application throttle or temporary upstream traffic control.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            },
            "ServerError": {
                "description": "The service could not return a usable completion.",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            }
        }
    }
}