feat: 初始化考培练系统项目

- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
This commit is contained in:
111
2026-01-24 19:33:28 +08:00
commit 998211c483
1197 changed files with 228429 additions and 0 deletions

View File

@@ -0,0 +1,136 @@
"""
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()}