Files

1 line
20 KiB
JSON

{"repo": "alfa546/auto-apply-ai", "files": {"backend/src/app/services/llm_client.py": {"58fe776106a40bbdcb4f82ffd2842d918b4425e8": {"t": 1785747517.1021955, "n": 5004, "h": "2825eadd76ebc170", "c": "import logging\nfrom typing import Tuple, Dict\nfrom src.app.config import settings\n\nlogger = logging.getLogger(__name__)\n\ndef detect_llm_provider(api_key: str) -> str:\n \"\"\"\n Automatically detects AI Model Provider based on API key prefix pattern.\n - 'gsk_' -> Groq (Free High-Speed Open Source Tier)\n - 'sk-or-' -> OpenRouter (Free Open Source Models)\n - 'AIzaSy' -> Google Gemini\n - 'sk-ant-' -> Anthropic Claude\n - 'sk-proj-' or 'sk-' -> OpenAI / DeepSeek\n \"\"\"\n if not api_key:\n return \"openai\"\n \n k = api_key.strip()\n if k.startswith(\"gsk_\"):\n return \"groq\"\n elif k.startswith(\"sk-or-\"):\n return \"openrouter\"\n elif k.startswith(\"AIzaSy\"):\n return \"gemini\"\n elif k.startswith(\"sk-ant-\"):\n return \"anthropic\"\n elif k.startswith(\"sk-\") or k.startswith(\"sk-proj-\"):\n return \"openai\"\n \n return \"openai\"\n\ndef get_llm_headers_and_url(\n api_key: str = None, \n provider: str = None, \n model_name: str = None, \n custom_api_base: str = None\n) -> Tuple[Dict[str, str], str, str]:\n \"\"\"\n Returns (headers, endpoint_url, model_name) for any AI provider in the world,\n including 100% Free Open Source Endpoints (Ollama, LM Studio, Groq Free Tier, OpenRouter Free).\n \"\"\"\n key = api_key or settings.OPENAI_API_KEY or settings.GEMINI_API_KEY or \"free-local\"\n detected_provider = provider or detect_llm_provider(key)\n\n # 1. Ollama or Local Offline Open-Source Models (100% Free, no API Key needed)\n if detected_provider == \"ollama\" or custom_api_base:\n base_url = (custom_api_base or \"http://localhost:11434/v1\").rstrip(\"/\")\n url = f\"{base_url}/chat/completions\"\n headers = {\n \"Authorization\": f\"Bearer {key or 'ollama-free'}\",\n \"Content-Type\": \"application/json\"\n }\n model = model_name or \"llama3\"\n logger.info(f\"Using Free Local Open Source Model (Ollama/LM Studio) at {url} with model: {model}\")\n return headers, url, model\n\n # 2. OpenRouter Free Open-Source Models\n elif detected_provider == \"openrouter\":\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"HTTP-Referer\": \"https://github.com/alfa546/Auto-Apply-AI\",\n \"X-Title\": \"Auto-Apply AI\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://openrouter.ai/api/v1/chat/completions\"\n model = model_name or \"meta-llama/llama-3.1-8b-instruct:free\"\n logger.info(f\"Using OpenRouter Free Model API with model: {model}\")\n return headers, url, model\n\n # 3. Groq Cloud (Free Open Source Models Tier)\n elif detected_provider == \"groq\":\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://api.groq.com/openai/v1/chat/completions\"\n model = model_name or \"llama-3.1-70b-versatile\"\n logger.info(f\"Using Groq Free Tier Open Source Model: {model}\")\n return headers, url, model\n\n # 4. Google Gemini\n elif detected_provider == \"gemini\":\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://generativelanguage.googleapis.com/v1beta/openai/chat/completions\"\n model = model_name or settings.GEMINI_MODEL or \"gemini-1.5-pro\"\n logger.info(f\"Using Gemini LLM with model: {model}\")\n return headers, url, model\n\n # 5. DeepSeek\n elif detected_provider == \"deepseek\":\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://api.deepseek.com/v1/chat/completions\"\n model = model_name or \"deepseek-chat\"\n logger.info(f\"Using DeepSeek LLM with model: {model}\")\n return headers, url, model\n\n # Default to OpenAI standard format\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://api.openai.com/v1/chat/completions\"\n model = model_name or settings.OPENAI_MODEL or \"gpt-4o\"\n logger.info(f\"Using OpenAI LLM with model: {model}\")\n return headers, url, model\n\ndef is_llm_configured(api_key: str = None) -> bool:\n return bool(api_key or settings.OPENAI_API_KEY or settings.GEMINI_API_KEY)\n\ndef generate_custom_cover_letter(candidate_name: str = \"Candidate\", job_title: str = \"Software Engineer\", company: str = \"Company\", skills: list = None, job_description: str = None) -> str:\n \"\"\"\n Generates a custom tailored cover letter using the active LLM provider.\n \"\"\"\n from src.app.services.application.cover_letter import generate_cover_letter\n profile_data = {\n \"skills\": skills or [\"Software Development\", \"Problem Solving\", \"AI Engineering\"],\n \"experience\": [{\"role\": \"Developer\", \"company\": \"Tech Company\"}],\n \"education\": []\n }\n return generate_cover_letter(profile_data, job_title, company, job_description or \"\")\n"}, "27022163e603bb7938edd7bd0fedcf3bc3ba2ef5": {"t": 1785773706.9097114, "n": 5004, "h": "2825eadd76ebc170", "c": "import logging\nfrom typing import Tuple, Dict\nfrom src.app.config import settings\n\nlogger = logging.getLogger(__name__)\n\ndef detect_llm_provider(api_key: str) -> str:\n \"\"\"\n Automatically detects AI Model Provider based on API key prefix pattern.\n - 'gsk_' -> Groq (Free High-Speed Open Source Tier)\n - 'sk-or-' -> OpenRouter (Free Open Source Models)\n - 'AIzaSy' -> Google Gemini\n - 'sk-ant-' -> Anthropic Claude\n - 'sk-proj-' or 'sk-' -> OpenAI / DeepSeek\n \"\"\"\n if not api_key:\n return \"openai\"\n \n k = api_key.strip()\n if k.startswith(\"gsk_\"):\n return \"groq\"\n elif k.startswith(\"sk-or-\"):\n return \"openrouter\"\n elif k.startswith(\"AIzaSy\"):\n return \"gemini\"\n elif k.startswith(\"sk-ant-\"):\n return \"anthropic\"\n elif k.startswith(\"sk-\") or k.startswith(\"sk-proj-\"):\n return \"openai\"\n \n return \"openai\"\n\ndef get_llm_headers_and_url(\n api_key: str = None, \n provider: str = None, \n model_name: str = None, \n custom_api_base: str = None\n) -> Tuple[Dict[str, str], str, str]:\n \"\"\"\n Returns (headers, endpoint_url, model_name) for any AI provider in the world,\n including 100% Free Open Source Endpoints (Ollama, LM Studio, Groq Free Tier, OpenRouter Free).\n \"\"\"\n key = api_key or settings.OPENAI_API_KEY or settings.GEMINI_API_KEY or \"free-local\"\n detected_provider = provider or detect_llm_provider(key)\n\n # 1. Ollama or Local Offline Open-Source Models (100% Free, no API Key needed)\n if detected_provider == \"ollama\" or custom_api_base:\n base_url = (custom_api_base or \"http://localhost:11434/v1\").rstrip(\"/\")\n url = f\"{base_url}/chat/completions\"\n headers = {\n \"Authorization\": f\"Bearer {key or 'ollama-free'}\",\n \"Content-Type\": \"application/json\"\n }\n model = model_name or \"llama3\"\n logger.info(f\"Using Free Local Open Source Model (Ollama/LM Studio) at {url} with model: {model}\")\n return headers, url, model\n\n # 2. OpenRouter Free Open-Source Models\n elif detected_provider == \"openrouter\":\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"HTTP-Referer\": \"https://github.com/alfa546/Auto-Apply-AI\",\n \"X-Title\": \"Auto-Apply AI\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://openrouter.ai/api/v1/chat/completions\"\n model = model_name or \"meta-llama/llama-3.1-8b-instruct:free\"\n logger.info(f\"Using OpenRouter Free Model API with model: {model}\")\n return headers, url, model\n\n # 3. Groq Cloud (Free Open Source Models Tier)\n elif detected_provider == \"groq\":\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://api.groq.com/openai/v1/chat/completions\"\n model = model_name or \"llama-3.1-70b-versatile\"\n logger.info(f\"Using Groq Free Tier Open Source Model: {model}\")\n return headers, url, model\n\n # 4. Google Gemini\n elif detected_provider == \"gemini\":\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://generativelanguage.googleapis.com/v1beta/openai/chat/completions\"\n model = model_name or settings.GEMINI_MODEL or \"gemini-1.5-pro\"\n logger.info(f\"Using Gemini LLM with model: {model}\")\n return headers, url, model\n\n # 5. DeepSeek\n elif detected_provider == \"deepseek\":\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://api.deepseek.com/v1/chat/completions\"\n model = model_name or \"deepseek-chat\"\n logger.info(f\"Using DeepSeek LLM with model: {model}\")\n return headers, url, model\n\n # Default to OpenAI standard format\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://api.openai.com/v1/chat/completions\"\n model = model_name or settings.OPENAI_MODEL or \"gpt-4o\"\n logger.info(f\"Using OpenAI LLM with model: {model}\")\n return headers, url, model\n\ndef is_llm_configured(api_key: str = None) -> bool:\n return bool(api_key or settings.OPENAI_API_KEY or settings.GEMINI_API_KEY)\n\ndef generate_custom_cover_letter(candidate_name: str = \"Candidate\", job_title: str = \"Software Engineer\", company: str = \"Company\", skills: list = None, job_description: str = None) -> str:\n \"\"\"\n Generates a custom tailored cover letter using the active LLM provider.\n \"\"\"\n from src.app.services.application.cover_letter import generate_cover_letter\n profile_data = {\n \"skills\": skills or [\"Software Development\", \"Problem Solving\", \"AI Engineering\"],\n \"experience\": [{\"role\": \"Developer\", \"company\": \"Tech Company\"}],\n \"education\": []\n }\n return generate_cover_letter(profile_data, job_title, company, job_description or \"\")\n"}, "ad0cd146d20f7832f11e7216ef6b4fb1abfcbfca": {"t": 1785773708.7639668, "n": 4335, "h": "78bdc72926fc0d0b", "c": "import logging\nfrom typing import Tuple, Dict\nfrom src.app.config import settings\n\nlogger = logging.getLogger(__name__)\n\ndef detect_llm_provider(api_key: str) -> str:\n \"\"\"\n Automatically detects AI Model Provider based on API key prefix pattern.\n - 'gsk_' -> Groq (Free High-Speed Open Source Tier)\n - 'sk-or-' -> OpenRouter (Free Open Source Models)\n - 'AIzaSy' -> Google Gemini\n - 'sk-ant-' -> Anthropic Claude\n - 'sk-proj-' or 'sk-' -> OpenAI / DeepSeek\n \"\"\"\n if not api_key:\n return \"openai\"\n \n k = api_key.strip()\n if k.startswith(\"gsk_\"):\n return \"groq\"\n elif k.startswith(\"sk-or-\"):\n return \"openrouter\"\n elif k.startswith(\"AIzaSy\"):\n return \"gemini\"\n elif k.startswith(\"sk-ant-\"):\n return \"anthropic\"\n elif k.startswith(\"sk-\") or k.startswith(\"sk-proj-\"):\n return \"openai\"\n \n return \"openai\"\n\ndef get_llm_headers_and_url(\n api_key: str = None, \n provider: str = None, \n model_name: str = None, \n custom_api_base: str = None\n) -> Tuple[Dict[str, str], str, str]:\n \"\"\"\n Returns (headers, endpoint_url, model_name) for any AI provider in the world,\n including 100% Free Open Source Endpoints (Ollama, LM Studio, Groq Free Tier, OpenRouter Free).\n \"\"\"\n key = api_key or settings.OPENAI_API_KEY or settings.GEMINI_API_KEY or \"free-local\"\n detected_provider = provider or detect_llm_provider(key)\n\n # 1. Ollama or Local Offline Open-Source Models (100% Free, no API Key needed)\n if detected_provider == \"ollama\" or custom_api_base:\n base_url = (custom_api_base or \"http://localhost:11434/v1\").rstrip(\"/\")\n url = f\"{base_url}/chat/completions\"\n headers = {\n \"Authorization\": f\"Bearer {key or 'ollama-free'}\",\n \"Content-Type\": \"application/json\"\n }\n model = model_name or \"llama3\"\n logger.info(f\"Using Free Local Open Source Model (Ollama/LM Studio) at {url} with model: {model}\")\n return headers, url, model\n\n # 2. OpenRouter Free Open-Source Models\n elif detected_provider == \"openrouter\":\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"HTTP-Referer\": \"https://github.com/alfa546/Auto-Apply-AI\",\n \"X-Title\": \"Auto-Apply AI\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://openrouter.ai/api/v1/chat/completions\"\n model = model_name or \"meta-llama/llama-3.1-8b-instruct:free\"\n logger.info(f\"Using OpenRouter Free Model API with model: {model}\")\n return headers, url, model\n\n # 3. Groq Cloud (Free Open Source Models Tier)\n elif detected_provider == \"groq\":\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://api.groq.com/openai/v1/chat/completions\"\n model = model_name or \"llama-3.1-70b-versatile\"\n logger.info(f\"Using Groq Free Tier Open Source Model: {model}\")\n return headers, url, model\n\n # 4. Google Gemini\n elif detected_provider == \"gemini\":\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://generativelanguage.googleapis.com/v1beta/openai/chat/completions\"\n model = model_name or settings.GEMINI_MODEL or \"gemini-1.5-pro\"\n logger.info(f\"Using Gemini LLM with model: {model}\")\n return headers, url, model\n\n # 5. DeepSeek\n elif detected_provider == \"deepseek\":\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://api.deepseek.com/v1/chat/completions\"\n model = model_name or \"deepseek-chat\"\n logger.info(f\"Using DeepSeek LLM with model: {model}\")\n return headers, url, model\n\n # Default to OpenAI standard format\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://api.openai.com/v1/chat/completions\"\n model = model_name or settings.OPENAI_MODEL or \"gpt-4o\"\n logger.info(f\"Using OpenAI LLM with model: {model}\")\n return headers, url, model\n\ndef is_llm_configured(api_key: str = None) -> bool:\n return bool(api_key or settings.OPENAI_API_KEY or settings.GEMINI_API_KEY)\n"}, "5878514a11d666c51693037355e70fefef3f281c": {"t": 1785773709.9545398, "n": 2911, "h": "c4c70ecece5738a6", "c": "import logging\nfrom typing import Tuple, Dict\nfrom src.app.config import settings\n\nlogger = logging.getLogger(__name__)\n\ndef detect_llm_provider(api_key: str) -> str:\n \"\"\"\n Automatically detects AI Model Provider based on API key prefix pattern.\n - 'sk-proj-' or 'sk-' -> OpenAI\n - 'AIzaSy' -> Google Gemini\n - 'gsk_' -> Groq\n - 'sk-ant-' -> Anthropic Claude\n \"\"\"\n if not api_key:\n return \"openai\"\n \n k = api_key.strip()\n if k.startswith(\"gsk_\"):\n return \"groq\"\n elif k.startswith(\"AIzaSy\"):\n return \"gemini\"\n elif k.startswith(\"sk-ant-\"):\n return \"anthropic\"\n elif k.startswith(\"sk-\") or k.startswith(\"sk-proj-\"):\n return \"openai\"\n \n return \"openai\"\n\ndef get_llm_headers_and_url(api_key: str = None, provider: str = None, model_name: str = None) -> Tuple[Dict[str, str], str, str]:\n \"\"\"\n Returns (headers, endpoint_url, model_name) for any AI provider in the world.\n Supports OpenAI, Google Gemini, Groq, DeepSeek, Anthropic, and custom endpoints.\n \"\"\"\n key = api_key or settings.OPENAI_API_KEY or settings.GEMINI_API_KEY\n if not key:\n return {}, \"\", \"\"\n\n detected_provider = provider or detect_llm_provider(key)\n\n if detected_provider == \"groq\":\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://api.groq.com/openai/v1/chat/completions\"\n model = model_name or \"llama-3.1-70b-versatile\"\n logger.info(f\"Using Groq LLM with model: {model}\")\n return headers, url, model\n\n elif detected_provider == \"gemini\":\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://generativelanguage.googleapis.com/v1beta/openai/chat/completions\"\n model = model_name or settings.GEMINI_MODEL or \"gemini-1.5-pro\"\n logger.info(f\"Using Gemini LLM with model: {model}\")\n return headers, url, model\n\n elif detected_provider == \"deepseek\":\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://api.deepseek.com/v1/chat/completions\"\n model = model_name or \"deepseek-chat\"\n logger.info(f\"Using DeepSeek LLM with model: {model}\")\n return headers, url, model\n\n # Default to OpenAI standard format (OpenAI, Anyscale, Together, Ollama)\n headers = {\n \"Authorization\": f\"Bearer {key}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://api.openai.com/v1/chat/completions\"\n model = model_name or settings.OPENAI_MODEL or \"gpt-4o\"\n logger.info(f\"Using OpenAI LLM with model: {model}\")\n return headers, url, model\n\ndef is_llm_configured(api_key: str = None) -> bool:\n return bool(api_key or settings.OPENAI_API_KEY or settings.GEMINI_API_KEY)\n"}, "73ad9030abd7c1d9c3f0471ce03632b360d0842a": {"t": 1785773711.1783743, "n": 1226, "h": "1aad9410cd987f87", "c": "import logging\nfrom src.app.config import settings\n\nlogger = logging.getLogger(__name__)\n\ndef get_llm_headers_and_url() -> tuple[dict, str, str]:\n \"\"\"\n Returns headers, API URL, and model name depending on which API key is configured.\n Prioritizes Gemini if GEMINI_API_KEY is present, otherwise falls back to OpenAI.\n \"\"\"\n if settings.GEMINI_API_KEY:\n headers = {\n \"Authorization\": f\"Bearer {settings.GEMINI_API_KEY}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://generativelanguage.googleapis.com/v1beta/openai/chat/completions\"\n model = settings.GEMINI_MODEL\n logger.info(f\"Using Gemini LLM with model: {model}\")\n return headers, url, model\n elif settings.OPENAI_API_KEY:\n headers = {\n \"Authorization\": f\"Bearer {settings.OPENAI_API_KEY}\",\n \"Content-Type\": \"application/json\"\n }\n url = \"https://api.openai.com/v1/chat/completions\"\n model = settings.OPENAI_MODEL\n logger.info(f\"Using OpenAI LLM with model: {model}\")\n return headers, url, model\n return {}, \"\", \"\"\n\ndef is_llm_configured() -> bool:\n return bool(settings.GEMINI_API_KEY or settings.OPENAI_API_KEY)\n"}}}}