From 8f1bc0d3ae0a089df06a3a99ee11b8fb142568b3 Mon Sep 17 00:00:00 2001 From: ccurme Date: Tue, 17 Feb 2026 10:48:52 -0500 Subject: [PATCH] feat(openai): support automatic server-side compaction (#35212) --- .../tests/unit_tests/chat_models/test_base.py | 1 + .../chat_models/test_chat_models.py | 1 + .../langchain_openai/chat_models/base.py | 11 +++ libs/partners/openai/pyproject.toml | 2 +- .../tests/cassettes/test_compaction.yaml.gz | Bin 0 -> 17428 bytes .../test_compaction_streaming.yaml.gz | Bin 0 -> 39127 bytes .../chat_models/test_responses_api.py | 93 ++++++++++++++++++ libs/partners/openai/uv.lock | 12 +-- 8 files changed, 113 insertions(+), 7 deletions(-) create mode 100644 libs/partners/openai/tests/cassettes/test_compaction.yaml.gz create mode 100644 libs/partners/openai/tests/cassettes/test_compaction_streaming.yaml.gz diff --git a/libs/langchain/tests/unit_tests/chat_models/test_base.py b/libs/langchain/tests/unit_tests/chat_models/test_base.py index 46787618e4d..12de234cbcc 100644 --- a/libs/langchain/tests/unit_tests/chat_models/test_base.py +++ b/libs/langchain/tests/unit_tests/chat_models/test_base.py @@ -147,6 +147,7 @@ def test_configurable() -> None: "reasoning_effort": None, "verbosity": None, "frequency_penalty": None, + "context_management": None, "include": None, "seed": None, "service_tier": None, diff --git a/libs/langchain_v1/tests/unit_tests/chat_models/test_chat_models.py b/libs/langchain_v1/tests/unit_tests/chat_models/test_chat_models.py index 51449b4c3d2..513da0edb59 100644 --- a/libs/langchain_v1/tests/unit_tests/chat_models/test_chat_models.py +++ b/libs/langchain_v1/tests/unit_tests/chat_models/test_chat_models.py @@ -192,6 +192,7 @@ def test_configurable() -> None: "reasoning_effort": None, "verbosity": None, "frequency_penalty": None, + "context_management": None, "include": None, "seed": None, "service_tier": None, diff --git a/libs/partners/openai/langchain_openai/chat_models/base.py b/libs/partners/openai/langchain_openai/chat_models/base.py index 741981a8d30..3a654a6451f 100644 --- a/libs/partners/openai/langchain_openai/chat_models/base.py +++ b/libs/partners/openai/langchain_openai/chat_models/base.py @@ -799,6 +799,11 @@ class BaseChatOpenAI(BaseChatModel): passed in the parameter during invocation. """ + context_management: list[dict[str, Any]] | None = None + """Configuration for + [context management](https://developers.openai.com/api/docs/guides/compaction). + """ + include: list[str] | None = None """Additional fields to include in generations from Responses API. @@ -1096,6 +1101,7 @@ class BaseChatOpenAI(BaseChatModel): "reasoning_effort": self.reasoning_effort, "reasoning": self.reasoning, "verbosity": self.verbosity, + "context_management": self.context_management, "include": self.include, "service_tier": self.service_tier, "truncation": self.truncation, @@ -1482,6 +1488,7 @@ class BaseChatOpenAI(BaseChatModel): return self.use_responses_api if ( self.output_version == "responses/v1" + or self.context_management is not None or self.include is not None or self.reasoning is not None or self.truncation is not None @@ -3894,6 +3901,7 @@ def _use_responses_api(payload: dict) -> bool: _is_builtin_tool(tool) for tool in payload["tools"] ) responses_only_args = { + "context_management", "include", "previous_response_id", "reasoning", @@ -4273,6 +4281,7 @@ def _construct_responses_api_input(messages: Sequence[BaseMessage]) -> list: ) elif block_type in ( "reasoning", + "compaction", "web_search_call", "file_search_call", "function_call", @@ -4475,6 +4484,7 @@ def _construct_lc_result_from_responses_api( tool_calls.append(tool_call) elif output.type in ( "reasoning", + "compaction", "web_search_call", "file_search_call", "computer_call", @@ -4683,6 +4693,7 @@ def _convert_responses_chunk_to_generation_chunk( } ) elif chunk.type == "response.output_item.done" and chunk.item.type in ( + "compaction", "web_search_call", "file_search_call", "computer_call", diff --git a/libs/partners/openai/pyproject.toml b/libs/partners/openai/pyproject.toml index c6abcec698c..72ccfed6513 100644 --- a/libs/partners/openai/pyproject.toml +++ b/libs/partners/openai/pyproject.toml @@ -24,7 +24,7 @@ version = "1.1.9" requires-python = ">=3.10.0,<4.0.0" dependencies = [ "langchain-core>=1.2.11,<2.0.0", - "openai>=1.109.1,<3.0.0", + "openai>=2.20.0,<3.0.0", "tiktoken>=0.7.0,<1.0.0", ] diff --git a/libs/partners/openai/tests/cassettes/test_compaction.yaml.gz b/libs/partners/openai/tests/cassettes/test_compaction.yaml.gz new file mode 100644 index 0000000000000000000000000000000000000000..5406d5ab80effe4bc6d947590a15848dce8294dd GIT binary patch literal 17428 zcmeIZRZyHkw>BDq03mpA_u%d_!6CT2ySux)3kn^d8~Uz=(o5e?o?#3=H8ds^^dV^5 z*6u@kS~z6N6y}(tVO<|Fk)z?1aT=(0VAqy14GR|;0k)j9_uiEEtF|

gKeGWMhfV zL&=BTFZC>*u#46=$T`T5L9rKh1M1y7<@N=@ZVcZ}aUT`EZ@AlyttrZzhW=D`IqUSh zr?&R{ltX)GbZxL5x(sS&&hNy=qtmXh1A2t3R87}$YZ`&mS`!wz9YNvB{(H{GN5x7Bb%Yh0W<&U z991NgA)f;C8iKTwHbuS4AMLkS%h)eysNc~=;4sAhxA?#913>S0Vmso*$v$`1uVv^S|rx4bkVsrD3C*7}$9EofLhW9-KN z0leRKSn#d$75d=V`vP$cEWE#aqHZV+dZfnK*d5=&p?qZ?5XK9O9-8sdxb*-O$#}`t& z$4qSZ7W!VcHbubYOs&-H*;Ra6rvvz6TncTq71r^DrVDV=S?#H9xjZF*<{32ZW!UQN zPi+BoMvpjlKGSu9V9&?8^&4+{Q6*uxpnt2r;|t~E;j2Fk4B&y@%l4#}ZUsC|7~Z&N zb>{^<)go);cF8+vWlGaCvE9)-W@|X<@7vcIRJ>l^rs@24ClD2YCAk!s`*r2jqMa__ zJ%pdy6>%)Fr+eepvC^lvI$aG5Kh7Tx63%+#DI&84`X1g3QDHFE{4$I@IXg8FRB#2f$WJ@(XQc->X-CimpOP^UKHzoT>7bp3k1?7kxS=W3Sae^L5>;wSaei>f!{dAsyHy5ZHW=j&r! zH{Z3m5C7jto!UE@cMvZ)iYsqucVPSYN@kh+qrJs|yI|Z>yc_=Q5rIf8HG^@>vsXVM zkU6H|v^MbVe!}qWp2tQp&yd0w+S&_)$c8$4=-Taf=);QkCtB<$3Je{=c|0c*EpIK~ z!0LuVe^~k5_Z743Pa!h|lP#Tj`UW>lXN~Ta;~N*?TVG|NH8)S2SOhS0L!JkCxn$z1 zKcZG!*|PG6FqH7=7WK{N>lEsiRr_hnd5zy)l0UdM>#Yv*u{8Dk+2*;2q#=;Q;J)() zMyO}~+?eI{@=yPO?`m&e4>lO4m|*q8%lQe+QaiyK5_qw-+zWFpbnM;J^@g5RH+PtZDr zcxS`5X-R%lrqFWl_sE4I(I^OxXQ2Rp;Vw3N9>;~AbT<2*7v$G&ebvx&i5>O1 zcui~Gr_rpoNO)rw{g&Pu*8gWG{P|u*t8-9cT%Pbe)LijX04-3z|LyO)|J@1y6FWit z>Xsq<@}T+w*m>>Ket$P$RO(%MKAuvVIwr2)_hivI%}4lo(E9gNP=wzele#xy6{zCv zxvN;i8D7{-6zvK^qtBhpVwqjxf|DJHW9iV<5wuLI(6Pgb&t5}%quu>uFq#~5CbM%S zv5QVaVi1)gKgVrRswdYk3L-A>v3-J*_m$HyAkblB75bq@(4HEl*qkNBKOj?W047-H z?BV(l&{DacUHkV(MVGR#GeI>j3(3m{G^wWWA5maYxGhBi*%oj^K=?hyd4gn z(EP}`Zpd7z3@O&doTC|Rq@l1B`}Fp`VC^b?;jTUKsP4)CcvOHT9UHQxLN!y+s zQ^Dc;9-bcv;JXbq+K<%$fq)dkG@7>J9K#?2JG2cInKrj0infBb-XN#a`#)&U3sIWk zW6*4YQuZ!L%70U9+Z^uAURVce76O4VH2i5$E)uekdGltg z5ora0O7c{ z%zvNa{!vy%Onqj9E>#C27Em6|o=XW`Ytugjo%V9-S?^)p%K{XSANCxh%|O|IAk@<( z9AEjh1(~TP4wZ0^DyhHH2s4(pP!~Y|D%!f@FX|A?+VE9x|1yH%ko<#XHGgjrF#y&7 zYr(e#^#C)kY~B?u&B-%00Gpi-Ljn54pzLaY&^Ju=7`p`>@s#1iX{g_Dh;CMaI>OO2 zKU)pYmCxAuzRDVz2h9~krA;@dmWzSQjxt8PC2pU*s#@DvO|>Hf&uMI=;2t$xHyf|g zBV0BRv8ENiH4T?l?&M?Z$gzutL{EvuPj^6>@51(UUW`anw(NKukU4c1uFA)}ItA)( z+=oo~XG?KgCvfH`2zY!*Eme>E9Pfpc@rXe)kobvuT$8Dgf@Pz)jv>kFI z7@=8Hf^gQH`#f3%-d&x-RQAEv*X_MT)xot|4^9VE0ShVuxnSa2@WdYzTc_{O{88L& z=OQ0)C0(CBCS*^0IjclED0z`K$<5v!YkhXbz?(wIYtO>f^-xvJ0u*kw(mQYK=6H&* z%HNm@V-W1G)Lhj7t|x(#$2i#&z*@7VTBes7^Ul4gj<`w<)99fw13Gy)&43|7i94+U<*8xfct~1x>0O9Xm z@!Pqj0!K-Z+6uewnn< zvyPTW(Lmw%Yzm_Ly%}^%Z+TMqz<+AiJstZh^j+IeQ|?)4X5WoVKybn}?7N+)*D z(P=hq%}DR6)Nj|R`rU~XK60o{e{G0A?}%;oth(b0;8!bg{q&>()oC>$ZosGPm( zV~xvio!XNv|I&2))ta7!+myyq&U|)nEwYPGYf=M?Prck~?xSe}Ml(Cg?)OqTZow86 z8`k-)Kc#Wrg)8yyhO3dhnAto+(J1HAl=nH*6z!Wo>A1=@vcj2Y3dpP7Xjn%_8gGBd zmmCAReKH9%H8^u+O)(CfbglLnO}NTs8u)R3T;R$yTVBj|G8;m@WG%21ZKlB#$pO{^ zlt_d@ZWRGYwmC#y=|iRn%p8-Lmfdc)ZP7zoVVUaFU96^@Ure6SGd3W}`Hd*!mHL9z zlz~dt$91IEu6lzVJO$kDa}hqVuRrV;c;c8+IYg{~^%hTXg z>m8*Q_K7FG&YBfFc3Sr@$Ynw?lnqk|iko~j!&9pw+k<)draOW9lI{$cyT<5tENB5(J7#hN!F&!Hpm+336_IqGn_MtD56w$1nt~C z%!cAmK1G`E8|TS6MjzyAxyr=}c}~7&%9U2&rT0V2js;d6weTCYzM$)@PE*7{KB}gE zCP0oz_S^uKw-dyyJw;ijVoVKX8Kp?{p?%7m>#$4Ry)_l(nXYn6WW6AI2Zu)aBc=q5 zttz5bL{mR)fTgdmc_s~-o&y^H(ZIReko^q&7)OLTRe@`mLgArB(C^1=PavgiXFfHW ztaqPLv(D-vI_E`eQ$f4(W2G4_%TUUj(N`q}NJJxb@ahvrc0;XJsme>46(_HyF;BH) zHu$(Q6BjzIkB<#JG4-vIv8;UN7%Aa+=7&hnWn^e*y)TttZJ10P@ksh6U^S*RJ@igl zssQ#uNxrfA8GkiBUC1jVx!0+Cs*SQldXO zimW~g4AG;?R49`GQNG0UZm3;O=FbnQalxrn*XAOOX`%S`t+hULOP3k&PGhw`pX%X6 z1m5hnMb>lult+*cM-|vkK|3`?xBX}wV-d|CcDAhgX<}{8fViMTN96+XSf^{H47Xq~ zpeD-qd{Fu&DwV&Okh>85Efu)SLWT~i;h;CtMcXMvSLQ<2XZsp&3XgIuN}b2PDA7Zh z^=c>TR~?d6Q&$5%Dj_h!(ds#;&aTuvmM*N5NohV4-$<2+jFytyVIsb!%u;W$+flW{ ziF7%EL&y0dA;=@ffoD{F0x-3+VfIFQ4#UQQ^cO*0S$-m>HyGC%v(9wl+=Dc=qLu?( zvz4Bm&_BW9t}TVgq8gd+w9jG)yVm$?DQNdLJ-ZXFN|j^rm`*b*(o|o%=_-ShQ0i#& zk4e!JuD;tFKOQkpQcyHa=XVt1Ue||OnG)KqaB-!uBD7^ ztRpqox81jJ5JA03%SiFW5Ro46V^WMUHH%_y&0s01pv&6m%RZq#fMU(Au-87H;v_YL zfqUrbwnB-v&eE&tC4}T@s>!214g+2Bu=21g&$)pQgbkT7RzJ3mhk3{wg5bfJxFM-&F1U65~XCG?rKmCy}rS zlby_U%?D19weWVC4>I2?r{+2uO$i(u|8kG~Q}xZ5lkN$q)JDZ7m}q1ekTzS!7IRZ4qyF&HQM#kpyecv)1qicfv}tz+F?51a1fH6Q*q_+tVk$ zUkX{fQbsC2O4U@F_+_Z1J>-PEE7Zo+ApP${B#lAEBdI(F=XdqZ9XPRZP}`o^u)HQ z0KaK-Jo@T~_bGxgkLf_%?$X(pJw@w2o8~*NmQazmT%K~eGcmMzR}6_130`D5MYVhx;w(V6i0y}o?*aT|I>7VjR>}oW0rwZES|wnxHT`(q7P!| z%U2XE`1;4MD!a5Rz?wlxZo2`VaO~SYIjjNIMQy?8#H0vs(MsVD4#g6JIL<=+;i~BY z**!`4p|d=f`Ldi^<_6T_wd)!?9eoZv8GS_eA4VTG8?E=p5Ic}}G`C;*F{_^23~u^18=6slIqXdd*)0l5fLirr z7oD61G+#WXH0{1omh^}GQVs24q>v!f$QF}y`WdG~rGnHB?DmH%%}ri44iO%oZ+- zCjo>~L1AzIh)Outd?B;DB4+a15l3bw8#R6EZMbxTSnr0$_xJDMOlXVnr-Svdo^|Hk zT`b3(Qvq3|Y>%N646bZnyyLuIM;Pz^WDJ90SXL8oD*}tTB9mMm5HQvEpTQKm& zraKIdnszRfZG!GmZw^s06*3JD8_v_~)9!!U-RLwppguDp;XUVq7pS5EpA|DRTE$rw z?-3h!m=<#`)l^ZcK#EUsqL`@ohC&{L$BiCfNm?fyDMb8cq6>qT;PeDv0DCKkgq}pS zFk5jxsyGO_H`uQu|5W<9IgxNp%*Ud?ZM`3x$cR&KkdMuuTcyxYiTRL~#+a%hI9-B; zXa|#Wv2avbnIoW-!{)G=Be?o>!&8;PH4$qIl4veIzbYdlG%)voo*egnzHzAL4>zm?pB=6a!^ zd@1_53-&;ce=L#A1itt9>9u=vu*9M+RSV5zjW!jQES|2HIYJA=wf|FrB9)#AstkV- z9_OqUA!_cGm_Pj^uU^B2bi^349hBLzYUaV-Vo`5s=R0>jDpr-T^R@LRwJ0xYiYgnGW;(f7_nOu8|s(QS3y*3^xHt>SI@*3_kg_KA6fOx zrM)%1J{oX}nR&3Gik+cC_2$kUFTk_+bveJZh42?*O$e@1wz zqvz1>xeVxR^8NpFEd44w_x!(O=?^mwA=WqlbrC?*Zn-y)wx1>NNw&wK@nN3j&HafR zZYlEI=5@z?$NUv8Fc;2@>+NOe#E?`2`(rd272z~m<<6{2#~f^!M_6X1b{YLW;j3Fi z@bQcP>rK}*%4K8_Jp5AdVi!csSV7nbLA^Dvw4{`5LTLbB^Tv-}m2k)J*@-q5BLmtA zf^ZNiOe;d~cHH=OCv;N9La4mz3yMQt8UH5k1 zvzwA2b*q~PWE4x4wgl>AKEF$ECOr$pfR}I6Xe657XPQpwvPpAjKnQ6dj#sMQ+($@U z=*+>H8t3l(liW?(`3>k)BGy%kN^T#e9#cA-d~R(_+dtqK9L~Z$lNYvDnzVy`fiduX zW%6%`YK;d-!HG%86Yas{a9=fmdDAfPRmLFeSp7JzSMZRycW_Pk79iN&87DWAm z;_<34d^?lV40>r3cz{&17$Qa|pPXJ^_(U!-F)WM&QyIy7;OxC_>&!>ujVPNzo(nUl;_ckZV8MN)W$`~w0+T^+R$zH(GVRSX@;Wk_{b%j# zF+?8oEG(|CAxg7J2zXAXiZ?Dd3M{?Z$A`c5^G@<2`CS>f^7LQ3$1wxd@lFI+s@iR9 z$z}vnx8bxZyEk(2zvv%DGUlV>Bxtk)2VT*Jy!}3?R?&tFZuu)znBj=coh;mDoE3HI z>`&EJ{+x&URJmsfJvIOQOJLf@s;j5p51&VS^veF^U@0_zf%_5}+l%{MaEti`ZRQye z-TLm;P598+H^IP2tJCg*c2JK&r$l(X+O05Z35UmkYY^OE<{BTM06HC+>% z(amwVa8Fg~p$nWz8!*e3LDl_961GV?2o4++EAEM4X0D4*a>-@MAa%V0W9^Ns`9t^n@z>03WXIfpMQdF6ddikJO#9oFbHvKL{lORh8AAGyQ|rH$^jYQj*5PsWUNAHl z1@O74Rt&ajc_>CEk?z0G5}7^fui*RE0HCfL`<^)qt7qwDtls2v#xvp_Y#@Jg3VuDD z=z&e!9yW8n-Q0L$D)_0APM_&|T}o*!ym~h-&RD7rep1%|lw0l}i2QoZ(mo!08!uei z3(H#H-J-z?Tr$dp1ipsW`MrJHdV7&VN5(Pgv1A&GxrDXWF_Qf}Qw&^#&YhuztoqVG z4*TzxRbee>)1ap3`I3y2-gDs?08IP(zIrsKLU80a>~$uQMc7bUpQ9dN+i*V4ts4mL zscpE&sdy{Wf9PQ%gNw9%UOIb~A4FNN&f|J|oFsd#8ml=Y@9W+356ngB8r)DjwLro3 zeA;@r8R=PvbRuLufIIBo{C6K3f{S+jn$eznNpG%fvsvx|S2I(A4u;i^wokMu!jTh) zk4b-eBRn=R3EJwDB4GCuH_vaSNI<&jRNr}9Q7Q^8Ieiyh#g}+{sHEV{Mjv!56CL}l zlv*5vM*PhcX*STX!UudP%%H(W4&_0beWE8LC)k@b)TeMj6us5wb$->-}6dsYzdO84nE8M3`ynunbs}mK&~H<>6h(F zKU!?05-{9=>(KPNh5?E@SSvNGMGSenzQBpwWL~GzcSiMD`g_Fep67tVR5Rp^lm%$N8-7}xn6b?Tj7iDnk(T?s zQjszR1QcC7rT8_yJORfK!EJtZ@1Vf7LoiWb9UK&Ra;SJSOK~K1lIQsR7;63}QSJNI z)_0#ObSRME=wFk{kyOR6f7)X6Ny|ffP#_2s|Aep}CPFkEaexXkOh#A-6DG}dXO9$6 z_YDg4Ir@)YMkp}mNLTL8$oP(uYxaTfRm=L0Qhm0y$FGhT3hX!npLy2_LV@E)|FP!# zKWmPBAK$d1?Mj=NK$`Z8Y{z&s;0(X@9}7)JgHB@|CIie4?7%R@z?# z_VDzTWjpt{AqfiO`)T3+^_Z{lbGR8;*Zrb!s91Bxo39%*Pe zngA6||GeGA)PI8Zf4pl1leUMP%jY1-R*{z1^ho@3yf#3^@IOr!FzIlJJ+)8WpMR5e z3J&wDTYv)TPr*uobt_OH|0$Tvr*8e9J*T?#5TpKo_AIqRZu*l?r7Ef~B@h#_^#Ll5 z{;}L7jGX~RJ5Z8JfQA=LdI|!Ij~e+=OIqIXpXrYMCv^5$S|+9%0#v;HYg@gm-aP}? zPX9BzNcWVB%MajNEsT4`lUhgWZ(D&ZsY$Kld7Rf3>p~T_)dR%~doPz0^K^W-Zr9pH zO4*eSajy1=z6^SgDWuKp*;^Wrr#tUJ1|~k9)Ocu+fDbbj!C&Uf?LV!j0&f5o!SOE^ z{&WIQV$Cy?0szE?X-lsf1Q|KSFvO;)kJ0{ixIGCjcf>)0bJ~|zaC<;$veTw{%VZjcP_EYpTjPT1wpi0hA|dKD6HMW z@*!^}$@}-Rz88wcuTQ~KUDy>?WJzob`^<(UtImkTZ7r`iR<}$qDxrIE+o%cKq5#q^ zD!B>8Tiw*fr}_hPC1?H4z*?ta(4pl6GHET#%uLCQVHS~a?BA;W^AKab1C;U$PZB7W z$qT)G!Vf>;@lM>n`cv0oz*om|e>T&#Cu4@V)>Bt-xsZ-R9%PFl>a{#xxF%4sxFXJw z<=`~5dWKx@4Je;zM(`qwf>%_$meC6+d@L1PN?fFaX$Q~wuRaE9mcq4Ow8e#_kiNVk zzRDUJV$>8CgVs6%Ugm7HO2gcLXhq$Ph(7q9ogL@X}WgeDOgOc_!f9A#} zevxIuEMV@vuMg%Eru3PHRPc@rmD&Q6IRo_laiY*3qOu*x74&6xiIx=tzEA&}njwDA zCqB*6dv<-Zngj^=1~*(K;4qy>N;ggVStt;3fg1cw%h5&8RZhRq{3WKXfMJaTS?p=w z5FntEjS89p?VTc-2}dp-KJd^H1qMz+{l0SCtZKTADlW%V>dyQ2^wqG?8PE{x-6e@E z1TY_bAi-(7W$U%%x!C7n6s6+p@Uz)}agG55$o*EOo;3f(+`D?ypwP1(04(NVT)KTm zd{lWKNGh0c-#mPLFQTpWF?(CZ;eh`+5au*6L$mj3sRx0kNbS`PqK&Ubx8-zVPDQ`f ztoZQoSb6YZzHMmnn-oC$;;zD-2z`yLWtk z-BAqsehi(;MJNZ5P8>-4dzMCKr#pkKgX#RXt_@&bMCNS&E^)mg zW=Sz+Uff5#u$Qn1-V>!onQnV2COz7f%j4|4tdAKfTTCYQ%LJCv$cG6<47mz?-l?YM zskpUWjL=ENzCIdVe^$NXT)^ccrOgNk$fh7$JUg7bMw`&$VRyYrMj1%dYe%09&Xq$8 zueR(jIZ{=%Dn571;6R0~>EHqbb)$cDQVtX$w52@1NCYx)`e!*Vcxov~cAZ;HC|w$@ zFSc(GTM2n^FsBq81K16`^BG3x$kq1}^8DsA)}?nuC

Xh=)`9?xH700{a?2 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 None: full = chunk if full is None else full + chunk assert isinstance(full, AIMessageChunk) assert len(full.tool_calls) == 1 + + +@pytest.mark.default_cassette("test_compaction.yaml.gz") +@pytest.mark.vcr +@pytest.mark.parametrize("output_version", ["responses/v1", "v1"]) +def test_compaction(output_version: Literal["responses/v1", "v1"]) -> None: + """Test the compation beta feature.""" + llm = ChatOpenAI( + model="gpt-5.2", + context_management=[{"type": "compaction", "compact_threshold": 10_000}], + output_version=output_version, + ) + + input_message = { + "role": "user", + "content": f"Generate a one-sentence summary of this:\n\n{'a' * 50000}", + } + messages: list = [input_message] + + first_response = llm.invoke(messages) + messages.append(first_response) + + second_message = { + "role": "user", + "content": f"Generate a one-sentence summary of this:\n\n{'b' * 50000}", + } + messages.append(second_message) + + second_response = llm.invoke(messages) + messages.append(second_response) + + content_blocks = second_response.content_blocks + compaction_block = next( + (block for block in content_blocks if block["type"] == "non_standard"), + None, + ) + assert compaction_block + assert compaction_block["value"].get("type") == "compaction" + + third_message = { + "role": "user", + "content": "What are we talking about?", + } + messages.append(third_message) + third_response = llm.invoke(messages) + assert third_response.text + + +@pytest.mark.default_cassette("test_compaction_streaming.yaml.gz") +@pytest.mark.vcr +@pytest.mark.parametrize("output_version", ["responses/v1", "v1"]) +def test_compaction_streaming(output_version: Literal["responses/v1", "v1"]) -> None: + """Test the compation beta feature.""" + llm = ChatOpenAI( + model="gpt-5.2", + context_management=[{"type": "compaction", "compact_threshold": 10_000}], + output_version=output_version, + streaming=True, + ) + + input_message = { + "role": "user", + "content": f"Generate a one-sentence summary of this:\n\n{'a' * 50000}", + } + messages: list = [input_message] + + first_response = llm.invoke(messages) + messages.append(first_response) + + second_message = { + "role": "user", + "content": f"Generate a one-sentence summary of this:\n\n{'b' * 50000}", + } + messages.append(second_message) + + second_response = llm.invoke(messages) + messages.append(second_response) + + content_blocks = second_response.content_blocks + compaction_block = next( + (block for block in content_blocks if block["type"] == "non_standard"), + None, + ) + assert compaction_block + assert compaction_block["value"].get("type") == "compaction" + + third_message = { + "role": "user", + "content": "What are we talking about?", + } + messages.append(third_message) + third_response = llm.invoke(messages) + assert third_response.text diff --git a/libs/partners/openai/uv.lock b/libs/partners/openai/uv.lock index 3a9857b346d..725f17e204e 100644 --- a/libs/partners/openai/uv.lock +++ b/libs/partners/openai/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 2 requires-python = ">=3.10.0, <4.0.0" resolution-markers = [ "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", @@ -580,7 +580,7 @@ requires-dist = [ provides-extras = ["community", "anthropic", "openai", "azure-ai", "google-vertexai", "google-genai", "fireworks", "ollama", "together", "mistralai", "huggingface", "groq", "aws", "deepseek", "xai", "perplexity"] [package.metadata.requires-dev] -lint = [{ name = "ruff", specifier = ">=0.14.11,<0.16.0" }] +lint = [{ name = "ruff", specifier = ">=0.15.0,<0.16.0" }] test = [ { name = "blockbuster", specifier = ">=1.5.26,<1.6.0" }, { name = "langchain-openai", editable = "." }, @@ -610,7 +610,7 @@ typing = [ [[package]] name = "langchain-core" -version = "1.2.11" +version = "1.2.12" source = { editable = "../../core" } dependencies = [ { name = "jsonpatch" }, @@ -641,7 +641,7 @@ dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, { name = "setuptools", specifier = ">=67.6.1,<83.0.0" }, ] -lint = [{ name = "ruff", specifier = ">=0.14.11,<0.16.0" }] +lint = [{ name = "ruff", specifier = ">=0.15.0,<0.16.0" }] test = [ { name = "blockbuster", specifier = ">=1.5.18,<1.6.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, @@ -718,7 +718,7 @@ typing = [ [package.metadata] requires-dist = [ { name = "langchain-core", editable = "../../core" }, - { name = "openai", specifier = ">=1.109.1,<3.0.0" }, + { name = "openai", specifier = ">=2.20.0,<3.0.0" }, { name = "tiktoken", specifier = ">=0.7.0,<1.0.0" }, ] @@ -791,7 +791,7 @@ requires-dist = [ ] [package.metadata.requires-dev] -lint = [{ name = "ruff", specifier = ">=0.14.11,<0.16.0" }] +lint = [{ name = "ruff", specifier = ">=0.15.0,<0.16.0" }] test = [{ name = "langchain-core", editable = "../../core" }] test-integration = [] typing = [