|
""" |
|
Tool definitions and handlers for Claude |
|
""" |
|
import json |
|
from .notification import push |
|
|
|
|
|
def record_user_details(email, name="Name not provided", notes="not provided"): |
|
"""Record user contact information when they express interest""" |
|
push(f"Recording {name} with email {email} and notes {notes}") |
|
return {"recorded": "ok"} |
|
|
|
def record_unknown_question(question): |
|
"""Record questions that couldn't be answered""" |
|
push(f"Recording unknown question: {question}") |
|
return {"recorded": "ok"} |
|
|
|
def search_faq(query): |
|
"""Search the FAQ for a question or topic""" |
|
push(f"Searching FAQ for: {query}") |
|
return {"search_results": "ok"} |
|
|
|
|
|
tool_schemas = [ |
|
{ |
|
"name": "record_user_details", |
|
"description": "Use this tool to record that a user is interested in being in touch and provided an email address", |
|
"input_schema": { |
|
"type": "object", |
|
"properties": { |
|
"email": {"type": "string", "description": "The email address of this user"}, |
|
"name": {"type": "string", "description": "The user's name, if they provided it"}, |
|
"notes": {"type": "string", "description": "Any additional context from the conversation"} |
|
}, |
|
"required": ["email"] |
|
} |
|
}, |
|
{ |
|
"name": "record_unknown_question", |
|
"description": "Use this tool to record any question that couldn't be answered", |
|
"input_schema": { |
|
"type": "object", |
|
"properties": { |
|
"question": {"type": "string", "description": "The question that couldn't be answered"} |
|
}, |
|
"required": ["question"] |
|
} |
|
}, |
|
{ |
|
"name": "search_faq", |
|
"description": "Searches a list of frequently asked questions.", |
|
"input_schema": { |
|
"type": "object", |
|
"properties": { |
|
"query": {"type": "string", "description": "The user's question or topic to search for in the FAQ."} |
|
}, |
|
"required": ["query"] |
|
} |
|
} |
|
] |
|
|
|
|
|
tool_functions = { |
|
"record_user_details": record_user_details, |
|
"record_unknown_question": record_unknown_question, |
|
"search_faq": search_faq |
|
} |
|
|
|
def handle_tool_calls(tool_calls): |
|
"""Process tool calls from Claude and execute the appropriate functions""" |
|
results = [] |
|
for tool_call in tool_calls: |
|
tool_name = tool_call.name |
|
arguments = tool_call.input |
|
print(f"Tool called: {tool_name}", flush=True) |
|
|
|
|
|
tool_func = tool_functions.get(tool_name) |
|
if tool_func: |
|
result = tool_func(**arguments) |
|
else: |
|
print(f"No function found for tool: {tool_name}") |
|
result = {"error": f"Tool {tool_name} not found"} |
|
|
|
|
|
results.append({ |
|
"role": "user", |
|
"content": [ |
|
{ |
|
"type": "tool_result", |
|
"tool_use_id": tool_call.id, |
|
"content": json.dumps(result) |
|
} |
|
] |
|
}) |
|
return results |