Integre a Lucy aos seus projetos.
A API da Lucy expõe endpoints no formato OpenAI (base /v1) e no formato
Ollama nativo (/api/*), para que qualquer cliente que fale essas
linguagens — SDKs, LiteLLM, Open WebUI, Cursor, SillyTavern — funcione com poucas linhas de configuração.
O código-fonte é proprietário; esta documentação cobre todos os endpoints públicos.
Autenticação
Todas as chamadas de geração exigem uma chave de API. A listagem de modelos é pública por padrão.
Obtendo uma chave
Entre na conta, abra o painel (seção Chaves API) e crie uma chave. Você também pode pedir a um administrador. Limite: até 10 chaves ativas por usuário.
As chaves têm o formato lucy_<prefixo>_<id> e são mostradas apenas uma vez no momento da criação — guarde-a com segurança.
Enviando a chave
Você pode autenticar de três formas (a primeira é a recomendada):
curl https://chat.opentty.fun/v1/models \
-H "Authorization: Bearer lucy_XXXX_YYYY"
curl https://chat.opentty.fun/v1/models \
-H "X-API-Key: lucy_XXXX_YYYY"
curl "https://chat.opentty.fun/v1/models?key=lucy_XXXX_YYYY"
Permissões das chaves
| Permissão | Libera |
|---|---|
| chat | Chat, completions, embeddings e endpoints /api/* (padrão) |
| files | Cloud: upload, download, editor de arquivos |
| notes | Notas |
| investigator | Modo detetive, busca e fetch da web |
/api/admin/* nunca aceitam chave de API — exigem sessão de navegador de um administrador.Modelos
A Lucy roda sobre um único cérebro próprio. O modelo canônico é lucy:latest — todos os aliases abaixo resolvem para ele, então qualquer cliente funciona.
| Alias | Descrição |
|---|---|
| lucy:latest | Resolve para o modelo canônico lucy:latest |
| lucy | Resolve para o modelo canônico lucy:latest |
| lucy:7b | Resolve para o modelo canônico lucy:latest |
| lucy-chat | Resolve para o modelo canônico lucy:latest |
| * | Qualquer id começando com lucy — ou mesmo um id desconhecido — roda como lucy:latest |
"model": "lucy:latest" ou qualquer alias para máxima compatibilidade.Endpoints
Clique em um endpoint para ver os parâmetros e exemplos.
Gera uma resposta de chat. Suporta messages (formato OpenAI) ou prompt. A última mensagem user é usada como instrução; system vira instrução de sistema. Nota: a Lucy ainda não usa histórico multi-turn da API — cada chamada é independente.
Parâmetros do corpo
system/user/assistantmessagesfalsecurl https://chat.opentty.fun/v1/chat/completions \
-H "Authorization: Bearer lucy_XXXX_YYYY" \
-H "Content-Type: application/json" \
-d '{
"model": "lucy:latest",
"messages": [
{"role": "system", "content": "Você é a Lucy, uma companheira carinhosa."},
{"role": "user", "content": "Oi, Lucy! Como foi seu dia?"}
],
"stream": false
}'
from openai import OpenAI
client = OpenAI(
base_url="https://chat.opentty.fun/v1", # troque pelo seu host
api_key="lucy_XXXX_YYYY",
)
resp = client.chat.completions.create(
model="lucy:latest",
messages=[
{"role": "system", "content": "Você é a Lucy, uma companheira carinhosa."},
{"role": "user", "content": "Oi, Lucy! Como foi seu dia?"},
],
)
print(resp.choices[0].message.content)
const client = new OpenAI({
baseURL: "https://chat.opentty.fun/v1", // troque pelo seu host
apiKey: "lucy_XXXX_YYYY",
});
const resp = await client.chat.completions.create({
model: "lucy:latest",
messages: [
{ role: "system", content: "Você é a Lucy, uma companheira carinhosa." },
{ role: "user", content: "Oi, Lucy! Como foi seu dia?" },
],
});
console.log(resp.choices[0].message.content);
Resposta
{
"id": "chatcmpl-1a2b3c4d5e6f",
"object": "chat.completion",
"created": 1754670000,
"model": "lucy:latest",
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "Meu dia foi ótimo!" },
"finish_reason": "stop",
"logprobs": null
}
],
"usage": {
"prompt_tokens": 18,
"completion_tokens": 6,
"total_tokens": 24
},
"system_fingerprint": "lucy",
"lucy": {
"thoughts": "...",
"sentiment": "happy",
"response_type": "normal",
"energy": 82
}
}
lucy (pensamentos, sentimento, energia) é incluído por padrão e pode ser desligado com API_EXPOSE_METRICS=0. Clientes OpenAI ignoram campos desconhecidos sem quebrar.Completions de texto no formato legacy da OpenAI. Envie o texto em prompt (ou input) e receba text na resposta.
falsecurl https://chat.opentty.fun/v1/completions \
-H "Authorization: Bearer lucy_XXXX_YYYY" \
-H "Content-Type: application/json" \
-d '{"model": "lucy:latest", "prompt": "Conte uma piada curta."}'
Lista os modelos disponíveis. Público por padrão (PUBLIC_MODEL_LIST=1); com 0, exige chave. Também aceita /v1/models/<id> para detalhe de um modelo.
curl https://chat.opentty.fun/v1/models
{
"object": "list",
"data": [
{ "id": "lucy:latest", "object": "model", "created": 1704067200, "owned_by": "lucy" }
]
}
Gera embeddings pseudo-determinísticos (hash → vetor normalizado) com dimensão fixa (EMBEDDING_DIM, padrão 384). Servem apenas para não quebrar clientes que exigem o endpoint — não têm significado semântico real.
text-embedding-3-smallcurl https://chat.opentty.fun/v1/embeddings \
-H "Authorization: Bearer lucy_XXXX_YYYY" \
-H "Content-Type: application/json" \
-d '{"input": ["olá mundo", "lucy é incrível"]}'
Compatibilidade Ollama (/api/*)
A mesma API responde no formato nativo do Ollama. Configure OLLAMA_HOST para este host e a maioria dos apps funciona direto.
Chat no formato Ollama. Padrão de streaming: true (NDJSON).
curl https://chat.opentty.fun/api/chat \
-H "Authorization: Bearer lucy_XXXX_YYYY" \
-H "Content-Type: application/json" \
-d '{
"model": "lucy:latest",
"stream": false,
"messages": [{"role": "user", "content": "Qual é o seu nome?"}]
}'
Geração de texto no formato Ollama. Campo de resposta: response.
curl https://chat.opentty.fun/api/generate \
-H "Authorization: Bearer lucy_XXXX_YYYY" \
-H "Content-Type: application/json" \
-d '{"model": "lucy:latest", "stream": false, "prompt": "Olá!"}'
curl https://chat.opentty.fun/api/tags
Também disponíveis para probes: GET /api/version, GET /api/ps e POST /api/show.
Streaming
Passe "stream": true nos endpoints OpenAI para receber eventos SSE (data: ...), terminando em data: [DONE].
from openai import OpenAI
client = OpenAI(base_url="https://chat.opentty.fun/v1", api_key="lucy_XXXX_YYYY")
stream = client.chat.completions.create(
model="lucy:latest",
messages=[{"role": "user", "content": "Conte uma história."}],
stream=True,
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
true.Erros
Erros seguem o padrão da OpenAI: código HTTP + corpo com error.
| Status | Significado |
|---|---|
| 400 | Requisição inválida (ex.: sem mensagem/prompt) |
| 401 | Chave ausente, inválida ou expirada |
| 403 | Chave sem a permissão necessária |
| 429 | Rate limit excedido |
| 500 | Erro interno |
{
"error": {
"message": "Invalid API key. Use Authorization: Bearer or X-API-Key.",
"type": "invalid_request_error",
"code": "invalid_api_key",
"param": null
}
}
Rate limit
Os endpoints de geração são limitados a 60 requisições por minuto por cliente. Ao exceder, você recebe 429.
Spec OpenAPI
Exportamos a especificação OpenAPI 3.0.3 em JSON para você importar em ferramentas como Swagger UI, Postman e Insomnia.
- Spec:
https://chat.opentty.fun/openapi.json - Postman: Import → link → cole a URL acima.
- Swagger UI: informe a URL da spec no campo de input.
- Insomnia: Import → From URL.
Os exemplos desta página usam o host atual: https://chat.opentty.fun.