import logging import time import requests import json import os from api.finnhub.financial_news_requester import fetch_comp_financial_news from api.openrouter.prompt_generator import PromptGenerator class OpenRouterClient: def __init__(self, model: str = "tngtech/deepseek-r1t2-chimera:free", api_key: str | None = None): self._api_key = api_key or os.getenv("OPENROUTER_API_KEY") if not self._api_key: raise ValueError("OpenRouter API key is required") self._api_url = "https://openrouter.ai/api/v1/chat/completions" self.model = model def chat(self, user_message: str, role: str = "user") -> str: """ Sends a message to the OpenRouter API and returns the response. Raises RuntimeError for HTTP errors and ValueError for unexpected response formats. Args: user_message (str): The message to send to the model. Returns: str: The response from the model. Raises: RuntimeError: If the API request fails. ValueError: If the response format is unexpected. """ headers = { "Authorization": f"Bearer {self._api_key}", "Content-Type": "application/json" } payload = { "model": self.model, "messages": [ { "role": role, "content": user_message } ] } try: response = requests.post( url=self._api_url, headers=headers, data=json.dumps(payload), timeout=10 ) response.raise_for_status() except requests.exceptions.RequestException as e: logging.error(f"OpenRouter request error: {e}") raise RuntimeError(f"Request error: {e}") response_json = response.json() try: return response_json["choices"][0]["message"]["content"] except (KeyError, IndexError): logging.error(f"Unexpected response format: {response_json}") raise ValueError(f"Unexpected response format: {response_json}") if __name__ == "__main__": sample_news = fetch_comp_financial_news(ticker='NVDA', date_from='2025-08-04', date_to='2025-08-05') print(sample_news) print(len(sample_news)) # Example usage client = OpenRouterClient() try: for news in sample_news: start_time = time.perf_counter() prompt = PromptGenerator.format_prompt(news) print(f"Prompt: {prompt}") response = client.chat(prompt) print(f"Response: {response}") elapsed = time.perf_counter() - start_time print(f"Processing time: {elapsed:.2f} seconds") except (RuntimeError, ValueError) as e: print(f"Error: {e}")