first commit
This commit is contained in:
@@ -0,0 +1,204 @@
|
||||
{
|
||||
"swagger": "2.0",
|
||||
"info": {
|
||||
"description": "OpenAI-compatible and Anthropic-compatible LLM proxy/gateway with Bifrost mapping. All configuration is loaded from environment variables.",
|
||||
"title": "LLM Gateway API",
|
||||
"termsOfService": "http://swagger.io/terms/",
|
||||
"contact": {
|
||||
"name": "optoant",
|
||||
"email": "admin@optoant.local"
|
||||
},
|
||||
"license": {
|
||||
"name": "MIT",
|
||||
"url": "https://opensource.org/licenses/MIT"
|
||||
},
|
||||
"version": "1.0"
|
||||
},
|
||||
"host": "localhost:8000",
|
||||
"basePath": "/",
|
||||
"paths": {
|
||||
"/health": {
|
||||
"get": {
|
||||
"description": "Returns service health status, database connectivity, and active configuration.",
|
||||
"produces": ["application/json"],
|
||||
"tags": ["health"],
|
||||
"summary": "Health check",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "OK",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/HealthResponse"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/v1/{path}": {
|
||||
"post": {
|
||||
"security": [{"BearerAuth": []}],
|
||||
"description": "Forwards any /v1/* request to the configured OpenAI-compatible backend (e.g. DeepSeek). The Authorization header and all standard headers are passed through.",
|
||||
"consumes": ["application/json"],
|
||||
"produces": ["application/json"],
|
||||
"tags": ["openai"],
|
||||
"summary": "OpenAI-compatible proxy",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "string",
|
||||
"description": "OpenAI API path (e.g. chat/completions)",
|
||||
"name": "path",
|
||||
"in": "path",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"description": "OpenAI chat completions request",
|
||||
"name": "body",
|
||||
"in": "body",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"$ref": "#/definitions/OpenAIChatRequest"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Upstream response forwarded as-is"
|
||||
},
|
||||
"502": {
|
||||
"description": "Bad Gateway — upstream unreachable",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/ErrorResponse"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/anthropic/{path}": {
|
||||
"post": {
|
||||
"security": [{"BearerAuth": []}],
|
||||
"description": "Converts Anthropic Messages API requests to OpenAI format, forwards to OPENAI_BACKEND, and converts the response back to Anthropic format.",
|
||||
"consumes": ["application/json"],
|
||||
"produces": ["application/json"],
|
||||
"tags": ["anthropic"],
|
||||
"summary": "Anthropic-compatible proxy",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "string",
|
||||
"description": "Anthropic API path (e.g. v1/messages)",
|
||||
"name": "path",
|
||||
"in": "path",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"description": "Anthropic Messages API request",
|
||||
"name": "body",
|
||||
"in": "body",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"$ref": "#/definitions/AnthropicRequest"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Response in Anthropic format",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/AnthropicResponse"
|
||||
}
|
||||
},
|
||||
"502": {
|
||||
"description": "Bad Gateway — upstream unreachable",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/ErrorResponse"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"definitions": {
|
||||
"HealthResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"status": {"type": "string", "example": "ok"},
|
||||
"database": {"type": "string", "example": "ok"},
|
||||
"config": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"openai_backend": {"type": "string"},
|
||||
"port": {"type": "string"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"OpenAIChatRequest": {
|
||||
"type": "object",
|
||||
"required": ["model", "messages"],
|
||||
"properties": {
|
||||
"model": {"type": "string", "example": "gpt-4"},
|
||||
"messages": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"role": {"type": "string", "example": "user"},
|
||||
"content": {"type": "string", "example": "Hello!"}
|
||||
}
|
||||
}
|
||||
},
|
||||
"stream": {"type": "boolean", "example": false}
|
||||
}
|
||||
},
|
||||
"AnthropicRequest": {
|
||||
"type": "object",
|
||||
"required": ["model", "max_tokens", "messages"],
|
||||
"properties": {
|
||||
"model": {"type": "string", "example": "claude-3-5-sonnet-20241022"},
|
||||
"max_tokens": {"type": "integer", "example": 1024},
|
||||
"system": {"type": "string", "example": "You are a helpful assistant."},
|
||||
"messages": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"role": {"type": "string", "example": "user"},
|
||||
"content": {"type": "string", "example": "Hello!"}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"AnthropicResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"id": {"type": "string"},
|
||||
"type": {"type": "string", "example": "message"},
|
||||
"role": {"type": "string", "example": "assistant"},
|
||||
"model": {"type": "string"},
|
||||
"stop_reason": {"type": "string", "example": "end_turn"},
|
||||
"content": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"type": {"type": "string", "example": "text"},
|
||||
"text": {"type": "string"}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"ErrorResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"error": {"type": "string", "example": "upstream error: connection refused"}
|
||||
}
|
||||
}
|
||||
},
|
||||
"securityDefinitions": {
|
||||
"BearerAuth": {
|
||||
"type": "apiKey",
|
||||
"name": "Authorization",
|
||||
"in": "header"
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user