First_agent_template / tools /perplexity_tools.py
cmgramse's picture
Create perplexity_tools.py
50cadfc verified
import requests
import json
def call_perplexity_api(query: str, api_key: str, model: str):
"""Calls the Perplexity API with the provided query and parameters."""
if not api_key:
return "Error: Perplexity API not initialized. Please initialize it first."
url = "https://api.perplexity.ai/chat/completions"
# System prompt
system_prompt = """
You are a helpful AI assistant.
Rules:
1. Provide only the final answer. It is important that you do not include any explanation on the steps below.
2. Do not show the intermediate steps information.
Steps:
1. Decide if the answer should be a brief sentence or a list of suggestions.
2. If it is a list of suggestions, first, write a brief and natural introduction based on the original query.
3. Followed by a list of suggestions, each suggestion should be split by two newlines.
"""
payload = {
"model": model, # Use the selected model
"messages": [
{
"role": "system",
"content": system_prompt.strip() # Add the system prompt
},
{
"role": "user",
"content": query
}
],
"max_tokens": 8000 if model in ["sonar-reasoning-pro", "sonar-pro"] else 1000,
"temperature": 0.2,
"top_p": 0.9,
"search_domain_filter": None,
"return_images": False,
"return_related_questions": False,
"search_recency_filter": "month", # Limit recency of search to this month
"top_k": 0,
"stream": False,
"presence_penalty": 0,
"frequency_penalty": 1,
"response_format": None
}
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
try:
response = requests.post(url, json=payload, headers=headers)
response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)
return response.json() # Return the JSON response
except requests.exceptions.RequestException as e:
# Provide detailed error information
error_details = {
"error_type": type(e).__name__,
"error_message": str(e),
"response_status_code": getattr(e.response, "status_code", None),
"response_text": getattr(e.response, "text", None),
"request_payload": payload,
"request_headers": headers
}
return f"Request failed. Details:\n{json.dumps(error_details, indent=2)}"
def get_ai_research_papers(query: str, api_key: str, model: str) -> str:
"""A tool that fetches relevant AI research papers using Perplexity API."""
try:
response_json = call_perplexity_api(f"search AI research papers about: {query}", api_key, model)
if isinstance(response_json, str): # Error message
return response_json
if response_json and "choices" in response_json:
content = response_json["choices"][0]["message"]["content"]
citations = response_json.get("citations", [])
citation_string = "\n".join([f"{i+1}. {citation}" for i, citation in enumerate(citations)])
return f"AI Research Papers:\n{content}\n\nCitations:\n{citation_string if citation_string else 'No citations found.'}"
return f"No relevant AI papers found for your query: {query}"
except Exception as e:
return f"Error fetching research papers: {str(e)}"
def summarize_paper(paper_title: str, api_key: str, model: str) -> str:
"""A tool that summarizes an AI research paper."""
try:
response_json = call_perplexity_api(f"Summarize AI research paper: {paper_title}", api_key, model)
if isinstance(response_json, str): # Error message
return response_json
if response_json and "choices" in response_json:
content = response_json["choices"][0]["message"]["content"]
return f"Summary of '{paper_title}':\n{content}"
return f"Could not summarize paper '{paper_title}'"
except Exception as e:
return f"Error summarizing paper: {str(e)}"
def get_citation(paper_title: str, api_key: str, model: str) -> str:
"""A tool that generates a citation for an AI research paper."""
try:
response_json = call_perplexity_api(f"Generate citation for AI research paper: {paper_title}", api_key, model)
if isinstance(response_json, str): # Error message
return response_json
if response_json and "choices" in response_json:
content = response_json["choices"][0]["message"]["content"]
return f"Citation for '{paper_title}':\n{content}"
return f"Could not generate citation for '{paper_title}'"
except Exception as e:
return f"Error generating citation: {str(e)}"
def explain_concept(concept: str, api_key: str, model: str) -> str:
"""A tool that explains an AI-related concept in simple terms."""
try:
response_json = call_perplexity_api(f"Explain the AI concept: {concept}", api_key, model)
if isinstance(response_json, str): # Error message
return response_json
if response_json and "choices" in response_json:
content = response_json["choices"][0]["message"]["content"]
return f"Explanation of {concept}:\n{content}"
return f"Could not explain the concept '{concept}'"
except Exception as e:
return f"Error explaining concept: {str(e)}"