From ae05009acd5ad8af3e085cc621e913b45ffaf253 Mon Sep 17 00:00:00 2001 From: liubiren Date: Thu, 6 Aug 2026 20:49:10 +0800 Subject: [PATCH] 1 --- .../{4269426de639_.py => 0d3f238840fe_.py} | 7 +- agent/application/domain_models.py | 62 ----- agent/application/pages/conversation.py | 2 +- agent/application/states/conversation.py | 83 +++--- agent/application/states/database.py | 92 +++---- agent/application/states/models.py | 151 +++++++++++ agent/application/tasks/__init__.py | 18 +- agent/application/tasks/book_flight.py | 256 ++++++++++++++++++ .../application/tasks/generating_prd_agent.py | 210 -------------- agent/database.db | Bin 339968 -> 106496 bytes 10 files changed, 502 insertions(+), 379 deletions(-) rename agent/alembic/versions/{4269426de639_.py => 0d3f238840fe_.py} (96%) delete mode 100644 agent/application/domain_models.py create mode 100644 agent/application/states/models.py create mode 100644 agent/application/tasks/book_flight.py delete mode 100644 agent/application/tasks/generating_prd_agent.py diff --git a/agent/alembic/versions/4269426de639_.py b/agent/alembic/versions/0d3f238840fe_.py similarity index 96% rename from agent/alembic/versions/4269426de639_.py rename to agent/alembic/versions/0d3f238840fe_.py index e383932..56c1673 100644 --- a/agent/alembic/versions/4269426de639_.py +++ b/agent/alembic/versions/0d3f238840fe_.py @@ -1,8 +1,8 @@ """empty message -Revision ID: 4269426de639 +Revision ID: 0d3f238840fe Revises: -Create Date: 2026-07-27 10:10:56.902466 +Create Date: 2026-08-06 13:35:59.116161 """ from typing import Sequence, Union @@ -12,7 +12,7 @@ import sqlalchemy as sa import sqlmodel # revision identifiers, used by Alembic. -revision: str = '4269426de639' +revision: str = '0d3f238840fe' down_revision: Union[str, Sequence[str], None] = None branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None @@ -51,6 +51,7 @@ def upgrade() -> None: sa.Column('user_prompt', sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.Column('thoughts', sa.JSON(), nullable=False), sa.Column('result_output', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('usage', sa.JSON(), nullable=False), sa.PrimaryKeyConstraint('id') ) with op.batch_alter_table('dialogrecord', schema=None) as batch_op: diff --git a/agent/application/domain_models.py b/agent/application/domain_models.py deleted file mode 100644 index ba95753..0000000 --- a/agent/application/domain_models.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- -""" -领域模型 -""" -from datetime import datetime -from typing import Dict, List, Optional, Callable, Any - -from pydantic import BaseModel, Field -from pydantic_ai import Agent, UsageLimits -from pydantic_ai._uuid import uuid7 -from enum import StrEnum - - -class Thought(BaseModel): - """ - 思考节点领域模型 - """ - - type: str = Field(..., description="思考类型") - content: str = Field(..., description="思考内容") - - -class Dialog(BaseModel): - """ - 对话领域模型 - """ - - id: str = Field(default_factory=lambda: str(uuid7()), description="对话唯一标识") - user_prompt: str = Field(default="", description="用户提示词") - thoughts: Dict[int, Thought] = Field(default_factory=dict, description="思考列表") - result_output: str = Field(default="", description="结果输出") - is_thinking: bool = Field( - default=False, description="正在思考,True 表示正在思考,False 表示未正在思考" - ) - is_expanded: bool = Field( - default=False, description="思考折叠面板展开状态,True 表示展开,False 表示折叠" - ) - - -class Conversation(BaseModel): - """ - 会话领域模型 - """ - - id: str = Field(default_factory=lambda: str(uuid7()), description="会话唯一标识") - description: str = Field(default="新会话", description="会话描述") - is_running: bool = Field( - default=False, description="正在运行,True 表示正在运行,False 表示未正在运行" - ) - dialogs: Dict[str, Dialog] = Field(default_factory=dict, description="对话列表") - created_at: str = Field( - ..., - description="创建时间", - ) - - -class TaskType(StrEnum): - """ - 任务类型枚举 - """ - - CHAT = "chat" diff --git a/agent/application/pages/conversation.py b/agent/application/pages/conversation.py index ddef791..ef7ccb8 100644 --- a/agent/application/pages/conversation.py +++ b/agent/application/pages/conversation.py @@ -5,7 +5,7 @@ import reflex as rx from typing import Tuple -from application.domain_models import ( +from application.states.models import ( Conversation, Dialog, Thought, diff --git a/agent/application/states/conversation.py b/agent/application/states/conversation.py index 6c6b1db..60cb262 100644 --- a/agent/application/states/conversation.py +++ b/agent/application/states/conversation.py @@ -2,7 +2,8 @@ """ 会话状态 """ -from typing import AsyncGenerator, Dict, List, Optional, Literal +from typing import AsyncGenerator + from pydantic_ai.messages import ( FunctionToolCallEvent, FunctionToolResultEvent, @@ -17,17 +18,19 @@ from pydantic_ai.messages import ( ToolCallPart, ToolSearchCallPart, ) - from pydantic_ai.run import AgentRunResultEvent import reflex as rx - from application.states.database import DatabaseState -from application.domain_models import ( +from application.states.models import ( Conversation, Dialog, - Thought, + Task, + TaskResultEvent, TaskType, + Thought, + thoughts_to_dict, + usage_to_dict, ) from application.tasks import run_stream_events @@ -40,7 +43,7 @@ class ConversationState(rx.State): # 当前用户唯一标识 user_id: str = "" # 键为会话唯一标识,值为会话实例的会话字典 - conversations: Dict[str, Conversation] = {} # 按照会话唯一标识顺序排序 + conversations: dict[str, Conversation] = {} # 按照会话唯一标识顺序排序 # 当前会话唯一标识 conversation_id: str = "" @@ -50,12 +53,12 @@ class ConversationState(rx.State): shown_more_conversation_id: str = "" # 任务类型 - task_type: TaskType = TaskType.CHAT + task_type: TaskType = TaskType.NONE # 用户提示词 user_prompt: str = "" # 数据库状态(私有变量,不予序列化) - _db_state: Optional[DatabaseState] = None + _db_state: DatabaseState | None = None async def get_db_state(self) -> DatabaseState: """ @@ -116,7 +119,7 @@ class ConversationState(rx.State): # 获取数据库状态 db_state = await self.get_db_state() # 先设置会话记录为已删除再在会话字典中删除会话实例 - await db_state.set_conversations_record_deleted(conversation_id=conversation_id) + await db_state.delete_conversations_record(conversation_id=conversation_id) del self.conversations[conversation_id] # 删除后,若会话字典为空则先创建会话记录再添加会话实例 @@ -189,7 +192,7 @@ class ConversationState(rx.State): return conversation.is_running @rx.var - def dialogs(self) -> Dict[str, Dialog]: + def dialogs(self) -> dict[str, Dialog]: """ 当前会话的对话字典 :return: 当前会话的对话字典 @@ -209,33 +212,29 @@ class ConversationState(rx.State): if not self.user_prompt: return - # 获取数据库状态 - db_state = await self.get_db_state() # 当前会话 conversation = self.conversations[self.conversation_id] # 将正在运行设置为是 conversation.is_running = True - # 创建对话记录再添加对话实例 - conversation.dialogs.update( - await db_state.create_dialog_record( - conversation_id=self.conversation_id, user_prompt=self.user_prompt - ) - ) - # 将最后一个对话作为当前对话 - dialog = next(reversed(conversation.dialogs.values())) - # 清空前端用户提示词 + # 当前对话 + dialog = Dialog(user_prompt=self.user_prompt) + # 清空用户提示词 self.user_prompt = "" + # 添加对话实例 + conversation.dialogs.update({dialog.id: dialog}) # 强制更新会话并推送前端 self.conversations[self.conversation_id] = conversation yield + # 获取数据库状态 + db_state = await self.get_db_state() # 获取消息历史列表 message_history = await db_state.get_message_history( conversation_id=self.conversation_id ) # 初始化工具调用唯一标识和片段索引映射字典 - tool_call_ids: Dict[str, int] = {} + tool_call_ids: dict[str, int] = {} # 获取运行流式输出事件 async for event in run_stream_events( task_type=self.task_type, @@ -363,14 +362,21 @@ class ConversationState(rx.State): case "tool_call": dialog.thoughts[index].content = f"已调用 {content}" + case TaskResultEvent(task=task, content=content): + # 更新任务 + conversation.task = task + dialog.result_output += content + # ========== 智能体运行结果事件 ========== case AgentRunResultEvent(result=result): - # 获取数据库状态 - # 补全对话记录 - await db_state.complete_dialog_record( + # 创建对话记录 + await db_state.create_dialog_record( + conversation_id=self.conversation_id, id=dialog.id, - thoughts=dialog.thoughts, + user_prompt=self.user_prompt, + thoughts=thoughts_to_dict(dialog.thoughts), result_output=dialog.result_output, + usage=usage_to_dict(result.usage), ) # 创建结果记录 await db_state.create_result_record( @@ -378,30 +384,29 @@ class ConversationState(rx.State): dialog_id=dialog.id, new_messages=result.new_messages(), ) - # 将正在运行设置为否 - conversation.is_running = False # 强制更新会话并推送前端 self.conversations[self.conversation_id] = conversation yield + # 将正在运行设置为否 + conversation.is_running = False + self.conversations[self.conversation_id] = conversation + yield + @rx.event - async def generate_prd(self) -> AsyncGenerator[None]: + async def generate_prd(self) -> None: """ - 生成产品需求文档 + 预订航班 """ + from application.tasks.book_flight import init_task + # 当前会话 conversation = self.conversations[self.conversation_id] + # 初始化预定航班任务 + conversation.task = init_task() - # 获取数据库状态 - db_state = await self.get_db_state() - # 创建对话记录再添加对话实例 - conversation.dialogs.update( - await db_state.create_dialog_record( - conversation_id=self.conversation_id, result_output="请输入产品需求" - ) - ) - yield + self.user_prompt = f"帮我找一班从 {conversation.task.deps.origin} 到 {conversation.task.deps.destination} 在 {conversation.task.deps.date} 的航班" @rx.event def toggle_collapse(self, dialog_id: str) -> None: diff --git a/agent/application/states/database.py b/agent/application/states/database.py index 2758e3e..85ba999 100644 --- a/agent/application/states/database.py +++ b/agent/application/states/database.py @@ -4,16 +4,15 @@ """ from datetime import datetime, timedelta from random import choices -from typing import Dict, List +from typing import Any -from pydantic import TypeAdapter from pydantic_ai import ModelMessage, ModelMessagesTypeAdapter from pydantic_ai._uuid import uuid7 import reflex as rx from sqlalchemy import desc from sqlmodel import Field, JSON, SQLModel, select, update -from application.domain_models import Conversation, Dialog, Thought +from application.states.models import Conversation, Dialog class CaptchaRecord(SQLModel, table=True): @@ -80,36 +79,25 @@ class ConversationRecord(SQLModel, table=True): ) -class ThoughtRecord(SQLModel): - """ - 思考记录(不创建数据表) - """ - - id: str = Field( - default_factory=lambda: str(uuid7()), - primary_key=True, - description="思考唯一标识", - ) - type: str = Field(description="思考类型") - content: str = Field(default="", description="思考内容") - - class DialogRecord(SQLModel, table=True): """ 对话记录 """ id: str = Field( - default_factory=lambda: str(uuid7()), + ..., primary_key=True, description="对话唯一标识", ) conversation_id: str = Field(..., index=True, description="会话唯一标识") user_prompt: str = Field(..., description="用户提示词") - thoughts: Dict[int, ThoughtRecord] = Field( + thoughts: dict[int, Any] = Field( default_factory=dict, sa_type=JSON, description="思考列表" ) result_output: str = Field(default="", description="结果输出") + usage: dict[str, Any] = Field( + default_factory=dict, sa_type=JSON, description="使用量" + ) class ResultRecord(SQLModel, table=True): @@ -138,10 +126,6 @@ def format_at(at: datetime) -> str: return formatted_at -# 思考领域模型类型适配器 -ThoughtTypeAdapter = TypeAdapter(Dict[int, Thought]) - - class DatabaseState(rx.State): """ 数据库状态 @@ -219,13 +203,13 @@ class DatabaseState(rx.State): await session.refresh(record) return record.id - async def get_conversations(self, user_id: str) -> Dict[str, Conversation]: + async def get_conversations(self, user_id: str) -> dict[str, Conversation]: """ 获取会话字典 :param user_id: 用户唯一标识 :return: 会话字典 """ - records: Dict[str, Conversation] = {} + records: dict[str, Conversation] = {} async with rx.asession() as session: result = await session.exec( select(ConversationRecord, DialogRecord) @@ -237,7 +221,6 @@ class DatabaseState(rx.State): .order_by(ConversationRecord.id, DialogRecord.id) ) for conversation_record, dialog_record in result.all(): - record = records.setdefault( conversation_record.id, Conversation( @@ -253,10 +236,9 @@ class DatabaseState(rx.State): dialog_record.id: Dialog( id=dialog_record.id, user_prompt=dialog_record.user_prompt, - thoughts=ThoughtTypeAdapter.validate_python( - dialog_record.thoughts - ), + thoughts=dialog_record.thoughts, result_output=dialog_record.result_output, + usage=dialog_record.usage, ) } ) @@ -264,7 +246,7 @@ class DatabaseState(rx.State): async def create_conversations_record( self, user_id: str, description: str = "新会话" - ) -> Dict[str, Conversation]: + ) -> dict[str, Conversation]: """ 创建会话记录 :param user_id: 用户唯一标识 @@ -284,9 +266,9 @@ class DatabaseState(rx.State): ) } - async def set_conversations_record_deleted(self, conversation_id: str) -> None: + async def delete_conversations_record(self, conversation_id: str) -> None: """ - 设置会话记录为已删除 + 删除会话记录(逻辑删除) :param conversation_id: 指定会话唯一标识 :return: None """ @@ -298,8 +280,14 @@ class DatabaseState(rx.State): await session.commit() async def create_dialog_record( - self, conversation_id: str, user_prompt: str = "", result_output: str = "" - ) -> Dict[str, Dialog]: + self, + conversation_id: str, + id: str, + user_prompt: str, + thoughts: dict[int, Any], + result_output: str, + usage: dict[str, Any], + ) -> dict[str, Dialog]: """ 创建对话记录 :param conversation_id: 会话唯一标识 @@ -309,45 +297,31 @@ class DatabaseState(rx.State): """ async with rx.asession() as session: record = DialogRecord( + id=id, conversation_id=conversation_id, user_prompt=user_prompt, + thoughts=thoughts, result_output=result_output, + usage=usage, ) session.add(record) await session.commit() await session.refresh(record) return { record.id: Dialog( - id=record.id, user_prompt=user_prompt, result_output=result_output + id=record.id, + user_prompt=record.user_prompt, + thoughts=record.thoughts, + result_output=record.result_output, + usage=record.usage, ) } - async def complete_dialog_record( - self, - id: str, - thoughts: Dict[int, Thought], - result_output: str, - ) -> None: - """ - 补全对话记录 - :param id: 对话唯一标识 - :param thoughts: 思考列表 - :param result_output: 结果输出 - :return: None - """ - async with rx.asession() as session: - record = await session.get(DialogRecord, id) # 通过主键查询记录 - if not record: - return - record.thoughts = ThoughtTypeAdapter.dump_python(thoughts) - record.result_output = result_output - await session.commit() - async def create_result_record( self, conversation_id: str, dialog_id: str, - new_messages: List[ModelMessage], + new_messages: list[ModelMessage], ) -> None: """ 创建结果记录 @@ -370,13 +344,13 @@ class DatabaseState(rx.State): ) await session.commit() - async def get_message_history(self, conversation_id: str) -> List[ModelMessage]: + async def get_message_history(self, conversation_id: str) -> list[ModelMessage]: """ 获取消息历史列表 :param conversation_id: 会话唯一标识 :return: 消息历史 """ - records: List[ModelMessage] = [] + records: list[ModelMessage] = [] async with rx.asession() as session: result = await session.exec( select(ResultRecord) diff --git a/agent/application/states/models.py b/agent/application/states/models.py new file mode 100644 index 0000000..315d4f5 --- /dev/null +++ b/agent/application/states/models.py @@ -0,0 +1,151 @@ +# -*- coding: utf-8 -*- +""" +面向 reflex.state 的类 +""" +from datetime import datetime +from typing import Any +from pydantic import BaseModel, Field, TypeAdapter +from pydantic_ai import RunUsage +from pydantic_ai._uuid import uuid7 +from enum import StrEnum +from pydantic_ai.usage import UsageLimits + + +class Thought(BaseModel): + """ + 思考类 + """ + + type: str = Field(..., description="思考类型") + content: str = Field(..., description="思考内容") + + +# 思考领域模型类型适配器 +ThoughtsAdapter = TypeAdapter(dict[int, Thought]) + + +def thoughts_to_dict(thoughts: dict[int, Thought]) -> dict: + """ + Thought 转为字典 + """ + return ThoughtsAdapter.dump_python(thoughts) + + +class Dialog(BaseModel): + """ + 对话类 + """ + + id: str = Field(default_factory=lambda: str(uuid7()), description="对话唯一标识") + user_prompt: str = Field(default="", description="用户提示词") + thoughts: dict[int, Thought] = Field(default_factory=dict, description="思考列表") + result_output: str = Field(default="", description="结果输出") + usage: dict[str, Any] = Field(default_factory=dict, description="对话使用量") + is_thinking: bool = Field( + default=False, description="正在思考,True 表示正在思考,False 表示未正在思考" + ) + is_expanded: bool = Field( + default=False, description="思考折叠面板展开状态,True 表示展开,False 表示折叠" + ) + + +# Usage 适配器 +UsageAdapter = TypeAdapter(RunUsage) + + +def usage_to_object(usage: dict) -> RunUsage: + """ + Usage 转为对象 + """ + return UsageAdapter.validate_python(usage) if usage else RunUsage() + + +def usage_to_dict(usage: RunUsage) -> dict: + """ + Usage 转为字典 + """ + return UsageAdapter.dump_python(usage) + + +# UsageLimits 适配器 +UsageLimitsAdapter = TypeAdapter(UsageLimits) + + +def usage_limits_to_object(usage_limits: dict) -> UsageLimits: + """ + UsageLimits 转为对象 + """ + return ( + UsageLimitsAdapter.validate_python(usage_limits) + if usage_limits + else UsageLimits() + ) + + +def usage_limits_to_dict(usage_limits: UsageLimits) -> dict: + """ + UsageLimits 转为字典 + """ + return UsageLimitsAdapter.dump_python(usage_limits) + + +class TaskType(StrEnum): + """ + 任务类型枚举 + """ + + NONE = "none" + BOOK_FLIGHT = "book_flight" + + +class TaskNode(StrEnum): + """ + 任务节点枚举 + """ + + EXECUTION = "execution" + PENDING_INPUT = "pending_input" + FINISH = "finish" + + +class Task(BaseModel): + """ + 任务类 + """ + + id: str = Field(default_factory=lambda: str(uuid7()), description="任务唯一标识") + type: TaskType = Field(..., description="任务类型") + node: TaskNode = Field(default=TaskNode.EXECUTION, description="任务节点") + deps: Any = Field(default=None, description="任务依赖项") + usage: dict[str, Any] = Field(default_factory=dict, description="任务使用量") + usage_limits: dict[str, Any] = Field( + default_factory=dict, description="任务使用量限制" + ) + + +class TaskResultEvent(BaseModel): + """ + 任务结果事件类 + """ + + task: Task = Field(..., description="任务实例") + content: str = Field(default="", description="任务结果内容") + + +class Conversation(BaseModel): + """ + 会话类 + """ + + id: str = Field(default_factory=lambda: str(uuid7()), description="会话唯一标识") + description: str = Field(default="新会话", description="会话描述") + is_running: bool = Field( + default=False, + description="会话正在运行,True 表示正在运行,False 表示未正在运行", + ) + dialogs: dict[str, Dialog] = Field(default_factory=dict, description="对话字典") + task: Task | None = Field(default=None, description="会话任务") + created_at: str = Field( + ..., + description="创建时间", + ) diff --git a/agent/application/tasks/__init__.py b/agent/application/tasks/__init__.py index ae53288..09f73f8 100644 --- a/agent/application/tasks/__init__.py +++ b/agent/application/tasks/__init__.py @@ -10,8 +10,9 @@ from pydantic_ai import Agent, ModelMessage from pydantic_ai.models.openai import OpenAIChatModel from pydantic_ai.providers.openai import OpenAIProvider -from application.domain_models import Dialog, TaskType -from models import DEEPSEEK_V4_FLASH_MODEL +from application.states.models import Dialog, TaskType +from application.tasks.models import DEEPSEEK_V4_FLASH_MODEL +from application.states.models import TaskNode, Task instruction = """ # 角色 @@ -39,7 +40,7 @@ async def run_stream_events( 以流式事件模式运行 """ match task_type: - case TaskType.CHAT: + case TaskType.NONE: agent = Agent( model=DEEPSEEK_V4_FLASH_MODEL, instructions=instruction, @@ -51,5 +52,12 @@ async def run_stream_events( async for event in events: yield event - case "flight": - yield "未知任务类型" + case TaskType.BOOK_FLIGHT: + from application.tasks.book_flight import run_stream_events, init_task + + async for event in run_stream_events( + task=init_task(), + user_prompt=user_prompt, + message_history=message_history, + ): + yield event diff --git a/agent/application/tasks/book_flight.py b/agent/application/tasks/book_flight.py new file mode 100644 index 0000000..512efe7 --- /dev/null +++ b/agent/application/tasks/book_flight.py @@ -0,0 +1,256 @@ +# -*- coding: utf-8 -*- +""" +生成产品需求文档智能体 +""" +import datetime +from typing import AsyncGenerator, Literal +from pydantic import BaseModel, Field +from pydantic_ai import ( + Agent, + ModelMessage, + ModelRetry, + RunContext, + UsageLimits, + ModelMessage, +) +from pydantic_ai.run import AgentRunResultEvent +from application.tasks.models import DEEPSEEK_V4_FLASH_MODEL +from application.states.models import ( + TaskType, + Task, + TaskNode, + usage_to_dict, + usage_to_object, + TaskResultEvent, + usage_limits_to_dict, + usage_limits_to_object, +) + + +class Deps(BaseModel): + flights: str = Field(..., description="航班信息") + date: datetime.date = Field(..., description="航班日期") + origin: str = Field(..., description="出发机场") + destination: str = Field(..., description="到达机场") + + +class FlightDetails(BaseModel): + """ + 航班详情 + """ + + number: str = Field(description="航班号") + date: datetime.date = Field(description="航班日期") + origin: str = Field(description="出发机场") + destination: str = Field(description="到达机场") + price: int = Field(description="机票价格") + + +class NoFlightFound(BaseModel): + """ + 未查询到航班 + """ + + +# 主控智能体 +master_agent = Agent[Deps, FlightDetails | NoFlightFound]( + model=DEEPSEEK_V4_FLASH_MODEL, + deps_type=Deps, + output_type=FlightDetails | NoFlightFound, + retries=2, + system_prompt=("你的工作是在给定日期为用户找到最便宜的航班"), +) + +# 航班查询智能体 +search_agent = Agent( + model=DEEPSEEK_V4_FLASH_MODEL, + output_type=list[FlightDetails], + system_prompt="从给定文本中提取所有航班详细信息", +) + + +@master_agent.tool +async def search_flights(ctx: RunContext[Deps]) -> list[FlightDetails]: + """ + 查询并返回航班详情列表 + """ + result = await search_agent.run(ctx.deps.flights, usage=ctx.usage) + return result.output + + +@master_agent.output_validator +async def validate_output( + ctx: RunContext[Deps], output: FlightDetails | NoFlightFound +) -> FlightDetails | NoFlightFound: + """ + 校验主控智能体输出 + """ + if isinstance(output, NoFlightFound): + return output + + errors = "" + if output.date != ctx.deps.date: + errors += f"航班日期应为 {ctx.deps.date}, 不是 {output.date}\n" + if output.origin != ctx.deps.origin: + errors += f"航班出发机场应为 {ctx.deps.origin}, 不是 {output.origin}\n" + if output.destination != ctx.deps.destination: + errors += ( + f"航班到达机场应为 {ctx.deps.destination}, 不是 {output.destination}\n" + ) + if errors: + raise ModelRetry(errors) + + return output + + +class SeatPreference(BaseModel): + row: int = Field(ge=1, le=30) + seat: Literal["A", "B", "C", "D", "E", "F"] + + +class Failed(BaseModel): + """Unable to extract a seat selection.""" + + +# 选座智能体 +seat_selection_agent = Agent[object, SeatPreference | Failed]( + model=DEEPSEEK_V4_FLASH_MODEL, + output_type=SeatPreference | Failed, + system_prompt=( + "Extract the user's seat preference. " + "Seats A and F are window seats. " + "Row 1 is the front row and has extra leg room. " + "Rows 14, and 20 also have extra leg room. " + ), +) + +flights = """ +1. Flight SFO-AK123 +- Price: $350 +- Origin: San Francisco International Airport (SFO) +- Destination: Ted Stevens Anchorage International Airport (ANC) +- Date: January 10, 2025 +2. Flight SFO-AK456 +- Price: $370 +- Origin: San Francisco International Airport (SFO) +- Destination: Fairbanks International Airport (FAI) +- Date: January 10, 2025 +3. Flight SFO-AK789 +- Price: $400 +- Origin: San Francisco International Airport (SFO) +- Destination: Juneau International Airport (JNU) +- Date: January 20, 2025 +4. Flight NYC-LA101 +- Price: $250 +- Origin: San Francisco International Airport (SFO) +- Destination: Ted Stevens Anchorage International Airport (ANC) +- Date: January 10, 2025 +5. Flight CHI-MIA202 +- Price: $200 +- Origin: Chicago O'Hare International Airport (ORD) +- Destination: Miami International Airport (MIA) +- Date: January 12, 2025 +6. Flight BOS-SEA303 +- Price: $120 +- Origin: Boston Logan International Airport (BOS) +- Destination: Ted Stevens Anchorage International Airport (ANC) +- Date: January 12, 2025 +7. Flight DFW-DEN404 +- Price: $150 +- Origin: Dallas/Fort Worth International Airport (DFW) +- Destination: Denver International Airport (DEN) +- Date: January 10, 2025 +8. Flight ATL-HOU505 +- Price: $180 +- Origin: Hartsfield-Jackson Atlanta International Airport (ATL) +- Destination: George Bush Intercontinental Airport (IAH) +- Date: January 10, 2025 +""" + + +def init_task() -> Task: + return Task( + type=TaskType.BOOK_FLIGHT, + node=TaskNode.EXECUTION, + deps=Deps( + flights=flights, + date=datetime.date(2025, 1, 10), + origin="SFO", + destination="ANC", + ), + usage_limits=usage_limits_to_dict(UsageLimits(request_limit=5)), + ) + + +async def run_stream_events( + task: Task, + user_prompt: str | None = None, + message_history: list[ModelMessage] | None = None, +) -> AsyncGenerator: + + result = None + while True: + if task.node == TaskNode.EXECUTION: + async with master_agent.run_stream_events( + user_prompt=user_prompt, + deps=task.deps, + message_history=message_history, + usage=usage_to_object(task.usage), + usage_limits=usage_limits_to_object(task.usage_limits), + ) as events: + async for event in events: + if not isinstance(event, AgentRunResultEvent): + yield event + else: + result = event.result + # 更新任务使用量 + task.usage = usage_to_dict(result.usage) + if isinstance(result.output, FlightDetails): + content = "\n---\n已查询到航班,请回复 buy 购票 / search 重新查询\n" + # 更新任务节点为待用户输入 + task.node = TaskNode.PENDING_INPUT + else: + content = "\n---\n未找到符合条件的航班,流程结束\n" + # 更新任务节点为结束 + task.node = TaskNode.FINISH + yield TaskResultEvent( + task=task, + content=content, + ) + yield event + return + + if task.node == TaskNode.PENDING_INPUT: + if user_prompt == "buy": + yield TaskResultEvent( + task=task, + content="请和我说下你的座位偏好吧:\nA、F 座位是靠窗位;1 排、14 排、20 排腿部空间更大、更舒展,你更想要靠窗座位,宽敞大空间座位", + ) + return + + elif user_prompt == "search": + # 更新任务节点为执行 + task.node = TaskNode.EXECUTION + + else: + async with seat_selection_agent.run_stream_events( + user_prompt=user_prompt, + message_history=message_history, + usage=usage_to_object(task.usage), + usage_limits=usage_limits_to_object(task.usage_limits), + ) as events: + async for event in events: + if not isinstance(event, AgentRunResultEvent): + yield event + else: + result = event.result + # 更新任务使用量 + task.usage = usage_to_dict(result.usage) + # 更新任务节点为结束 + task.node = TaskNode.FINISH + yield TaskResultEvent( + task=task, + content="已为您预定好座位,流程结束", + ) + yield event + return diff --git a/agent/application/tasks/generating_prd_agent.py b/agent/application/tasks/generating_prd_agent.py deleted file mode 100644 index a08b29a..0000000 --- a/agent/application/tasks/generating_prd_agent.py +++ /dev/null @@ -1,210 +0,0 @@ -# -*- coding: utf-8 -*- -""" -生成产品需求文档智能体 -""" -from dataclasses import dataclass -import datetime -from typing import AsyncGenerator, Optional, Literal, List - -from pydantic import BaseModel, Field, Optional -from pydantic_ai import ( - Agent, - ModelMessage, - ModelRetry, - RunContext, - RunUsage, - UsageLimits, -) -from pydantic_ai.usage import RunUsage -from pydantic_ai.run import AgentRunResultEvent -from models import DEEPSEEK_V4_FLASH_MODEL - - -class Deps(BaseModel): - web_page_text: str - req_origin: str - req_destination: str - req_date: datetime.date - - -class FlightDetails(BaseModel): - """ - Details of the most suitable flight - """ - - flight_number: str - price: int - origin: str = Field(description="Three-letter airport code") - destination: str = Field(description="Three-letter airport code") - date: datetime.date - - -class NoFlightFound(BaseModel): - """ - When no valid flight is found - """ - - -# This agent is responsible for controlling the flow of the conversation. -search_agent = Agent[Deps, FlightDetails | NoFlightFound]( - model=DEEPSEEK_V4_FLASH_MODEL, - deps_type=Deps, - output_type=FlightDetails | NoFlightFound, - retries=3, - system_prompt=( - "Your job is to find the cheapest flight for the user on the given date. " - ), -) - -# This agent is responsible for extracting flight details from web page text. -extraction_agent = Agent( - model=DEEPSEEK_V4_FLASH_MODEL, - output_type=List[FlightDetails], - system_prompt="Extract all the flight details from the given text.", -) - - -@search_agent.tool -async def extract_flights(ctx: RunContext[Deps]) -> List[FlightDetails]: - """Get details of all flights.""" - # we pass the usage to the search agent so requests within this agent are counted - result = await extraction_agent.run(ctx.deps.web_page_text, usage=ctx.usage) - return result.output - - -@search_agent.output_validator -async def validate_output( - ctx: RunContext[Deps], output: FlightDetails | NoFlightFound -) -> FlightDetails | NoFlightFound: - """Procedural validation that the flight meets the constraints.""" - if isinstance(output, NoFlightFound): - return output - errors: list[str] = [] - if output.origin != ctx.deps.req_origin: - errors.append( - f"Flight should have origin {ctx.deps.req_origin}, not {output.origin}" - ) - if output.destination != ctx.deps.req_destination: - errors.append( - f"Flight should have destination {ctx.deps.req_destination}, not {output.destination}" - ) - if output.date != ctx.deps.req_date: - errors.append(f"Flight should be on {ctx.deps.req_date}, not {output.date}") - if errors: - raise ModelRetry("\n".join(errors)) - else: - return output - - -class SeatPreference(BaseModel): - row: int = Field(ge=1, le=30) - seat: Literal["A", "B", "C", "D", "E", "F"] - - -class Failed(BaseModel): - """Unable to extract a seat selection.""" - - -# This agent is responsible for extracting the user's seat selection -seat_preference_agent = Agent[object, SeatPreference | Failed]( - model=DEEPSEEK_V4_FLASH_MODEL, - output_type=SeatPreference | Failed, - system_prompt=( - "Extract the user's seat preference. " - "Seats A and F are window seats. " - "Row 1 is the front row and has extra leg room. " - "Rows 14, and 20 also have extra leg room. " - ), -) -# in reality this would be downloaded from a booking site, -# potentially using another agent to navigate the site -flights_web_page = """ -1. Flight SFO-AK123 -- Price: $350 -- Origin: San Francisco International Airport (SFO) -- Destination: Ted Stevens Anchorage International Airport (ANC) -- Date: January 10, 2025 -2. Flight SFO-AK456 -- Price: $370 -- Origin: San Francisco International Airport (SFO) -- Destination: Fairbanks International Airport (FAI) -- Date: January 10, 2025 -3. Flight SFO-AK789 -- Price: $400 -- Origin: San Francisco International Airport (SFO) -- Destination: Juneau International Airport (JNU) -- Date: January 20, 2025 -4. Flight NYC-LA101 -- Price: $250 -- Origin: San Francisco International Airport (SFO) -- Destination: Ted Stevens Anchorage International Airport (ANC) -- Date: January 10, 2025 -5. Flight CHI-MIA202 -- Price: $200 -- Origin: Chicago O'Hare International Airport (ORD) -- Destination: Miami International Airport (MIA) -- Date: January 12, 2025 -6. Flight BOS-SEA303 -- Price: $120 -- Origin: Boston Logan International Airport (BOS) -- Destination: Ted Stevens Anchorage International Airport (ANC) -- Date: January 12, 2025 -7. Flight DFW-DEN404 -- Price: $150 -- Origin: Dallas/Fort Worth International Airport (DFW) -- Destination: Denver International Airport (DEN) -- Date: January 10, 2025 -8. Flight ATL-HOU505 -- Price: $180 -- Origin: Hartsfield-Jackson Atlanta International Airport (ATL) -- Destination: George Bush Intercontinental Airport (IAH) -- Date: January 10, 2025 -""" -# restrict how many requests this app can make to the LLM -usage_limits = UsageLimits(request_limit=5) - - -async def flight_booking( - deps: Deps, user_prompt: Optional[str] = None -) -> AsyncGenerator: - if deps.stage == FlowStage.EXEC: - prompt = f"Find me a flight from {deps.req_origin} to {deps.req_destination} on {deps.req_date}" - run_result = None - - # 1. 模型流式查询航班 - async with search_agent.run_stream_events( - user_prompt=prompt, - deps=deps, - message_history=message_history, - usage_limits=usage_limits, - ) as events: - async for event in events: - if isinstance(event, AgentRunResultEvent): - run_result = event - yield event - - # 2. 保存本轮模型对话到数据库(核心:上下文持久化,防止断裂) - if run_result is not None: - # 写入对话历史,下一轮get_message_history可以读到航班内容 - await db_state.create_result_record( - conversation_id=state.conversation_id, - dialog_id=state.dialog_id, - new_messages=run_result.new_messages(), - ) - # 用量回填 - state.usage = run_result.usage - - # 3. 判断业务结果分支 - if isinstance(run_result.output, NoFlightFound): - # 无航班场景 - state.stage = FlowStage.FINISH - yield AgentStreamEvent.text_event("未找到符合条件的航班,预订流程结束") - return - else: - # ✅ 查询到航班,推送业务选择提示(前端展示按钮/文字提示) - tip_text = "已查询到航班,请回复 buy 购票 / search 重新查询" - yield AgentStreamEvent.text_event(tip_text) - - # 阶段挂起,等待用户输入buy/search,不直接结束流程 - state.stage = FlowStage.WAIT_USER_INPUT - return diff --git a/agent/database.db b/agent/database.db index cf1a9783c1cdc9f72718b468f360d8fd22151ddc..b609ef33cd05e7becf0c1185501f0ab4c88d7565 100644 GIT binary patch literal 106496 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 Ry)cO7osc-61`Yd}{}0H0@hboT literal 339968 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