brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
openai-specsBuild and debug LitServe OpenAI-compatible chat completions and embeddings endpoints with OpenAISpec and OpenAIEmbeddingSpec.
Independent GitHub snapshot · Automated classification · Original documentation governs
Use this sub-skill when the user wants a LitServe server that looks like the
OpenAI API, including /v1/chat/completions, /v1/embeddings, streaming chat,
tool calls, response_format, image/audio chat messages, or embedding response
shape debugging.
For the underlying LitServe server model, LitAPI lifecycle, LitServer.run,
ports, process settings, auth, middleware, and non-OpenAI routes, first load the
root LitServe router at ../../SKILL.md and the server basics sub-skill at
../server-basics/SKILL.md.
Do not use this sub-skill for MCP tool exposure, GPU/Torch benchmark paths, or throughput benchmark harnesses.
OpenAISpec for /v1/chat/completions.
LitAPI.predict as a generator, even when clients send
non-streaming requests.ChatMessage-compatible objects with role, content,
tool_calls, and optional token usage keys.encode_response, it must also be a generator in sync mode.enable_async=True on the LitAPI and make
predict an async generator. decode_request may be sync or async;
overridden encode_response must yield from either a sync generator or async
generator.stream=True selects SSE chunks; stream=False returns one
JSON chat.completion response assembled from the same generated messages.tool_calls=[...]; keep
function.arguments as a JSON string.response_format from the request/context and
yield JSON text yourself. LitServe accepts OpenAI-style text, json_object,
and json_schema request shapes, but it does not synthesize or validate model
JSON for you.messages[*].content as either text or a
list of content items. Image items use image_url; audio items use
input_audio with format limited to wav or mp3.OpenAIEmbeddingSpec for /v1/embeddings.
predict and encode_response must return values, not generators.{"embeddings": <list-of-vectors>} from custom encode_response,
plus optional prompt_tokens and total_tokens.api_path registers the endpoint, but the OpenAI Python SDK only targets the
default /v1/chat/completions and /v1/embeddings paths through
base_url="http://host:port/v1".Chat completions:
import litserve as ls
from litserve import OpenAISpec
class ChatAPI(ls.LitAPI):
def predict(self, request):
# request is a ChatCompletionRequest
yield "This is a generated output"
if __name__ == "__main__":
api = ChatAPI(spec=OpenAISpec())
server = ls.LitServer(api)
server.run(port=8000)
Embeddings:
import litserve as ls
from litserve import OpenAIEmbeddingSpec
class EmbeddingAPI(ls.LitAPI):
def predict(self, inputs):
n = len(inputs) if isinstance(inputs, list) else 1
return [[0.0, 1.0, 0.5] for _ in range(n)]
def encode_response(self, output):
return {"embeddings": output}
if __name__ == "__main__":
api = EmbeddingAPI(spec=OpenAIEmbeddingSpec())
server = ls.LitServer(api)
server.run(port=8000)
Bundled runnable examples:
scripts/openai_chat_server.py — chat completions server with streaming,
usage, tool-call, response_format, image, and audio request handling hooks.scripts/openai_embedding_server.py — deterministic embeddings server with
OpenAI-compatible response shape and optional usage accounting.references/api-reference.md — request/response models, endpoint paths,
response assembly rules, validation contracts, and import paths.references/workflows.md — implementation recipes for chat, streaming,
tool calls, JSON response format, multimodal messages, embeddings, batching,
and OpenAI SDK clients.references/troubleshooting.md — failure matrix for generator validation,
async mode, malformed outputs, embedding response rejection, multimodal
payload errors, batching conflicts, and custom path warnings.Before claiming an OpenAI-compatible LitServe endpoint is ready:
OpenAISpec() for chat or
OpenAIEmbeddingSpec() for embeddings.predict is generator-based and any custom
encode_response is generator-based.enable_async=True and predict is an async
generator.embeddings key with one vector per requested input item.