modify: 流式输出
This commit is contained in:
@@ -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",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
]
|
]
|
||||||
@@ -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}
|
||||||
Reference in New Issue
Block a user