{"components":{"schemas":{"ChatCompletionRequest":{"oneOf":[{"required":["messages"]},{"required":["prompt"]}],"properties":{"messages":{"items":{"properties":{"content":{"description":"Texto ou lista de parts (text / image_url \u2014 imagens viram `[image]`).","oneOf":[{"type":"string"},{"items":{"type":"object"},"type":"array"}]},"role":{"description":"A Lucy usa a \u00faltima mensagem `user` como instru\u00e7\u00e3o (sem hist\u00f3rico multi-turn).","enum":["system","user","assistant"],"type":"string"}},"required":["role","content"],"type":"object"},"type":"array"},"model":{"default":"lucy:latest","description":"ID do modelo. Aceita qualquer alias da Lucy; resolve para `lucy:latest`.","example":"lucy:latest","type":"string"},"prompt":{"type":"string"},"stream":{"default":false,"type":"boolean"}},"type":"object"},"CompletionRequest":{"properties":{"model":{"default":"lucy:latest","description":"ID do modelo. Aceita qualquer alias da Lucy; resolve para `lucy:latest`.","example":"lucy:latest","type":"string"},"prompt":{"type":"string"},"stream":{"default":false,"type":"boolean"}},"required":["prompt"],"type":"object"},"EmbeddingRequest":{"properties":{"input":{"oneOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]},"model":{"type":"string"}},"required":["input"],"type":"object"},"Error":{"properties":{"error":{"properties":{"code":{"nullable":true,"type":"string"},"message":{"type":"string"},"param":{"nullable":true,"type":"string"},"type":{"type":"string"}},"type":"object"}},"type":"object"},"ModelList":{"properties":{"data":{"items":{"properties":{"created":{"type":"integer"},"id":{"type":"string"},"object":{"enum":["model"],"type":"string"},"owned_by":{"enum":["lucy"],"type":"string"}},"type":"object"},"type":"array"},"object":{"enum":["list"],"type":"string"}},"type":"object"}},"securitySchemes":{"apiKeyHeader":{"description":"Alternativa ao Bearer: envie a chave no header X-API-Key.","in":"header","name":"X-API-Key","type":"apiKey"},"bearerAuth":{"description":"Chave de API da Lucy no formato `lucy_...`. Crie no painel (Chaves API).","scheme":"bearer","type":"http"}}},"info":{"description":"API compat\u00edvel com OpenAI e Ollama da Lucy \u2014 uma companheira de IA com personalidade pr\u00f3pria, mem\u00f3ria e c\u00e9rebro pr\u00f3prio.\n\n**Autentica\u00e7\u00e3o:** use uma chave de API (`lucy_...`) no header `Authorization: Bearer <chave>` ou `X-API-Key: <chave>`. Chaves s\u00e3o criadas no painel (se\u00e7\u00e3o Chaves API). `GET /v1/models` \u00e9 p\u00fablico por padr\u00e3o (desative com `PUBLIC_MODEL_LIST=0`).","title":"Lucy API","version":"1.0.0"},"openapi":"3.0.3","paths":{"/api/chat":{"post":{"operationId":"ollamaChat","requestBody":{"content":{"application/json":{"schema":{"properties":{"messages":{"items":{"properties":{"content":{"description":"Texto ou lista de parts (text / image_url \u2014 imagens viram `[image]`).","oneOf":[{"type":"string"},{"items":{"type":"object"},"type":"array"}]},"role":{"description":"A Lucy usa a \u00faltima mensagem `user` como instru\u00e7\u00e3o (sem hist\u00f3rico multi-turn).","enum":["system","user","assistant"],"type":"string"}},"required":["role","content"],"type":"object"},"type":"array"},"model":{"default":"lucy:latest","description":"ID do modelo. Aceita qualquer alias da Lucy; resolve para `lucy:latest`.","example":"lucy:latest","type":"string"},"prompt":{"type":"string"},"stream":{"default":true,"type":"boolean"}},"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"created_at":{"type":"string"},"done":{"type":"boolean"},"done_reason":{"type":"string"},"eval_count":{"type":"integer"},"message":{"properties":{"content":{"type":"string"},"role":{"type":"string"}},"type":"object"},"model":{"type":"string"},"prompt_eval_count":{"type":"integer"}},"type":"object"}}},"description":"Resposta no formato Ollama (JSON ou NDJSON se stream)."},"400":{"description":"Mensagem obrigat\u00f3ria."}},"security":[{"bearerAuth":[]}],"summary":"Chat no formato nativo Ollama","tags":["Ollama"]}},"/api/generate":{"post":{"operationId":"ollamaGenerate","requestBody":{"content":{"application/json":{"schema":{"properties":{"model":{"default":"lucy:latest","description":"ID do modelo. Aceita qualquer alias da Lucy; resolve para `lucy:latest`.","example":"lucy:latest","type":"string"},"prompt":{"type":"string"},"stream":{"default":true,"type":"boolean"},"system":{"type":"string"}},"required":["prompt"],"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"created_at":{"type":"string"},"done":{"type":"boolean"},"eval_count":{"type":"integer"},"model":{"type":"string"},"prompt_eval_count":{"type":"integer"},"response":{"type":"string"}},"type":"object"}}},"description":"Resposta no formato Ollama."},"400":{"description":"`prompt` obrigat\u00f3rio."}},"security":[{"bearerAuth":[]}],"summary":"Gera\u00e7\u00e3o no formato nativo Ollama","tags":["Ollama"]}},"/api/ps":{"get":{"operationId":"ollamaPs","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Lista vazia de modelos carregados."}},"security":[],"summary":"Modelos carregados em mem\u00f3ria (sempre vazio)","tags":["Ollama"]}},"/api/show":{"post":{"operationId":"ollamaShow","requestBody":{"content":{"application/json":{"schema":{"properties":{"model":{"type":"string"},"name":{"type":"string"}},"type":"object"}}}},"responses":{"200":{"description":"Modelfile/detalhes do modelo virtual."}},"security":[],"summary":"Metadados de um modelo","tags":["Ollama"]}},"/api/tags":{"get":{"operationId":"ollamaTags","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"models":{"items":{"properties":{"digest":{"type":"string"},"model":{"type":"string"},"modified_at":{"type":"string"},"name":{"type":"string"},"size":{"type":"integer"}},"type":"object"},"type":"array"}},"type":"object"}}},"description":"Modelos instalados (virtuais)."}},"security":[],"summary":"Lista modelos no formato Ollama","tags":["Ollama"]}},"/api/version":{"get":{"operationId":"ollamaVersion","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Vers\u00e3o."}},"security":[],"summary":"Vers\u00e3o da API (probe de compatibilidade)","tags":["Ollama"]}},"/chat/completions":{"post":{"operationId":"createChatCompletionShort","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatCompletionRequest"}}}},"responses":{"200":{"description":"Id\u00eantico a /v1/chat/completions."}},"security":[{"bearerAuth":[]}],"summary":"Alias sem prefixo `/v1` de /v1/chat/completions","tags":["Chat (OpenAI)"]}},"/completions":{"post":{"operationId":"createCompletionShort","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompletionRequest"}}}},"responses":{"200":{"description":"Id\u00eantico a /v1/completions."}},"security":[{"bearerAuth":[]}],"summary":"Alias sem prefixo `/v1` de /v1/completions","tags":["Completions (OpenAI)"]}},"/embeddings":{"post":{"operationId":"createEmbeddingShort","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbeddingRequest"}}}},"responses":{"200":{"description":"Id\u00eantico a /v1/embeddings."}},"security":[{"bearerAuth":[]}],"summary":"Alias sem prefixo `/v1` de /v1/embeddings","tags":["Embeddings"]}},"/models":{"get":{"operationId":"listModelsShort","responses":{"200":{"description":"Id\u00eantico a /v1/models."}},"security":[],"summary":"Alias sem prefixo `/v1` de /v1/models","tags":["Models"]}},"/v1/chat/completions":{"post":{"operationId":"createChatCompletion","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"required":["messages"]},{"required":["prompt"]}],"properties":{"max_tokens":{"description":"Aceito por compatibilidade (ignorado).","type":"integer"},"messages":{"items":{"properties":{"content":{"description":"Texto ou lista de parts (text / image_url \u2014 imagens viram `[image]`).","oneOf":[{"type":"string"},{"items":{"type":"object"},"type":"array"}]},"role":{"description":"A Lucy usa a \u00faltima mensagem `user` como instru\u00e7\u00e3o (sem hist\u00f3rico multi-turn).","enum":["system","user","assistant"],"type":"string"}},"required":["role","content"],"type":"object"},"type":"array"},"model":{"default":"lucy:latest","description":"ID do modelo. Aceita qualquer alias da Lucy; resolve para `lucy:latest`.","example":"lucy:latest","type":"string"},"prompt":{"description":"Alternativa a `messages` para uso simples.","type":"string"},"stream":{"default":false,"description":"Se true, retorna SSE (`data: ...`).","type":"boolean"},"temperature":{"description":"Aceito por compatibilidade (ignorado).","type":"number"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"choices":{"items":{"properties":{"finish_reason":{"enum":["stop"],"nullable":true,"type":"string"},"index":{"type":"integer"},"logprobs":{"nullable":true,"type":"object"},"message":{"properties":{"content":{"type":"string"},"role":{"enum":["assistant"],"type":"string"}},"type":"object"}},"type":"object"},"type":"array"},"created":{"type":"integer"},"id":{"example":"chatcmpl-abc123","type":"string"},"lucy":{"description":"Meta da Lucy (apenas se API_EXPOSE_METRICS=1, padr\u00e3o).","properties":{"energy":{"type":"integer"},"response_type":{"type":"string"},"sentiment":{"type":"string"},"thoughts":{"type":"string"}},"type":"object"},"model":{"type":"string"},"object":{"enum":["chat.completion"],"type":"string"},"system_fingerprint":{"type":"string"},"usage":{"properties":{"completion_tokens":{"type":"integer"},"prompt_tokens":{"description":"Estimativa aproximada.","type":"integer"},"total_tokens":{"type":"integer"}},"type":"object"}},"type":"object"}}},"description":"Resposta de chat."},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"nullable":true,"type":"string"},"message":{"type":"string"},"param":{"nullable":true,"type":"string"},"type":{"type":"string"}},"type":"object"}},"type":"object"}}},"description":"Sem mensagem de usu\u00e1rio."},"401":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"nullable":true,"type":"string"},"message":{"type":"string"},"param":{"nullable":true,"type":"string"},"type":{"type":"string"}},"type":"object"}},"type":"object"}}},"description":"API key inv\u00e1lida ou ausente."},"429":{"description":"Rate limit excedido (60 req/min)."},"500":{"description":"Erro interno."}},"security":[{"bearerAuth":[]}],"summary":"Gera uma resposta de chat (formato OpenAI)","tags":["Chat (OpenAI)"]}},"/v1/completions":{"post":{"operationId":"createCompletion","requestBody":{"content":{"application/json":{"schema":{"properties":{"input":{"description":"Alias de `prompt`.","type":"string"},"model":{"default":"lucy:latest","description":"ID do modelo. Aceita qualquer alias da Lucy; resolve para `lucy:latest`.","example":"lucy:latest","type":"string"},"prompt":{"type":"string"},"stream":{"default":false,"type":"boolean"}},"required":["prompt"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"choices":{"items":{"properties":{"finish_reason":{"type":"string"},"index":{"type":"integer"},"text":{"type":"string"}},"type":"object"},"type":"array"},"created":{"type":"integer"},"id":{"type":"string"},"model":{"type":"string"},"object":{"enum":["text_completion"],"type":"string"},"usage":{"properties":{"completion_tokens":{"type":"integer"},"prompt_tokens":{"description":"Estimativa aproximada.","type":"integer"},"total_tokens":{"type":"integer"}},"type":"object"}},"type":"object"}}},"description":"Texto completo."},"401":{"description":"API key inv\u00e1lida ou ausente."}},"security":[{"bearerAuth":[]}],"summary":"Completions de texto (legacy)","tags":["Completions (OpenAI)"]}},"/v1/embeddings":{"post":{"operationId":"createEmbedding","requestBody":{"content":{"application/json":{"schema":{"properties":{"input":{"oneOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]},"model":{"default":"text-embedding-3-small","type":"string"}},"required":["input"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"properties":{"embedding":{"items":{"type":"number"},"type":"array"},"index":{"type":"integer"},"object":{"enum":["embedding"],"type":"string"}},"type":"object"},"type":"array"},"model":{"type":"string"},"object":{"type":"string"},"usage":{"properties":{"completion_tokens":{"type":"integer"},"prompt_tokens":{"description":"Estimativa aproximada.","type":"integer"},"total_tokens":{"type":"integer"}},"type":"object"}},"type":"object"}}},"description":"Embeddings pseudo-determin\u00edsticos (dimens\u00e3o EMBEDDING_DIM, padr\u00e3o 384)."},"400":{"description":"`input` ausente."}},"security":[{"bearerAuth":[]}],"summary":"Gera embeddings (stub determin\u00edstico, s\u00f3 para compatibilidade)","tags":["Embeddings"]}},"/v1/models":{"get":{"operationId":"listModels","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelList"}}},"description":"Lista de modelos (p\u00fablica por padr\u00e3o)."},"401":{"description":"Se PUBLIC_MODEL_LIST=0 e sem chave v\u00e1lida."}},"security":[],"summary":"Lista modelos dispon\u00edveis","tags":["Models"]}},"/v1/models/{model_id}":{"get":{"operationId":"retrieveModel","parameters":[{"in":"path","name":"model_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"created":{"type":"integer"},"id":{"type":"string"},"object":{"type":"string"},"owned_by":{"enum":["lucy"],"type":"string"}},"type":"object"}}},"description":"Detalhe do modelo."}},"security":[],"summary":"Detalhe de um modelo","tags":["Models"]}}},"servers":[{"description":"Este servidor (caminho relativo)","url":"/"},{"description":"Substitua pelo seu host","url":"https://SEU-HOST"}],"tags":[{"description":"Compatible com o SDK/API da OpenAI","name":"Chat (OpenAI)"},{"description":"Endpoint legacy de texto","name":"Completions (OpenAI)"},{"description":"Listagem de modelos","name":"Models"},{"description":"Embeddings (stub determin\u00edstico)","name":"Embeddings"},{"description":"Compatibilidade nativa com Ollama (/api/*)","name":"Ollama"}]}
