ShvIA

Docs · API compatível com OpenAI

Modelos

O id de um modelo nomeia o modelo e onde ele roda. Esta página explica os ids, as listas que os devolvem e como saber quais modelos você realmente pode chamar.

Ids de modelo#

O id canônico é <model>@<server>:

Estes ids são exemplos.

IdSignificado
claude-sonnet-4-6@anthropico modelo claude-sonnet-4-6, servido pelo provedor anthropic
gpt-4o@openaio modelo gpt-4o, servido pelo provedor openai
anthropic/claude-opus-4.8@kiloum nome de modelo que contém / e ., servido pelo gateway kilo
qwen3:8b@my-serverum modelo servido do hardware do próprio operador; o sufixo é o nome que o operador deu ao servidor

A parte do modelo pode conter : e /. O sufixo depois do último @ é o servidor. Trate o id inteiro como uma string opaca: copie-o de uma lista, não o monte.

A forma antiga model#server ainda é aceita na entrada e nunca é devolvida.

Use o id completo#

Se você enviar um nome sem @server, o gateway procura um modelo com esse nome no melhor servidor disponível. Se não achar nenhum, ele não devolve erro. Responde com outro modelo: o primeiro que o servidor padrão lista para você.

bash
curl -s "$SHVIA_URL/v1/chat/completions" \
  -H "Authorization: Bearer $SHVIA_API_KEY" -H "Content-Type: application/json" \
  -d '{ "model": "a-model-that-does-not-exist", "messages": [{ "role": "user", "content": "hi" }] }'

A resposta tem status 200, e o campo model dela é o modelo que o gateway resolveu para a requisição, não o nome que você enviou. Nos endpoints nativos isso vale para profile_name; os campos separados model e server são estritos, e um par desconhecido é respondido com um erro. Um nome com um servidor explícito que não tem o modelo devolve 404 com o código model_not_found.

Quando o modelo que você pediu não consegue responder#

Em /v1/messages, /v1/responses, /v1/chat/completions (para modelos cujo driver não é ollama) e POST /api/v1/agent/chat, o gateway monta uma cadeia curta: o modelo que você pediu e depois o modelo padrão da sua conta. Se o primeiro não consegue responder, por exemplo porque é um modelo de nuvem e você não cadastrou uma chave do provedor dele, ou porque o provedor falha com algo que outro modelo pode resolver (veja combos para a lista) antes de enviar qualquer texto, o modelo padrão responde no lugar. Um modelo dos servidores do próprio operador só tem como reserva outro modelo desses servidores. Em /v1 a chamada tem sucesso com 200, e o campo model e o header X-Inference-Model continuam mostrando o modelo que você pediu: a resposta não diz que outro modelo respondeu. agent/chat nomeia o modelo que respondeu.

Se importa qual modelo responde, tenha a chave dos modelos de nuvem em que você confia (veja provedores e suas chaves) e confira que os modelos que você chama são os que você pediu antes de confiar num resultado.

GET/v1/models#

A lista compatível com OpenAI. Ela exige a sua chave de API e não recebe parâmetros.

json
{
  "object": "list",
  "data": [
    { "id": "claude-sonnet-4-6@anthropic", "object": "model", "created": 1767225600, "owned_by": "shvia" }
  ]
}

owned_by é sempre shvia. Não há paginação, nem metadados por modelo, nem rota para ler um modelo pelo id (/v1/models/{id}), então client.models.retrieve(...) nos SDKs da OpenAI devolve 404.

Esta lista é o que o gateway expõe. Não é uma lista de modelos que você tem permissão de usar:

  • ela inclui modelos de nuvem mesmo quando você não cadastrou uma chave daquele provedor;
  • ela não filtra pelos modelos permitidos do seu grupo nem pela sua cota.

Chamar um modelo listado que você não pode usar nem sempre falha do jeito que se espera: ele é recusado com 403 e o código permission_denied quando o seu grupo ou a sua cota o proíbem, e um modelo de nuvem sem chave de provedor por trás pode ser atendido pelo seu modelo padrão no lugar, como descrito acima.

GET/api/v1/profiles#

A lista nativa, e a melhor para "de quais modelos eu tenho credenciais". Ela exige a sua chave de API e devolve uma entrada por modelo visível a você. Modelos de nuvem aparecem só quando você tem uma credencial do provedor.

json
{
  "profiles": [
    {
      "name": "claude-sonnet-4-6@anthropic",
      "label": "claude-sonnet-4-6",
      "model": "claude-sonnet-4-6",
      "server": "anthropic",
      "driver": "anthropic",
      "data_locality": "cloud_us",
      "efforts": ["low", "medium", "high"],
      "price_tier": "$$",
      "price": { "in": 3.0, "out": 15.0 },
      "parameter_size": null,
      "quantization": null,
      "is_default": false
    }
  ]
}

Os campos em que vale confiar:

CampoSignificado
nameo id do modelo a enviar. Nos endpoints nativos ele vai em profile_name
modelo nome do modelo sem o servidor
drivercomo o gateway fala com o modelo: ollama, openai, anthropic e outros. Ele decide quais parâmetros da requisição valem, veja chat completions. Para distinguir o hardware do operador de um provedor de nuvem, use data_locality
data_localitypara onde o prompt vai: on_prem fica na infraestrutura do operador; cloud_us, cloud_eu, cloud_br e cloud_cn saem dela. Veja seus dados
effortsos níveis de esforço de raciocínio que o gateway anuncia para o modelo, incluindo metadados descobertos do provedor quando disponíveis. Uma lista vazia significa que nenhum nível ajustável é anunciado aqui; isso, por si só, não prova que o provedor rejeita todo valor explícito de esforço
priceUSD por milhão de tokens, in e out. É null quando não há preço
parameter_size, quantizationpara modelos auto-hospedados, quando conhecidos

O tratamento do esforço depende do driver. Para a Anthropic, um valor fora do enum de esforço do driver é ignorado. Com uma whitelist não vazia configurada para o modelo, um nível válido fora da lista vira o nível permitido mais próximo abaixo dele, ou o menor permitido acima se nenhum for inferior. Sem essa whitelist, o driver repassa um nível válido solicitado. Não trate essa lista anunciada como uma regra universal de validação de requisições para todos os provedores.

A resposta traz também outros campos que servem aos apps (favoritos, um mapa de servidores, flags obsoletas). Não dependa deles. A resposta traz os headers Deprecation e Sunset, que se referem a alguns desses campos obsoletos.

POST/api/v1/profiles/refresh#

Descarta a sua lista em cache de modelos de nuvem e devolve o mesmo corpo de GET /api/v1/profiles. Chame depois de cadastrar uma chave de provedor.

Qual lista usar#

Você querUse
uma lista para uma ferramenta ou SDK compatível com OpenAIGET /v1/models
os modelos de que você tem credenciais, com preço e localidadeGET /api/v1/profiles
saber se um modelo aceita esforço de raciocínioefforts em GET /api/v1/profiles