From 026c573556d4a78f03d194b28d153ec7b8078ce1 Mon Sep 17 00:00:00 2001 From: liubiren Date: Fri, 7 Aug 2026 02:52:07 +0800 Subject: [PATCH] 1 --- agent/application/states/models.py | 14 +++++++------- agent/application/tasks/book_flight.py | 15 ++++++++------- agent/application/tasks/models.py | 6 ++++-- agent/database.db | Bin 126976 -> 126976 bytes 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/agent/application/states/models.py b/agent/application/states/models.py index 9c57645..8f3f0b1 100644 --- a/agent/application/states/models.py +++ b/agent/application/states/models.py @@ -57,7 +57,9 @@ def usage_to_object(usage: dict[str, Any]) -> RunUsage: """ Usage 转为对象 """ - return UsageAdapter.validate_python(usage) if usage else RunUsage() + if isinstance(usage, dict) and usage: + return UsageAdapter.validate_python(usage) + return RunUsage() def usage_to_dict(usage: RunUsage) -> dict[str, Any]: @@ -75,11 +77,9 @@ def usage_limits_to_object(usage_limits: dict[str, Any]) -> UsageLimits: """ UsageLimits 转为对象 """ - return ( - UsageLimitsAdapter.validate_python(usage_limits) - if usage_limits - else UsageLimits() - ) + if isinstance(usage_limits, dict) and usage_limits: + return UsageLimitsAdapter.validate_python(usage_limits) + return UsageLimits(request_limit=5) def usage_limits_to_dict(usage_limits: UsageLimits) -> dict[str, Any]: @@ -104,7 +104,7 @@ class Task(BaseModel): id: str = Field(default_factory=lambda: str(uuid7()), description="任务唯一标识") type: TaskType = Field(..., description="任务类型") - node: str | None = Field(default="", description="任务节点") + node: str = Field(default="", description="任务节点") deps: Any = Field(default=None, description="任务依赖项") usage: dict[str, Any] = Field(default_factory=dict, description="任务使用量") usage_limits: dict[str, Any] = Field( diff --git a/agent/application/tasks/book_flight.py b/agent/application/tasks/book_flight.py index e891865..4e13ec1 100644 --- a/agent/application/tasks/book_flight.py +++ b/agent/application/tasks/book_flight.py @@ -13,12 +13,11 @@ from application.states.models import ( Task, TaskNodeResultEvent, TaskType, - usage_limits_to_dict, usage_limits_to_object, usage_to_dict, usage_to_object, ) -from application.tasks.models import DEEPSEEK_V4_FLASH_MODEL +from application.tasks.models import DEEPSEEK_V4_FLASH_MODEL, MODEL_SETTINGS class Deps(BaseModel): @@ -53,6 +52,7 @@ class NoFlightFound(BaseModel): # 航班查询智能体 flight_search_agent = Agent[Deps, FlightDetail | NoFlightFound]( model=DEEPSEEK_V4_FLASH_MODEL, + model_settings=MODEL_SETTINGS, deps_type=Deps, output_type=FlightDetail | NoFlightFound, system_prompt="你的工作是在给定日期、出发机场和到达机场为用户找到最便宜的航班", @@ -61,6 +61,7 @@ flight_search_agent = Agent[Deps, FlightDetail | NoFlightFound]( # 所有航班详情提取智能体 flight_details_extraction_agent = Agent( model=DEEPSEEK_V4_FLASH_MODEL, + model_settings=MODEL_SETTINGS, output_type=list[FlightDetail], system_prompt="从给定文本中提取所有航班详细,包括航班号、航班日期、出发机场、到达机场和机票价格", ) @@ -117,6 +118,7 @@ class NoSeatExtracted(BaseModel): # 提取座位偏好智能体(无依赖项) seat_preference_extraction_agent = Agent[object, SeatPreference | NoSeatExtracted]( model=DEEPSEEK_V4_FLASH_MODEL, + model_settings=MODEL_SETTINGS, output_type=SeatPreference | NoSeatExtracted, system_prompt="提取用户的座位偏好。座位规则说明:A 座、F 座为靠窗座位;第 1 排是前排座位,腿部空间更大;14 排、20 排同样拥有加宽腿部空间", ) @@ -175,7 +177,6 @@ def init_task() -> Task: origin="SFO", destination="ANC", ), - usage_limits=usage_limits_to_dict(UsageLimits(request_limit=5)), ) @@ -196,8 +197,8 @@ async def 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), + usage=usage_to_object(dict(task.usage)), + usage_limits=usage_limits_to_object(dict(task.usage_limits)), ) as events: async for event in events: if not isinstance(event, AgentRunResultEvent): @@ -241,8 +242,8 @@ async def run_stream_events( async with seat_preference_extraction_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), + usage=usage_to_object(dict(task.usage)), + usage_limits=usage_limits_to_object(dict(task.usage_limits)), ) as events: async for event in events: if not isinstance(event, AgentRunResultEvent): diff --git a/agent/application/tasks/models.py b/agent/application/tasks/models.py index a9ad39b..cd8e64c 100644 --- a/agent/application/tasks/models.py +++ b/agent/application/tasks/models.py @@ -2,10 +2,10 @@ """ 智能体相关模块 """ -from pydantic_ai.models.openai import OpenAIChatModel +from pydantic_ai import ModelSettings +from pydantic_ai.models.openai import OpenAIChatModel, OpenAIChatModelSettings from pydantic_ai.providers.openai import OpenAIProvider - DEEPSEEK_V4_FLASH_MODEL = OpenAIChatModel( model_name="deepseek-v4-flash", provider=OpenAIProvider( @@ -13,3 +13,5 @@ DEEPSEEK_V4_FLASH_MODEL = OpenAIChatModel( api_key="sk-D9Y1mCe8VlvNqLuSC4mAjqEwxJ2nW4C0h8a7EPn8kg9RLsHq", ), ) + +MODEL_SETTINGS = ModelSettings(extra_body={"thinking": {"type": "disabled"}}) diff --git a/agent/database.db b/agent/database.db index e3772894668ce8c042796be81f6635dbd0d9d20f..9ef11eb246db2361c9b6a6d110372f4234cf0cc3 100644 GIT binary patch delta 6837 zcmc&(>vI#=71vsRVT>2rQWKnnMVLohuY32s>miv48y5&*5~F0=I5k(Rm8~L6X0;+P z9#^=@5IT*AP%)?&Q`#mBOlN{2ZVTnr_8(}QPqZJJFs&uid?=LZv>!TCdhV_)OO_=Z zlF}JVUf+B7+;h+4_dDnM(CwN-w`<;RS|Yeyu2t}9f=}(S4GJY(+VgI-uAZcF~9FTl8VrHCw*c1_VwR=R5`H=L)EJivBwN}~bmbBlb=Qin`gL{iYqH_uy4u9++ue(NzU3qBue|=6qnV6YUF0-YffKQs zgg7>!E3yJdS0!Coi1wVw1cyAx)5Z*Wtb>CFJb0{VG~BD>aM;trc=Tw*G9ng?Cp
  • XLvY$`Tg{j3z_enPhS{IpS_X3 zdT#2*=-umYWqv*~eg1pX*OHmjXYO7f8S;c8gK?|ZitaTcG1yELIhpK^^?sxGH8W%x zy(u(7tzO9?UWAEg+$vbFD136_S}cKvVbV1A#f_LnWArfM;XN*Kgitq*?ZGx&oh}LCzzOlO}(G_>zkvQ z6BnHq>xv96@M?;gptzC-77;PyLH`rJT`MQ+Z+}d$ zfT!gZ@bv|%4!+%Vql=!T4Z3l%;oj%z#6ys2AsOu6QR!P43OUm94Yr~IQuZk z=N?o~{`tWgR8_OoRkIYpuexS(>GZwY6VFjqRn_mfs^1}~TfOW37b~iKzNyBAU`eqK z#VRECOs{-ldhCt#<+D>a#xp;dNROYNzIGDOA(J|r89(!vLnG-oucnV4%Zy)5!_W8M zA~AmRrt|02m8;Xo&u5NY&V2VKjAzCVP2K!e`oehX`O{RhS8YR58_&1O2#HAhhNs07 zI2geLA-&f$f}XZWJRENE3}Vyj-5ZJoJZ+xX!I)(Xu!ClFV9@dmx1^SxroP#bFGiG8 zZy%@B=DaaQmWk+4Bxad$-3mnsUJ==;qZ+k(l}dad@dCjTfmIbjV3BC>JYb0=3S9EX zcUP8J!yzn5qN3@^4?gA-c20rzfXE)>fMsIc>J5fNef?H%z_4&A90Mh=*$10@hKAue zmxR3`ayEkBy|8^y6cyyxbR?=ltN~B(ilogfckJL8hP;(Ekr~~eVmDHYQ-3;1eWe!I zfF;sWi^r&^DpV=;v7!ugjyaxVRX}`B1kT}+R89=c znem8o`q@w{?Fv{A-Py%@pXYc1whmy6 zxRyt}!~$<~2*#pjs4qlJ(~Tocr->taD5gi5t-!!$#8wiAnS?iF4n|Fj*#P3cL?i*# zg`8=4b+-{1U>_Zf3UsNL^8q3)D?~LVa_a z&8u!F4w-%&*&8dRVyAa&zKRM;%%h{Cl8~NbQhvcEEwAFXc*MZ*oPG(26>vlDoozdP zc?ycC(1ts|-p+3Ka)>L|Z{aS_?L|zOAd)^Sm-BO6-o9lkyJM>tqH-R6$yn4(WMj0w zKcwTnDATom3pPteSl5dk#WA`g1gM-fC=llt;p3VK@7!5IjXb;ZIlCsDT-wyt&3140 zLY-ey)2yPKqA@EPVYWy6Agc;_jYzmmrt^Bc1||s zqBUV76!_eV1w%$Sz;46(UO;rlYlU&d!lkwb;l@f*$h9b~#+}>bxNFd?33%Tl~!wJ*m|jsm9_$=SjD!3Z&9$ zS;0%P9R~URCMR(7mp=k(l_jJIa$fl(*n#x0@<$UiU62Eq4Tw+@h<?)nQb2FFsW5KUWsv-s;b0x_y z@RA~_r0TaFR@knT%G^p0$##>{vO^wpei{G&6Sc5|EEfp5R>jjv*n@G{gMqG?(47%z zoiV@NQqDG)5Ajx00nnBtTR~`*;L1`}9+_-y2`Y58|9i4sOTGGwJya#CrWVz^7S+QQ zNyVaFqx;-&MKb1F_!UX{3oy7MX{;povZ;HQs3z#DMbsv$t-PW^gFJH`ksX8Hn77%b zB&yhZX%eeQ2FGGG$g_Sqpy2=?5G238+rZXl=Z3-{Bs&8vGXy<1%dw{L zI2h!RF8M`6kT6_UD}1m-mS?N8^&6>W^RRR!#{t#a7ZL(L4ZD&a_FgJ&h%R2+sf9eZ~hxq1E zbG@9;o+ke;$cN_nbKP+T2URg|XX+;}tY;+1=yAmS+SG$Cs;U-R(;E0Zak>6S)IYlZ E3(81sp#T5? delta 4683 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 ibmh9U(5K28vZ;BN!