mirror of
https://github.com/hwchase17/langchain.git
synced 2026-06-09 18:50:33 +00:00
anthropic[patch]: support claude 3.7 sonnet (#29971)
This commit is contained in:
@@ -661,3 +661,67 @@ def test_citations() -> None:
|
||||
assert isinstance(full.content, list)
|
||||
assert any("citations" in block for block in full.content)
|
||||
assert not any("citation" in block for block in full.content)
|
||||
|
||||
|
||||
def test_thinking() -> None:
|
||||
llm = ChatAnthropic(
|
||||
model="claude-3-7-sonnet-latest",
|
||||
max_tokens=5_000,
|
||||
thinking={"type": "enabled", "budget_tokens": 2_000},
|
||||
)
|
||||
response = llm.invoke("Hello")
|
||||
assert any("thinking" in block for block in response.content)
|
||||
for block in response.content:
|
||||
assert isinstance(block, dict)
|
||||
if block["type"] == "thinking":
|
||||
assert set(block.keys()) == {"type", "thinking", "signature"}
|
||||
assert block["thinking"] and isinstance(block["thinking"], str)
|
||||
assert block["signature"] and isinstance(block["signature"], str)
|
||||
|
||||
# Test streaming
|
||||
full: Optional[BaseMessageChunk] = None
|
||||
for chunk in llm.stream("Hello"):
|
||||
full = chunk if full is None else full + chunk
|
||||
assert isinstance(full, AIMessageChunk)
|
||||
assert isinstance(full.content, list)
|
||||
assert any("thinking" in block for block in full.content)
|
||||
for block in full.content:
|
||||
assert isinstance(block, dict)
|
||||
if block["type"] == "thinking":
|
||||
assert set(block.keys()) == {"type", "thinking", "signature", "index"}
|
||||
assert block["thinking"] and isinstance(block["thinking"], str)
|
||||
assert block["signature"] and isinstance(block["signature"], str)
|
||||
|
||||
|
||||
def test_redacted_thinking() -> None:
|
||||
llm = ChatAnthropic(
|
||||
model="claude-3-7-sonnet-latest",
|
||||
max_tokens=5_000,
|
||||
thinking={"type": "enabled", "budget_tokens": 2_000},
|
||||
)
|
||||
query = "ANTHROPIC_MAGIC_STRING_TRIGGER_REDACTED_THINKING_46C9A13E193C177646C7398A98432ECCCE4C1253D5E2D82641AC0E52CC2876CB" # noqa: E501
|
||||
|
||||
response = llm.invoke(query)
|
||||
has_reasoning = False
|
||||
for block in response.content:
|
||||
assert isinstance(block, dict)
|
||||
if block["type"] == "redacted_thinking":
|
||||
has_reasoning = True
|
||||
assert set(block.keys()) == {"type", "data"}
|
||||
assert block["data"] and isinstance(block["data"], str)
|
||||
assert has_reasoning
|
||||
|
||||
# Test streaming
|
||||
full: Optional[BaseMessageChunk] = None
|
||||
for chunk in llm.stream(query):
|
||||
full = chunk if full is None else full + chunk
|
||||
assert isinstance(full, AIMessageChunk)
|
||||
assert isinstance(full.content, list)
|
||||
stream_has_reasoning = False
|
||||
for block in full.content:
|
||||
assert isinstance(block, dict)
|
||||
if block["type"] == "redacted_thinking":
|
||||
stream_has_reasoning = True
|
||||
assert set(block.keys()) == {"type", "data", "index"}
|
||||
assert block["data"] and isinstance(block["data"], str)
|
||||
assert stream_has_reasoning
|
||||
|
||||
Reference in New Issue
Block a user