From 1ac121e9cb4ffa09573a3497e47b3b5fb97a833f Mon Sep 17 00:00:00 2001 From: liubiren Date: Fri, 11 Sep 2026 20:24:02 +0800 Subject: [PATCH] 1 --- agent/alembic/versions/3a74f94a7ad4_.py | 36 --- .../{d52f1ee0f9c4_.py => 3e4ccabe44c3_.py} | 16 +- agent/application/pages/conversation.py | 10 +- agent/application/states/auth.py | 6 +- agent/application/states/conversation.py | 213 ++++++++++-------- agent/application/states/database.py | 33 ++- agent/application/states/models.py | 14 +- agent/application/workshop/book_flight.py | 51 +++-- agent/application/workshop/events.py | 16 ++ agent/application/workshop/models.py | 2 +- agent/database.db | Bin 237568 -> 147456 bytes 11 files changed, 205 insertions(+), 192 deletions(-) delete mode 100644 agent/alembic/versions/3a74f94a7ad4_.py rename agent/alembic/versions/{d52f1ee0f9c4_.py => 3e4ccabe44c3_.py} (90%) create mode 100644 agent/application/workshop/events.py diff --git a/agent/alembic/versions/3a74f94a7ad4_.py b/agent/alembic/versions/3a74f94a7ad4_.py deleted file mode 100644 index 413e5a8..0000000 --- a/agent/alembic/versions/3a74f94a7ad4_.py +++ /dev/null @@ -1,36 +0,0 @@ -"""empty message - -Revision ID: 3a74f94a7ad4 -Revises: d52f1ee0f9c4 -Create Date: 2026-09-03 12:30:13.538072 - -""" -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -import sqlmodel - -# revision identifiers, used by Alembic. -revision: str = '3a74f94a7ad4' -down_revision: Union[str, Sequence[str], None] = 'd52f1ee0f9c4' -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - """Upgrade schema.""" - # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table('conversationrecord', schema=None) as batch_op: - batch_op.add_column(sa.Column('workflow', sqlmodel.sql.sqltypes.AutoString(), server_default=sa.text("('')"), nullable=False)) - - # ### end Alembic commands ### - - -def downgrade() -> None: - """Downgrade schema.""" - # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table('conversationrecord', schema=None) as batch_op: - batch_op.drop_column('workflow') - - # ### end Alembic commands ### diff --git a/agent/alembic/versions/d52f1ee0f9c4_.py b/agent/alembic/versions/3e4ccabe44c3_.py similarity index 90% rename from agent/alembic/versions/d52f1ee0f9c4_.py rename to agent/alembic/versions/3e4ccabe44c3_.py index 02dfbd4..ca642bc 100644 --- a/agent/alembic/versions/d52f1ee0f9c4_.py +++ b/agent/alembic/versions/3e4ccabe44c3_.py @@ -1,8 +1,8 @@ """empty message -Revision ID: d52f1ee0f9c4 +Revision ID: 3e4ccabe44c3 Revises: -Create Date: 2026-08-11 14:59:37.246745 +Create Date: 2026-09-11 14:22:48.429299 """ from typing import Sequence, Union @@ -12,7 +12,7 @@ import sqlalchemy as sa import sqlmodel # revision identifiers, used by Alembic. -revision: str = 'd52f1ee0f9c4' +revision: str = '3e4ccabe44c3' down_revision: Union[str, Sequence[str], None] = None branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None @@ -37,9 +37,10 @@ def upgrade() -> None: sa.Column('id', sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.Column('user_id', sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.Column('description', sqlmodel.sql.sqltypes.AutoString(), nullable=False), - sa.Column('usage', sa.JSON(), nullable=False), - sa.Column('is_deleted', sa.Boolean(), nullable=False), sa.Column('created_at', sa.DateTime(), nullable=False), + sa.Column('is_deleted', sa.Boolean(), nullable=False), + sa.Column('usage', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('workflow', sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.PrimaryKeyConstraint('id') ) with op.batch_alter_table('conversationrecord', schema=None) as batch_op: @@ -49,9 +50,10 @@ def upgrade() -> None: op.create_table('messagerecord', sa.Column('id', sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.Column('conversation_id', sqlmodel.sql.sqltypes.AutoString(), nullable=False), - sa.Column('type', sa.Enum('USER_PROMPT', 'THINKING', 'TOOL_CALL', 'RESULT_OUTPUT', name='messagetype'), nullable=False), + sa.Column('type', sa.Enum('USER_PROMPT', 'THINKING', 'TOOL_CALL', 'TEXT', name='messagetype'), nullable=False), sa.Column('title', sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.Column('content', sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column('approval', sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.PrimaryKeyConstraint('id') ) with op.batch_alter_table('messagerecord', schema=None) as batch_op: @@ -60,7 +62,7 @@ def upgrade() -> None: op.create_table('runrecord', sa.Column('id', sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.Column('conversation_id', sqlmodel.sql.sqltypes.AutoString(), nullable=False), - sa.Column('new_messages', sa.JSON(), nullable=False), + sa.Column('new_messages', sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.PrimaryKeyConstraint('id') ) with op.batch_alter_table('runrecord', schema=None) as batch_op: diff --git a/agent/application/pages/conversation.py b/agent/application/pages/conversation.py index c3a1f59..554a0fb 100644 --- a/agent/application/pages/conversation.py +++ b/agent/application/pages/conversation.py @@ -475,9 +475,8 @@ def tool_call(item: MessageHistoryItem) -> rx.Component: rx.button( "发送", # 点击事件:审批 - on_click=lambda: ConversationState.approve(item.id), + on_click=lambda: ConversationState.approve(item.id, True), # 是否禁用绑定验证码发送禁用状态 - disabled=AuthState.is_captcha_code_sending_button_disabled, margin="0 8px", background_color="var(--prismui-background-color-1)", line_height="16px", @@ -487,11 +486,6 @@ def tool_call(item: MessageHistoryItem) -> rx.Component: "var(--prismui-color-4)", "var(--prismui-color-5)", ), - cursor=rx.cond( - AuthState.is_captcha_code_sending_button_disabled, - "not-allowed", - "pointer", - ), ), width="100%", height="45px", @@ -669,7 +663,7 @@ def message_history() -> rx.Component: align_items="center", width="100%", padding="0 16px", - margin_bottom="8px", + margin="8px 0", overflow="hidden", ), rx.fragment(), diff --git a/agent/application/states/auth.py b/agent/application/states/auth.py index a23d245..cbe4de1 100644 --- a/agent/application/states/auth.py +++ b/agent/application/states/auth.py @@ -208,8 +208,9 @@ class AuthState(rx.State): """ 恢复会话状态 """ - # 恢复会话状态 + # 获取会话状态 conversation_state = await self.get_state(ConversationState) + # 恢复会话状态 await conversation_state.resume_conversation_state(user_id=self.user_id) @rx.event @@ -253,8 +254,9 @@ class AuthState(rx.State): # 创建用户记录 user_id = await db_state.create_user_record(email=self.email) - # 恢复当前用户会话状态 + # 获取会话状态 conversation_state = await self.get_state(ConversationState) + # 恢复当前用户的会话状态 await conversation_state.resume_conversation_state(user_id=user_id) self.user_id = user_id diff --git a/agent/application/states/conversation.py b/agent/application/states/conversation.py index 1bd3e41..aee44fa 100644 --- a/agent/application/states/conversation.py +++ b/agent/application/states/conversation.py @@ -4,18 +4,15 @@ """ from datetime import datetime from typing import AsyncGenerator, cast + from pydantic_ai import ( DeferredToolRequests, DeferredToolResults, ToolApproved, ToolDenied, ) - from pydantic_ai.messages import ( - FunctionToolCallEvent, FunctionToolResultEvent, - LoadCapabilityCallPart, - ToolReturnPart, PartDeltaEvent, PartEndEvent, PartStartEvent, @@ -24,13 +21,14 @@ from pydantic_ai.messages import ( ThinkingPart, ThinkingPartDelta, ToolCallPart, - ToolSearchCallPart, + ToolReturnPart, ) -from pydantic_ai.run import AgentRunResultEvent, AgentRunResult +from pydantic_ai.run import AgentRunResultEvent import reflex as rx from application.states.database import DatabaseState from application.states.models import ( + Approval, Conversation, ConversationHistoryItem, Message, @@ -38,11 +36,8 @@ from application.states.models import ( MessageType, Workflow, WorkflowType, - Approval, - workflow_dump_json, - workflow_validate_json, - usage_validate_json, ) +from application.workshop.events import AgentPromptEvent def format_conversation_created_at(created_at: datetime) -> str: @@ -280,34 +275,7 @@ class ConversationState(rx.State): # 获取数据库状态 db_state = await self.get_db_state() - # 无审批实例 - if not approval: - # 若用户提示词为空则直接返回 - if not conversation.user_prompt: - return - - # 将正在运行设置为是 - conversation.is_running = True - # 将等待流式输出设置为是 - conversation.awaiting_stream = True - yield # 通知前端更新渲染 - - # 先创建消息记录再添加消息实例 - conversation.messages.update( - await db_state.create_message_record( - conversation_id=conversation.id, - message=Message( - type=MessageType.USER_PROMPT, - content=(user_prompt := conversation.user_prompt), - ), - ) - ) - # 清空用户提示词 - conversation.user_prompt = "" - yield # 通知前端更新渲染 - - # 有审批实例 - else: + if isinstance(approval, Approval): if not (user_prompt := approval.user_prompt): return @@ -315,42 +283,63 @@ class ConversationState(rx.State): conversation.awaiting_stream = True yield # 通知前端更新渲染 + else: + # 若用户提示词为空则直接返回 + if not (user_prompt := conversation.user_prompt): + return + + # 清空用户提示词 + conversation.user_prompt = "" + # 将正在运行设置为是 + conversation.is_running = True + # 将等待流式输出设置为是 + conversation.awaiting_stream = True + # 先创建消息记录再添加消息实例 + conversation.messages.update( + await db_state.create_message_record( + conversation_id=conversation.id, + message=Message( + type=MessageType.USER_PROMPT, + content=user_prompt, + ), + ) + ) + yield # 通知前端更新渲染 + # 初始化片段索引映射为消息实例唯一标识字典 index_map_to_message_id: dict[int, str] = {} - # 初始化工具调用片段工具名称映射为消息实例唯一标识字典 - tool_name_map_to_message_id: dict[str, str] = {} + + # 查询消息历史列表 + message_history = await db_state.read_message_history( + conversation_id=self.actived_conversation_id + ) # 初始化工作流 - if conversation.workflow: - match conversation.workflow.type: - case WorkflowType.BOOK_FLIGHT: - from application.workshop.book_flight import ( - run_stream_events, - ) + match conversation.workflow.type: + case WorkflowType.TALK: + from application.workshop.talk import ( + run_stream_events, + ) - # 运行并流式输出事件 - stream_events = run_stream_events( - deps=conversation.workflow.deps, - user_prompt=user_prompt, - message_history=await db_state.read_message_history( - conversation_id=self.actived_conversation_id - ), - usage=conversation.usage, - deferred_tool_results=deferred_tool_results, - ) - else: - from application.workshop.talk import ( - run_stream_events, - ) + # 运行并流式输出事件 + stream_events = run_stream_events( + user_prompt=user_prompt, + message_history=message_history, + usage=conversation.usage, + ) + case WorkflowType.BOOK_FLIGHT: + from application.workshop.book_flight import ( + run_stream_events, + ) - # 运行并流式输出事件 - stream_events = run_stream_events( - user_prompt=user_prompt, - message_history=await db_state.read_message_history( - conversation_id=self.actived_conversation_id - ), - usage=conversation.usage, - ) + # 运行并流式输出事件 + stream_events = run_stream_events( + deps=conversation.workflow.deps, + user_prompt=user_prompt, + message_history=message_history, + usage=conversation.usage, + deferred_tool_results=deferred_tool_results, + ) # 消息列表 messages: list[Message] = [] @@ -382,7 +371,9 @@ class ConversationState(rx.State): yield # 通知前端更新渲染 # 工具调用分片 - case ToolCallPart(tool_name=tool_name): + case ToolCallPart( + tool_call_id=tool_call_id, tool_name=tool_name + ): # 构建消息实例 message = Message( type=MessageType.TOOL_CALL, @@ -391,8 +382,10 @@ class ConversationState(rx.State): ) # 添加至消息字典 conversation.messages[message.id] = message - # 将消息实例唯一标识与工具调用片段工具名称映射 - tool_name_map_to_message_id[tool_name] = message.id + # 将消息实例唯一标识与工具调用唯一标识映射 + conversation.workflow.tool_call_id_map_to_message_id[ + tool_call_id + ] = message.id yield # 通知前端更新渲染 # 文本分片 @@ -436,7 +429,7 @@ class ConversationState(rx.State): ): match part: # 思考分片 - case ThinkingPart(content=content): + case ThinkingPart(): # 获取消息实例 message = conversation.messages[ index_map_to_message_id[index] @@ -447,7 +440,7 @@ class ConversationState(rx.State): messages.append(message) # 文本分片 - case TextPart(content=content): + case TextPart(): # 获取消息实例 message = conversation.messages[ index_map_to_message_id[index] @@ -458,13 +451,18 @@ class ConversationState(rx.State): case FunctionToolResultEvent(part=part): match part: # 工具返回分片 - case ToolReturnPart(tool_name=tool_name, content=content): + case ToolReturnPart( + tool_call_id=tool_call_id, + tool_name=tool_name, + content=content, + ): # 获取消息实例 message = conversation.messages[ - tool_name_map_to_message_id[tool_name] + conversation.workflow.tool_call_id_map_to_message_id[ + tool_call_id + ] ] message.is_running = False - yield # 通知前端更新渲染 message.title = f"{tool_name}已完成" message.content = cast( str, content @@ -472,42 +470,52 @@ class ConversationState(rx.State): yield # 通知前端更新渲染 messages.append(message) + # ========== 智能体提示事件 ========== + case AgentPromptEvent(content=content): + # 构建消息实例 + message = Message(type=MessageType.TEXT, content=content) + # 添加至消息字典 + conversation.messages[message.id] = message + yield # 通知前端更新渲染 + messages.append(message) + # ========== 智能体运行结果事件 ========== case AgentRunResultEvent(result=result): if isinstance(output := result.output, DeferredToolRequests): - for approval_ in output.approvals: + for appr in output.approvals: # 获取消息实例 message = conversation.messages[ - tool_name_map_to_message_id[approval_.tool_name] + conversation.workflow.tool_call_id_map_to_message_id[ + tool_call_id := appr.tool_call_id + ] ] - message.content = output.metadata[ - tool_call_id := approval_.tool_call_id - ]["content"] + message.content = output.metadata[tool_call_id]["content"] message.approval = Approval( tool_call_id=tool_call_id, ) + yield # 通知前端更新渲染 messages.append(message) + else: - # 将工作流设置为空 - conversation.workflow = None + # 若工作流类型非对话则设置为对话 + if conversation.workflow.type != WorkflowType.TALK: + conversation.workflow = Workflow() # 将正在运行设置为否 conversation.is_running = False + yield # 通知前端更新渲染 - # 更新会话记录 - await db_state.update_conversation_record( - conversation.id, - usage=result.usage, - workflow=conversation.workflow, - ) - # 创建运行记录 - await db_state.create_run_record( - conversation_id=conversation.id, - new_messages=result.new_messages(), - ) - - self.conversations[self.actived_conversation_id] = conversation - yield # 通知前端更新渲染 + # 更新会话记录 + await db_state.update_conversation_record( + conversation.id, + usage=result.usage, + workflow=conversation.workflow, + ) + # 创建运行记录 + await db_state.create_run_record( + conversation_id=conversation.id, + new_messages=result.new_messages(), + ) # 批量创建消息记录 await db_state.create_message_records( conversation_id=conversation.id, @@ -578,7 +586,6 @@ class ConversationState(rx.State): if not conversation: return - # 获取审批实例 if not (message := conversation.messages.get(item_id)) or not isinstance( approval := message.approval, Approval ): @@ -587,14 +594,15 @@ class ConversationState(rx.State): # 更新审批结果 approval.result = result # 运行 - await self.run( + async for _ in self.run( approval, DeferredToolResults( approvals={ approval.tool_call_id: ToolApproved() if result else ToolDenied() } ), - ) + ): + ... @rx.event async def set_workflow(self, type: WorkflowType) -> None: @@ -617,6 +625,11 @@ class ConversationState(rx.State): f"帮我查询并预定在 {workflow.deps.date.strftime('%Y-%m-%d')} 从 {workflow.deps.origin_airport_code} 到 {workflow.deps.destination_airport_code} 的航班" ) + case _: + # 初始化对话工作流 + workflow = Workflow() + + # 设置工作流 conversation.workflow = workflow # 获取数据库状态 db_state = await self.get_db_state() diff --git a/agent/application/states/database.py b/agent/application/states/database.py index 39ee00b..d8460de 100644 --- a/agent/application/states/database.py +++ b/agent/application/states/database.py @@ -2,9 +2,10 @@ """ 数据库状态 """ +from dataclasses import asdict from datetime import datetime, timedelta from random import choices -from dataclasses import asdict + from pydantic_ai import ModelMessage, ModelMessagesTypeAdapter, RunUsage from pydantic_ai._uuid import uuid7 import reflex as rx @@ -15,12 +16,12 @@ from application.states.models import ( Message, MessageType, Workflow, + approval_dump_json, + approval_validate_json, usage_dump_json, usage_validate_json, workflow_dump_json, workflow_validate_json, - approval_dump_json, - approval_validate_json, ) @@ -346,15 +347,25 @@ class DatabaseState(rx.State): """ async with rx.asession() as session: for message in messages: - record = MessageRecord( - id=message.id, - conversation_id=conversation_id, - type=message.type, - title=message.title, - content=message.content, - approval=approval_dump_json(message.approval), + result = await session.exec( + select(MessageRecord).where(MessageRecord.id == message.id) ) - session.add(record) + record = result.first() + if record: + record.title = message.title + record.content = message.content + record.approval = approval_dump_json(message.approval) + else: + session.add( + MessageRecord( + id=message.id, + conversation_id=conversation_id, + type=message.type, + title=message.title, + content=message.content, + approval=approval_dump_json(message.approval), + ) + ) await session.commit() async def read_message_history(self, conversation_id: str) -> list[ModelMessage]: diff --git a/agent/application/states/models.py b/agent/application/states/models.py index 839164b..3b1fb33 100644 --- a/agent/application/states/models.py +++ b/agent/application/states/models.py @@ -66,6 +66,7 @@ class WorkflowType(StrEnum): 工作类型枚举 """ + TALK = "talk" BOOK_FLIGHT = "预定航班" @@ -74,8 +75,11 @@ class Workflow(BaseModel): 工作流类 """ - type: WorkflowType = Field(..., description="工作类型") + type: WorkflowType = Field(default=WorkflowType.TALK, description="工作类型") deps: Any = Field(default=None, description="工作依赖项") + tool_call_id_map_to_message_id: dict[str, str] = Field( + default_factory=dict, description="工具调用唯一标识映射为消息实例唯一标识字典" + ) class Conversation(BaseModel): @@ -88,7 +92,7 @@ class Conversation(BaseModel): created_at: datetime = Field(..., description="会话创建日期时间") usage: RunUsage = Field(..., description="会话使用量") messages: dict[str, Message] = Field(default_factory=dict, description="消息字典") - workflow: Workflow | None = Field(default=None, description="工作流") + workflow: Workflow = Field(default_factory=Workflow, description="工作,默认为对话") user_prompt: str = Field(default="", description="用户提示词") is_running: bool = Field( default=False, description="正在运行,True 表示正在运行, False 表示运行结束" @@ -119,7 +123,7 @@ class MessageHistoryItem(Message): # 工作流适配器 -WorkflowAdapter = TypeAdapter(Any) +WorkflowAdapter = TypeAdapter(Workflow) def workflow_validate_json(workflow: str) -> Any: @@ -127,11 +131,11 @@ def workflow_validate_json(workflow: str) -> Any: 将工作流反序列化 """ if not workflow: - return None + return Workflow() return WorkflowAdapter.validate_json(workflow) -def workflow_dump_json(workflow: Any) -> str: +def workflow_dump_json(workflow: Workflow) -> str: """ 将工作流序列化 :param workflow: 工作流 diff --git a/agent/application/workshop/book_flight.py b/agent/application/workshop/book_flight.py index 16d3334..db92140 100644 --- a/agent/application/workshop/book_flight.py +++ b/agent/application/workshop/book_flight.py @@ -16,24 +16,25 @@ from pydantic_ai import ( RunContext, RunUsage, UsageLimits, + AgentRunResult, ) from pydantic_ai.messages import ( + PartDeltaEvent, + TextPart, AgentStreamEvent, FunctionToolResultEvent, PartStartEvent, ToolCallPart, ToolReturnPart, ) -from pydantic_ai.run import AgentRunResult, AgentRunResultEvent +from pydantic_ai.run import AgentRunResultEvent -from application.states.models import ( - NoResult, - Approval, -) +from application.states.models import NoResult from application.workshop.models import ( DEEPSEEK_V4_FLASH_MODEL, DEEPSEEK_V4_FLASH_MODEL_SETTINGS, ) +from application.workshop.events import AgentPromptEvent class Flight(BaseModel): @@ -174,6 +175,9 @@ async def search_flights(ctx: RunContext[Deps]) -> list[Flight]: **设计工具需先设计业务流程** 本示例按照 查询航班 -> 推荐航班 -> 预定航班 """ + if ctx.deps.searched_flights: + return ctx.deps.searched_flights + # 提取到的所有航班信息 extracted_flights = ( await extraction_flights_agent.run( @@ -204,13 +208,14 @@ async def search_flights(ctx: RunContext[Deps]) -> list[Flight]: return searched_flights -@agent.tool( - name="预定航班", -) +@agent.tool(name="预定航班") async def book_flight(ctx: RunContext[Deps]) -> Flight | NoResult: """ 预定航班 """ + if ctx.deps.booked_flight: + return ctx.deps.booked_flight + if (searched_flights := ctx.deps.searched_flights) is None: raise ModelRetry("必须先使用 search_flights 查询航班") @@ -289,7 +294,6 @@ async def run_stream_events( """ 运行并流式输出事件 """ - tool_names = set() async with agent.run_stream_events( user_prompt=user_prompt, deps=deps, @@ -308,9 +312,7 @@ async def run_stream_events( case ToolCallPart(tool_name=tool_name): match tool_name: case "查询航班" | "预定航班": - if tool_name not in tool_names: - tool_names.add(tool_name) - yield event + yield event case FunctionToolResultEvent(part): match part: @@ -327,14 +329,19 @@ async def run_stream_events( event.part.content += f"{searched_flight.number} {searched_flight.airfare}$ 于 {searched_flight.date.strftime('%Y-%m-%d')} 从 {searched_flight.origin_airport_code} 到 {searched_flight.destination_airport_code}\n\n" yield event - case "预定航班": - if isinstance(content, NoResult): - event.part.content = ( - "未提取到航班号,请检查后重试" - ) - if isinstance(content, Flight): - event.part.content = f"已预定航班:\n{content.number} {content.airfare}$ 于 {content.date.strftime('%Y-%m-%d')} 从 {content.origin_airport_code} 到 {content.destination_airport_code}\n" - yield event + # 预定航班无需业务定义 - case AgentRunResultEvent: - yield event + case AgentRunResultEvent(result=result): + match result: + case AgentRunResult(output=output): + match output: + case Flight(): + yield AgentPromptEvent( + content=f"已预定航班:\n\n{output.number} {output.airfare}$ 于 {output.date.strftime('%Y-%m-%d')} 从 {output.origin_airport_code} 到 {output.destination_airport_code}\n\n" + ) + case NoResult(): + yield AgentPromptEvent( + content="未提取到航班号,请检查后重试" + ) + case DeferredToolRequests(): + yield event diff --git a/agent/application/workshop/events.py b/agent/application/workshop/events.py new file mode 100644 index 0000000..5d70436 --- /dev/null +++ b/agent/application/workshop/events.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +""" +智能体事件模块 +""" +from dataclasses import dataclass + +from pydantic_ai.messages import CustomEvent + + +@dataclass(kw_only=True) +class AgentPromptEvent(CustomEvent): + """ + 智能体提示事件 + """ + + content: str diff --git a/agent/application/workshop/models.py b/agent/application/workshop/models.py index 373f4b8..bc138e6 100644 --- a/agent/application/workshop/models.py +++ b/agent/application/workshop/models.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -智能体相关模块 +智能体模型模块 """ from pydantic_ai import ModelSettings from pydantic_ai.models.openai import OpenAIChatModel diff --git a/agent/database.db b/agent/database.db index c99a5dab614b8532591b3f59ef8b66e2ea4d2630..53f8c0659eb94e100a81ec87ac92d2597992f5d1 100644 GIT binary patch literal 147456 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 Y|GEDEe)<2n{-4n*5}uJKPyhe_1KPHQ;{X5v literal 237568 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