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
Files changed (2) hide show
  1. langgraph_agent.py +7 -1
  2. 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-3-haiku-20240307", # Fast and cheap
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-3-5-sonnet-20241022", # Use latest model that supports web search
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-3-5-sonnet-20241022",
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()