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 |
|---|---|---|
| residency | eu-hosted | eu-owned | de | any | Restringe o encaminhamento a endpoints nessa residência; um conjunto elegível vazio devolve 409 no_endpoint_for_policy em vez de alargar o filtro. |
| task | um nome de tarefa | A tarefa à qual o router ajusta o modelo. |
| retention | zero | Apenas 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_class | public | internal | confidential | restricted | Verificado 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_id | uuid | Nomeia uma política da mesma organização; um id desconhecido devolve 404 policy_not_found. |
| max_usd_per_1m | um número | Um teto de preço por milhão de tokens para este pedido. |
| allow_partners | true | false | Se 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/completions | 501 not_implemented — o endpoint completions legado não é oferecido; use /v1/chat/completions. |
| n > 1 | 400 unsupported_n — apenas n = 1 é suportado. |
| POST /v1/embeddings | Os 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/images | 404 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.