Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/abaracadabra_mindx.json
T

1 line
10 KiB
JSON

{"repo": "abaracadabra/mindx", "files": {"api/grok_api.py": {"25951e998962300a2b918fcc6cc5fbd99867fc7c": {"t": 1785674555.4604168, "n": 9975, "h": "722d1f81ab2e069a", "c": "\"\"\"\nGrok API Integration for mindX\n\nThis module provides comprehensive integration with xAI's Grok API,\nincluding rate limit management, monitoring, and optimization.\nGrok API is compatible with OpenAI's API format.\n\"\"\"\n\nimport asyncio\nimport json\nimport os\nfrom typing import Dict, List, Optional, Any\nfrom dataclasses import dataclass\nfrom datetime import datetime\n\ntry:\n import openai\n from openai import AsyncOpenAI\n OPENAI_AVAILABLE = True\nexcept ImportError:\n OPENAI_AVAILABLE = False\n # Don't log here - logger not yet initialized\n\nimport aiohttp\n\nfrom utils.logging_config import get_logger\nfrom utils.config import Config\nfrom llm.rate_limiter import RateLimiter\n\nlogger = get_logger(__name__)\n\n\n@dataclass\nclass GrokRateLimits:\n \"\"\"Grok API rate limits (xAI service)\"\"\"\n # Based on xAI's current limits (may change)\n requests_per_minute: int = 30 # Conservative default\n requests_per_day: int = 10000 # High daily limit\n tokens_per_minute: int = 100000 # Estimated\n tokens_per_day: int = 10000000 # High daily limit\n\n\n@dataclass\nclass GrokAPIMetrics:\n \"\"\"Metrics for Grok API usage\"\"\"\n total_requests: int = 0\n successful_requests: int = 0\n failed_requests: int = 0\n rate_limit_hits: int = 0\n total_tokens_input: int = 0\n total_tokens_output: int = 0\n total_cost: float = 0.0 # Grok may have different pricing\n last_request_time: Optional[datetime] = None\n average_latency_ms: float = 0.0\n\n\nclass GrokAPI:\n \"\"\"\n Grok API client with rate limiting, monitoring, and optimization.\n\n Uses xAI's API endpoint which is compatible with OpenAI's format.\n \"\"\"\n\n def __init__(\n self,\n api_key: Optional[str] = None,\n base_url: Optional[str] = None,\n rate_limits: Optional[GrokRateLimits] = None,\n config: Optional[Config] = None\n ):\n self.config = config or Config()\n self.api_key = api_key or os.getenv(\"GROK_API_KEY\") or os.getenv(\"XAI_API_KEY\") or self.config.get(\"llm.grok.api_key\")\n self.base_url = base_url or self.config.get(\"llm.grok.base_url\", \"https://api.x.ai/v1\")\n\n if not OPENAI_AVAILABLE:\n logger.error(\"OpenAI library not available (required for Grok API)\")\n self.client = None\n elif self.api_key:\n self.client = AsyncOpenAI(api_key=self.api_key, base_url=self.base_url)\n else:\n logger.warning(\"Grok API key not provided\")\n self.client = None\n\n self.rate_limits = rate_limits or GrokRateLimits()\n self.metrics = GrokAPIMetrics()\n\n # Initialize rate limiter\n self.rate_limiter = RateLimiter(\n requests_per_minute=self.rate_limits.requests_per_minute,\n max_retries=5,\n initial_backoff_s=1.0\n )\n\n # Grok model pricing (subject to change)\n self.pricing = {\n \"grok-beta\": {\"input\": 0.0, \"output\": 0.0}, # Free during beta\n \"grok-1\": {\"input\": 0.0, \"output\": 0.0}, # Free during beta\n \"grok-1.5\": {\"input\": 0.0, \"output\": 0.0}, # Free during beta\n \"grok-1.5-vision\": {\"input\": 0.0, \"output\": 0.0}, # Free during beta\n }\n\n logger.info(f\"GrokAPI initialized with rate limit: {self.rate_limits.requests_per_minute} RPM\")\n\n def _get_model_pricing(self, model: str) -> Dict[str, float]:\n \"\"\"Get pricing for a model\"\"\"\n # Try exact match first\n if model in self.pricing:\n return self.pricing[model]\n\n # Try partial match\n for key, pricing in self.pricing.items():\n if key in model.lower():\n return pricing\n\n # Default to grok-beta pricing\n return self.pricing.get(\"grok-beta\", {\"input\": 0.0, \"output\": 0.0})\n\n async def generate_text(\n self,\n prompt: str,\n model: str = \"grok-beta\",\n max_tokens: Optional[int] = 4096,\n temperature: Optional[float] = 0.7,\n json_mode: Optional[bool] = False,\n **kwargs\n ) -> Optional[str]:\n \"\"\"\n Generate text using Grok API with rate limiting and retry logic.\n \"\"\"\n if not self.client:\n return json.dumps({\"error\": \"Grok client not configured\"})\n\n # Wait for rate limiter\n if not await self.rate_limiter.wait():\n self.metrics.rate_limit_hits += 1\n return json.dumps({\"error\": \"Rate limit exceeded\"})\n\n start_time = asyncio.get_event_loop().time()\n\n try:\n # Prepare messages\n messages = [{\"role\": \"user\", \"content\": prompt}]\n\n # Handle system messages\n system_message = kwargs.get(\"system_message\") or kwargs.get(\"system\")\n if system_message:\n messages.insert(0, {\"role\": \"system\", \"content\": system_message})\n\n # Set response format for JSON mode\n response_format = {\"type\": \"json_object\"} if json_mode else None\n\n # Make API call\n response = await self.client.chat.completions.create(\n model=model,\n messages=messages,\n max_tokens=max_tokens,\n temperature=temperature,\n response_format=response_format,\n **kwargs\n )\n\n # Extract response content\n content = response.choices[0].message.content\n\n # Update metrics\n self.metrics.total_requests += 1\n self.metrics.successful_requests += 1\n self.metrics.last_request_time = datetime.now()\n\n # Extract token usage\n usage = response.usage\n if usage:\n self.metrics.total_tokens_input += usage.prompt_tokens or 0\n self.metrics.total_tokens_output += usage.completion_tokens or 0\n\n # Calculate cost (Grok may be free during beta)\n pricing = self._get_model_pricing(model)\n input_cost = (usage.prompt_tokens or 0) * pricing[\"input\"] / 1000\n output_cost = (usage.completion_tokens or 0) * pricing[\"output\"] / 1000\n self.metrics.total_cost += input_cost + output_cost\n\n latency_ms = (asyncio.get_event_loop().time() - start_time) * 1000\n self.metrics.average_latency_ms = (\n (self.metrics.average_latency_ms * (self.metrics.total_requests - 1) + latency_ms) /\n self.metrics.total_requests\n )\n\n return content\n\n except openai.RateLimitError as e:\n self.metrics.total_requests += 1\n self.metrics.rate_limit_hits += 1\n logger.warning(f\"Grok API rate limit hit: {e}\")\n return json.dumps({\"error\": \"RateLimitExceeded\", \"message\": str(e)})\n except openai.AuthenticationError as e:\n self.metrics.total_requests += 1\n self.metrics.failed_requests += 1\n logger.error(f\"Grok API authentication error: {e}\")\n return json.dumps({\"error\": \"AuthenticationError\", \"message\": str(e)})\n except openai.APIError as e:\n self.metrics.total_requests += 1\n self.metrics.failed_requests += 1\n logger.error(f\"Grok API error: {e}\")\n return json.dumps({\"error\": \"ApiCallFailed\", \"message\": str(e)})\n except Exception as e:\n self.metrics.total_requests += 1\n self.metrics.failed_requests += 1\n logger.error(f\"Unexpected Grok API error: {e}\")\n return json.dumps({\"error\": \"ApiCallFailed\", \"message\": str(e)})\n\n async def list_models(self) -> List[Dict[str, Any]]:\n \"\"\"List available Grok models\"\"\"\n if not self.client:\n return []\n\n try:\n models_response = await self.client.models.list()\n models = []\n for model in models_response.data:\n # Filter to only Grok models\n if \"grok\" in model.id.lower():\n models.append({\n \"id\": model.id,\n \"object\": model.object,\n \"created\": model.created,\n \"owned_by\": model.owned_by\n })\n return models\n except Exception as e:\n logger.error(f\"Error listing Grok models: {e}\")\n return []\n\n def update_rate_limits(self, rpm: Optional[int] = None, tpm: Optional[int] = None):\n \"\"\"Update rate limits\"\"\"\n if rpm:\n self.rate_limits.requests_per_minute = rpm\n self.rate_limiter.requests_per_minute = rpm\n self.rate_limiter.token_fill_rate = rpm / 60.0\n self.rate_limiter.max_tokens = float(rpm)\n if tpm:\n self.rate_limits.tokens_per_minute = tpm\n\n def get_metrics(self) -> Dict[str, Any]:\n \"\"\"Get current API metrics\"\"\"\n return {\n \"total_requests\": self.metrics.total_requests,\n \"successful_requests\": self.metrics.successful_requests,\n \"failed_requests\": self.metrics.failed_requests,\n \"rate_limit_hits\": self.metrics.rate_limit_hits,\n \"total_tokens_input\": self.metrics.total_tokens_input,\n \"total_tokens_output\": self.metrics.total_tokens_output,\n \"total_cost\": self.metrics.total_cost,\n \"average_latency_ms\": self.metrics.average_latency_ms,\n \"last_request_time\": self.metrics.last_request_time.isoformat() if self.metrics.last_request_time else None,\n \"rate_limits\": {\n \"rpm\": self.rate_limits.requests_per_minute,\n \"tpm\": self.rate_limits.tokens_per_minute,\n },\n \"rate_limiter_metrics\": self.rate_limiter.get_metrics()\n }\n\n\ndef create_grok_api(\n api_key: Optional[str] = None,\n base_url: Optional[str] = None,\n config: Optional[Config] = None\n) -> GrokAPI:\n \"\"\"Create a Grok API instance\"\"\"\n return GrokAPI(api_key=api_key, base_url=base_url, config=config)"}}}}