31 lines
803 B
Python
31 lines
803 B
Python
|
import asyncio
|
|||
|
from typing import Awaitable
|
|||
|
from pydantic import BaseModel, Field
|
|||
|
|
|||
|
|
|||
|
async def wrap_done(fn: Awaitable, event: asyncio.Event):
|
|||
|
"""Wrap an awaitable with a event to signal when it's done or an exception is raised."""
|
|||
|
try:
|
|||
|
await fn
|
|||
|
except Exception as e:
|
|||
|
# TODO: handle exception
|
|||
|
print(f"Caught exception: {e}")
|
|||
|
finally:
|
|||
|
# Signal the aiter to stop.
|
|||
|
event.set()
|
|||
|
|
|||
|
|
|||
|
class History(BaseModel):
|
|||
|
"""
|
|||
|
对话历史
|
|||
|
可从dict生成,如
|
|||
|
h = History(**{"role":"user","content":"你好"})
|
|||
|
也可转换为tuple,如
|
|||
|
h.to_msy_tuple = ("human", "你好")
|
|||
|
"""
|
|||
|
role: str = Field(...)
|
|||
|
content: str = Field(...)
|
|||
|
|
|||
|
def to_msg_tuple(self):
|
|||
|
return "ai" if self.role=="assistant" else "human", self.content
|