Build lightweight AI agent admin
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
"""
|
||||
AI 平台 Schema 定义
|
||||
"""
|
||||
from .provider_schema import *
|
||||
from .model_schema import *
|
||||
from .app_schema import *
|
||||
from .chat_schema import *
|
||||
from .workflow_schema import *
|
||||
from .agent_schema import *
|
||||
@@ -0,0 +1,312 @@
|
||||
"""
|
||||
智能体 Schema
|
||||
"""
|
||||
from typing import Optional, List, Any, Dict
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel, Field, ConfigDict
|
||||
|
||||
from app.base_schema import CSTDatetime
|
||||
|
||||
|
||||
# ==================== Agent Schema ====================
|
||||
|
||||
class PersonaConfig(BaseModel):
|
||||
"""人设配置"""
|
||||
role: str = Field(default="", description="角色定位")
|
||||
personality: List[str] = Field(default_factory=list, description="性格特点")
|
||||
skills: List[str] = Field(default_factory=list, description="技能")
|
||||
constraints: List[str] = Field(default_factory=list, description="约束条件")
|
||||
background: str = Field(default="", description="背景介绍")
|
||||
examples: List[Dict[str, str]] = Field(default_factory=list, description="对话示例")
|
||||
|
||||
|
||||
class AgentCreate(BaseModel):
|
||||
"""创建智能体"""
|
||||
model_config = ConfigDict(protected_namespaces=())
|
||||
|
||||
application_id: Optional[str] = Field(None, description="所属应用ID")
|
||||
is_global: bool = Field(default=False, description="是否在子应用中可见")
|
||||
name: str = Field(..., max_length=100, description="智能体名称")
|
||||
code: str = Field(..., max_length=100, pattern=r"^[a-zA-Z][a-zA-Z0-9_]*$", description="智能体编码(字母开头,只能包含字母、数字和下划线)")
|
||||
description: str = Field(default="", description="描述")
|
||||
avatar: str = Field(default="", description="头像")
|
||||
mode: str = Field(default="autonomous", description="运行模式")
|
||||
persona: Dict[str, Any] = Field(default_factory=dict, description="人设配置")
|
||||
system_prompt: str = Field(default="", description="系统提示词")
|
||||
model_id: Optional[str] = Field(None, description="模型 ID")
|
||||
temperature: float = Field(default=0.7, description="温度")
|
||||
top_p: float = Field(default=1.0, description="top_p")
|
||||
max_tokens: int = Field(default=4096, description="最大 Token")
|
||||
max_iterations: int = Field(default=10, description="最大推理轮数")
|
||||
welcome_message: str = Field(default="", description="开场白")
|
||||
suggested_questions: List[str] = Field(default_factory=list, description="推荐问题")
|
||||
workflow_id: Optional[str] = Field(None, description="工作流 ID(对话流模式)")
|
||||
knowledge_base_ids: List[str] = Field(default_factory=list, description="关联的知识库ID列表")
|
||||
knowledge_config: Dict[str, Any] = Field(default_factory=dict, description="知识库检索配置")
|
||||
is_public: bool = Field(default=False, description="是否公开")
|
||||
|
||||
|
||||
class AgentUpdate(BaseModel):
|
||||
"""更新智能体"""
|
||||
model_config = ConfigDict(protected_namespaces=())
|
||||
|
||||
application_id: Optional[str] = None
|
||||
is_global: Optional[bool] = None
|
||||
name: Optional[str] = None
|
||||
description: Optional[str] = None
|
||||
avatar: Optional[str] = None
|
||||
mode: Optional[str] = None
|
||||
persona: Optional[Dict[str, Any]] = None
|
||||
system_prompt: Optional[str] = None
|
||||
model_id: Optional[str] = None
|
||||
temperature: Optional[float] = None
|
||||
top_p: Optional[float] = None
|
||||
max_tokens: Optional[int] = None
|
||||
max_iterations: Optional[int] = None
|
||||
welcome_message: Optional[str] = None
|
||||
suggested_questions: Optional[List[str]] = None
|
||||
workflow_id: Optional[str] = None
|
||||
knowledge_base_ids: Optional[List[str]] = None
|
||||
knowledge_config: Optional[Dict[str, Any]] = None
|
||||
is_public: Optional[bool] = None
|
||||
enable_memory: Optional[bool] = None
|
||||
memory_window: Optional[int] = None
|
||||
enable_streaming: Optional[bool] = None
|
||||
|
||||
|
||||
class AgentResponse(BaseModel):
|
||||
"""智能体输出"""
|
||||
model_config = ConfigDict(from_attributes=True, protected_namespaces=())
|
||||
|
||||
id: str
|
||||
application_id: Optional[str] = None
|
||||
is_global: bool = False
|
||||
name: str
|
||||
code: str
|
||||
description: str = ""
|
||||
avatar: str = ""
|
||||
mode: str = "autonomous"
|
||||
status: str = "draft"
|
||||
persona: Dict[str, Any] = Field(default_factory=dict)
|
||||
system_prompt: str = ""
|
||||
model_id: Optional[str] = None
|
||||
model_name: str = ""
|
||||
temperature: float = 0.7
|
||||
top_p: float = 1.0
|
||||
max_tokens: int = 4096
|
||||
max_iterations: int = 10
|
||||
welcome_message: str = ""
|
||||
suggested_questions: List[str] = Field(default_factory=list)
|
||||
workflow_id: Optional[str] = None
|
||||
workflow_name: str = ""
|
||||
workflow_type: str = "general"
|
||||
is_public: bool = False
|
||||
enable_memory: bool = False
|
||||
memory_window: int = 10
|
||||
enable_streaming: bool = True
|
||||
knowledge_base_ids: List[str] = Field(default_factory=list)
|
||||
knowledge_config: Dict[str, Any] = Field(default_factory=dict)
|
||||
conversation_count: int = 0
|
||||
message_count: int = 0
|
||||
total_tokens: int = 0
|
||||
sort: int = 0
|
||||
sys_create_datetime: Optional[CSTDatetime] = None
|
||||
sys_update_datetime: Optional[CSTDatetime] = None
|
||||
|
||||
|
||||
class AgentListResponse(BaseModel):
|
||||
"""智能体列表输出"""
|
||||
model_config = ConfigDict(from_attributes=True, protected_namespaces=())
|
||||
|
||||
id: str
|
||||
application_id: Optional[str] = None
|
||||
application_name: str = ""
|
||||
is_global: bool = False
|
||||
name: str
|
||||
code: str
|
||||
description: str = ""
|
||||
avatar: str = ""
|
||||
mode: str = "autonomous"
|
||||
status: str = "draft"
|
||||
model_name: str = ""
|
||||
is_public: bool = False
|
||||
conversation_count: int = 0
|
||||
message_count: int = 0
|
||||
has_menu: bool = False
|
||||
sys_create_datetime: Optional[CSTDatetime] = None
|
||||
|
||||
|
||||
# ==================== 导入/导出 Schema ====================
|
||||
|
||||
class AgentImportCheckIn(BaseModel):
|
||||
"""智能体导入预检查请求"""
|
||||
code: str = Field(..., description="智能体编码")
|
||||
|
||||
|
||||
class AgentImportCheckOut(BaseModel):
|
||||
"""智能体导入预检查结果"""
|
||||
code_exists: bool = Field(..., description="智能体编码是否已存在")
|
||||
can_import: bool = Field(..., description="是否可以直接导入(编码不冲突)")
|
||||
|
||||
|
||||
class AgentImportIn(BaseModel):
|
||||
"""智能体配置导入"""
|
||||
application_id: Optional[str] = Field(None, description="所属应用ID")
|
||||
is_global: bool = Field(default=False, description="是否在子应用中可见")
|
||||
name: str = Field(..., description="智能体名称")
|
||||
code: str = Field(..., description="智能体编码")
|
||||
description: str = Field(default="", description="描述")
|
||||
avatar: str = Field(default="", description="头像")
|
||||
mode: str = Field(default="autonomous", description="运行模式")
|
||||
persona: Dict[str, Any] = Field(default_factory=dict, description="人设配置")
|
||||
system_prompt: str = Field(default="", description="系统提示词")
|
||||
model_name: str = Field(default="", description="模型名称(API model_name)")
|
||||
temperature: float = Field(default=0.7, description="温度")
|
||||
top_p: float = Field(default=1.0, description="top_p")
|
||||
max_tokens: int = Field(default=4096, description="最大 Token")
|
||||
max_iterations: int = Field(default=10, description="最大推理轮数")
|
||||
welcome_message: str = Field(default="", description="开场白")
|
||||
suggested_questions: List[str] = Field(default_factory=list, description="推荐问题")
|
||||
workflow_code: str = Field(default="", description="关联工作流编码")
|
||||
knowledge_base_codes: List[str] = Field(default_factory=list, description="知识库编码列表")
|
||||
knowledge_config: Dict[str, Any] = Field(default_factory=dict, description="知识库检索配置")
|
||||
enable_memory: bool = Field(default=False, description="是否启用对话记忆")
|
||||
memory_window: int = Field(default=10, description="记忆窗口大小")
|
||||
enable_streaming: bool = Field(default=True, description="是否启用流式输出")
|
||||
is_public: bool = Field(default=False, description="是否公开")
|
||||
|
||||
|
||||
# ==================== Conversation Schema ====================
|
||||
|
||||
class AgentConversationCreate(BaseModel):
|
||||
"""创建对话"""
|
||||
title: str = Field(default="", description="对话标题")
|
||||
|
||||
|
||||
class AgentConversationResponse(BaseModel):
|
||||
"""对话输出"""
|
||||
id: str
|
||||
agent_id: str
|
||||
agent_name: str = ""
|
||||
title: str = ""
|
||||
summary: str = ""
|
||||
message_count: int = 0
|
||||
total_tokens: int = 0
|
||||
sys_create_datetime: Optional[CSTDatetime] = None
|
||||
sys_update_datetime: Optional[CSTDatetime] = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class AgentConversationListResponse(BaseModel):
|
||||
"""对话列表输出"""
|
||||
id: str
|
||||
agent_id: str
|
||||
agent_name: str = ""
|
||||
title: str = ""
|
||||
message_count: int = 0
|
||||
sys_create_datetime: Optional[CSTDatetime] = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
# ==================== Message Schema ====================
|
||||
|
||||
class ReasoningStep(BaseModel):
|
||||
"""推理步骤"""
|
||||
type: str = Field(..., description="步骤类型: thought/action/observation")
|
||||
content: str = Field(default="", description="内容")
|
||||
tool: str = Field(default="", description="工具名称(action 类型)")
|
||||
params: Dict[str, Any] = Field(default_factory=dict, description="工具参数(action 类型)")
|
||||
timestamp: str = Field(default="", description="时间戳")
|
||||
|
||||
|
||||
class ToolCallRecord(BaseModel):
|
||||
"""工具调用记录"""
|
||||
tool: str = Field(..., description="工具名称")
|
||||
params: Dict[str, Any] = Field(default_factory=dict, description="参数")
|
||||
result: Any = Field(default=None, description="结果")
|
||||
elapsed_time: int = Field(default=0, description="耗时(毫秒)")
|
||||
status: str = Field(default="success", description="状态")
|
||||
|
||||
|
||||
class AttachmentResponse(BaseModel):
|
||||
"""附件输出
|
||||
|
||||
附件通过 file_id 关联文件管理系统(core_file_manager)
|
||||
前端通过 file_id 调用文件管理 API 获取访问 URL
|
||||
"""
|
||||
file_id: str = Field(..., description="文件管理系统中的文件 ID")
|
||||
type: str = Field(default="file", description="附件类型: image/file/audio/video")
|
||||
name: str = Field(default="", description="文件名")
|
||||
mime_type: str = Field(default="", description="MIME 类型")
|
||||
size: int = Field(default=0, description="文件大小(字节)")
|
||||
|
||||
|
||||
class AgentMessageResponse(BaseModel):
|
||||
"""消息输出"""
|
||||
id: str
|
||||
role: str
|
||||
content: str = ""
|
||||
attachments: List[AttachmentResponse] = Field(default_factory=list)
|
||||
status: str = "completed"
|
||||
reasoning_steps: List[ReasoningStep] = Field(default_factory=list)
|
||||
tool_calls: List[ToolCallRecord] = Field(default_factory=list)
|
||||
prompt_tokens: int = 0
|
||||
completion_tokens: int = 0
|
||||
total_tokens: int = 0
|
||||
elapsed_time: int = 0
|
||||
error_message: str = ""
|
||||
feedback: str = ""
|
||||
sys_create_datetime: Optional[CSTDatetime] = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class AttachmentInput(BaseModel):
|
||||
"""附件输入
|
||||
|
||||
附件通过 file_id 关联文件管理系统(core_file_manager)
|
||||
"""
|
||||
file_id: str = Field(..., description="文件管理系统中的文件 ID")
|
||||
type: str = Field(default="file", description="附件类型: image/file/audio/video")
|
||||
|
||||
|
||||
class ChatInput(BaseModel):
|
||||
"""对话输入"""
|
||||
message: str = Field(..., description="用户消息")
|
||||
conversation_id: Optional[str] = Field(None, description="对话 ID(续聊时提供)")
|
||||
application_id: Optional[str] = Field(None, description="子应用 ID(在子应用下自动注入)")
|
||||
form_code: Optional[str] = Field(None, description="表单编码(从表单列表调用时自动注入)")
|
||||
attachments: Optional[List[AttachmentInput]] = Field(None, description="附件列表")
|
||||
|
||||
|
||||
class ChatStreamEvent(BaseModel):
|
||||
"""对话流式事件"""
|
||||
type: str = Field(..., description="事件类型")
|
||||
content: str = Field(default="", description="内容")
|
||||
tool: str = Field(default="", description="工具名称")
|
||||
params: Dict[str, Any] = Field(default_factory=dict, description="工具参数")
|
||||
message_id: str = Field(default="", description="消息 ID")
|
||||
conversation_id: str = Field(default="", description="对话 ID")
|
||||
tokens_used: int = Field(default=0, description="Token 使用量")
|
||||
elapsed_time: int = Field(default=0, description="耗时")
|
||||
|
||||
|
||||
# ==================== Feedback Schema ====================
|
||||
|
||||
class MessageFeedback(BaseModel):
|
||||
"""消息反馈"""
|
||||
feedback: str = Field(..., description="反馈类型: like/dislike")
|
||||
content: str = Field(default="", description="反馈内容")
|
||||
|
||||
|
||||
# ==================== Publish Schema ====================
|
||||
|
||||
class AgentPublishInput(BaseModel):
|
||||
"""发布智能体到菜单"""
|
||||
menu_name: str = Field(..., description="菜单名称")
|
||||
menu_parent_id: Optional[str] = Field(None, description="上级菜单 ID")
|
||||
menu_icon: str = Field(default="lucide:bot", description="菜单图标")
|
||||
menu_order: int = Field(default=0, description="菜单排序")
|
||||
@@ -0,0 +1,92 @@
|
||||
"""
|
||||
AI 应用 Schema
|
||||
"""
|
||||
from typing import Optional, List, Any
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel, Field, ConfigDict
|
||||
|
||||
from app.base_schema import CSTDatetime
|
||||
|
||||
|
||||
class AppCreate(BaseModel):
|
||||
"""创建应用"""
|
||||
model_config = ConfigDict(protected_namespaces=())
|
||||
|
||||
name: str = Field(..., max_length=100, description="应用名称")
|
||||
code: str = Field(..., max_length=100, description="应用编码")
|
||||
description: str = Field(default="", description="描述")
|
||||
icon: str = Field(default="", description="图标")
|
||||
app_type: str = Field(default="chat", description="应用类型")
|
||||
model_id: Optional[str] = Field(None, description="默认模型 ID")
|
||||
system_prompt: str = Field(default="", description="系统提示词")
|
||||
temperature: float = Field(default=0.7, description="温度")
|
||||
top_p: float = Field(default=1.0, description="top_p")
|
||||
max_tokens: int = Field(default=2048, description="最大 Token")
|
||||
opening_statement: str = Field(default="", description="开场白")
|
||||
suggested_questions: List[str] = Field(default_factory=list, description="建议问题")
|
||||
is_public: bool = Field(default=False, description="是否公开")
|
||||
|
||||
|
||||
class AppUpdate(BaseModel):
|
||||
"""更新应用"""
|
||||
model_config = ConfigDict(protected_namespaces=())
|
||||
|
||||
name: Optional[str] = None
|
||||
description: Optional[str] = None
|
||||
icon: Optional[str] = None
|
||||
model_id: Optional[str] = None
|
||||
system_prompt: Optional[str] = None
|
||||
temperature: Optional[float] = None
|
||||
top_p: Optional[float] = None
|
||||
max_tokens: Optional[int] = None
|
||||
opening_statement: Optional[str] = None
|
||||
suggested_questions: Optional[List[str]] = None
|
||||
is_public: Optional[bool] = None
|
||||
workflow_definition: Optional[dict] = None
|
||||
|
||||
|
||||
class AppResponse(BaseModel):
|
||||
"""应用输出"""
|
||||
model_config = ConfigDict(from_attributes=True, protected_namespaces=())
|
||||
|
||||
id: str
|
||||
name: str
|
||||
code: str
|
||||
description: str = ""
|
||||
icon: str = ""
|
||||
app_type: str = "chat"
|
||||
status: str = "draft"
|
||||
model_id: Optional[str] = None
|
||||
model_name: str = ""
|
||||
system_prompt: str = ""
|
||||
temperature: float = 0.7
|
||||
top_p: float = 1.0
|
||||
max_tokens: int = 2048
|
||||
opening_statement: str = ""
|
||||
suggested_questions: List[Any] = Field(default_factory=list)
|
||||
workflow_definition: dict = Field(default_factory=dict)
|
||||
is_public: bool = False
|
||||
conversation_count: int = 0
|
||||
message_count: int = 0
|
||||
sort: int = 0
|
||||
sys_create_datetime: Optional[CSTDatetime] = None
|
||||
sys_update_datetime: Optional[CSTDatetime] = None
|
||||
|
||||
|
||||
class AppListResponse(BaseModel):
|
||||
"""应用列表输出"""
|
||||
model_config = ConfigDict(from_attributes=True, protected_namespaces=())
|
||||
|
||||
id: str
|
||||
name: str
|
||||
code: str
|
||||
description: str = ""
|
||||
icon: str = ""
|
||||
app_type: str = "chat"
|
||||
status: str = "draft"
|
||||
model_name: str = ""
|
||||
is_public: bool = False
|
||||
conversation_count: int = 0
|
||||
message_count: int = 0
|
||||
sys_create_datetime: Optional[CSTDatetime] = None
|
||||
@@ -0,0 +1,76 @@
|
||||
"""
|
||||
对话 Schema
|
||||
"""
|
||||
from typing import Optional
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel, Field, ConfigDict
|
||||
|
||||
from app.base_schema import CSTDatetime
|
||||
|
||||
|
||||
class ConversationCreate(BaseModel):
|
||||
"""创建对话"""
|
||||
app_id: str = Field(..., description="应用 ID")
|
||||
title: str = Field(default="", description="对话标题")
|
||||
|
||||
|
||||
class ConversationUpdate(BaseModel):
|
||||
"""更新对话"""
|
||||
title: Optional[str] = None
|
||||
is_pinned: Optional[bool] = None
|
||||
|
||||
|
||||
class ConversationResponse(BaseModel):
|
||||
"""对话输出"""
|
||||
id: str
|
||||
app_id: str
|
||||
app_name: str = ""
|
||||
title: str = ""
|
||||
message_count: int = 0
|
||||
total_tokens: int = 0
|
||||
is_pinned: bool = False
|
||||
sort: int = 0
|
||||
sys_create_datetime: Optional[CSTDatetime] = None
|
||||
sys_update_datetime: Optional[CSTDatetime] = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class ConversationListResponse(BaseModel):
|
||||
"""对话列表输出"""
|
||||
id: str
|
||||
title: str = ""
|
||||
message_count: int = 0
|
||||
is_pinned: bool = False
|
||||
sys_update_datetime: Optional[CSTDatetime] = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class MessageResponse(BaseModel):
|
||||
"""消息输出"""
|
||||
model_config = ConfigDict(from_attributes=True, protected_namespaces=())
|
||||
|
||||
id: str
|
||||
role: str
|
||||
content: str = ""
|
||||
status: str = "completed"
|
||||
prompt_tokens: int = 0
|
||||
completion_tokens: int = 0
|
||||
total_tokens: int = 0
|
||||
model_name: str = ""
|
||||
latency: int = 0
|
||||
error_message: str = ""
|
||||
feedback: str = ""
|
||||
sys_create_datetime: Optional[CSTDatetime] = None
|
||||
|
||||
|
||||
class SendMessageInput(BaseModel):
|
||||
"""发送消息"""
|
||||
content: str = Field(..., description="消息内容")
|
||||
|
||||
|
||||
class MessageFeedbackInput(BaseModel):
|
||||
"""消息反馈"""
|
||||
feedback: str = Field(..., description="反馈: like/dislike")
|
||||
@@ -0,0 +1,101 @@
|
||||
"""
|
||||
LLM 模型 Schema
|
||||
"""
|
||||
from typing import Optional
|
||||
from datetime import datetime
|
||||
from decimal import Decimal
|
||||
|
||||
from pydantic import BaseModel, Field, ConfigDict
|
||||
|
||||
from app.base_schema import CSTDatetime
|
||||
|
||||
|
||||
class ModelCreate(BaseModel):
|
||||
"""创建模型"""
|
||||
model_config = ConfigDict(protected_namespaces=())
|
||||
|
||||
provider_id: str = Field(..., description="提供商 ID")
|
||||
model_name: str = Field(..., max_length=100, description="模型名称")
|
||||
display_name: str = Field(..., max_length=100, description="显示名称")
|
||||
model_type: str = Field(default="chat", description="模型类型")
|
||||
max_tokens: int = Field(default=4096, description="最大 Token")
|
||||
context_window: int = Field(default=4096, description="上下文窗口")
|
||||
default_temperature: float = Field(default=0.7, description="默认温度")
|
||||
default_top_p: float = Field(default=1.0, description="默认 top_p")
|
||||
input_price: Decimal = Field(default=0, description="输入价格")
|
||||
output_price: Decimal = Field(default=0, description="输出价格")
|
||||
supports_vision: bool = Field(default=False, description="支持视觉")
|
||||
supports_function_call: bool = Field(default=False, description="支持函数调用")
|
||||
supports_streaming: bool = Field(default=True, description="支持流式")
|
||||
is_active: bool = Field(default=True, description="是否启用")
|
||||
|
||||
|
||||
class ModelUpdate(BaseModel):
|
||||
"""更新模型"""
|
||||
model_config = ConfigDict(protected_namespaces=())
|
||||
|
||||
display_name: Optional[str] = None
|
||||
model_type: Optional[str] = None
|
||||
max_tokens: Optional[int] = None
|
||||
context_window: Optional[int] = None
|
||||
default_temperature: Optional[float] = None
|
||||
default_top_p: Optional[float] = None
|
||||
input_price: Optional[Decimal] = None
|
||||
output_price: Optional[Decimal] = None
|
||||
supports_vision: Optional[bool] = None
|
||||
supports_function_call: Optional[bool] = None
|
||||
supports_streaming: Optional[bool] = None
|
||||
is_active: Optional[bool] = None
|
||||
|
||||
|
||||
class ModelResponse(BaseModel):
|
||||
"""模型输出"""
|
||||
model_config = ConfigDict(from_attributes=True, protected_namespaces=())
|
||||
|
||||
id: str
|
||||
provider_id: str
|
||||
provider_name: str = ""
|
||||
model_name: str
|
||||
display_name: str
|
||||
model_type: str = "chat"
|
||||
max_tokens: int = 4096
|
||||
context_window: int = 4096
|
||||
default_temperature: float = 0.7
|
||||
default_top_p: float = 1.0
|
||||
input_price: Decimal = Decimal(0)
|
||||
output_price: Decimal = Decimal(0)
|
||||
supports_vision: bool = False
|
||||
supports_function_call: bool = False
|
||||
supports_streaming: bool = True
|
||||
is_active: bool = True
|
||||
sort: int = 0
|
||||
sys_create_datetime: Optional[CSTDatetime] = None
|
||||
sys_update_datetime: Optional[CSTDatetime] = None
|
||||
|
||||
|
||||
class ModelListResponse(BaseModel):
|
||||
"""模型列表输出"""
|
||||
model_config = ConfigDict(from_attributes=True, protected_namespaces=())
|
||||
|
||||
id: str
|
||||
provider_id: str
|
||||
provider_name: str = ""
|
||||
model_name: str
|
||||
display_name: str
|
||||
model_type: str = "chat"
|
||||
is_active: bool = True
|
||||
|
||||
|
||||
class DefaultModelResponse(BaseModel):
|
||||
"""默认模型信息"""
|
||||
model_config = ConfigDict(protected_namespaces=())
|
||||
|
||||
model_name: str
|
||||
display_name: str
|
||||
model_type: str = "chat"
|
||||
max_tokens: int = 4096
|
||||
context_window: int = 4096
|
||||
supports_vision: bool = False
|
||||
supports_function_call: bool = False
|
||||
input_price: float = 0
|
||||
output_price: float = 0
|
||||
@@ -0,0 +1,70 @@
|
||||
"""
|
||||
LLM 提供商 Schema
|
||||
"""
|
||||
from typing import Optional
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel, Field, ConfigDict
|
||||
|
||||
from app.base_schema import CSTDatetime
|
||||
|
||||
|
||||
class ProviderCreate(BaseModel):
|
||||
"""创建提供商"""
|
||||
name: str = Field(..., max_length=100, description="提供商名称")
|
||||
provider_type: str = Field(..., description="提供商类型")
|
||||
api_key: str = Field(default="", description="API Key")
|
||||
api_base: str = Field(default="", description="API 地址")
|
||||
api_version: str = Field(default="", description="API 版本")
|
||||
ollama_host: str = Field(default="http://localhost:11434", description="Ollama 地址")
|
||||
description: str = Field(default="", description="描述")
|
||||
is_active: bool = Field(default=True, description="是否启用")
|
||||
|
||||
|
||||
class ProviderUpdate(BaseModel):
|
||||
"""更新提供商"""
|
||||
name: Optional[str] = Field(None, max_length=100)
|
||||
api_key: Optional[str] = None
|
||||
api_base: Optional[str] = None
|
||||
api_version: Optional[str] = None
|
||||
ollama_host: Optional[str] = None
|
||||
description: Optional[str] = None
|
||||
is_active: Optional[bool] = None
|
||||
|
||||
|
||||
class ProviderResponse(BaseModel):
|
||||
"""提供商输出"""
|
||||
id: str
|
||||
name: str
|
||||
provider_type: str
|
||||
api_key_masked: str = ""
|
||||
api_base: str = ""
|
||||
api_version: str = ""
|
||||
ollama_host: str = ""
|
||||
description: str = ""
|
||||
is_active: bool = True
|
||||
quota_limit: int = 0
|
||||
quota_used: int = 0
|
||||
sort: int = 0
|
||||
sys_create_datetime: Optional[CSTDatetime] = None
|
||||
sys_update_datetime: Optional[CSTDatetime] = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class ProviderListResponse(BaseModel):
|
||||
"""提供商列表输出"""
|
||||
id: str
|
||||
name: str
|
||||
provider_type: str
|
||||
is_active: bool = True
|
||||
description: str = ""
|
||||
sys_create_datetime: Optional[CSTDatetime] = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class ProviderTypeResponse(BaseModel):
|
||||
"""提供商类型"""
|
||||
type: str
|
||||
name: str
|
||||
@@ -0,0 +1,170 @@
|
||||
"""
|
||||
AI 工作流 Schema
|
||||
"""
|
||||
from typing import Optional, List, Any
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel, Field, ConfigDict
|
||||
|
||||
from app.base_schema import CSTDatetime
|
||||
|
||||
|
||||
class WorkflowCreate(BaseModel):
|
||||
"""创建工作流"""
|
||||
application_id: Optional[str] = Field(None, description="所属应用ID")
|
||||
is_global: bool = Field(default=False, description="是否在子应用中可见")
|
||||
name: str = Field(..., max_length=100, description="工作流名称")
|
||||
code: str = Field(..., max_length=100, pattern=r"^[a-zA-Z][a-zA-Z0-9_]*$", description="工作流编码(字母开头,只能包含字母、数字和下划线)")
|
||||
workflow_type: str = Field(default="general", description="工作流类型: general/application/form/report/data_process/automation")
|
||||
description: str = Field(default="", description="描述")
|
||||
definition: dict = Field(default_factory=dict, description="工作流定义")
|
||||
input_variables: List[dict] = Field(default_factory=list, description="输入变量")
|
||||
output_variables: List[dict] = Field(default_factory=list, description="输出变量")
|
||||
|
||||
|
||||
class WorkflowUpdate(BaseModel):
|
||||
"""更新工作流"""
|
||||
application_id: Optional[str] = None
|
||||
is_global: Optional[bool] = None
|
||||
name: Optional[str] = None
|
||||
code: Optional[str] = Field(None, max_length=100, pattern=r"^[a-zA-Z][a-zA-Z0-9_]*$", description="工作流编码(字母开头,只能包含字母、数字和下划线)")
|
||||
workflow_type: Optional[str] = None
|
||||
description: Optional[str] = None
|
||||
definition: Optional[dict] = None
|
||||
input_variables: Optional[List[dict]] = None
|
||||
output_variables: Optional[List[dict]] = None
|
||||
|
||||
|
||||
class WorkflowResponse(BaseModel):
|
||||
"""工作流输出"""
|
||||
id: str
|
||||
application_id: Optional[str] = None
|
||||
is_global: bool = False
|
||||
name: str
|
||||
code: str
|
||||
workflow_type: str = "general"
|
||||
description: str = ""
|
||||
status: str = "draft"
|
||||
version: int = 1
|
||||
published_version: Optional[int] = None
|
||||
published_at: Optional[CSTDatetime] = None
|
||||
published_definition: Optional[dict] = None
|
||||
definition: dict = Field(default_factory=dict)
|
||||
input_variables: List[dict] = Field(default_factory=list)
|
||||
output_variables: List[dict] = Field(default_factory=list)
|
||||
run_count: int = 0
|
||||
success_count: int = 0
|
||||
sort: int = 0
|
||||
sys_create_datetime: Optional[CSTDatetime] = None
|
||||
sys_update_datetime: Optional[CSTDatetime] = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class WorkflowListResponse(BaseModel):
|
||||
"""工作流列表输出"""
|
||||
id: str
|
||||
application_id: Optional[str] = None
|
||||
application_name: str = ""
|
||||
is_global: bool = False
|
||||
name: str
|
||||
code: str
|
||||
workflow_type: str = "general"
|
||||
description: str = ""
|
||||
status: str = "draft"
|
||||
version: int = 1
|
||||
run_count: int = 0
|
||||
success_count: int = 0
|
||||
sys_create_datetime: Optional[CSTDatetime] = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class WorkflowRunInput(BaseModel):
|
||||
"""运行工作流"""
|
||||
inputs: dict = Field(default_factory=dict, description="输入数据")
|
||||
use_draft: bool = Field(default=False, description="是否使用草稿版本(编辑器调试用)")
|
||||
|
||||
|
||||
class WorkflowResumeInput(BaseModel):
|
||||
"""恢复工作流执行"""
|
||||
user_input: Any = Field(..., description="用户输入的值")
|
||||
|
||||
|
||||
class WorkflowRunResponse(BaseModel):
|
||||
"""工作流运行记录输出"""
|
||||
id: str
|
||||
workflow_id: str
|
||||
workflow_name: str = ""
|
||||
status: str = "pending"
|
||||
trigger_type: str = "api"
|
||||
use_draft: bool = False
|
||||
workflow_version: Optional[int] = None
|
||||
definition_snapshot: dict = Field(default_factory=dict)
|
||||
inputs: dict = Field(default_factory=dict)
|
||||
outputs: dict = Field(default_factory=dict)
|
||||
execution_log: List[dict] = Field(default_factory=list)
|
||||
current_node_id: str = ""
|
||||
waiting_config: dict = Field(default_factory=dict)
|
||||
error_message: str = ""
|
||||
total_tokens: int = 0
|
||||
total_steps: int = 0
|
||||
elapsed_time: int = 0
|
||||
started_at: Optional[CSTDatetime] = None
|
||||
completed_at: Optional[CSTDatetime] = None
|
||||
sys_create_datetime: Optional[CSTDatetime] = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class WorkflowRunListResponse(BaseModel):
|
||||
"""工作流运行记录列表输出"""
|
||||
id: str
|
||||
workflow_id: str
|
||||
workflow_name: str = ""
|
||||
status: str = "pending"
|
||||
trigger_type: str = "api"
|
||||
total_steps: int = 0
|
||||
total_tokens: int = 0
|
||||
elapsed_time: int = 0
|
||||
error_message: str = ""
|
||||
started_at: Optional[CSTDatetime] = None
|
||||
completed_at: Optional[CSTDatetime] = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class WorkflowImportCheckIn(BaseModel):
|
||||
"""工作流导入预检查请求"""
|
||||
code: str = Field(..., description="工作流编码")
|
||||
|
||||
|
||||
class WorkflowImportCheckOut(BaseModel):
|
||||
"""工作流导入预检查结果"""
|
||||
code_exists: bool = Field(..., description="工作流编码是否已存在")
|
||||
can_import: bool = Field(..., description="是否可以直接导入(编码不冲突)")
|
||||
|
||||
|
||||
class WorkflowImportIn(BaseModel):
|
||||
"""工作流配置导入"""
|
||||
application_id: Optional[str] = Field(None, description="所属应用ID")
|
||||
is_global: bool = Field(default=False, description="是否在子应用中可见")
|
||||
name: str = Field(..., description="工作流名称")
|
||||
code: str = Field(..., description="工作流编码")
|
||||
workflow_type: str = Field(default="general", description="工作流类型")
|
||||
description: str = Field(default="", description="描述")
|
||||
definition: dict = Field(default_factory=dict, description="工作流定义")
|
||||
input_variables: List[dict] = Field(default_factory=list, description="输入变量")
|
||||
output_variables: List[dict] = Field(default_factory=list, description="输出变量")
|
||||
|
||||
|
||||
class NodeSchemaResponse(BaseModel):
|
||||
"""节点 Schema 输出"""
|
||||
type: str
|
||||
name: str
|
||||
category: str = ""
|
||||
icon: str = ""
|
||||
description: str = ""
|
||||
inputs: List[dict] = Field(default_factory=list)
|
||||
outputs: List[dict] = Field(default_factory=list)
|
||||
supports_branches: bool = False
|
||||
Reference in New Issue
Block a user