Python/agent/application/states/models.py

185 lines
4.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
"""
面向 reflex.state 的类
"""
from enum import StrEnum
from typing import Any
from datetime import datetime
from pydantic import BaseModel, Field, TypeAdapter
from pydantic_ai import RunUsage
from pydantic_ai._uuid import uuid7
from pydantic_ai.usage import UsageLimits
class MessageType(StrEnum):
"""
消息类型枚举
"""
USER_PROMPT = "user_prompt"
THINKING = "thinking"
AGENT_RUN_RESULT_OUTPUT = "agent_run_result_output"
class Message(BaseModel):
"""
消息类
"""
id: str = Field(default_factory=lambda: str(uuid7()), description="消息唯一标识")
type: MessageType = Field(..., description="消息类型")
title: str = Field(default="", description="消息标题")
content: str = Field(default="", description="消息内容")
is_component_expanded: bool = Field(
default=True, description="展开组件True 表示展开False 表示折叠"
)
class RunStatus(StrEnum):
"""
运行状态枚举
"""
RUNNING = "running"
FINISHED = "finished"
class Run(BaseModel):
"""
运行类
"""
id: str = Field(default_factory=lambda: str(uuid7()), description="运行唯一标识")
messages: dict[str, Message] = Field(default_factory=dict, description="消息字典")
status: RunStatus = Field(default=RunStatus.RUNNING, description="运行状态")
usage: RunUsage = Field(default=RunUsage(), description="运行使用量")
usage_limits: UsageLimits | None = Field(default=None, description="运行使用量限制")
is_thinking: bool = Field(
default=False, description="正在思考True 表示正在思考False 表示未正在思考"
)
class TaskType(StrEnum):
"""
任务类型枚举
"""
CHAT = "聊天"
BOOK_FLIGHT = "预定航班"
class TaskStatus(StrEnum):
"""
任务状态枚举
"""
NONE = "none"
class Deps(BaseModel):
"""
依赖项类
"""
...
class Task(BaseModel):
"""
任务类
"""
type: TaskType = Field(default=TaskType.CHAT, description="任务类型")
status: TaskStatus = Field(default=TaskStatus.NONE, description="任务状态")
deps: Deps | None = Field(default=None, description="任务依赖项")
usage: RunUsage = Field(default=RunUsage(), description="任务使用量")
usage_limits: UsageLimits | None = Field(
default=None,
description="任务使用量限制",
)
class Conversation(BaseModel):
"""
会话类
"""
id: str = Field(default_factory=lambda: str(uuid7()), description="会话唯一标识")
runs: dict[str, Run] = Field(default_factory=dict, description="运行字典")
description: str = Field(default="新会话", description="会话描述")
created_at: datetime = Field(..., description="会话创建日期时间")
class ConversationHistoryItem(BaseModel):
"""
会话历史项类
"""
description: str = Field(..., description="会话描述")
created_at: str = Field(..., description="会话创建日期时间")
# Dpes 适配器
DepsAdapter = TypeAdapter(Deps)
def deps_to_object(deps: dict[str, Any]) -> Deps | None:
"""
Deps 转为对象
"""
if not deps:
return None
return DepsAdapter.validate_python(deps)
def deps_to_dict(deps: Deps | None) -> dict[str, Any]:
"""
Deps 转为字典
"""
if not deps:
return {}
return DepsAdapter.dump_python(deps)
# Usage 适配器
UsageAdapter = TypeAdapter(RunUsage)
def usage_to_object(usage: dict[str, Any]) -> RunUsage:
"""
Usage 转为对象
"""
if not usage:
return RunUsage()
return UsageAdapter.validate_python(usage)
def usage_to_dict(usage: RunUsage) -> dict[str, Any]:
"""
Usage 转为字典
"""
return UsageAdapter.dump_python(usage)
# UsageLimits 适配器
UsageLimitsAdapter = TypeAdapter(UsageLimits)
def usage_limits_to_object(usage_limits: dict[str, Any]) -> UsageLimits | None:
"""
UsageLimits 转为对象
"""
if not usage_limits:
return None
return UsageLimitsAdapter.validate_python(usage_limits)
def usage_limits_to_dict(usage_limits: UsageLimits | None) -> dict[str, Any]:
"""
UsageLimits 转为字典
"""
if not usage_limits:
return {}
return UsageLimitsAdapter.dump_python(usage_limits)