737 lines
No EOL
18 KiB
JSON
737 lines
No EOL
18 KiB
JSON
{
|
||
"openapi": "3.0.0",
|
||
"info": {
|
||
"title": "SLOP API",
|
||
"description": "A SLOP pattern implementation with dynamic model endpoints, tools, memory, resources, and payment simulation.",
|
||
"version": "1.0.0"
|
||
},
|
||
"servers": [
|
||
{
|
||
"url": "http://localhost:31337",
|
||
"description": "Local development server"
|
||
},
|
||
{
|
||
"url": "https://slop.unturf.com",
|
||
"description": "Production server"
|
||
}
|
||
],
|
||
"paths": {
|
||
"/chat": {
|
||
"post": {
|
||
"summary": "Send a message to an AI model",
|
||
"tags": ["Chat"],
|
||
"requestBody": {
|
||
"required": true,
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ChatRequest"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful response with AI message",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ChatResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"404": {
|
||
"description": "Model not found",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ErrorResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"500": {
|
||
"description": "Server error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ErrorResponse"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"/models": {
|
||
"get": {
|
||
"summary": "List available models",
|
||
"tags": ["Models"],
|
||
"responses": {
|
||
"200": {
|
||
"description": "List of model IDs",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ModelsResponse"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"/tools": {
|
||
"get": {
|
||
"summary": "List available tools",
|
||
"tags": ["Tools"],
|
||
"responses": {
|
||
"200": {
|
||
"description": "List of tools",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ToolsResponse"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"/tools/{tool_id}": {
|
||
"post": {
|
||
"summary": "Use a specific tool",
|
||
"tags": ["Tools"],
|
||
"parameters": [
|
||
{
|
||
"name": "tool_id",
|
||
"in": "path",
|
||
"required": true,
|
||
"schema": {
|
||
"type": "string",
|
||
"enum": ["calculator", "greet"]
|
||
}
|
||
}
|
||
],
|
||
"requestBody": {
|
||
"required": true,
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ToolRequest"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"responses": {
|
||
"200": {
|
||
"description": "Tool execution result",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ToolResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"400": {
|
||
"description": "Missing required parameter",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ErrorResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"404": {
|
||
"description": "Tool not found",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ErrorResponse"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"/memory": {
|
||
"get": {
|
||
"summary": "List all memory keys",
|
||
"tags": ["Memory"],
|
||
"responses": {
|
||
"200": {
|
||
"description": "List of memory keys",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/MemoryListResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"503": {
|
||
"description": "Memory lock timeout",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ErrorResponse"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"post": {
|
||
"summary": "Store a key-value pair in memory",
|
||
"tags": ["Memory"],
|
||
"requestBody": {
|
||
"required": true,
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/MemoryStoreRequest"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successfully stored",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/MemoryStoreResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"400": {
|
||
"description": "Missing key or value",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ErrorResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"503": {
|
||
"description": "Memory lock timeout",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ErrorResponse"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"/memory/{key}": {
|
||
"get": {
|
||
"summary": "Retrieve a value by key from memory",
|
||
"tags": ["Memory"],
|
||
"parameters": [
|
||
{
|
||
"name": "key",
|
||
"in": "path",
|
||
"required": true,
|
||
"schema": {
|
||
"type": "string"
|
||
}
|
||
}
|
||
],
|
||
"responses": {
|
||
"200": {
|
||
"description": "Retrieved value",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/MemoryGetResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"503": {
|
||
"description": "Memory lock timeout",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ErrorResponse"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"delete": {
|
||
"summary": "Delete a memory key",
|
||
"tags": ["Memory"],
|
||
"parameters": [
|
||
{
|
||
"name": "key",
|
||
"in": "path",
|
||
"required": true,
|
||
"schema": {
|
||
"type": "string"
|
||
}
|
||
}
|
||
],
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successfully deleted",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/MemoryStoreResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"404": {
|
||
"description": "Key not found",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ErrorResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"503": {
|
||
"description": "Memory lock timeout",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ErrorResponse"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"/resources": {
|
||
"get": {
|
||
"summary": "List all available resources",
|
||
"tags": ["Resources"],
|
||
"responses": {
|
||
"200": {
|
||
"description": "List of resources",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ResourcesResponse"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"/resources/{resource_id}": {
|
||
"get": {
|
||
"summary": "Get a specific resource or nested resources by prefix",
|
||
"description": "Retrieves a resource by its exact ID. If no exact match is found, performs a prefix search (e.g., `/resources/foo` returns all resources under `foo/` like `foo/bar` and `foo/baz`).",
|
||
"tags": ["Resources"],
|
||
"parameters": [
|
||
{
|
||
"name": "resource_id",
|
||
"in": "path",
|
||
"required": true,
|
||
"schema": {
|
||
"type": "string"
|
||
},
|
||
"description": "The ID of the resource or a prefix for nested resources (e.g., \"foo\" for \"foo/bar\")."
|
||
}
|
||
],
|
||
"responses": {
|
||
"200": {
|
||
"description": "Resource content or list of nested resources",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"oneOf": [
|
||
{
|
||
"$ref": "#/components/schemas/ResourceResponse"
|
||
},
|
||
{
|
||
"$ref": "#/components/schemas/ResourcesResponse"
|
||
}
|
||
]
|
||
},
|
||
"examples": {
|
||
"exactMatch": {
|
||
"summary": "Exact resource match",
|
||
"value": {
|
||
"id": "hello",
|
||
"content": "Hello, SLOP!"
|
||
}
|
||
},
|
||
"prefixMatch": {
|
||
"summary": "Nested resources via prefix search",
|
||
"value": {
|
||
"resources": [
|
||
{
|
||
"id": "foo/bar",
|
||
"content": "Nested Foo Bar"
|
||
},
|
||
{
|
||
"id": "foo/baz",
|
||
"content": "Nested Foo Baz"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"404": {
|
||
"description": "No resource or nested resources found",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ErrorResponse"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"put": {
|
||
"summary": "Update or create a resource",
|
||
"description": "Updates an existing resource or creates a new one if it doesn’t exist.",
|
||
"tags": ["Resources"],
|
||
"parameters": [
|
||
{
|
||
"name": "resource_id",
|
||
"in": "path",
|
||
"required": true,
|
||
"schema": {
|
||
"type": "string"
|
||
},
|
||
"description": "The ID of the resource to update or create."
|
||
}
|
||
],
|
||
"requestBody": {
|
||
"required": true,
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ResourceUpdateRequest"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"responses": {
|
||
"200": {
|
||
"description": "Resource updated or created successfully",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ResourceUpdateResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"400": {
|
||
"description": "Missing content field",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ErrorResponse"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"/pay": {
|
||
"post": {
|
||
"summary": "Simulate a payment",
|
||
"tags": ["Pay"],
|
||
"requestBody": {
|
||
"required": true,
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/PayRequest"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"responses": {
|
||
"200": {
|
||
"description": "Payment simulation result",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/PayResponse"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"components": {
|
||
"schemas": {
|
||
"ChatRequest": {
|
||
"type": "object",
|
||
"properties": {
|
||
"messages": {
|
||
"type": "array",
|
||
"items": {
|
||
"$ref": "#/components/schemas/Message"
|
||
}
|
||
},
|
||
"model": {
|
||
"type": "string",
|
||
"nullable": true
|
||
}
|
||
},
|
||
"required": ["messages"]
|
||
},
|
||
"Message": {
|
||
"type": "object",
|
||
"properties": {
|
||
"role": {
|
||
"type": "string",
|
||
"enum": ["user", "assistant", "system"]
|
||
},
|
||
"content": {
|
||
"type": "string"
|
||
}
|
||
},
|
||
"required": ["role", "content"]
|
||
},
|
||
"ChatResponse": {
|
||
"type": "object",
|
||
"properties": {
|
||
"choices": {
|
||
"type": "array",
|
||
"items": {
|
||
"type": "object",
|
||
"properties": {
|
||
"message": {
|
||
"type": "object",
|
||
"properties": {
|
||
"content": {
|
||
"type": "string"
|
||
}
|
||
},
|
||
"required": ["content"]
|
||
}
|
||
},
|
||
"required": ["message"]
|
||
}
|
||
}
|
||
},
|
||
"required": ["choices"]
|
||
},
|
||
"ModelsResponse": {
|
||
"type": "object",
|
||
"properties": {
|
||
"models": {
|
||
"type": "array",
|
||
"items": {
|
||
"type": "string"
|
||
}
|
||
}
|
||
},
|
||
"required": ["models"]
|
||
},
|
||
"ToolsResponse": {
|
||
"type": "object",
|
||
"properties": {
|
||
"tools": {
|
||
"type": "array",
|
||
"items": {
|
||
"type": "object",
|
||
"properties": {
|
||
"id": {
|
||
"type": "string"
|
||
},
|
||
"description": {
|
||
"type": "string"
|
||
}
|
||
},
|
||
"required": ["id", "description"]
|
||
}
|
||
}
|
||
},
|
||
"required": ["tools"]
|
||
},
|
||
"ToolRequest": {
|
||
"type": "object",
|
||
"properties": {
|
||
"expression": {
|
||
"type": "string",
|
||
"nullable": true
|
||
},
|
||
"name": {
|
||
"type": "string",
|
||
"nullable": true
|
||
}
|
||
}
|
||
},
|
||
"ToolResponse": {
|
||
"type": "object",
|
||
"properties": {
|
||
"result": {
|
||
"oneOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "integer"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["result"]
|
||
},
|
||
"MemoryStoreRequest": {
|
||
"type": "object",
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"type": "string"
|
||
}
|
||
},
|
||
"required": ["key", "value"]
|
||
},
|
||
"MemoryStoreResponse": {
|
||
"type": "object",
|
||
"properties": {
|
||
"status": {
|
||
"type": "string",
|
||
"enum": ["stored", "deleted"]
|
||
}
|
||
},
|
||
"required": ["status"]
|
||
},
|
||
"MemoryGetResponse": {
|
||
"type": "object",
|
||
"properties": {
|
||
"value": {
|
||
"type": "string",
|
||
"nullable": true
|
||
}
|
||
},
|
||
"required": ["value"]
|
||
},
|
||
"MemoryListResponse": {
|
||
"type": "object",
|
||
"properties": {
|
||
"keys": {
|
||
"type": "array",
|
||
"items": {
|
||
"type": "string"
|
||
}
|
||
}
|
||
},
|
||
"required": ["keys"]
|
||
},
|
||
"ResourcesResponse": {
|
||
"type": "object",
|
||
"properties": {
|
||
"resources": {
|
||
"type": "array",
|
||
"items": {
|
||
"type": "object",
|
||
"properties": {
|
||
"id": {
|
||
"type": "string"
|
||
},
|
||
"content": {
|
||
"type": "string"
|
||
}
|
||
},
|
||
"required": ["id", "content"]
|
||
}
|
||
}
|
||
},
|
||
"required": ["resources"]
|
||
},
|
||
"ResourceResponse": {
|
||
"type": "object",
|
||
"properties": {
|
||
"id": {
|
||
"type": "string"
|
||
},
|
||
"content": {
|
||
"type": "string"
|
||
}
|
||
},
|
||
"required": ["id", "content"]
|
||
},
|
||
"ResourceUpdateRequest": {
|
||
"type": "object",
|
||
"properties": {
|
||
"content": {
|
||
"type": "string",
|
||
"description": "The content to set for the resource."
|
||
}
|
||
},
|
||
"required": ["content"]
|
||
},
|
||
"ResourceUpdateResponse": {
|
||
"type": "object",
|
||
"properties": {
|
||
"status": {
|
||
"type": "string",
|
||
"enum": ["updated"]
|
||
},
|
||
"resource": {
|
||
"$ref": "#/components/schemas/ResourceResponse"
|
||
}
|
||
},
|
||
"required": ["status", "resource"]
|
||
},
|
||
"PayRequest": {
|
||
"type": "object",
|
||
"properties": {
|
||
"amount": {
|
||
"type": "number",
|
||
"format": "float"
|
||
}
|
||
},
|
||
"required": ["amount"]
|
||
},
|
||
"PayResponse": {
|
||
"type": "object",
|
||
"properties": {
|
||
"transaction_id": {
|
||
"type": "string"
|
||
},
|
||
"status": {
|
||
"type": "string",
|
||
"enum": ["success"]
|
||
}
|
||
},
|
||
"required": ["transaction_id", "status"]
|
||
},
|
||
"ErrorResponse": {
|
||
"type": "object",
|
||
"properties": {
|
||
"error": {
|
||
"type": "string"
|
||
}
|
||
},
|
||
"required": ["error"]
|
||
}
|
||
}
|
||
}
|
||
} |