Mike Fishbein
commited on
Commit
Β·
b67cc38
1
Parent(s):
4dedff2
π Upgrade to Claude Sonnet 4 (claude-sonnet-4-20250514) with enhanced reasoning and refusal handling
Browse files- langgraph_agent.py +7 -1
- tools.py +11 -2
langgraph_agent.py
CHANGED
|
@@ -114,10 +114,16 @@ def call_claude(prompt: str, max_tokens: int = 100) -> str:
|
|
| 114 |
|
| 115 |
try:
|
| 116 |
response = claude_client.messages.create(
|
| 117 |
-
model="claude-
|
| 118 |
max_tokens=max_tokens,
|
| 119 |
messages=[{"role": "user", "content": prompt}]
|
| 120 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 121 |
return response.content[0].text.strip()
|
| 122 |
except Exception as e:
|
| 123 |
print(f"Claude API error: {e}")
|
|
|
|
| 114 |
|
| 115 |
try:
|
| 116 |
response = claude_client.messages.create(
|
| 117 |
+
model="claude-sonnet-4-20250514", # Latest Claude 4 model
|
| 118 |
max_tokens=max_tokens,
|
| 119 |
messages=[{"role": "user", "content": prompt}]
|
| 120 |
)
|
| 121 |
+
|
| 122 |
+
# Handle Claude 4 refusal stop reason
|
| 123 |
+
if hasattr(response, 'stop_reason') and response.stop_reason == "refusal":
|
| 124 |
+
print(f"Claude refused to answer: {response.content[0].text if response.content else 'No content'}")
|
| 125 |
+
return ""
|
| 126 |
+
|
| 127 |
return response.content[0].text.strip()
|
| 128 |
except Exception as e:
|
| 129 |
print(f"Claude API error: {e}")
|
tools.py
CHANGED
|
@@ -94,7 +94,7 @@ def web_search_clean(query: str, max_results: int = 3) -> List[str]:
|
|
| 94 |
try:
|
| 95 |
# Use Claude's built-in web search tool
|
| 96 |
response = claude_client.messages.create(
|
| 97 |
-
model="claude-
|
| 98 |
max_tokens=1500,
|
| 99 |
messages=[{
|
| 100 |
"role": "user",
|
|
@@ -107,6 +107,11 @@ def web_search_clean(query: str, max_results: int = 3) -> List[str]:
|
|
| 107 |
}]
|
| 108 |
)
|
| 109 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 110 |
# Extract the search results from Claude's response
|
| 111 |
if not response.content:
|
| 112 |
print("β No content in Claude's web search response")
|
|
@@ -295,7 +300,7 @@ Be precise and factual."""
|
|
| 295 |
|
| 296 |
# Send request to Claude with vision
|
| 297 |
response = claude_client.messages.create(
|
| 298 |
-
model="claude-
|
| 299 |
max_tokens=500,
|
| 300 |
messages=[{
|
| 301 |
"role": "user",
|
|
@@ -316,6 +321,10 @@ Be precise and factual."""
|
|
| 316 |
}]
|
| 317 |
)
|
| 318 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 319 |
# Extract response text
|
| 320 |
if response.content and len(response.content) > 0:
|
| 321 |
return response.content[0].text.strip()
|
|
|
|
| 94 |
try:
|
| 95 |
# Use Claude's built-in web search tool
|
| 96 |
response = claude_client.messages.create(
|
| 97 |
+
model="claude-sonnet-4-20250514", # Latest Claude 4 model with web search
|
| 98 |
max_tokens=1500,
|
| 99 |
messages=[{
|
| 100 |
"role": "user",
|
|
|
|
| 107 |
}]
|
| 108 |
)
|
| 109 |
|
| 110 |
+
# Handle Claude 4 refusal stop reason
|
| 111 |
+
if hasattr(response, 'stop_reason') and response.stop_reason == "refusal":
|
| 112 |
+
print("β Claude refused web search request")
|
| 113 |
+
return []
|
| 114 |
+
|
| 115 |
# Extract the search results from Claude's response
|
| 116 |
if not response.content:
|
| 117 |
print("β No content in Claude's web search response")
|
|
|
|
| 300 |
|
| 301 |
# Send request to Claude with vision
|
| 302 |
response = claude_client.messages.create(
|
| 303 |
+
model="claude-sonnet-4-20250514",
|
| 304 |
max_tokens=500,
|
| 305 |
messages=[{
|
| 306 |
"role": "user",
|
|
|
|
| 321 |
}]
|
| 322 |
)
|
| 323 |
|
| 324 |
+
# Handle Claude 4 refusal stop reason
|
| 325 |
+
if hasattr(response, 'stop_reason') and response.stop_reason == "refusal":
|
| 326 |
+
return "Claude refused to analyze this image for safety reasons"
|
| 327 |
+
|
| 328 |
# Extract response text
|
| 329 |
if response.content and len(response.content) > 0:
|
| 330 |
return response.content[0].text.strip()
|