From dd0e09c8fa84675a8be4f07215e5c19a80c9b95a Mon Sep 17 00:00:00 2001 From: keenborder786 <21110290@lums.edu.pk> Date: Thu, 10 Jul 2025 07:20:46 +0500 Subject: [PATCH 01/11] [chore]: Dynamic Upgrade of Max Tokens for Anthropic --- .../langchain_anthropic/chat_models.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/libs/partners/anthropic/langchain_anthropic/chat_models.py b/libs/partners/anthropic/langchain_anthropic/chat_models.py index ea055d349ce..648117401a9 100644 --- a/libs/partners/anthropic/langchain_anthropic/chat_models.py +++ b/libs/partners/anthropic/langchain_anthropic/chat_models.py @@ -1170,7 +1170,7 @@ class ChatAnthropic(BaseChatModel): model: str = Field(alias="model_name") """Model name to use.""" - max_tokens: int = Field(default=1024, alias="max_tokens_to_sample") + max_tokens: Optional[int] = Field(default=None, alias="max_tokens_to_sample") """Denotes the number of tokens to predict per generation.""" temperature: Optional[float] = None @@ -1300,6 +1300,23 @@ class ChatAnthropic(BaseChatModel): ls_params["ls_stop"] = ls_stop return ls_params + @model_validator(mode="before") + @classmethod + def validate_max_tokens(cls, values: dict[str, Any]) -> Any: + """Validate max_tokens.""" + if values.get("max_tokens") is None: + if "claude-opus-4" in values.get("model"): + print('hello') + values["max_tokens"] = 32000 + elif values.get("model") in ["claude-sonnet-4", "claude-3-7-sonnet"]: + values["max_tokens"] = 64000 + elif values.get("model") in ["claude-3-5-sonnet", "claude-3-5-haiku"]: + values["max_tokens"] = 8192 + # leaves us with "claude-3-5-opus", "claude-3-haiku" + else: + values["max_tokens"] = 1024 + return values + @model_validator(mode="before") @classmethod def build_extra(cls, values: dict) -> Any: From 6eafcb324ef3e61757a6bd0a16e03ca7ae26b339 Mon Sep 17 00:00:00 2001 From: keenborder786 <21110290@lums.edu.pk> Date: Fri, 11 Jul 2025 05:34:51 +0500 Subject: [PATCH 02/11] [chore]: Remove the print statement --- libs/partners/anthropic/langchain_anthropic/chat_models.py | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/partners/anthropic/langchain_anthropic/chat_models.py b/libs/partners/anthropic/langchain_anthropic/chat_models.py index 648117401a9..b7f77aedbc3 100644 --- a/libs/partners/anthropic/langchain_anthropic/chat_models.py +++ b/libs/partners/anthropic/langchain_anthropic/chat_models.py @@ -1306,7 +1306,6 @@ class ChatAnthropic(BaseChatModel): """Validate max_tokens.""" if values.get("max_tokens") is None: if "claude-opus-4" in values.get("model"): - print('hello') values["max_tokens"] = 32000 elif values.get("model") in ["claude-sonnet-4", "claude-3-7-sonnet"]: values["max_tokens"] = 64000 From 11ac96c5da7b9c98e9ff4c9428f26f4ceddc449a Mon Sep 17 00:00:00 2001 From: keenborder786 <21110290@lums.edu.pk> Date: Fri, 11 Jul 2025 05:38:59 +0500 Subject: [PATCH 03/11] [fix]: Only Updating max_tokens if models is provided --- libs/partners/anthropic/langchain_anthropic/chat_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/partners/anthropic/langchain_anthropic/chat_models.py b/libs/partners/anthropic/langchain_anthropic/chat_models.py index b7f77aedbc3..92330a03ac0 100644 --- a/libs/partners/anthropic/langchain_anthropic/chat_models.py +++ b/libs/partners/anthropic/langchain_anthropic/chat_models.py @@ -1304,7 +1304,7 @@ class ChatAnthropic(BaseChatModel): @classmethod def validate_max_tokens(cls, values: dict[str, Any]) -> Any: """Validate max_tokens.""" - if values.get("max_tokens") is None: + if values.get("max_tokens") is None and values.get("model"): if "claude-opus-4" in values.get("model"): values["max_tokens"] = 32000 elif values.get("model") in ["claude-sonnet-4", "claude-3-7-sonnet"]: From c91fc04f03c131251fc3f321e512acc68bfd3b74 Mon Sep 17 00:00:00 2001 From: keenborder786 <21110290@lums.edu.pk> Date: Fri, 11 Jul 2025 06:01:31 +0500 Subject: [PATCH 04/11] test: added test_validate_max_tokens --- .../tests/unit_tests/test_chat_models.py | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/libs/partners/anthropic/tests/unit_tests/test_chat_models.py b/libs/partners/anthropic/tests/unit_tests/test_chat_models.py index 93605b4dded..a6499bce3cb 100644 --- a/libs/partners/anthropic/tests/unit_tests/test_chat_models.py +++ b/libs/partners/anthropic/tests/unit_tests/test_chat_models.py @@ -62,6 +62,44 @@ def test_anthropic_client_caching() -> None: assert llm1._client._client is not llm5._client._client +def test_validate_max_tokens() -> None: + """Test the validate_max_tokens function through class initialization.""" + # Test claude-opus-4 models + llm = ChatAnthropic(model="claude-opus-4-20250514", anthropic_api_key="test") + assert llm.max_tokens == 32000 + + # Test claude-sonnet-4 models + llm = ChatAnthropic(model="claude-sonnet-4-latest", anthropic_api_key="test") + assert llm.max_tokens == 64000 + + # Test claude-3-7-sonnet models + llm = ChatAnthropic(model="claude-3-7-sonnet-latest", anthropic_api_key="test") + assert llm.max_tokens == 64000 + + # Test claude-3-5-sonnet models + llm = ChatAnthropic(model="claude-3-5-sonnet-latest", anthropic_api_key="test") + assert llm.max_tokens == 8192 + + # Test claude-3-5-haiku models + llm = ChatAnthropic(model="claude-3-5-haiku-latest", anthropic_api_key="test") + assert llm.max_tokens == 8192 + + # Test claude-3-5-opus models (should default to 1024) + llm = ChatAnthropic(model="claude-3-5-opus-latest", anthropic_api_key="test") + assert llm.max_tokens == 1024 + + # Test claude-3-haiku models (should default to 1024) + llm = ChatAnthropic(model="claude-3-haiku-latest", anthropic_api_key="test") + assert llm.max_tokens == 1024 + + # Test that existing max_tokens values are preserved + llm = ChatAnthropic(model="claude-3-5-sonnet-latest", max_tokens=2048, anthropic_api_key="test") + assert llm.max_tokens == 2048 + + # Test that explicitly set max_tokens values are preserved + llm = ChatAnthropic(model="claude-3-5-sonnet-latest", max_tokens=4096, anthropic_api_key="test") + assert llm.max_tokens == 4096 + @pytest.mark.requires("anthropic") def test_anthropic_model_name_param() -> None: llm = ChatAnthropic(model_name="foo") # type: ignore[call-arg, call-arg] @@ -104,6 +142,7 @@ def test_anthropic_initialization() -> None: ChatAnthropic(model="test", anthropic_api_key="test") # type: ignore[call-arg, call-arg] + def test__format_output() -> None: anthropic_msg = Message( id="foo", From a04c1c76e6803892a1027dc2d9c38e1efa839dd9 Mon Sep 17 00:00:00 2001 From: keenborder786 <21110290@lums.edu.pk> Date: Fri, 11 Jul 2025 06:01:43 +0500 Subject: [PATCH 05/11] fix: validate_max_tokens --- .../anthropic/langchain_anthropic/chat_models.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/libs/partners/anthropic/langchain_anthropic/chat_models.py b/libs/partners/anthropic/langchain_anthropic/chat_models.py index 92330a03ac0..85fd7c7fd0d 100644 --- a/libs/partners/anthropic/langchain_anthropic/chat_models.py +++ b/libs/partners/anthropic/langchain_anthropic/chat_models.py @@ -1305,11 +1305,17 @@ class ChatAnthropic(BaseChatModel): def validate_max_tokens(cls, values: dict[str, Any]) -> Any: """Validate max_tokens.""" if values.get("max_tokens") is None and values.get("model"): - if "claude-opus-4" in values.get("model"): + if "claude-opus-4" in values.get("model", ""): values["max_tokens"] = 32000 - elif values.get("model") in ["claude-sonnet-4", "claude-3-7-sonnet"]: + elif ( + "claude-sonnet-4" in values.get("model", "") + or "claude-3-7-sonnet" in values.get("model", "") + ): values["max_tokens"] = 64000 - elif values.get("model") in ["claude-3-5-sonnet", "claude-3-5-haiku"]: + elif ( + "claude-3-5-sonnet" in values.get("model", "") + or "claude-3-5-haiku" in values.get("model", "") + ): values["max_tokens"] = 8192 # leaves us with "claude-3-5-opus", "claude-3-haiku" else: From 8c628fe0c14c1e61fac41817311c8c7b89fe63f1 Mon Sep 17 00:00:00 2001 From: keenborder786 <21110290@lums.edu.pk> Date: Fri, 11 Jul 2025 06:05:56 +0500 Subject: [PATCH 06/11] fix: lint --- .../anthropic/langchain_anthropic/chat_models.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/libs/partners/anthropic/langchain_anthropic/chat_models.py b/libs/partners/anthropic/langchain_anthropic/chat_models.py index 85fd7c7fd0d..2adf3e2b95b 100644 --- a/libs/partners/anthropic/langchain_anthropic/chat_models.py +++ b/libs/partners/anthropic/langchain_anthropic/chat_models.py @@ -1307,15 +1307,13 @@ class ChatAnthropic(BaseChatModel): if values.get("max_tokens") is None and values.get("model"): if "claude-opus-4" in values.get("model", ""): values["max_tokens"] = 32000 - elif ( - "claude-sonnet-4" in values.get("model", "") - or "claude-3-7-sonnet" in values.get("model", "") - ): + elif "claude-sonnet-4" in values.get( + "model", "" + ) or "claude-3-7-sonnet" in values.get("model", ""): values["max_tokens"] = 64000 - elif ( - "claude-3-5-sonnet" in values.get("model", "") - or "claude-3-5-haiku" in values.get("model", "") - ): + elif "claude-3-5-sonnet" in values.get( + "model", "" + ) or "claude-3-5-haiku" in values.get("model", ""): values["max_tokens"] = 8192 # leaves us with "claude-3-5-opus", "claude-3-haiku" else: From 4ef1aee9d87f0f36cdc1eab4b81083c910607225 Mon Sep 17 00:00:00 2001 From: keenborder786 <21110290@lums.edu.pk> Date: Fri, 11 Jul 2025 06:08:53 +0500 Subject: [PATCH 07/11] fix: lint --- .../anthropic/tests/unit_tests/test_chat_models.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/libs/partners/anthropic/tests/unit_tests/test_chat_models.py b/libs/partners/anthropic/tests/unit_tests/test_chat_models.py index a6499bce3cb..3ffc1bf02d6 100644 --- a/libs/partners/anthropic/tests/unit_tests/test_chat_models.py +++ b/libs/partners/anthropic/tests/unit_tests/test_chat_models.py @@ -93,13 +93,18 @@ def test_validate_max_tokens() -> None: assert llm.max_tokens == 1024 # Test that existing max_tokens values are preserved - llm = ChatAnthropic(model="claude-3-5-sonnet-latest", max_tokens=2048, anthropic_api_key="test") + llm = ChatAnthropic( + model="claude-3-5-sonnet-latest", max_tokens=2048, anthropic_api_key="test" + ) assert llm.max_tokens == 2048 # Test that explicitly set max_tokens values are preserved - llm = ChatAnthropic(model="claude-3-5-sonnet-latest", max_tokens=4096, anthropic_api_key="test") + llm = ChatAnthropic( + model="claude-3-5-sonnet-latest", max_tokens=4096, anthropic_api_key="test" + ) assert llm.max_tokens == 4096 + @pytest.mark.requires("anthropic") def test_anthropic_model_name_param() -> None: llm = ChatAnthropic(model_name="foo") # type: ignore[call-arg, call-arg] @@ -142,7 +147,6 @@ def test_anthropic_initialization() -> None: ChatAnthropic(model="test", anthropic_api_key="test") # type: ignore[call-arg, call-arg] - def test__format_output() -> None: anthropic_msg = Message( id="foo", From 3d19aea494028ff70c1e2677a4f1f5b1858a117a Mon Sep 17 00:00:00 2001 From: keenborder786 <21110290@lums.edu.pk> Date: Fri, 11 Jul 2025 07:07:51 +0500 Subject: [PATCH 08/11] test: Generated a new casset file since has now 8192 tokens limit as default --- ...AnthropicStandard.test_stream_time.yaml.gz | Bin 3355 -> 3245 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/libs/partners/anthropic/tests/cassettes/TestAnthropicStandard.test_stream_time.yaml.gz b/libs/partners/anthropic/tests/cassettes/TestAnthropicStandard.test_stream_time.yaml.gz index 10a3e4007191e4e50aca514fe50afa09e25ea236..af60833e15a87e77f115c826ac719d013b0d6aa9 100644 GIT binary patch literal 3245 zcmV;e3{vwSiwFSZad2n?|J7StbE3)?exF~F^R%m`$~}lN`;e;r5KTl(Vzy`ycmo;* z<>D4lvCfY_Yc(_yZ&BmJWU5k=Xm``=_N{NNZszvCi52-N2Zq zH~;%_1OM!_6Kkq7BBC(YhxN5I32$Eq)AXg;iFLKR)`rBhQt573i(JbWBE2u&NrAG~ zRmp`h6O*rVFpq z!igHca>!8jUIwpmw_jbuqKU5dV!EIywm8@cC%H@4s>!K7Y{k-K##w>lje39o4TBup zAod)D#PNn@*|RwNy>j!%&!6(s<3n@s^!W4VAEf~mJFr6H2IFHRgV>peGuNstV0kwT zj*PX!Ah50Y(?PKv#1+pD#<6q4z&M@RM}|3JbWGADvgZ|J3=16@w5k|0w=%WUqhq4j za0AbdqKYxMoKuHJX<(f=)-#TpqC7N=P8>KhtSN|pg7wO?=5{CRua8f4`<>$m-&rZX z@JM)}KJ@g&f(F+nsU__wYxC=x<{H^`uZqwuY-s5)s>=rNy&$=0~v*P-@KT>BM{=2YOUjG zIMtQz%s`3ECPk`+)e-6wT(`t`v??SFhguqzy@h4&B)20-&4$n%&phJ8 zqaMStCBo9n*%b8Zyt$3PHuE2t6VV}Q=fku;y9H-jaawQRQkxy;OR|ltJm{${JGe`* z=u}t7?%U)61kOJP!L}tT&q2xZC8>Z@$Fux*chr9jU zA!|u|8q9Si)}0qtcwr@xZ55v2Nu{nw}i${l+6vVab}Z zmY!NuYLd2+!siR!ZK#ImtsxLoD@8v&Y(8f33;gep`3m!#?|;;M-YNlMOA<6{42jfN zN&`(%@r<+)SbnQsw&rKhk?WO02U~J0w;Xio{tk4o&+pj$61Y)eTBWJfvY3mcF(8qv zpFf`J07s|M0$d#Q#&6_$#e;^d99#i7T@UQ%R$L@DOMMjUx%fv zNNRU6IBO7?5eU2l!6pU>4wem}#u@8=i#PLPe~uQSfsi!5cd04X&!w-fa4t4;u*Ry#5-q_+-Go5!hvpr?H z+~?+(#yYe30Wxw)tnU(-O{_za0s<#etLqu+41q6q>29de;sj#8Cgo<`_%k!l7g+DM zBA9u;z3?;L}iLdO~n6Vh4vl%@?%ax9%a-t zTIYB&*(HM)1!38&g?Y}iE+}MTsIW6g7NmJQe&;c%=nGRUb_x2JVnwS38I1xR)oIeL zz{8@_q00>-My~_8Zu!p9aOqd z)!vQ=zQ7@x)0$|v#Q!SgKW6bOBwuD8Uts-l@5GtZTKw3U7Gb<_2a;q5vv1E29(D~&=3=?$ z3RggOPfNda+Du9?QuNjFQY>b_My#v7@u1e7XcR+*G_&Lu)%sQqGSE3l)5S|_4oFDb z`bCj)3zl>o(#&|J9CQ|tS2DzbTHM|z`1fduibAq=T8a=;)Z^;+xDip@Y#bYWeL+t~ z)2t>36HRHqR~*wjSteig0cJRD*uiTdA^h#-w7@~A`G&;0?vWI+((_Ee7fE8(F){^Y zOpbQ49mi@nX7nODy~U1KM7|3WNl#VB5?7wo>T*RRLhG_*V1cILDvc!_VRC0gw_Wa}j8GAUad^P|8hRROv literal 3355 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 From a82227d16545db0459f55b3a78781d3e5cf1b954 Mon Sep 17 00:00:00 2001 From: keenborder786 <21110290@lums.edu.pk> Date: Tue, 29 Jul 2025 05:41:28 +0500 Subject: [PATCH 09/11] chore: claude-3-ops removed --- .../partners/anthropic/langchain_anthropic/chat_models.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libs/partners/anthropic/langchain_anthropic/chat_models.py b/libs/partners/anthropic/langchain_anthropic/chat_models.py index 02f58e76d36..5eb51654235 100644 --- a/libs/partners/anthropic/langchain_anthropic/chat_models.py +++ b/libs/partners/anthropic/langchain_anthropic/chat_models.py @@ -1279,7 +1279,9 @@ class ChatAnthropic(BaseChatModel): @model_validator(mode="before") @classmethod def validate_max_tokens(cls, values: dict[str, Any]) -> Any: - """Validate max_tokens.""" + """Validate max_tokens. + Can find the Max Tokens limits here: https://docs.anthropic.com/en/docs/about-claude/models/overview#model-comparison-table + """ if values.get("max_tokens") is None and values.get("model"): if "claude-opus-4" in values.get("model", ""): values["max_tokens"] = 32000 @@ -1291,9 +1293,9 @@ class ChatAnthropic(BaseChatModel): "model", "" ) or "claude-3-5-haiku" in values.get("model", ""): values["max_tokens"] = 8192 - # leaves us with "claude-3-5-opus", "claude-3-haiku" + # leaves us with "claude-3-haiku" else: - values["max_tokens"] = 1024 + values["max_tokens"] = 4096 return values @model_validator(mode="before") From 91ca6c5b8f050ceeebd4360982923b7c17093566 Mon Sep 17 00:00:00 2001 From: keenborder786 <21110290@lums.edu.pk> Date: Tue, 29 Jul 2025 05:46:13 +0500 Subject: [PATCH 10/11] tests: updated tests --- .../anthropic/tests/unit_tests/test_chat_models.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/libs/partners/anthropic/tests/unit_tests/test_chat_models.py b/libs/partners/anthropic/tests/unit_tests/test_chat_models.py index 3ffc1bf02d6..a626e8a81bd 100644 --- a/libs/partners/anthropic/tests/unit_tests/test_chat_models.py +++ b/libs/partners/anthropic/tests/unit_tests/test_chat_models.py @@ -84,13 +84,9 @@ def test_validate_max_tokens() -> None: llm = ChatAnthropic(model="claude-3-5-haiku-latest", anthropic_api_key="test") assert llm.max_tokens == 8192 - # Test claude-3-5-opus models (should default to 1024) - llm = ChatAnthropic(model="claude-3-5-opus-latest", anthropic_api_key="test") - assert llm.max_tokens == 1024 - - # Test claude-3-haiku models (should default to 1024) + # Test claude-3-haiku models (should default to 4096) llm = ChatAnthropic(model="claude-3-haiku-latest", anthropic_api_key="test") - assert llm.max_tokens == 1024 + assert llm.max_tokens == 4096 # Test that existing max_tokens values are preserved llm = ChatAnthropic( From bd6223eae3ab13bc754a01781cb60dd8c43bfafa Mon Sep 17 00:00:00 2001 From: keenborder786 <21110290@lums.edu.pk> Date: Tue, 29 Jul 2025 05:50:48 +0500 Subject: [PATCH 11/11] lint: fix linting error --- libs/partners/anthropic/langchain_anthropic/chat_models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/partners/anthropic/langchain_anthropic/chat_models.py b/libs/partners/anthropic/langchain_anthropic/chat_models.py index 5eb51654235..72f53b469cd 100644 --- a/libs/partners/anthropic/langchain_anthropic/chat_models.py +++ b/libs/partners/anthropic/langchain_anthropic/chat_models.py @@ -1280,6 +1280,7 @@ class ChatAnthropic(BaseChatModel): @classmethod def validate_max_tokens(cls, values: dict[str, Any]) -> Any: """Validate max_tokens. + Can find the Max Tokens limits here: https://docs.anthropic.com/en/docs/about-claude/models/overview#model-comparison-table """ if values.get("max_tokens") is None and values.get("model"):