Files
012-kaopeilian/backend/app/services/ai/coze/models.py
111 998211c483 feat: 初始化考培练系统项目
- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
2026-01-24 19:33:28 +08:00

137 lines
4.4 KiB
Python

"""
Coze 服务数据模型
"""
from typing import Optional, List, Dict, Any, Literal
from datetime import datetime
from pydantic import BaseModel, Field
from enum import Enum
class SessionType(str, Enum):
"""会话类型"""
COURSE_CHAT = "course_chat" # 课程对话
TRAINING = "training" # 陪练会话
EXAM = "exam" # 考试会话
class MessageRole(str, Enum):
"""消息角色"""
USER = "user"
ASSISTANT = "assistant"
SYSTEM = "system"
class ContentType(str, Enum):
"""内容类型"""
TEXT = "text"
CARD = "card"
IMAGE = "image"
FILE = "file"
class StreamEventType(str, Enum):
"""流式事件类型"""
MESSAGE_START = "conversation.message.start"
MESSAGE_DELTA = "conversation.message.delta"
MESSAGE_COMPLETED = "conversation.message.completed"
ERROR = "error"
DONE = "done"
class CozeSession(BaseModel):
"""Coze 会话模型"""
session_id: str = Field(..., description="会话ID")
conversation_id: str = Field(..., description="Coze对话ID")
session_type: SessionType = Field(..., description="会话类型")
user_id: str = Field(..., description="用户ID")
bot_id: str = Field(..., description="Bot ID")
created_at: datetime = Field(default_factory=datetime.now, description="创建时间")
ended_at: Optional[datetime] = Field(None, description="结束时间")
metadata: Dict[str, Any] = Field(default_factory=dict, description="元数据")
class Config:
json_encoders = {datetime: lambda v: v.isoformat()}
class CozeMessage(BaseModel):
"""Coze 消息模型"""
message_id: str = Field(..., description="消息ID")
session_id: str = Field(..., description="会话ID")
role: MessageRole = Field(..., description="消息角色")
content: str = Field(..., description="消息内容")
content_type: ContentType = Field(ContentType.TEXT, description="内容类型")
created_at: datetime = Field(default_factory=datetime.now, description="创建时间")
metadata: Dict[str, Any] = Field(default_factory=dict, description="元数据")
class Config:
json_encoders = {datetime: lambda v: v.isoformat()}
class StreamEvent(BaseModel):
"""流式事件模型"""
event: StreamEventType = Field(..., description="事件类型")
data: Dict[str, Any] = Field(..., description="事件数据")
message_id: Optional[str] = Field(None, description="消息ID")
content: Optional[str] = Field(None, description="内容")
content_type: Optional[ContentType] = Field(None, description="内容类型")
role: Optional[MessageRole] = Field(None, description="角色")
error: Optional[str] = Field(None, description="错误信息")
class CreateSessionRequest(BaseModel):
"""创建会话请求"""
session_type: SessionType = Field(..., description="会话类型")
user_id: str = Field(..., description="用户ID")
course_id: Optional[str] = Field(None, description="课程ID (课程对话时必需)")
training_topic: Optional[str] = Field(None, description="陪练主题 (陪练时可选)")
metadata: Dict[str, Any] = Field(default_factory=dict, description="额外元数据")
class CreateSessionResponse(BaseModel):
"""创建会话响应"""
session_id: str = Field(..., description="会话ID")
conversation_id: str = Field(..., description="Coze对话ID")
bot_id: str = Field(..., description="Bot ID")
created_at: datetime = Field(..., description="创建时间")
class Config:
json_encoders = {datetime: lambda v: v.isoformat()}
class SendMessageRequest(BaseModel):
"""发送消息请求"""
session_id: str = Field(..., description="会话ID")
content: str = Field(..., description="消息内容")
file_ids: List[str] = Field(default_factory=list, description="附件ID列表")
stream: bool = Field(True, description="是否流式响应")
class EndSessionRequest(BaseModel):
"""结束会话请求"""
reason: Optional[str] = Field(None, description="结束原因")
feedback: Optional[Dict[str, Any]] = Field(None, description="用户反馈")
class EndSessionResponse(BaseModel):
"""结束会话响应"""
session_id: str = Field(..., description="会话ID")
ended_at: datetime = Field(..., description="结束时间")
duration_seconds: int = Field(..., description="会话时长(秒)")
message_count: int = Field(..., description="消息数量")
class Config:
json_encoders = {datetime: lambda v: v.isoformat()}