1 line
29 KiB
JSON
1 line
29 KiB
JSON
{"repo": "al-amini/graphmem", "files": {"src/graphmem/llm/embeddings.py": {"5dcb3b76db1a9f217adb428ea0a75ca368b1d0de": {"t": 1785674496.1839654, "n": 12510, "h": "1434af4942d3c61b", "c": "\"\"\"\nGraphMem Embedding Providers\n\nAbstraction layer for embedding generation supporting multiple providers.\n\nSupports:\n- OpenAI\n- Azure OpenAI\n- OpenRouter (via OpenAI-compatible API)\n- Together AI (via OpenAI-compatible API)\n- Any OpenAI-compatible embedding API\n- Local models (sentence-transformers)\n\"\"\"\n\nfrom __future__ import annotations\nimport logging\nimport os\nfrom typing import List, Optional\nimport hashlib\n\nimport numpy as np\n\nlogger = logging.getLogger(__name__)\n\n\nclass EmbeddingProvider:\n \"\"\"\n Multi-provider embedding abstraction supporting any OpenAI-compatible API.\n \n Supported Providers:\n - azure_openai: Azure OpenAI Service\n - openai: OpenAI API\n - openai_compatible: Any OpenAI-compatible API (OpenRouter, Together, etc.)\n - local: Local sentence-transformers models\n \n Examples:\n # OpenAI\n embeddings = EmbeddingProvider(\n provider=\"openai\",\n api_key=\"sk-...\",\n model=\"text-embedding-3-small\"\n )\n \n # Azure OpenAI\n embeddings = EmbeddingProvider(\n provider=\"azure_openai\",\n api_key=\"...\",\n api_base=\"https://your-resource.openai.azure.com/\",\n deployment=\"text-embedding-3-small\"\n )\n \n # OpenRouter\n embeddings = EmbeddingProvider(\n provider=\"openai_compatible\",\n api_key=\"sk-or-v1-...\",\n api_base=\"https://openrouter.ai/api/v1\",\n model=\"openai/text-embedding-3-small\"\n )\n \n # Together AI\n embeddings = EmbeddingProvider(\n provider=\"openai_compatible\",\n api_key=\"...\",\n api_base=\"https://api.together.xyz/v1\",\n model=\"togethercomputer/m2-bert-80M-8k-retrieval\"\n )\n \n # Local (sentence-transformers)\n embeddings = EmbeddingProvider(\n provider=\"local\",\n model=\"all-MiniLM-L6-v2\"\n )\n \"\"\"\n \n def __init__(\n self,\n provider: str = \"azure_openai\",\n api_key: Optional[str] = None,\n api_base: Optional[str] = None,\n api_version: Optional[str] = None,\n model: Optional[str] = None,\n deployment: Optional[str] = None,\n cache=None,\n **kwargs,\n ):\n \"\"\"\n Initialize embedding provider.\n \n Args:\n provider: Provider name (azure_openai, openai, openai_compatible, local)\n api_key: API key\n api_base: API base URL (required for openai_compatible)\n api_version: API version (Azure only)\n model: Model name\n deployment: Deployment name (Azure only)\n cache: Optional cache for embeddings\n \"\"\"\n self.provider = provider.lower()\n self.api_key = api_key\n self.api_base = api_base\n self.api_version = api_version\n self.model = model\n self.deployment = deployment\n self.cache = cache\n self.kwargs = kwargs\n \n self._client = None\n self._local_model = None\n self._initialize_client()\n \n def _initialize_client(self):\n \"\"\"Initialize the appropriate client.\"\"\"\n if self.provider == \"azure_openai\":\n self._init_azure_openai()\n elif self.provider == \"openai\":\n self._init_openai()\n elif self.provider == \"openai_compatible\":\n self._init_openai_compatible()\n elif self.provider == \"local\":\n self._init_local()\n else:\n raise ValueError(\n f\"Unsupported embedding provider: {self.provider}. \"\n f\"Supported: azure_openai, openai, openai_compatible, local\"\n )\n \n def _init_azure_openai(self):\n \"\"\"Initialize Azure OpenAI client.\"\"\"\n try:\n from openai import AzureOpenAI\n \n self._client = AzureOpenAI(\n api_key=self.api_key or os.getenv(\"AZURE_OPENAI_API_KEY\"),\n api_version=self.api_version or os.getenv(\"AZURE_OPENAI_API_VERSION\", \"2024-02-01\"),\n azure_endpoint=self.api_base or os.getenv(\"AZURE_OPENAI_ENDPOINT\"),\n )\n self.model = self.deployment or os.getenv(\"AZURE_OPENAI_EMBEDDING_DEPLOYMENT\", \"text-embedding-3-small\")\n \n except ImportError:\n raise ImportError(\"openai package required: pip install openai\")\n \n def _init_openai(self):\n \"\"\"Initialize OpenAI client.\"\"\"\n try:\n from openai import OpenAI\n \n self._client = OpenAI(\n api_key=self.api_key or os.getenv(\"OPENAI_API_KEY\"),\n base_url=self.api_base, # None uses default\n )\n self.model = self.model or \"text-embedding-3-small\"\n \n except ImportError:\n raise ImportError(\"openai package required: pip install openai\")\n \n def _init_openai_compatible(self):\n \"\"\"\n Initialize OpenAI-compatible client for third-party providers.\n \n Works with:\n - OpenRouter: https://openrouter.ai/api/v1\n - Together AI: https://api.together.xyz/v1\n - Anyscale: https://api.endpoints.anyscale.com/v1\n - And any other OpenAI-compatible embedding endpoint\n \"\"\"\n try:\n from openai import OpenAI\n \n if not self.api_base:\n raise ValueError(\n \"api_base is required for openai_compatible provider. \"\n \"Example: api_base='https://openrouter.ai/api/v1'\"\n )\n \n if not self.api_key:\n raise ValueError(\"api_key is required for openai_compatible provider\")\n \n self._client = OpenAI(\n api_key=self.api_key,\n base_url=self.api_base,\n )\n \n if not self.model:\n raise ValueError(\n \"model is required for openai_compatible provider. \"\n \"Example: model='openai/text-embedding-3-small'\"\n )\n \n except ImportError:\n raise ImportError(\"openai package required: pip install openai\")\n \n def _init_local(self):\n \"\"\"Initialize local embedding model.\"\"\"\n try:\n from sentence_transformers import SentenceTransformer\n \n self.model = self.model or \"all-MiniLM-L6-v2\"\n self._local_model = SentenceTransformer(self.model)\n \n except ImportError:\n raise ImportError(\"sentence-transformers required: pip install sentence-transformers\")\n \n def embed_text(self, text: str) -> List[float]:\n \"\"\"Generate embedding for a single text.\"\"\"\n if not text or not text.strip():\n return []\n \n text = text.replace(\"\\n\", \" \").strip()\n \n # Check cache\n if self.cache:\n text_hash = hashlib.md5(text.encode()).hexdigest()\n cached = self.cache.get_embedding(text_hash)\n if cached:\n return cached\n \n embedding = self._generate_embedding(text)\n \n # Cache result\n if self.cache and embedding:\n text_hash = hashlib.md5(text.encode()).hexdigest()\n self.cache.cache_embedding(text_hash, embedding)\n \n return embedding\n \n def embed_batch(self, texts: List[str]) -> List[List[float]]:\n \"\"\"Generate embeddings for multiple texts.\"\"\"\n if not texts:\n return []\n \n # Clean texts\n texts = [t.replace(\"\\n\", \" \").strip() for t in texts if t and t.strip()]\n \n if not texts:\n return []\n \n if self.provider == \"local\":\n return self._local_embed_batch(texts)\n else:\n return self._api_embed_batch(texts)\n \n def _generate_embedding(self, text: str) -> List[float]:\n \"\"\"Generate a single embedding.\"\"\"\n if self.provider == \"local\":\n embedding = self._local_model.encode(text)\n return embedding.tolist()\n else:\n try:\n response = self._client.embeddings.create(\n model=self.model,\n input=[text],\n )\n return response.data[0].embedding\n except Exception as e:\n logger.error(f\"Embedding error: {e}\")\n return []\n \n def _local_embed_batch(self, texts: List[str]) -> List[List[float]]:\n \"\"\"Generate embeddings using local model.\"\"\"\n try:\n embeddings = self._local_model.encode(texts)\n return [e.tolist() for e in embeddings]\n except Exception as e:\n logger.error(f\"Local embedding batch error: {e}\")\n return []\n \n def _api_embed_batch(self, texts: List[str], batch_size: int = 100) -> List[List[float]]:\n \"\"\"Generate embeddings using API with batching.\"\"\"\n all_embeddings = []\n \n for i in range(0, len(texts), batch_size):\n batch = texts[i:i + batch_size]\n try:\n response = self._client.embeddings.create(\n model=self.model,\n input=batch,\n )\n batch_embeddings = [item.embedding for item in response.data]\n all_embeddings.extend(batch_embeddings)\n except Exception as e:\n logger.error(f\"API embedding batch error: {e}\")\n # Return empty embeddings for failed batch\n all_embeddings.extend([[] for _ in batch])\n \n return all_embeddings\n \n def cosine_similarity(self, vec_a: List[float], vec_b: List[float]) -> float:\n \"\"\"Calculate cosine similarity between two vectors.\"\"\"\n if not vec_a or not vec_b:\n return 0.0\n \n a = np.array(vec_a)\n b = np.array(vec_b)\n \n norm_a = np.linalg.norm(a)\n norm_b = np.linalg.norm(b)\n \n if norm_a == 0 or norm_b == 0:\n return 0.0\n \n return float(np.dot(a, b) / (norm_a * norm_b))\n\n\ndef get_embedding_provider(\n provider: str = \"openai\",\n api_key: Optional[str] = None,\n api_base: Optional[str] = None,\n api_version: Optional[str] = None,\n model: Optional[str] = None,\n deployment: Optional[str] = None,\n cache=None,\n **kwargs,\n) -> EmbeddingProvider:\n \"\"\"\n Factory function to create an embedding provider.\n \n Args:\n provider: Provider name:\n - \"openai\": OpenAI API\n - \"azure_openai\": Azure OpenAI Service\n - \"openai_compatible\": Any OpenAI-compatible API\n - \"local\": Local sentence-transformers\n api_key: API key\n api_base: API base URL (required for openai_compatible)\n api_version: API version (Azure only)\n model: Model name\n deployment: Deployment name (Azure only)\n cache: Optional cache for embeddings\n \n Returns:\n Configured EmbeddingProvider instance\n \n Examples:\n # OpenAI\n emb = get_embedding_provider(\"openai\", api_key=\"sk-...\")\n \n # OpenRouter\n emb = get_embedding_provider(\n \"openai_compatible\",\n api_key=\"sk-or-v1-...\",\n api_base=\"https://openrouter.ai/api/v1\",\n model=\"openai/text-embedding-3-small\"\n )\n \n # Local\n emb = get_embedding_provider(\"local\", model=\"all-MiniLM-L6-v2\")\n \"\"\"\n return EmbeddingProvider(\n provider=provider,\n api_key=api_key,\n api_base=api_base,\n api_version=api_version,\n model=model,\n deployment=deployment,\n cache=cache,\n **kwargs,\n )\n\n\n# Convenience functions for common providers\ndef openrouter_embeddings(api_key: str, model: str = \"openai/text-embedding-3-small\") -> EmbeddingProvider:\n \"\"\"Create an OpenRouter embedding provider.\"\"\"\n return EmbeddingProvider(\n provider=\"openai_compatible\",\n api_key=api_key,\n api_base=\"https://openrouter.ai/api/v1\",\n model=model,\n )\n\n\ndef together_embeddings(api_key: str, model: str = \"togethercomputer/m2-bert-80M-8k-retrieval\") -> EmbeddingProvider:\n \"\"\"Create a Together AI embedding provider.\"\"\"\n return EmbeddingProvider(\n provider=\"openai_compatible\",\n api_key=api_key,\n api_base=\"https://api.together.xyz/v1\",\n model=model,\n )\n"}}, "src/graphmem/llm/providers.py": {"5dcb3b76db1a9f217adb428ea0a75ca368b1d0de": {"t": 1785674600.8282907, "n": 15424, "h": "48da30dcb46ff10c", "c": "\"\"\"\nGraphMem LLM Providers\n\nAbstraction layer for LLM interactions supporting multiple providers.\n\nSupports:\n- OpenAI\n- Azure OpenAI \n- Anthropic Claude\n- OpenRouter (100+ models)\n- Together AI\n- Groq\n- Any OpenAI-compatible API\n- Local models (Ollama)\n\"\"\"\n\nfrom __future__ import annotations\nimport logging\nimport os\nfrom typing import List, Dict, Any, Optional, Literal, Union\nfrom abc import ABC, abstractmethod\n\nlogger = logging.getLogger(__name__)\n\n\nclass BaseLLM(ABC):\n \"\"\"Base class for LLM providers.\"\"\"\n \n @abstractmethod\n def complete(\n self,\n prompt: str,\n temperature: float = 0.1,\n max_tokens: int = 4000,\n ) -> str:\n \"\"\"Generate completion for a prompt.\"\"\"\n pass\n \n @abstractmethod\n def chat(\n self,\n messages: List[Dict[str, str]],\n temperature: float = 0.1,\n max_tokens: int = 4000,\n ) -> str:\n \"\"\"Generate chat completion.\"\"\"\n pass\n\n\nclass LLMProvider(BaseLLM):\n \"\"\"\n Multi-provider LLM abstraction supporting any OpenAI-compatible API.\n \n Supported Providers:\n - azure_openai: Azure OpenAI Service\n - openai: OpenAI API\n - openai_compatible: Any OpenAI-compatible API (OpenRouter, Together, Groq, etc.)\n - anthropic: Anthropic Claude\n - ollama: Local Ollama models\n \n Examples:\n # OpenAI\n llm = LLMProvider(provider=\"openai\", api_key=\"sk-...\", model=\"gpt-4o\")\n \n # Azure OpenAI\n llm = LLMProvider(\n provider=\"azure_openai\",\n api_key=\"...\",\n api_base=\"https://your-resource.openai.azure.com/\",\n deployment=\"gpt-4\"\n )\n \n # OpenRouter (100+ models)\n llm = LLMProvider(\n provider=\"openai_compatible\",\n api_key=\"sk-or-v1-...\",\n api_base=\"https://openrouter.ai/api/v1\",\n model=\"google/gemini-2.5-flash\"\n )\n \n # Together AI\n llm = LLMProvider(\n provider=\"openai_compatible\",\n api_key=\"...\",\n api_base=\"https://api.together.xyz/v1\",\n model=\"meta-llama/Llama-3-70b-chat-hf\"\n )\n \n # Groq\n llm = LLMProvider(\n provider=\"openai_compatible\",\n api_key=\"gsk_...\",\n api_base=\"https://api.groq.com/openai/v1\",\n model=\"llama-3.1-70b-versatile\"\n )\n \n # Local Ollama\n llm = LLMProvider(provider=\"ollama\", model=\"llama3.2\")\n \"\"\"\n \n def __init__(\n self,\n provider: str = \"azure_openai\",\n api_key: Optional[str] = None,\n api_base: Optional[str] = None,\n api_version: Optional[str] = None,\n model: Optional[str] = None,\n deployment: Optional[str] = None,\n **kwargs,\n ):\n \"\"\"\n Initialize LLM provider.\n \n Args:\n provider: Provider name (azure_openai, openai, openai_compatible, anthropic, ollama)\n api_key: API key (or from env)\n api_base: API base URL (required for openai_compatible)\n api_version: API version (Azure only)\n model: Model name/identifier\n deployment: Deployment name (Azure only)\n **kwargs: Additional provider-specific options\n \"\"\"\n self.provider = provider.lower()\n self.api_key = api_key\n self.api_base = api_base\n self.api_version = api_version\n self.model = model\n self.deployment = deployment\n self.kwargs = kwargs\n \n self._client = None\n self._initialize_client()\n \n def _initialize_client(self):\n \"\"\"Initialize the appropriate client.\"\"\"\n if self.provider == \"azure_openai\":\n self._init_azure_openai()\n elif self.provider == \"openai\":\n self._init_openai()\n elif self.provider == \"openai_compatible\":\n self._init_openai_compatible()\n elif self.provider == \"anthropic\":\n self._init_anthropic()\n elif self.provider == \"ollama\":\n self._init_ollama()\n else:\n raise ValueError(f\"Unsupported LLM provider: {self.provider}. \"\n f\"Supported: azure_openai, openai, openai_compatible, anthropic, ollama\")\n \n def _init_azure_openai(self):\n \"\"\"Initialize Azure OpenAI client.\"\"\"\n try:\n from openai import AzureOpenAI\n \n self._client = AzureOpenAI(\n api_key=self.api_key or os.getenv(\"AZURE_OPENAI_API_KEY\"),\n api_version=self.api_version or os.getenv(\"AZURE_OPENAI_API_VERSION\", \"2024-02-01\"),\n azure_endpoint=self.api_base or os.getenv(\"AZURE_OPENAI_ENDPOINT\"),\n )\n self.model = self.deployment or os.getenv(\"AZURE_OPENAI_DEPLOYMENT\")\n \n except ImportError:\n raise ImportError(\"openai package required: pip install openai\")\n \n def _init_openai(self):\n \"\"\"Initialize OpenAI client.\"\"\"\n try:\n from openai import OpenAI\n \n self._client = OpenAI(\n api_key=self.api_key or os.getenv(\"OPENAI_API_KEY\"),\n base_url=self.api_base, # None uses default OpenAI endpoint\n )\n self.model = self.model or \"gpt-4o\"\n \n except ImportError:\n raise ImportError(\"openai package required: pip install openai\")\n \n def _init_openai_compatible(self):\n \"\"\"\n Initialize OpenAI-compatible client for third-party providers.\n \n Works with:\n - OpenRouter: https://openrouter.ai/api/v1\n - Together AI: https://api.together.xyz/v1 \n - Groq: https://api.groq.com/openai/v1\n - Anyscale: https://api.endpoints.anyscale.com/v1\n - Fireworks: https://api.fireworks.ai/inference/v1\n - Perplexity: https://api.perplexity.ai\n - DeepInfra: https://api.deepinfra.com/v1/openai\n - Mistral: https://api.mistral.ai/v1\n - And any other OpenAI-compatible endpoint\n \"\"\"\n try:\n from openai import OpenAI\n \n if not self.api_base:\n raise ValueError(\n \"api_base is required for openai_compatible provider. \"\n \"Example: api_base='https://openrouter.ai/api/v1'\"\n )\n \n if not self.api_key:\n raise ValueError(\"api_key is required for openai_compatible provider\")\n \n self._client = OpenAI(\n api_key=self.api_key,\n base_url=self.api_base,\n )\n \n if not self.model:\n raise ValueError(\n \"model is required for openai_compatible provider. \"\n \"Example: model='google/gemini-2.5-flash'\"\n )\n \n except ImportError:\n raise ImportError(\"openai package required: pip install openai\")\n \n def _init_anthropic(self):\n \"\"\"Initialize Anthropic client.\"\"\"\n try:\n import anthropic\n \n self._client = anthropic.Anthropic(\n api_key=self.api_key or os.getenv(\"ANTHROPIC_API_KEY\"),\n )\n self.model = self.model or \"claude-3-5-sonnet-20241022\"\n \n except ImportError:\n raise ImportError(\"anthropic package required: pip install anthropic\")\n \n def _init_ollama(self):\n \"\"\"Initialize Ollama client.\"\"\"\n self.api_base = self.api_base or \"http://localhost:11434\"\n self.model = self.model or \"llama3.2\"\n \n def complete(\n self,\n prompt: str,\n temperature: float = 0.1,\n max_tokens: int = 4000,\n ) -> str:\n \"\"\"Generate completion.\"\"\"\n messages = [{\"role\": \"user\", \"content\": prompt}]\n return self.chat(messages, temperature, max_tokens)\n \n def chat(\n self,\n messages: List[Dict[str, str]],\n temperature: float = 0.1,\n max_tokens: int = 4000,\n ) -> str:\n \"\"\"Generate chat completion.\"\"\"\n if self.provider in (\"azure_openai\", \"openai\", \"openai_compatible\"):\n return self._openai_chat(messages, temperature, max_tokens)\n elif self.provider == \"anthropic\":\n return self._anthropic_chat(messages, temperature, max_tokens)\n elif self.provider == \"ollama\":\n return self._ollama_chat(messages, temperature, max_tokens)\n else:\n raise ValueError(f\"Unsupported provider: {self.provider}\")\n \n def _openai_chat(\n self,\n messages: List[Dict[str, str]],\n temperature: float,\n max_tokens: int,\n ) -> str:\n \"\"\"OpenAI/Azure chat completion.\"\"\"\n try:\n response = self._client.chat.completions.create(\n model=self.model,\n messages=messages,\n temperature=temperature,\n max_tokens=max_tokens,\n )\n return response.choices[0].message.content or \"\"\n except Exception as e:\n logger.error(f\"OpenAI chat error: {e}\")\n raise\n \n def _anthropic_chat(\n self,\n messages: List[Dict[str, str]],\n temperature: float,\n max_tokens: int,\n ) -> str:\n \"\"\"Anthropic chat completion.\"\"\"\n try:\n # Extract system message\n system = None\n chat_messages = []\n for msg in messages:\n if msg[\"role\"] == \"system\":\n system = msg[\"content\"]\n else:\n chat_messages.append(msg)\n \n kwargs = {\n \"model\": self.model,\n \"messages\": chat_messages,\n \"max_tokens\": max_tokens,\n }\n if system:\n kwargs[\"system\"] = system\n \n response = self._client.messages.create(**kwargs)\n return response.content[0].text\n except Exception as e:\n logger.error(f\"Anthropic chat error: {e}\")\n raise\n \n def _ollama_chat(\n self,\n messages: List[Dict[str, str]],\n temperature: float,\n max_tokens: int,\n ) -> str:\n \"\"\"Ollama chat completion.\"\"\"\n import requests\n \n try:\n response = requests.post(\n f\"{self.api_base}/api/chat\",\n json={\n \"model\": self.model,\n \"messages\": messages,\n \"stream\": False,\n \"options\": {\n \"temperature\": temperature,\n \"num_predict\": max_tokens,\n },\n },\n timeout=120,\n )\n response.raise_for_status()\n return response.json()[\"message\"][\"content\"]\n except Exception as e:\n logger.error(f\"Ollama chat error: {e}\")\n raise\n \n def analyze_image(\n self,\n image_b64: str,\n prompt: str = \"Describe this image in detail.\",\n ) -> str:\n \"\"\"Analyze an image using vision model.\"\"\"\n if self.provider in (\"azure_openai\", \"openai\", \"openai_compatible\"):\n messages = [\n {\n \"role\": \"user\",\n \"content\": [\n {\"type\": \"text\", \"text\": prompt},\n {\n \"type\": \"image_url\",\n \"image_url\": {\n \"url\": f\"data:image/jpeg;base64,{image_b64}\",\n },\n },\n ],\n }\n ]\n return self._openai_chat(messages, 0.1, 4000)\n elif self.provider == \"anthropic\":\n messages = [\n {\n \"role\": \"user\",\n \"content\": [\n {\n \"type\": \"image\",\n \"source\": {\n \"type\": \"base64\",\n \"media_type\": \"image/jpeg\",\n \"data\": image_b64,\n },\n },\n {\"type\": \"text\", \"text\": prompt},\n ],\n }\n ]\n return self._anthropic_chat(messages, 0.1, 4000)\n else:\n raise ValueError(f\"Vision not supported for provider: {self.provider}\")\n\n\ndef get_llm_provider(\n provider: str = \"openai\",\n api_key: Optional[str] = None,\n api_base: Optional[str] = None,\n api_version: Optional[str] = None,\n model: Optional[str] = None,\n deployment: Optional[str] = None,\n **kwargs,\n) -> LLMProvider:\n \"\"\"\n Factory function to create an LLM provider.\n \n Args:\n provider: Provider name:\n - \"openai\": OpenAI API\n - \"azure_openai\": Azure OpenAI Service\n - \"openai_compatible\": Any OpenAI-compatible API\n - \"anthropic\": Anthropic Claude\n - \"ollama\": Local Ollama models\n api_key: API key\n api_base: API base URL (required for openai_compatible)\n api_version: API version (Azure only)\n model: Model name\n deployment: Deployment name (Azure only)\n \n Returns:\n Configured LLMProvider instance\n \n Examples:\n # OpenAI\n llm = get_llm_provider(\"openai\", api_key=\"sk-...\")\n \n # OpenRouter (access 100+ models)\n llm = get_llm_provider(\n \"openai_compatible\",\n api_key=\"sk-or-v1-...\",\n api_base=\"https://openrouter.ai/api/v1\",\n model=\"google/gemini-2.5-flash\"\n )\n \n # Groq (fast inference)\n llm = get_llm_provider(\n \"openai_compatible\",\n api_key=\"gsk_...\",\n api_base=\"https://api.groq.com/openai/v1\",\n model=\"llama-3.1-70b-versatile\"\n )\n \n # Together AI\n llm = get_llm_provider(\n \"openai_compatible\",\n api_key=\"...\",\n api_base=\"https://api.together.xyz/v1\",\n model=\"meta-llama/Llama-3-70b-chat-hf\"\n )\n \"\"\"\n return LLMProvider(\n provider=provider,\n api_key=api_key,\n api_base=api_base,\n api_version=api_version,\n model=model,\n deployment=deployment,\n **kwargs,\n )\n\n\n# Convenience aliases for common providers\ndef openrouter(api_key: str, model: str, **kwargs) -> LLMProvider:\n \"\"\"Create an OpenRouter provider.\"\"\"\n return LLMProvider(\n provider=\"openai_compatible\",\n api_key=api_key,\n api_base=\"https://openrouter.ai/api/v1\",\n model=model,\n **kwargs,\n )\n\n\ndef groq(api_key: str, model: str = \"llama-3.1-70b-versatile\", **kwargs) -> LLMProvider:\n \"\"\"Create a Groq provider.\"\"\"\n return LLMProvider(\n provider=\"openai_compatible\",\n api_key=api_key,\n api_base=\"https://api.groq.com/openai/v1\",\n model=model,\n **kwargs,\n )\n\n\ndef together(api_key: str, model: str, **kwargs) -> LLMProvider:\n \"\"\"Create a Together AI provider.\"\"\"\n return LLMProvider(\n provider=\"openai_compatible\",\n api_key=api_key,\n api_base=\"https://api.together.xyz/v1\",\n model=model,\n **kwargs,\n )\n"}}}} |