协作头脑风暴
brainstorming
在实现前澄清需求、探索设计选择,并形成清晰的开发方向。
openai-specs【开发与工程】Build and debug LitServe OpenAI-compatible chat completions and embeddings endpoints with OpenAISpec and OpenAIEmbeddingSpec.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
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.