{"id":30520217,"url":"https://github.com/tanantor/langgate","last_synced_at":"2025-08-26T15:29:22.313Z","repository":{"id":286707977,"uuid":"962218114","full_name":"Tanantor/langgate","owner":"Tanantor","description":"Lightweight AI inference gateway - local model registry \u0026 parameter transformer (Python SDK) - with optional Envoy proxy processor and FastAPI registry server deployment options.","archived":false,"fork":false,"pushed_at":"2025-08-18T13:39:14.000Z","size":974,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-18T13:42:31.512Z","etag":null,"topics":["ai","ai-gateway","ai-proxy","aiops","anthropic","azure-openai","bedrock","envoy","fastapi","gateway","langchain","langchain-python","llm","llm-gateway","llmops","mlops","openai","openai-proxy","registry","vertex-ai"],"latest_commit_sha":null,"homepage":"https://tanantor.github.io/langgate/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tanantor.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-07T20:34:44.000Z","updated_at":"2025-08-18T13:38:18.000Z","dependencies_parsed_at":"2025-06-09T02:25:09.910Z","dependency_job_id":"2b0c0cc9-bc7a-4b0d-b96d-ee2f23791e9f","html_url":"https://github.com/Tanantor/langgate","commit_stats":null,"previous_names":["tanantor/langgate"],"tags_count":70,"template":false,"template_full_name":null,"purl":"pkg:github/Tanantor/langgate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanantor%2Flanggate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanantor%2Flanggate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanantor%2Flanggate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanantor%2Flanggate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tanantor","download_url":"https://codeload.github.com/Tanantor/langgate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanantor%2Flanggate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272233926,"owners_count":24896912,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-26T02:00:07.904Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","ai-gateway","ai-proxy","aiops","anthropic","azure-openai","bedrock","envoy","fastapi","gateway","langchain","langchain-python","llm","llm-gateway","llmops","mlops","openai","openai-proxy","registry","vertex-ai"],"created_at":"2025-08-26T15:29:17.814Z","updated_at":"2025-08-26T15:29:22.302Z","avatar_url":"https://github.com/Tanantor.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# LangGate AI Gateway\n\u003cp align=\"left\"\u003e\n  \u003ca href=\"https://pypi.org/project/langgate\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/pypi/pyversions/langgate.svg\" alt=\"Python versions\"\u003e\u003c/a\u003e \u003ca href=\"https://pypi.org/project/langgate\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/pypi/v/langgate\" alt=\"PyPI\"\u003e\u003c/a\u003e \u003ca href=\"https://github.com/Tanantor/langgate/actions?query=workflow%3A%22CI+Checks%22\" target=\"_blank\"\u003e\u003cimg src=\"https://github.com/Tanantor/langgate/actions/workflows/ci.yaml/badge.svg?event=push\u0026branch=main\" alt=\"CI Checks\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/Tanantor/langgate/tree/main/tests\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/badge/dynamic/xml?url=https://tanantor.github.io/langgate/coverage/test-count.xml\u0026query=//testcount\u0026label=tests\u0026color=blue\u0026style=flat\" alt=\"Tests\"\u003e\u003c/a\u003e \u003ca href=\"https://github.com/Tanantor/langgate/actions?query=workflow%3ACI\" target=\"_blank\"\u003e\u003cimg src=\"https://tanantor.github.io/langgate/coverage/coverage-badge.svg\" alt=\"Coverage\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nLangGate is a lightweight, high-performance gateway for AI model inference.\n\nLangGate adapts to your architecture: integrate it as a Python SDK, run it as a standalone registry, or deploy it as a complete proxy server.\n\nLangGate works with any AI provider, without forcing standardization to a specific API format. Apply custom parameter mappings or none at all - you decide.\n\nLangGate by default avoids unnecessary transformation.\n\n## Core Features\n\n- **Provider-Agnostic**: Works with any AI inference provider (OpenAI, Anthropic, Google, etc.)\n- **Flexible Parameter Transformations**: Apply custom parameter mappings or none at all - you decide\n- **High-Performance Proxying**: Uses Envoy for efficient request handling with direct response streaming\n- **Simple Configuration**: Clean YAML configuration inspired by familiar formats\n- **Minimal Architecture**: Direct integration with Envoy, without complex control plane overhead\n- **SDK First Approach**: Use the registry as a standalone module without the proxy service\n\n## Architecture\n\nLangGate uses a simplified architecture with three main components:\n\n1. **Envoy Proxy**: Front-facing proxy that receives API requests and handles response streaming\n2. **External Processor**: gRPC service implementing Envoy's External Processing filter for request transformation and routing\n3. **Registry Service**: Manages model mappings, parameter transformations, and provider configurations\n\nThe system works as follows:\n\n1. **Request Flow**: Client sends request → Envoy → External Processor transforms request → Envoy routes to appropriate AI provider\n2. **Response Flow**: AI provider response → Envoy streams directly to client\n\nThis architecture provides several advantages:\n- No control plane overhead or complex deployment requirements\n- Direct response streaming from providers through Envoy for optimal performance\n- Flexible deployment options, from local development to production environments\n\n## Getting Started\n\n### Using the Registry SDK\nThe LangGate SDK is designed to be used as a standalone module, allowing you to integrate it into your existing applications without the need for the proxy service.\nThis is particularly useful for local development or when you want to use LangGate's features without deploying the full stack.\nYou probably won't need the proxy unless scaling your application to a microservice architecture or if you have multiple apps in a Kubernetes cluster that each depend on a registry.\nYou can switch from the SDK's local registry client to the remote registry client + proxy setup with minimal code changes.\n#### Installation\nWe recommend using [uv](https://docs.astral.sh/uv/) to manage Python projects. In a uv project, add `langgate[sdk]` to dependencies by running:\n```bash\nuv add langgate[sdk]\n```\nAlternatively, using pip:\n\n```bash\npip install langgate[sdk]\n```\n\nFor more information on package components and installation options for specific use cases, see the  [packages documentation](packages/README.md).\n#### Example Usage\n\nThe package includes a `LangGateLocal` client that can be used directly in your application without needing to run the proxy service. This client provides access to both language and image model registries, plus parameter transformation features.\n\n**List Available Models:**\n\n```py\nfrom pprint import pprint as pp\nfrom langgate.sdk import LangGateLocal\n\nclient = LangGateLocal()\n\n# List available LLMs\nllms = await client.list_llms()\nprint(f\"Available LLMs: {len(llms)}\")\nfor model in llms[:3]:\n    print(f\"- {model.id}: {model.name}\")\n\n# List available image models\nimage_models = await client.list_image_models()\nprint(f\"Available Image Models: {len(image_models)}\")\nfor model in image_models[:3]:\n    print(f\"- {model.id}: {model.name}\")\n```\n```text\nAvailable LLMs: 5\n- openai/gpt-5-chat: ChatGPT-5\n- openai/gpt-5: GPT-5\n- openai/gpt-5-high: GPT-5 high\n- anthropic/claude-sonnet-4: Claude-4 Sonnet\n- anthropic/claude-sonnet-4-reasoning: Claude-4 Sonnet R\n\n==================================================\n\nAvailable Image Models: 4\n- openai/gpt-image-1: GPT Image 1\n- openai/dall-e-3: DALL-E 3\n- black-forest-labs/flux-dev: FLUX.1 [dev]\n- stability-ai/sd-3.5-large: SD 3.5 Large\n```\n\n**Get Model Information and Transform Parameters:**\n\n```py\n# LangGate allows us to register \"virtual models\" - models with specific parameters.\n# `langgate_config.yaml` defines this `claude-sonnet-4-reasoning` model\n# which is a wrapper around the `claude-sonnet-4-0` model,\n# with specific parameters and metadata.\nmodel_id = \"anthropic/claude-sonnet-4-reasoning\"\n\n# Get model info\nmodel_info = await client.get_llm_info(model_id)\nprint(f\"Model: {model_info.name}\")\nprint(f\"Provider: {model_info.provider.name}\")\n\n# Transform parameters\ninput_params = {\"temperature\": 0.7, \"stream\": True}\napi_format, transformed = await client.get_params(model_id, input_params)\nprint(f\"API format: {api_format}\")\npp(transformed)\n```\n```\nModel: Claude-4 Sonnet R\nProvider: Anthropic\nDescription: Claude-4 Sonnet with reasoning capabilities.\n\nTransformed parameters:\n('anthropic',\n {'api_key': SecretStr('**********'),\n  'base_url': 'https://api.anthropic.com',\n  'model': 'claude-sonnet-4-0',\n  'stream': True,\n  'thinking': {'budget_tokens': 1024, 'type': 'enabled'}})\n```\n\nThe `temperature` parameter is removed because temperature is not supported by Claude models with reasoning enabled. The `thinking` parameter is added with the `budget_tokens` we specify in `langgate_config.yaml`. See the below [Configuration](#configuration) section for more details on how LangGate handles parameter transformations.\n\n**Working with Image Models:**\nTransforming parameters for image models is the exact same process as for LLMs.\n```py\n# Transform parameters for an image model\nimage_model_id = \"openai/gpt-image-1\"\nimage_params = {\n    \"prompt\": \"A beautiful sunset over the ocean\",\n    \"size\": \"1024x1024\",\n    \"quality\": \"medium\",\n}\n\napi_format, transformed = await client.get_params(image_model_id, image_params)\nprint(f\"API format: {api_format}\")\npp(transformed)\n```\n```text\nAPI format: openai\n{'api_key': SecretStr('**********'),\n 'base_url': 'https://api.openai.com/v1',\n 'model': 'gpt-image-1',\n 'prompt': 'A beautiful sunset over the ocean',\n 'quality': 'medium',\n 'size': '1024x1024'}\n```\n\n#### Example integration with Langchain:\nThe following is an example of how you might define a factory class to create a Langchain `BaseChatModel` instance configured via the `LangGateLocal` client:\n```py\nimport os\n\n# Ensure you have the required environment variables set\nos.environ[\"OPENAI_API_KEY\"] = \"\u003cYOUR_API_KEY\u003e\"\n\n# The below environment variables are optional.\n\n# The yaml config resolution priority is: args \u003e env \u003e cwd \u003e package default.\n# If you don't want to use either the package default (langgate/core/data/default_config.yaml)\n# or a config in your cwd, set:\n# os.environ[\"LANGGATE_CONFIG\"] = \"some_other_path_not_in_your_cwd/langgate_config.yaml\"\n\n# The models data resolution priority is: args \u003e env \u003e cwd \u003e package default\n# By default, any user-defined `langgate_models.json` files are merged with default models data. See `models_merge_mode` configuration.\n# If you don't want to use either the package default (langgate/registry/data/default_models.json)\n# or a models data file in your cwd, set:\n# os.environ[\"LANGGATE_MODELS\"] = \"some_other_path_not_in_your_cwd/langgate_models.json\"\n\n# The .env file resolution priority is: args \u003e env \u003e cwd \u003e None\n# If you don't want to use either the package default or a .env file in your cwd, set:\n# os.environ[\"LANGGATE_ENV_FILE\"] = \"some_other_path_not_in_your_cwd/.env\"\n```\n```py\nfrom typing import Any\nfrom pprint import pprint as pp\n\nfrom langchain.chat_models.base import BaseChatModel\nfrom langchain_anthropic import ChatAnthropic\nfrom langchain_openai import ChatOpenAI\n\nfrom langgate.sdk import LangGateLocal, LangGateLocalProtocol\nfrom langgate.core.models import (\n    # `ModelProviderId` is a string alias for better type safety\n    ModelProviderId,\n    # ids for common providers are included for convenience\n    MODEL_PROVIDER_OPENAI,\n    MODEL_PROVIDER_ANTHROPIC,\n)\n\n# Map providers to model classes\nMODEL_CLASS_MAP: dict[ModelProviderId, type[BaseChatModel]] = {\n    MODEL_PROVIDER_OPENAI: ChatOpenAI,\n    MODEL_PROVIDER_ANTHROPIC: ChatAnthropic,\n}\n\n\nclass ModelFactory:\n    \"\"\"\n    Factory for creating a Langchain `BaseChatModel` instance\n    with paramaters from LangGate.\n    \"\"\"\n\n    def __init__(self, langgate_client: LangGateLocalProtocol | None = None):\n        self.langgate_client = langgate_client or LangGateLocal()\n\n    async def create_model(\n        self, model_id: str, input_params: dict[str, Any] | None = None\n    ) -\u003e tuple[BaseChatModel, dict[str, Any]]:\n        \"\"\"Create a model instance for the given model ID.\"\"\"\n        params = {\"temperature\": 0.7, \"streaming\": True}\n        if input_params:\n            params.update(input_params)\n\n        # Get model info from the registry cache\n        model_info = await self.langgate_client.get_model_info(model_id)\n\n        # Transform parameters using the transformer client\n        # If switching to using the proxy, you would remove this line\n        # and let the proxy handle the parameter transformation instead.\n        api_format, model_params = await self.langgate_client.get_params(\n            model_id, params\n        )\n        # api_format defaults to the provider id unless specified in the config.\n        # e.g. Specify \"openai\" for OpenAI-compatible APIs, etc.\n        print(\"API format:\", api_format)\n        pp(model_params)\n\n        # Get the appropriate model class based on provider\n        client_cls_key = ModelProviderId(api_format)\n        model_class = MODEL_CLASS_MAP.get(client_cls_key)\n        if not model_class:\n            raise ValueError(f\"No model class for provider {model_info.provider.id}\")\n\n        # Create model instance with parameters\n        model = model_class(**model_params)\n\n        # Create model info dict\n        model_metadata = model_info.model_dump(exclude_none=True)\n\n        return model, model_metadata\n```\n```py\nmodel_factory = ModelFactory()\nmodel_id = \"openai/gpt-5\"\nmodel = await model_factory.create_model(model_id, {\"temperature\": 0.7})\nmodel\n```\n```text\nAPI format: openai\n\n{'api_key': SecretStr('**********'),\n 'base_url': 'https://api.openai.com/v1',\n 'include_reasoning': True,\n 'model': 'gpt-5',\n 'streaming': True}\n\nChatOpenAI(client=\u003copenai.resources.chat.completions.completions.Completions object at 0x10cbacec0\u003e, async_client=\u003copenai.resources.chat.completions.completions.AsyncCompletions object at 0x10cbad940\u003e, root_client=\u003copenai.OpenAI object at 0x10c40e270\u003e, root_async_client=\u003copenai.AsyncOpenAI object at 0x10cbad6a0\u003e, model_name='gpt-5', model_kwargs={'include_reasoning': True}, openai_api_key=SecretStr('**********'), openai_api_base='https://api.openai.com/v1', streaming=True)\n```\nIf you want to use the LangGate Envoy proxy instead of `LangGateLocal`,  you can switch to the `HTTPRegistryClient` with minimal code changes.\n\nFor more usage patterns and detailed instructions, see  [examples](examples/README.md).\n\n### Envoy Proxy Service (Coming Soon)\n\nThe LangGate proxy feature is currently in development. When completed, it will provide:\n\n1. Centralized model registry accessible via API\n2. Parameter transformation at the proxy level\n3. API key management and request routing\n4. High-performance response streaming via Envoy\n\n## Configuration\n\nLangGate uses a simple YAML configuration format:\n\n```yaml\n# langgate_config.yaml\n# Main configuration file for LangGate\n\n# Global default parameters by modality (applied to all models unless overridden)\ndefault_params:\n  text:\n    temperature: 0.7\n\n# Service provider configurations\nservices:\n  openai:\n    api_key: \"${OPENAI_API_KEY}\"\n    base_url: \"https://api.openai.com/v1\"\n    model_patterns:\n      # match any o-series model\n      openai/o:\n        remove_params:\n          - temperature\n\n  anthropic:\n    api_key: \"${ANTHROPIC_API_KEY}\"\n    base_url: \"https://api.anthropic.com\"\n    model_patterns:\n      # match any model with reasoning in the id\n      reasoning:\n        override_params:\n          thinking:\n            type: enabled\n        remove_params:\n          - temperature\n\n  replicate:\n    api_key: \"${REPLICATE_API_KEY}\"\n\n# Model-specific configurations organized by modality\nmodels:\n  text:\n    - id: openai/gpt-5-chat\n      service:\n        provider: openai\n        model_id: gpt-5-chat-latest\n\n    - id: openai/gpt-5\n      service:\n        provider: openai\n        model_id: gpt-5\n      override_params:\n        include_reasoning: true\n\n    # \"virtual model\" that wraps the gpt-5 model with high-effort reasoning\n    - id: openai/gpt-5-high\n      service:\n        provider: openai\n        model_id: gpt-5\n      name: GPT-5 high\n      description: gpt-5-high applies high-effort reasoning for the gpt-5 model\n      override_params:\n        reasoning_effort: high\n\n    - id: anthropic/claude-sonnet-4\n      service:\n        provider: anthropic\n        model_id: claude-sonnet-4-0\n\n    # \"virtual model\" that wraps the claude-sonnet-4-0 model with reasoning\n    - id: anthropic/claude-sonnet-4-reasoning\n      service:\n        provider: anthropic\n        model_id: claude-sonnet-4-0\n      name: Claude-4 Sonnet R\n      description: \"Claude-4 Sonnet with reasoning capabilities.\"\n      override_params:\n        thinking:\n          budget_tokens: 1024\n\n  image:\n    - id: openai/gpt-image-1\n      service:\n        provider: openai\n        model_id: gpt-image-1\n\n    - id: openai/dall-e-3\n      service:\n        provider: openai\n        model_id: dall-e-3\n\n    - id: black-forest-labs/flux-dev\n      service:\n        provider: replicate\n        model_id: black-forest-labs/flux-dev\n      default_params:\n        disable_safety_checker: true\n\n    - id: stability-ai/sd-3.5-large\n      service:\n        provider: replicate\n        model_id: stability-ai/stable-diffusion-3.5-large\n\n# Models merge mode for loading data from JSON files: \"merge\" (default), \"replace\", or \"extend\"\n# - merge: User models override defaults, new models are added\n# - replace: Only use user models (ignore default models file)\n# - extend: Add user models to defaults, error on conflicts\nmodels_merge_mode: merge\n\n```\n\n### Parameter Transformation Precedence\n\nWhen transforming parameters for model requests, LangGate follows a specific precedence order:\n\n#### Defaults (applied only if key doesn't exist yet):\n1. Model-specific defaults (highest precedence for defaults)\n2. Pattern defaults (matching patterns applied in config order)\n3. Service provider defaults\n4. Global defaults (lowest precedence for defaults)\n\n#### Overrides/Removals/Renames (applied in order, later steps overwrite/modify earlier ones):\n1. Input parameters (initial state)\n2. Service-level API keys and base URLs\n3. Service-level overrides, removals, renames\n4. Pattern-level overrides, removals, renames (matching patterns applied in config order)\n5. Model-specific overrides, removals, renames (highest precedence)\n6. Model ID (always overwritten with service_model_id)\n7. Environment variable substitution (applied last to all string values)\n\n## Environment Variables\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| LANGGATE_CONFIG | Path to the main configuration file | ./langgate_config.yaml |\n| LANGGATE_MODELS | Path to the models data JSON file | ./langgate_models.json |\n| LANGGATE_ENV_FILE | Path to the .env file | ./.env |\n| LOG_LEVEL | Logging level | info |\n\n### Models Merge Behavior\n\nYou can add additional models to LangGate's model registry by creating a `langgate_models.json` file in your working directory, or by setting the `LANGGATE_MODELS` environment variable to point to a custom JSON file.\n\nLangGate supports three modes for including extra models beyond those we ship with the package (`default_models.json`):\n- **merge** (default): Your defined models are merged with default models, with your models taking precedence\n- **replace**: Only your models are used\n- **extend**: your models are added to defaults, conflicts cause errors\n\nConfigure this with `models_merge_mode` in your YAML configuration.\n\nNote:\n- If `langgate_models.json` is unset in your working directory, and no `LANGGATE_MODELS` environment variable is set, then the registry package default `langgate/registry/data/default_models.json` will be used. This file contains data on most major providers and models.\n- If `langgate_config.yaml` is unset in your working directory, and no `LANGGATE_CONFIG` environment variable is set, then the core package default `langgate/core/data/default_config.yaml` will be used. This file contains a default configuration with common LLM providers.\n\n## LangGate vs Alternatives\n\n### LangGate vs Envoy AI Gateway\n\nWhile both use Envoy for proxying, LangGate takes a more direct approach:\n\n- **Simplified Architecture**: LangGate uses Envoy's ext_proc filter directly without a separate control plane\n- **No Kubernetes Dependency**: Runs anywhere Docker runs, without requiring Kubernetes CRDs or custom resources\n- **Configuration Simplicity**: Uses a straightforward YAML configuration instead of Kubernetes resources\n- **Lightweight Deployment**: Deploy with Docker Compose or any container platform without complex orchestration\n\n### LangGate vs Python-based Gateways\n\nUnlike other Python-based gateways:\n\n- **High-Performance Streaming**: Uses Envoy's native streaming capabilities instead of Python for response handling\n- **Focused Functionality**: Handles request transformation in Python while letting Envoy manage the high-throughput parts\n- **No Middleman for Responses**: Responses stream directly from providers to clients via Envoy\n\n## Running with Docker\n\n```bash\n# Start the full LangGate stack\nmake compose-up\n\n# Development mode with hot reloading\nmake compose-dev\n\n# Local development (Python on host, Envoy in Docker)\nmake run-local\n\n# Stop the stack\nmake compose-down\n\n# Stop stack and remove volumes\nmake compose-breakdown\n```\n\n## Testing and Development\n\n```bash\n# Run all tests\nmake test\n\n# Run lint checks\nmake lint\n```\n\n## Additional Documentation\n\n- [Contributing Guide](CONTRIBUTING.md) - Development setup and guidelines\n- [SDK Examples](examples/README.md) - Sample code for using the LangGate SDK\n- [Deployment Guide](deployment/README.md) - Instructions for deploying to Kubernetes and other platforms\n\n## Roadmap\n- **Pydantic Schema Validation**: Implement validation of parameters against Pydantic schemas representing the full API of the provider's model\n- **TTS and ASR Model Support**: Include leading Text-to-Speech (TTS) and Automatic Speech Recognition (ASR) models in the default model registry, with endpoints for fetching models filtered by modality (for modality-specific return typing) and schemas for these modalities.\n- **Video Generation Model Support**: Add video generation models, similarly to the afformentioned modalities, with an explicit endpoint and schemas.\n- **OpenAI API Standardization Option**: Introduce an option to standardize to the OpenAI API spec. This will involve mapping provider-specific Pydantic schemas to corresponding OpenAI API input schemas, offering a unified interface for diverse models.\n\n## License\n\n[MIT License](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanantor%2Flanggate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftanantor%2Flanggate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanantor%2Flanggate/lists"}