Migração

Um URL base e uma chave movem um cliente OpenAI. Esta página também indica o que a API não faz, porque uma migração que descobre isso em produção não é uma migração.

A forma de substituição direta

Aponte o URL base do cliente para https://api.llmeu.com/v1 e forneça-lhe uma chave de API da consola. A forma do pedido não muda.

from openai import OpenAI

client = OpenAI(base_url="https://api.llmeu.com/v1", api_key="llmeu_live_xxxxxxxx.your-secret")

resp = client.chat.completions.create(
    model="llmeu-auto",
    messages=[{"role": "user", "content": "Say hello from EU hosting."}],
)
print(resp.choices[0].message.content)

O que o endpoint de chat aceita

O validador de pedidos em apps/api/src/app.mjs verifica o seguinte; o que não verifica é transmitido ou ignorado em vez de rejeitado, para que um cliente mais recente continue a funcionar.

  • model e messages são obrigatórios; messages tem de ser um array não vazio.
  • Cada mensagem precisa de um role (system, user, assistant, tool ou developer) e conteúdo como uma string ou um array de partes.
  • stream tem de ser um booleano quando presente.
  • temperature, top_p, max_tokens, presence_penalty, frequency_penalty, seed e n têm de ser números quando presentes.
  • max_tokens tem de ser pelo menos 1.
  • n tem de ser exatamente 1; qualquer outra coisa é recusada.
  • stop pode ser uma string ou um array de strings.
  • tools tem de ser um array quando presente.
  • llmeu tem de ser um objeto; nunca é obrigatório.
  • tool_choice e response_format são encaminhados para o backend juntamente com os campos acima; um campo extra desconhecido não é rejeitado.

Extras do pedido em llmeu

Um objeto llmeu com namespace no corpo do pedido; um cliente que ignore campos desconhecidos pode enviá-lo em segurança.

Campo Valor Efeito
residencyeu-hosted | eu-owned | de | anyRestringe o encaminhamento a endpoints nessa residência; um conjunto elegível vazio devolve 409 no_endpoint_for_policy em vez de alargar o filtro.
taskum nome de tarefaA tarefa à qual o router ajusta o modelo.
retentionzeroApenas zero está implementado. Pedir mais do que a política permite devolve 403 retention_exceeds_policy; um valor efetivo permitido diferente de zero devolve 501 retention_not_implemented.
data_classpublic | internal | confidential | restrictedVerificado em relação às classes de dados permitidas pela política: uma classe fora delas devolve 403 data_class_not_allowed, e uma classe desconhecida devolve 400 invalid_data_class.
policy_iduuidNomeia uma política da mesma organização; um id desconhecido devolve 404 policy_not_found.
max_usd_per_1mum númeroUm teto de preço por milhão de tokens para este pedido.
allow_partnerstrue | falseSe os endpoints de parceiros podem ser usados para este pedido.

Chaves desconhecidas dentro de llmeu são ignoradas; uma chave conhecida com um valor inválido é recusada, porque um data_class inválido tem de falhar em segurança em vez de significar silenciosamente nenhuma classe de dados.

curl https://api.llmeu.com/v1/chat/completions \
  -H "Authorization: Bearer $LLMEU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llmeu-auto",
    "messages": [{"role": "user", "content": "Summarise this contract."}],
    "llmeu": {"residency": "eu-owned", "data_class": "confidential", "retention": "zero"}
  }'

O que não existe

Estas respostas são deliberadas, e um cliente que as espera vê o código de erro em vez de uma substituição silenciosa.

Pedido Resultado
POST /v1/completions501 not_implemented — o endpoint completions legado não é oferecido; use /v1/chat/completions.
n > 1400 unsupported_n — apenas n = 1 é suportado.
POST /v1/embeddingsOs embeddings precisam de um modelo de embedding, e o id predefinido pedido é bge-m3. Atualmente são servidos pelo backend local determinístico, cuja resposta contém llmeu.mock: true e a nota de que são devolvidos vetores de substituição determinísticos e nenhum peso de embedding é servido nesta instalação.
/v1/files, /v1/batches, /v1/assistants, /v1/fine_tuning, /v1/audio, /v1/images404 unknown_route — não é encaminhado de todo; um caminho /v1 que o router não conhece responde 404 unknown_route, e qualquer outro caminho responde 404 not_found.

Retirar os seus dados

A exportação da conta me.json contém campos de conta selecionados, organizações, metadados de chaves de API sem segredos, políticas atuais, os últimos 200 rastreamentos por organização e agregados de utilização diária para 365 dias. Não é uma cópia completa de todos os dados pessoais nem um registo histórico de políticas.

A exportação de auditoria NDJSON tem por omissão 7 dias, permite no máximo 90 dias e limita os rastreamentos a 5000; o seu manifesto contém counts.truncated, que assinala uma exportação que atingiu o limite.

GET /app/exports/me.json
GET /app/exports/audit.ndjson?days=7
GET /app/exports/traces.json
GET /app/exports/usage.json
GET /app/exports/policies.json

A eliminação da própria conta ocorre na página de perfil e está sujeita à regra de propriedade na página da consola.

Um cookie de sessão não é uma credencial de API

Uma sessão de navegador autentica a consola, não a API. Um cliente OpenAI que envie uma é recusado com 403 api_key_required e tem de usar uma chave de API em vez disso.

Uma recusa aqui nomeia um código, para que uma migração possa ramificar com base nele, e o bloco llmeu em cada resposta indica o que realmente aconteceu.