mayank1101's picture
Upload 7 files
28d8100 verified
raw
history blame
3.48 kB
import asyncio
from typing import Dict, Any
import httpx
from pydantic import BaseModel
from model_registry import model_card
perpelxity_card = model_card["perplexity"]
class QueryRequest(BaseModel):
query: str
class PerplexityClient:
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = perpelxity_card["url"]
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
async def generate_response(self, query: str) -> Dict[str, Any]:
payload = {
"model": perpelxity_card["model"],
"messages": [
{
"role": "system",
"content": perpelxity_card["prompt"]
},
{
"role": "user",
"content": query
}
],
"max_tokens": perpelxity_card["inference_config"]["max_tokens"],
"temperature": perpelxity_card["inference_config"]["temperature"],
"stream": False, # We'll handle streaming separately
}
async with httpx.AsyncClient() as client:
try:
async with httpx.AsyncClient(
timeout=httpx.Timeout(
connect=10.0, # Connection timeout
read=45.0, # Read timeout
write=10.0, # Write timeout
pool=10.0 # Connection pool timeout
)
) as client:
response = await client.post(
self.base_url,
headers=self.headers,
json=payload
)
response.raise_for_status()
return response.json()
except httpx.HTTPStatusError as e:
print(f"HTTP error occurred: {e}")
print(f"Response text: {e.response.text}")
raise
except httpx.RequestError as e:
print(f"Request error occurred: {e}")
raise
except Exception as e:
print(f"An unexpected error occurred: {e}")
raise
def parse_perplexity_response(response: Dict[str, Any]) -> Dict[str, Any]:
"""
Parse the Perplexity API response and extract key information.
Args:
response (Dict[str, Any]): Raw response from Perplexity API
Returns:
Dict[str, Any]: Parsed response with content and citations
"""
print("parse_perplexity_response called...")
# Basic citation extraction (this is a simple implementation)
# In a real-world scenario, you might want a more sophisticated citation extraction
citations = []
# default content to stream if no response from the Perplexity AI
default_content = (
"I'm sorry, I couldn't find any relevant information for your query from the available sources. "
"If you'd like, you can try rephrasing your question or provide more context to help refine the search. "
"Alternatively, let me know if you'd like assistance in a different area."
)
citations = response.get("citations", [])
content = response.get("choices", default_content)[0]["message"]["content"]
return {
"content": content,
"citations": citations
}