modify: 流式输出

This commit is contained in:
2026-08-21 14:48:05 +08:00
parent 5e5dee83df
commit 51aa93eefb
4 changed files with 46 additions and 3 deletions
+2
View File
@@ -15,6 +15,7 @@ from .pydantic import ExampleResponse
from .pydantic import HeartbeatMqttRequest from .pydantic import HeartbeatMqttRequest
from .pydantic import MultiplyGetRequest from .pydantic import MultiplyGetRequest
from .pydantic import MultiplyGetResponse from .pydantic import MultiplyGetResponse
from .pydantic import StreamChatPostRequest
from .pydantic import SubtractGetRequest from .pydantic import SubtractGetRequest
from .pydantic import SubtractGetResponse from .pydantic import SubtractGetResponse
@@ -31,6 +32,7 @@ __all__ = [
"HeartbeatMqttRequest", "HeartbeatMqttRequest",
"MultiplyGetRequest", "MultiplyGetRequest",
"MultiplyGetResponse", "MultiplyGetResponse",
"StreamChatPostRequest",
"SubtractGetRequest", "SubtractGetRequest",
"SubtractGetResponse", "SubtractGetResponse",
] ]
+7 -2
View File
@@ -5,7 +5,7 @@
from __future__ import annotations from __future__ import annotations
from typing import Any, Optional from typing import Optional
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
class AddGetRequest(BaseModel): class AddGetRequest(BaseModel):
@@ -67,6 +67,11 @@ class MultiplyGetResponse(BaseModel):
operation: str = Field(default='multiply') operation: str = Field(default='multiply')
timestamp: Optional[float] = Field(default=0.0) timestamp: Optional[float] = Field(default=0.0)
class StreamChatPostRequest(BaseModel):
"""模拟 AI 流式对话(SSE,逐 token 输出) — 请求体"""
prompt: str = Field(...)
tokens: int = Field(...)
class SubtractGetRequest(BaseModel): class SubtractGetRequest(BaseModel):
"""Subtract two numbers — 请求体""" """Subtract two numbers — 请求体"""
a: float = Field(...) a: float = Field(...)
@@ -80,4 +85,4 @@ class SubtractGetResponse(BaseModel):
# 所有响应模型的联合类型 # 所有响应模型的联合类型
ExampleResponse = AddPostResponse | AddGetResponse | DivideGetResponse | SubtractGetResponse | CountGetResponse | MultiplyGetResponse ExampleResponse = MultiplyGetResponse | AddPostResponse | CountGetResponse | SubtractGetResponse | DivideGetResponse | AddGetResponse
+3 -1
View File
@@ -5,6 +5,7 @@ from .subtract import subtract
from .multiply import multiply from .multiply import multiply
from .divide import divide from .divide import divide
from .count import count_get from .count import count_get
from .stream_chat import stream_chat
__all__ = [ __all__ = [
@@ -15,5 +16,6 @@ __all__ = [
"subtract", "subtract",
"multiply", "multiply",
"divide", "divide",
"count_get" "count_get",
"stream_chat"
] ]
+34
View File
@@ -0,0 +1,34 @@
"""
流式端点示例 — @rpc_method 返回异步生成器,框架自动逐块多回复推送
网关在 TOML 中声明 stream = true 时,该端点以 SSE(text/event-stream)输出:
POST /api/v1/calc/stream_chat {"prompt": "你好", "tokens": 5}
响应: data: {"token": "..."} ... data: {"done": true}
约定:
- 插件侧写法:函数返回生成器(yield),框架逐块 query.reply() 推送
- {"done": true} 是业务结束标记(插件自定义),不是协议哨兵——
流式协议以生成器自然结束为流终止信号
- 中途异常时框架自动发送 {"error": ...} 收尾块
"""
import asyncio
import logging
from chongming_worker import rpc_method
logger = logging.getLogger("plugins.example.stream_chat")
@rpc_method(
subject="example.stream_chat",
method="POST",
summary="模拟 AI 流式对话(SSE,逐 token 输出)",
stream=True,
)
async def stream_chat(prompt: str = "你好", tokens: int = 10):
"""逐 token 模拟生成:把 return 改成 yield,框架即自动流式推送"""
logger.info("收到流式请求: prompt=%s, tokens=%d", prompt, tokens)
for i in range(tokens):
await asyncio.sleep(0.05)
yield {"token": f"{prompt}·{i + 1}", "index": i}
yield {"done": True}