Files
llmgw/docs/client-api.openapi.json
T
Ilker ManapandClaude Opus 5.5 fd3c7bda32
CI / test (push) Failing after 6m12s
The client API described in OpenAPI, and both APIs in Swagger UI
/v1/openapi.json is the API clients use — OpenAI's endpoints, Anthropic's,
and what llmgw adds — in OpenAPI 3.1, generated from internal/clientapi's
route table by the generator the admin API's document comes from, now
told each document's title, server, token and error. A test reads the
router's mux.HandleFunc calls and refuses a route described and not
mounted, or mounted and not described. Asked for before there is a key,
so it needs none.

/docs/api shows it in Swagger UI 5.33.1 (Apache 2.0, served from the
gateway as the page's policy requires): Authorize takes a key, Try it out
sends to this gateway. Staff are offered the admin API's document too,
from /docs/api/admin.json, which nobody else is given.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-10 20:22:48 +02:00

2725 lines
69 KiB
JSON

{
"openapi": "3.1.0",
"info": {
"title": "llmgw client API",
"version": "v1",
"description": "OpenAI's API, as llmgw serves it, and what llmgw adds: pictures and 3D models from ComfyUI, knowledge bases, memory notes, stored conversations.\n\nThe SDKs of OpenAI and Anthropic work against it unchanged: set the base URL to the gateway's /v1 and the key to an llmgw key. A request carries more than is listed here: what the gateway does not read goes to the engine as it came. Headers llmgw reads: x-llmgw-thread (continue a stored conversation), x-llmgw-knowledge (answer from these collections), x-llmgw-tags (tags kept with the usage), x-session-id (stay on one replica). Headers it sends back: x-request-id, x-llmgw-served-model, x-llmgw-hardware, x-llmgw-seed, and Retry-After when waiting helps.\n\nGenerated from the route table in internal/clientapi; see docs/clients.md."
},
"servers": [
{
"url": "http://localhost:8080",
"description": "A gateway at its default address, listen."
}
],
"security": [
{
"apiKey": []
}
],
"tags": [
{
"name": "3d"
},
{
"name": "audio"
},
{
"name": "batches"
},
{
"name": "chat"
},
{
"name": "completions"
},
{
"name": "embeddings"
},
{
"name": "files"
},
{
"name": "images"
},
{
"name": "kb"
},
{
"name": "mcp"
},
{
"name": "me"
},
{
"name": "memory"
},
{
"name": "messages"
},
{
"name": "models"
},
{
"name": "moderations"
},
{
"name": "rerank"
},
{
"name": "responses"
},
{
"name": "score"
},
{
"name": "threads"
}
],
"paths": {
"/mcp": {
"post": {
"operationId": "postMcp",
"summary": "The gateway's MCP server: the memory notes as tools",
"tags": [
"mcp"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MCPRequest"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"description": "Any JSON value."
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/me": {
"get": {
"operationId": "getMe",
"summary": "The caller: its key, its place in the tree, its limits and what it has used",
"tags": [
"me"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Me"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/3d/generations": {
"post": {
"operationId": "post3dGenerations",
"summary": "A 3D model from a picture, as a job",
"description": "Answered 202 with the job; ask after it until it is completed, then download output_file_id from /v1/files.",
"tags": [
"3d"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MeshRequest"
}
}
}
},
"responses": {
"202": {
"description": "Accepted: started, and running on.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Job"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
},
"get": {
"operationId": "get3dGenerations",
"summary": "The caller's 3D jobs, newest first",
"tags": [
"3d"
],
"parameters": [
{
"name": "limit",
"in": "query",
"description": "The most jobs to answer with, at most 100; 20 when absent.",
"schema": {
"type": "integer"
}
},
{
"name": "after",
"in": "query",
"description": "A job's ID: those asked for before it.",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/JobList"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/3d/generations/{id}": {
"get": {
"operationId": "get3dGenerationsId",
"summary": "A 3D job: its status, progress and result",
"tags": [
"3d"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"description": "The job's ID, job_….",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Job"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/3d/generations/{id}/cancel": {
"post": {
"operationId": "post3dGenerationsIdCancel",
"summary": "Stop a 3D job, in the engine's queue too",
"tags": [
"3d"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"description": "The job's ID, job_….",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Job"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/audio/transcriptions": {
"post": {
"operationId": "postAudioTranscriptions",
"summary": "Speech to text",
"tags": [
"audio"
],
"requestBody": {
"required": true,
"content": {
"multipart/form-data": {
"schema": {
"$ref": "#/components/schemas/TranscriptionForm"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Transcription"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/audio/translations": {
"post": {
"operationId": "postAudioTranslations",
"summary": "Speech to English text",
"tags": [
"audio"
],
"requestBody": {
"required": true,
"content": {
"multipart/form-data": {
"schema": {
"$ref": "#/components/schemas/TranscriptionForm"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Transcription"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/batches": {
"post": {
"operationId": "postBatches",
"summary": "Run a file of requests at the lowest priority",
"tags": [
"batches"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/BatchRequest"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Batch"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
},
"get": {
"operationId": "getBatches",
"summary": "The caller's batches",
"tags": [
"batches"
],
"parameters": [
{
"name": "limit",
"in": "query",
"description": "The most batches to answer with; 20 when absent.",
"schema": {
"type": "integer"
}
},
{
"name": "after",
"in": "query",
"description": "A batch's ID: those made before it.",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/BatchList"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/batches/{id}": {
"get": {
"operationId": "getBatchesId",
"summary": "A batch and how far it is",
"tags": [
"batches"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"description": "The batch's ID, batch_….",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Batch"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/batches/{id}/cancel": {
"post": {
"operationId": "postBatchesIdCancel",
"summary": "Stop a batch",
"tags": [
"batches"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"description": "The batch's ID, batch_….",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Batch"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/chat/completions": {
"post": {
"operationId": "postChatCompletions",
"summary": "A chat turn",
"description": "A model's name, an alias, or an adapter's name. Fields not listed go to the engine as sent. With a knowledge base, x-llmgw-knowledge names the collections to answer from; x-llmgw-thread continues a stored conversation.",
"tags": [
"chat"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ChatCompletionRequest"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ChatCompletion"
}
},
"text/event-stream": {
"schema": {
"type": "string",
"description": "With stream: true, server-sent events: one JSON chunk per data: line, then data: [DONE]."
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/completions": {
"post": {
"operationId": "postCompletions",
"summary": "A prompt continued",
"tags": [
"completions"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CompletionRequest"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Completion"
}
},
"text/event-stream": {
"schema": {
"type": "string",
"description": "With stream: true, server-sent events: one JSON chunk per data: line, then data: [DONE]."
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/embeddings": {
"post": {
"operationId": "postEmbeddings",
"summary": "Vectors for texts",
"tags": [
"embeddings"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EmbeddingRequest"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EmbeddingList"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/files": {
"post": {
"operationId": "postFiles",
"summary": "Upload a file: a batch's input",
"tags": [
"files"
],
"requestBody": {
"required": true,
"content": {
"multipart/form-data": {
"schema": {
"$ref": "#/components/schemas/FileForm"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/File"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
},
"get": {
"operationId": "getFiles",
"summary": "The caller's files",
"tags": [
"files"
],
"parameters": [
{
"name": "purpose",
"in": "query",
"description": "Only files of this purpose: batch, batch_output, job_output.",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FileList"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/files/{id}": {
"get": {
"operationId": "getFilesId",
"summary": "A file",
"tags": [
"files"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"description": "The file's ID, file-….",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/File"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
},
"delete": {
"operationId": "deleteFilesId",
"summary": "Delete a file",
"tags": [
"files"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"description": "The file's ID, file-….",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Deleted"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/files/{id}/content": {
"get": {
"operationId": "getFilesIdContent",
"summary": "A file's content",
"tags": [
"files"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"description": "The file's ID, file-….",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/octet-stream": {
"schema": {
"type": "string",
"format": "binary"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/images/generations": {
"post": {
"operationId": "postImagesGenerations",
"summary": "Pictures, of a model that makes them",
"description": "Made by ComfyUI. Pictures come back as b64_json and are kept nowhere; x-llmgw-seed says the seed.",
"tags": [
"images"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ImageRequest"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ImagesResponse"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/kb/collections": {
"get": {
"operationId": "getKbCollections",
"summary": "The knowledge-base collections the caller may read",
"tags": [
"kb"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/router.KBCollectionView"
}
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/kb/collections/{id}/documents": {
"put": {
"operationId": "putKbCollectionsIdDocuments",
"summary": "Add or replace a document, read and embedded by the client",
"tags": [
"kb"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"description": "The collection's ID, its name when that is unique, or ORG/NAME.",
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/router.KBPutDocument"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/router.KBPutResult"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
},
"delete": {
"operationId": "deleteKbCollectionsIdDocuments",
"summary": "Take a document out of a collection",
"tags": [
"kb"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"description": "The collection's ID, its name when that is unique, or ORG/NAME.",
"schema": {
"type": "string"
}
},
{
"name": "name",
"in": "query",
"required": true,
"description": "The document's name, as the manifest lists it.",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/KBDeleted"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/kb/collections/{id}/manifest": {
"get": {
"operationId": "getKbCollectionsIdManifest",
"summary": "A collection and its documents",
"tags": [
"kb"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"description": "The collection's ID, its name when that is unique, or ORG/NAME.",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/router.KBManifest"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/memory": {
"get": {
"operationId": "getMemory",
"summary": "The project's notes",
"tags": [
"memory"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MemoryList"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/memory/{key}": {
"put": {
"operationId": "putMemoryKey",
"summary": "Keep a note for the project",
"tags": [
"memory"
],
"parameters": [
{
"name": "key",
"in": "path",
"required": true,
"description": "The note's key, chosen by the caller.",
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MemoryWrite"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MemoryNote"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
},
"get": {
"operationId": "getMemoryKey",
"summary": "A note",
"tags": [
"memory"
],
"parameters": [
{
"name": "key",
"in": "path",
"required": true,
"description": "The note's key, chosen by the caller.",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MemoryNote"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
},
"delete": {
"operationId": "deleteMemoryKey",
"summary": "Forget a note",
"tags": [
"memory"
],
"parameters": [
{
"name": "key",
"in": "path",
"required": true,
"description": "The note's key, chosen by the caller.",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/messages": {
"post": {
"operationId": "postMessages",
"summary": "Anthropic's Messages API, for Claude Code and Anthropic's SDKs",
"description": "The key is sent as x-api-key or as a bearer token.",
"tags": [
"messages"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MessagesRequest"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"description": "Any JSON value."
}
},
"text/event-stream": {
"schema": {
"type": "string",
"description": "With stream: true, server-sent events: one JSON chunk per data: line, then data: [DONE]."
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/messages/count_tokens": {
"post": {
"operationId": "postMessagesCountTokens",
"summary": "How many tokens a Messages request would be",
"tags": [
"messages"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MessagesRequest"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TokenCount"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/models": {
"get": {
"operationId": "getModels",
"summary": "The models the key may use",
"tags": [
"models"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ModelList"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/moderations": {
"post": {
"operationId": "postModerations",
"summary": "Texts judged by the guardrails' judge model",
"tags": [
"moderations"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ModerationRequest"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ModerationResponse"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/rerank": {
"post": {
"operationId": "postRerank",
"summary": "Documents ordered by a query, for a reranker vLLM serves",
"tags": [
"rerank"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RerankRequest"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"description": "Any JSON value."
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/responses": {
"post": {
"operationId": "postResponses",
"summary": "OpenAI's Responses API, for Codex and the like",
"tags": [
"responses"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ResponsesRequest"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"description": "Any JSON value."
}
},
"text/event-stream": {
"schema": {
"type": "string",
"description": "With stream: true, server-sent events: one JSON chunk per data: line, then data: [DONE]."
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/score": {
"post": {
"operationId": "postScore",
"summary": "Pairs of texts scored, for a scorer vLLM serves",
"tags": [
"score"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ScoreRequest"
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"description": "Any JSON value."
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/v1/threads/{id}": {
"delete": {
"operationId": "deleteThreadsId",
"summary": "Forget a stored conversation",
"tags": [
"threads"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"description": "The conversation's ID, as sent in x-llmgw-thread.",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
}
},
"components": {
"securitySchemes": {
"apiKey": {
"type": "http",
"scheme": "bearer",
"description": "An API key, sk-llmgw-…, made with `llmgw keys create` or on the portal's profile page. Sent as Authorization: Bearer KEY; /v1/messages also takes it as x-api-key."
}
},
"responses": {
"Error": {
"description": "Refused: the error says why.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"Unauthorized": {
"description": "The token is missing or wrong.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
},
"schemas": {
"Batch": {
"type": "object",
"description": "Batch is a batch and how far it is.",
"properties": {
"id": {
"type": "string"
},
"object": {
"type": "string"
},
"endpoint": {
"type": "string"
},
"input_file_id": {
"type": "string"
},
"completion_window": {
"type": "string"
},
"status": {
"type": "string"
},
"output_file_id": {
"type": "string"
},
"error_file_id": {
"type": "string"
},
"created_at": {
"type": "integer",
"format": "int64"
},
"in_progress_at": {
"type": "integer",
"format": "int64"
},
"expires_at": {
"type": "integer",
"format": "int64"
},
"finalizing_at": {
"type": "integer",
"format": "int64"
},
"completed_at": {
"type": "integer",
"format": "int64"
},
"failed_at": {
"type": "integer",
"format": "int64"
},
"expired_at": {
"type": "integer",
"format": "int64"
},
"cancelling_at": {
"type": "integer",
"format": "int64"
},
"cancelled_at": {
"type": "integer",
"format": "int64"
},
"request_counts": {
"$ref": "#/components/schemas/RequestCounts"
},
"errors": {
"description": "Any JSON value."
},
"metadata": {
"description": "Any JSON value."
}
}
},
"BatchList": {
"type": "object",
"description": "BatchList is the caller's batches.",
"properties": {
"object": {
"type": "string"
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Batch"
}
},
"has_more": {
"type": "boolean"
}
}
},
"BatchRequest": {
"type": "object",
"description": "BatchRequest runs a file of requests, at the lowest priority.",
"properties": {
"input_file_id": {
"type": "string"
},
"endpoint": {
"type": "string",
"description": "Endpoint is /v1/chat/completions, /v1/completions or /v1/embeddings."
},
"completion_window": {
"type": "string",
"description": "CompletionWindow is 24h."
},
"metadata": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
}
},
"ChatChoice": {
"type": "object",
"description": "ChatChoice is one answer.",
"properties": {
"index": {
"type": "integer"
},
"message": {
"$ref": "#/components/schemas/ChatMessage"
},
"finish_reason": {
"type": "string",
"description": "FinishReason is stop, length or tool_calls."
}
}
},
"ChatCompletion": {
"type": "object",
"description": "ChatCompletion is a model's answer.",
"properties": {
"id": {
"type": "string"
},
"object": {
"type": "string"
},
"created": {
"type": "integer",
"format": "int64"
},
"model": {
"type": "string"
},
"choices": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ChatChoice"
}
},
"usage": {
"$ref": "#/components/schemas/Usage"
}
}
},
"ChatCompletionRequest": {
"type": "object",
"description": "ChatCompletionRequest is a chat turn asked of a model.",
"properties": {
"model": {
"type": "string",
"description": "Model is a model's name or alias, or an adapter's name."
},
"messages": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ChatMessage"
}
},
"stream": {
"type": "boolean",
"description": "Stream answers as server-sent events."
},
"stream_options": {
"$ref": "#/components/schemas/StreamOptions"
},
"max_tokens": {
"type": "integer"
},
"max_completion_tokens": {
"type": "integer"
},
"temperature": {
"type": "number"
},
"top_p": {
"type": "number"
},
"seed": {
"type": "integer",
"format": "int64"
},
"stop": {
"description": "Stop is a string or a list of them.\n\nAny JSON value."
},
"tools": {
"description": "Any JSON value."
},
"tool_choice": {
"description": "Any JSON value."
},
"response_format": {
"description": "Any JSON value."
},
"user": {
"type": "string",
"description": "User is the client's own name for whoever it serves, kept with the usage."
},
"metadata": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "Metadata are tags kept with the usage, never sent to the engine."
}
}
},
"ChatMessage": {
"type": "object",
"description": "ChatMessage is one turn.",
"properties": {
"role": {
"type": "string",
"description": "Role is system, user, assistant or tool."
},
"content": {
"description": "Content is a string, or a list of parts: text, and image_url for a model with vision.\n\nAny JSON value."
},
"name": {
"type": "string"
},
"tool_calls": {
"description": "Any JSON value."
},
"tool_call_id": {
"type": "string"
}
}
},
"Completion": {
"type": "object",
"description": "Completion is a continued prompt.",
"properties": {
"id": {
"type": "string"
},
"object": {
"type": "string"
},
"created": {
"type": "integer",
"format": "int64"
},
"model": {
"type": "string"
},
"choices": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CompletionChoice"
}
},
"usage": {
"$ref": "#/components/schemas/Usage"
}
}
},
"CompletionChoice": {
"type": "object",
"description": "CompletionChoice is one continuation.",
"properties": {
"index": {
"type": "integer"
},
"text": {
"type": "string"
},
"finish_reason": {
"type": "string"
}
}
},
"CompletionRequest": {
"type": "object",
"description": "CompletionRequest is a prompt to continue.",
"properties": {
"model": {
"type": "string"
},
"prompt": {
"description": "Prompt is a string or a list of them.\n\nAny JSON value."
},
"max_tokens": {
"type": "integer"
},
"temperature": {
"type": "number"
},
"stream": {
"type": "boolean"
},
"stop": {
"description": "Any JSON value."
},
"seed": {
"type": "integer",
"format": "int64"
}
}
},
"Deleted": {
"type": "object",
"description": "Deleted says a thing is gone.",
"properties": {
"id": {
"type": "string"
},
"object": {
"type": "string"
},
"deleted": {
"type": "boolean"
}
}
},
"Embedding": {
"type": "object",
"description": "Embedding is one input's vector.",
"properties": {
"object": {
"type": "string"
},
"index": {
"type": "integer"
},
"embedding": {
"type": "array",
"items": {
"type": "number"
}
}
}
},
"EmbeddingList": {
"type": "object",
"description": "EmbeddingList is every input's vector.",
"properties": {
"object": {
"type": "string"
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Embedding"
}
},
"model": {
"type": "string"
},
"usage": {
"$ref": "#/components/schemas/Usage"
}
}
},
"EmbeddingRequest": {
"type": "object",
"description": "EmbeddingRequest asks for vectors.",
"properties": {
"model": {
"type": "string"
},
"input": {
"description": "Input is a string or a list of them; each is embedded on its own, and the longest must fit the model's context.\n\nAny JSON value."
},
"encoding_format": {
"type": "string"
},
"dimensions": {
"type": "integer"
}
}
},
"Error": {
"type": "object",
"description": "Error is every refusal: OpenAI's shape.",
"properties": {
"error": {
"$ref": "#/components/schemas/ErrorBody"
}
}
},
"ErrorBody": {
"type": "object",
"description": "ErrorBody says why.",
"properties": {
"message": {
"type": "string"
},
"type": {
"type": "string",
"description": "Type is invalid_request_error, server_error, rate_limit_exceeded …"
},
"code": {
"type": "string",
"description": "Code, where there is one a client branches on: model_not_found, content_policy_violation, job_not_found, system_stopped."
}
}
},
"File": {
"type": "object",
"description": "File is a file kept: a batch's input or output, a job's result.",
"properties": {
"id": {
"type": "string"
},
"object": {
"type": "string"
},
"bytes": {
"type": "integer",
"format": "int64"
},
"created_at": {
"type": "integer",
"format": "int64"
},
"filename": {
"type": "string"
},
"purpose": {
"type": "string",
"description": "Purpose is batch, batch_output or job_output."
},
"status": {
"type": "string"
},
"expires_at": {
"type": "integer",
"format": "int64"
}
}
},
"FileForm": {
"type": "object",
"description": "FileForm is a file uploaded, as a form.",
"properties": {
"file": {
"type": "string",
"contentEncoding": "base64"
},
"purpose": {
"type": "string",
"description": "Purpose is batch for a batch's input."
}
}
},
"FileList": {
"type": "object",
"description": "FileList is the caller's files.",
"properties": {
"object": {
"type": "string"
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/File"
}
}
}
},
"Image": {
"type": "object",
"description": "Image is one picture.",
"properties": {
"b64_json": {
"type": "string"
}
}
},
"ImageRequest": {
"type": "object",
"description": "ImageRequest asks for pictures, of a model that makes them.",
"properties": {
"model": {
"type": "string"
},
"prompt": {
"type": "string"
},
"n": {
"type": "integer",
"description": "N is how many, at most 4."
},
"size": {
"type": "string",
"description": "Size is WIDTHxHEIGHT, each a multiple of 16 from 256 to 2048."
},
"response_format": {
"type": "string",
"description": "ResponseFormat is b64_json, the only one offered."
},
"seed": {
"type": "integer",
"format": "int64"
},
"steps": {
"type": "integer"
},
"negative_prompt": {
"type": "string"
},
"guidance": {
"type": "number"
}
}
},
"ImagesResponse": {
"type": "object",
"description": "ImagesResponse is the pictures made; x-llmgw-seed says the seed.",
"properties": {
"created": {
"type": "integer",
"format": "int64"
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Image"
}
}
}
},
"Job": {
"type": "object",
"description": "Job is a 3D model asked for: its status, progress and, when done, the file its result is in.",
"properties": {
"id": {
"type": "string"
},
"object": {
"type": "string"
},
"endpoint": {
"type": "string"
},
"model": {
"type": "string"
},
"status": {
"type": "string",
"description": "Status is queued, running, cancelling, completed, failed, cancelled or expired."
},
"progress": {
"$ref": "#/components/schemas/JobProgress"
},
"output_file_id": {
"type": "string"
},
"content_type": {
"type": "string"
},
"error": {
"$ref": "#/components/schemas/ErrorBody"
},
"created_at": {
"type": "integer",
"format": "int64"
},
"started_at": {
"type": "integer",
"format": "int64"
},
"finished_at": {
"type": "integer",
"format": "int64"
},
"expires_at": {
"type": "integer",
"format": "int64"
},
"usage": {
"$ref": "#/components/schemas/JobUsage"
},
"license": {
"$ref": "#/components/schemas/License"
}
}
},
"JobList": {
"type": "object",
"description": "JobList is the caller's jobs.",
"properties": {
"object": {
"type": "string"
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Job"
}
},
"has_more": {
"type": "boolean"
},
"first_id": {
"type": "string"
},
"last_id": {
"type": "string"
}
}
},
"JobProgress": {
"type": "object",
"description": "JobProgress is how far along a job is.",
"properties": {
"state": {
"type": "string",
"description": "State is queued, running, done or failed."
},
"ahead": {
"type": "integer",
"description": "Ahead is how many wait before it, while queued."
},
"node_class": {
"type": "string"
},
"step": {
"type": "integer"
},
"steps": {
"type": "integer"
},
"percent": {
"type": "integer"
}
}
},
"JobUsage": {
"type": "object",
"description": "JobUsage is what a finished job used.",
"properties": {
"prompt_tokens": {
"type": "integer",
"format": "int64"
},
"completion_tokens": {
"type": "integer",
"format": "int64"
},
"images": {
"type": "integer",
"format": "int64"
},
"meshes": {
"type": "integer",
"format": "int64"
}
}
},
"KBDeleted": {
"type": "object",
"description": "KBDeleted says a document left a collection.",
"properties": {
"name": {
"type": "string"
},
"deleted": {
"type": "boolean"
}
}
},
"License": {
"type": "object",
"description": "License is the terms what a model makes comes under.",
"properties": {
"name": {
"type": "string"
},
"url": {
"type": "string"
},
"notice": {
"type": "string"
}
}
},
"MCPRequest": {
"type": "object",
"description": "MCPRequest is a JSON-RPC 2.0 call to the gateway's MCP server: its tools are the memory notes.",
"properties": {
"jsonrpc": {
"type": "string"
},
"id": {
"description": "Any JSON value."
},
"method": {
"type": "string"
},
"params": {
"description": "Any JSON value."
}
}
},
"Me": {
"type": "object",
"description": "Me is the caller as the gateway sees it: its key, place and limits.",
"properties": {
"authenticated": {
"type": "boolean"
},
"key_id": {
"type": "string"
},
"key": {
"type": "string"
},
"project": {
"type": "string"
},
"team": {
"type": "string"
},
"organization": {
"type": "string"
},
"limits": {
"description": "Limits and Usage are what applies and what has been used of it.\n\nAny JSON value."
},
"usage": {
"description": "Any JSON value."
}
}
},
"MemoryList": {
"type": "object",
"description": "MemoryList is the project's notes.",
"properties": {
"object": {
"type": "string"
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/MemoryNote"
}
}
}
},
"MemoryNote": {
"type": "object",
"description": "MemoryNote is a note kept.",
"properties": {
"key": {
"type": "string"
},
"text": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
}
},
"MemoryWrite": {
"type": "object",
"description": "MemoryWrite is a note kept for the caller's project.",
"properties": {
"text": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"MeshRequest": {
"type": "object",
"description": "MeshRequest asks for a 3D model from a picture, of a model that makes them: a job.",
"properties": {
"model": {
"type": "string"
},
"image": {
"type": "string",
"description": "Image is the picture, base64 or a data URL: PNG, JPEG or WebP, one object on a plain background."
},
"seed": {
"type": "integer",
"format": "int64"
},
"steps": {
"type": "integer"
},
"resolution": {
"type": "integer",
"description": "Resolution is the model's grid, a multiple of 32 from 64 to 2048."
}
}
},
"MessagesRequest": {
"type": "object",
"description": "MessagesRequest is Anthropic's Messages API, translated to chat completions.",
"properties": {
"model": {
"type": "string"
},
"messages": {
"description": "Any JSON value."
},
"system": {
"description": "Any JSON value."
},
"max_tokens": {
"type": "integer"
},
"stream": {
"type": "boolean"
},
"tools": {
"description": "Any JSON value."
}
}
},
"ModelInfo": {
"type": "object",
"description": "ModelInfo is a model a key may use.",
"properties": {
"id": {
"type": "string"
},
"object": {
"type": "string"
},
"created": {
"type": "integer",
"format": "int64"
},
"owned_by": {
"type": "string"
},
"context_length": {
"type": "integer",
"description": "ContextLength and MaxOutputTokens, where the catalog says."
},
"max_output_tokens": {
"type": "integer"
},
"description": {
"type": "string"
},
"capabilities": {
"type": "object",
"additionalProperties": {
"type": "boolean"
},
"description": "Capabilities: tools, vision, embeddings, images, meshes."
},
"license": {
"$ref": "#/components/schemas/License"
}
}
},
"ModelList": {
"type": "object",
"description": "ModelList is the models a key may use.",
"properties": {
"object": {
"type": "string"
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ModelInfo"
}
}
}
},
"ModerationRequest": {
"type": "object",
"description": "ModerationRequest asks the guardrails' judge.",
"properties": {
"input": {
"description": "Input is a string or up to 32 of them.\n\nAny JSON value."
},
"model": {
"type": "string"
}
}
},
"ModerationResponse": {
"type": "object",
"description": "ModerationResponse is every input's verdict.",
"properties": {
"id": {
"type": "string"
},
"model": {
"type": "string"
},
"results": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ModerationResult"
}
}
}
},
"ModerationResult": {
"type": "object",
"description": "ModerationResult is one input's verdict.",
"properties": {
"flagged": {
"type": "boolean"
},
"categories": {
"type": "object",
"additionalProperties": {
"type": "boolean"
}
},
"category_scores": {
"type": "object",
"additionalProperties": {
"type": "number"
}
}
}
},
"RequestCounts": {
"type": "object",
"description": "RequestCounts is how a batch's lines went.",
"properties": {
"total": {
"type": "integer"
},
"completed": {
"type": "integer"
},
"failed": {
"type": "integer"
}
}
},
"RerankRequest": {
"type": "object",
"description": "RerankRequest orders documents by a query, for a reranker vLLM serves.",
"properties": {
"model": {
"type": "string"
},
"query": {
"type": "string"
},
"documents": {
"type": "array",
"items": {
"type": "string"
}
},
"top_n": {
"type": "integer"
}
}
},
"ResponsesRequest": {
"type": "object",
"description": "ResponsesRequest is OpenAI's Responses API, translated to chat completions.",
"properties": {
"model": {
"type": "string"
},
"input": {
"description": "Input is a string or a list of items: messages, function calls and their outputs.\n\nAny JSON value."
},
"instructions": {
"type": "string"
},
"stream": {
"type": "boolean"
},
"tools": {
"description": "Any JSON value."
},
"text": {
"description": "Text carries format: a JSON schema the answer follows.\n\nAny JSON value."
},
"max_output_tokens": {
"type": "integer"
}
}
},
"ScoreRequest": {
"type": "object",
"description": "ScoreRequest scores pairs of texts, for a scorer vLLM serves.",
"properties": {
"model": {
"type": "string"
},
"text_1": {
"description": "TextA and TextB are strings or lists of them.\n\nAny JSON value."
},
"text_2": {
"description": "Any JSON value."
}
}
},
"StreamOptions": {
"type": "object",
"description": "StreamOptions asks for usage in the last chunk of a stream.",
"properties": {
"include_usage": {
"type": "boolean"
}
}
},
"TokenCount": {
"type": "object",
"description": "TokenCount is how many tokens a Messages request would be.",
"properties": {
"input_tokens": {
"type": "integer"
}
}
},
"Transcription": {
"type": "object",
"description": "Transcription is the text.",
"properties": {
"text": {
"type": "string"
}
}
},
"TranscriptionForm": {
"type": "object",
"description": "TranscriptionForm is speech to text, sent as a form.",
"properties": {
"file": {
"type": "string",
"contentEncoding": "base64",
"description": "File is the audio."
},
"model": {
"type": "string"
},
"language": {
"type": "string"
},
"prompt": {
"type": "string"
},
"response_format": {
"type": "string"
},
"temperature": {
"type": "number"
}
}
},
"Usage": {
"type": "object",
"description": "Usage is what a request used.",
"properties": {
"prompt_tokens": {
"type": "integer"
},
"completion_tokens": {
"type": "integer"
},
"total_tokens": {
"type": "integer"
}
}
},
"router.KBCollectionView": {
"type": "object",
"description": "KBCollectionView is a collection as a caller sees it.",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"owner": {
"type": "string",
"description": "Owner is the owning scope as scope:ID; OwnerName how people know it, \"Acme / hr\"."
},
"owner_name": {
"type": "string"
},
"embed_model": {
"type": "string"
},
"dims": {
"type": "integer"
},
"writable": {
"type": "boolean",
"description": "Writable is whether this caller may add and remove documents."
}
}
},
"router.KBDocumentView": {
"type": "object",
"description": "KBDocumentView is a document as the manifest lists it.",
"properties": {
"name": {
"type": "string"
},
"digest": {
"type": "string"
},
"bytes": {
"type": "integer",
"format": "int64"
},
"chunks": {
"type": "integer"
},
"added_at": {
"type": "string",
"format": "date-time"
}
}
},
"router.KBManifest": {
"type": "object",
"description": "KBManifest is a collection and its documents: what a sync compares the files on disk with.",
"properties": {
"collection": {
"$ref": "#/components/schemas/router.KBCollectionView"
},
"documents": {
"type": "array",
"items": {
"$ref": "#/components/schemas/router.KBDocumentView"
}
}
}
},
"router.KBPutDocument": {
"type": "object",
"description": "KBPutDocument is one document, read and embedded by the client.",
"properties": {
"name": {
"type": "string"
},
"digest": {
"type": "string"
},
"bytes": {
"type": "integer",
"format": "int64"
},
"chunks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string"
},
"embedding": {
"type": "array",
"items": {
"type": "number"
}
}
}
}
}
}
},
"router.KBPutResult": {
"type": "object",
"description": "KBPutResult is what adding a document did.",
"properties": {
"name": {
"type": "string"
},
"chunks": {
"type": "integer"
},
"changed": {
"type": "boolean"
}
}
}
}
}
}