|
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, |
|
} |
|
|
|
async with httpx.AsyncClient() as client: |
|
try: |
|
async with httpx.AsyncClient( |
|
timeout=httpx.Timeout( |
|
connect=10.0, |
|
read=45.0, |
|
write=10.0, |
|
pool=10.0 |
|
) |
|
) 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...") |
|
|
|
|
|
citations = [] |
|
|
|
|
|
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 |
|
} |
|
|