{"repo": "chaitanya14/maxllm", "files": {"maxllm.toml": {"ad92bff3212e638e6d055bfa300d40fc1a5d817f": {"t": 1785745363.7624085, "n": 10626, "h": "7811963fea24223a", "c": "# MaxLLM Gateway Configuration\n# Environment variables can be referenced with ${VAR_NAME} syntax.\n\n# Global plugins run on every request, in order.\nglobal_plugins = [\"request_id\", \"api_auth\"]\n\n[server]\nlisten = \"0.0.0.0:8080\"\nthreads = 4\n# tcp_reuseport = true\n# tcp_fastopen = 256\n\n[metrics]\nenabled = true\n\n# --- Model Aliases ---\n# Map requested model names to actual model names.\n[model_aliases]\n\"gpt-4\" = \"gpt-4o\"\n\"claude-3\" = \"claude-sonnet-4-20250514\"\n\n# --- Admin API (optional) ---\n[admin]\nmaster_key = \"sk-maxllm-dev-key\"\nenabled = true\ndb_path = \"maxllm.db\"\n\n# --- Model Cost Overrides (supplement built-in costs) ---\n# [model_costs.\"custom-model\"]\n# input_per_1m = 1.00\n# output_per_1m = 3.00\n\n# --- Plugins ---\n\n[plugins.request_id]\ncategory = \"request_id\"\nheader_name = \"X-Request-Id\"\n\n[plugins.api_auth]\ncategory = \"key_auth\"\nheader = \"Authorization\"\nstrip_prefix = \"Bearer \"\nkeys = [\"sk-maxllm-dev-key\"]\n\n# [plugins.ip_guard]\n# category = \"ip_restriction\"\n# type = \"deny\"\n# ip_list = [\"10.0.0.0/8\"]\n\n[plugins.rate_limiter]\ncategory = \"rate_limit\"\nrequests_per_minute = 600\nkey = \"client_ip\"\n\n[plugins.cors]\ncategory = \"cors\"\nallow_origin = \"*\"\nallow_methods = \"GET, POST, OPTIONS\"\nallow_headers = \"Content-Type, Authorization\"\nmax_age = \"86400\"\n\n# [plugins.response_cache]\n# category = \"cache\"\n# max_entries = 10000\n# default_ttl_secs = 3600\n\n# [plugins.webhook_logger]\n# category = \"webhook\"\n# target = \"maxllm::webhook\"\n# include_body = false\n\n# [plugins.pii_guard]\n# category = \"pii_filter\"\n# patterns = [\"email\", \"ssn\", \"credit_card\", \"phone\"]\n# action = \"block\"\n# mode = \"pre_call\"\n\n# [plugins.keyword_guard]\n# category = \"keyword_block\"\n# keywords = [\"DROP TABLE\", \"ignore previous instructions\"]\n# case_sensitive = false\n\n# [plugins.size_limit]\n# category = \"max_size\"\n# max_body_bytes = 1048576\n# max_tokens = 128000\n\n# [plugins.prompt_guard]\n# category = \"prompt_guard\"\n# action = \"block\" # block | log_only\n# rules = [\"system_override\", \"role_play_jailbreak\", \"developer_mode\",\n# \"encoding_evasion\", \"delimiter_injection\", \"instruction_leak\"]\n# # Custom rules:\n# # [[plugins.prompt_guard.custom_rules]]\n# # name = \"company_policy\"\n# # regex = \"(?i)reveal.*internal.*policy\"\n\n# [plugins.secret_scan]\n# category = \"secret_scan\"\n# action = \"block\" # block | redact | log_only\n# patterns = [\"aws_access_key\", \"aws_secret_key\", \"github_token\",\n# \"gitlab_token\", \"slack_token\", \"jwt\", \"private_key\",\n# \"password_in_url\", \"generic_api_key\"]\n# # Custom patterns:\n# # [[plugins.secret_scan.custom_patterns]]\n# # name = \"internal_token\"\n# # regex = \"mxl_[A-Za-z0-9]{32}\"\n# # replacement = \"[INTERNAL_TOKEN]\"\n\n# [plugins.regex_guard]\n# category = \"regex_guard\"\n# action = \"block\" # block | redact | log_only\n# mode = \"pre_call\" # pre_call | post_call | both\n# [[plugins.regex_guard.rules]]\n# name = \"sql_injection\"\n# regex = '(?i)\\b(?:SELECT|INSERT|UPDATE|DELETE|DROP)\\b.*\\b(?:FROM|INTO|TABLE|SET)\\b'\n# [[plugins.regex_guard.rules]]\n# name = \"internal_id\"\n# regex = 'PROJ-\\d+'\n# replacement = \"[INTERNAL_ID]\"\n\n# --- Providers ---\n\n[providers.openai]\nkind = \"openai\"\nbase_url = \"https://api.openai.com\"\napi_key = \"${OPENAI_API_KEY}\"\ndefault_model = \"gpt-4o\"\n\n[providers.anthropic]\nkind = \"anthropic\"\nbase_url = \"https://api.anthropic.com\"\napi_key = \"${ANTHROPIC_API_KEY}\"\ndefault_model = \"claude-sonnet-4-20250514\"\n\n[providers.gemini]\nkind = \"gemini\"\nbase_url = \"https://generativelanguage.googleapis.com\"\napi_key = \"${GEMINI_API_KEY}\"\ndefault_model = \"gemini-2.5-flash\"\n\n# [providers.azure_gpt4]\n# kind = \"azure_openai\"\n# base_url = \"https://my-resource.openai.azure.com\"\n# api_key = \"${AZURE_OPENAI_KEY}\"\n# deployment = \"gpt-4o\"\n# api_version = \"2024-02-01\"\n\n# [providers.groq]\n# kind = \"groq\"\n# base_url = \"https://api.groq.com\"\n# api_key = \"${GROQ_API_KEY}\"\n\n# [providers.together]\n# kind = \"together\"\n# base_url = \"https://api.together.xyz\"\n# api_key = \"${TOGETHER_API_KEY}\"\n\n# [providers.fireworks]\n# kind = \"fireworks\"\n# base_url = \"https://api.fireworks.ai\"\n# api_key = \"${FIREWORKS_API_KEY}\"\n\n# [providers.mistral]\n# kind = \"mistral\"\n# base_url = \"https://api.mistral.ai\"\n# api_key = \"${MISTRAL_API_KEY}\"\n\n# [providers.deepseek]\n# kind = \"deepseek\"\n# base_url = \"https://api.deepseek.com\"\n# api_key = \"${DEEPSEEK_API_KEY}\"\n\n# [providers.xai]\n# kind = \"xai\"\n# base_url = \"https://api.x.ai\"\n# api_key = \"${XAI_API_KEY}\"\n\n[providers.ollama]\nkind = \"ollama\"\nbase_url = \"http://127.0.0.1:11434\"\ndefault_model = \"gemma3:1b\"\n\n# [providers.cohere]\n# kind = \"cohere\"\n# base_url = \"https://api.cohere.com\"\n# api_key = \"${COHERE_API_KEY}\"\n\n# Mock provider for perf testing (run: python3 perf/mock_upstream.py)\n[providers.mock]\nkind = \"openai\"\nbase_url = \"http://127.0.0.1:9999\"\napi_key = \"mock\"\n\n# --- Routes ---\n\n[[routes]]\npath = \"/v1/chat/completions\"\nprovider = \"openai\"\nfallback = [\"anthropic\"]\ntimeout_secs = 120\nstrategy = \"fallback\"\nplugins = [\"rate_limiter\", \"cors\"]\n# guardrails = [\"injection-guard\", \"pii-check\", \"secret-scan\"] # Only these guardrails run for this route\n\n[[routes]]\npath = \"/v1/anthropic\"\nprovider = \"anthropic\"\nfallback = [\"openai\"]\nplugins = [\"rate_limiter\", \"cors\"]\n# guardrails = [\"injection-guard\"] # Minimal guardrails for this route\n\n[[routes]]\npath = \"/v1/ollama\"\nprovider = \"ollama\"\ntimeout_secs = 120\nplugins = [\"rate_limiter\", \"cors\"]\n# guardrails = [] # Empty = all default_on guardrails apply\n\n[[routes]]\npath = \"/v1/gemini\"\nprovider = \"gemini\"\ntimeout_secs = 120\nplugins = [\"rate_limiter\", \"cors\"]\n\n# Mock route for perf testing (no rate limit)\n[[routes]]\npath = \"/v1/mock\"\nprovider = \"mock\"\ntimeout_secs = 10\nplugins = [\"cors\"]\n\n# Bare proxy route — no plugins, pure routing + upstream (perf baseline)\n[[routes]]\npath = \"/v1/proxy\"\nprovider = \"mock\"\ntimeout_secs = 10\nplugins = []\n\n# --- Native Provider Endpoints ---\n# Accept provider-native request format directly (no translation).\n# Clients use the provider's own SDK/format, gateway adds auth + logging.\n\n# Anthropic Messages API (native format)\n# curl -d '{\"model\":\"claude-sonnet-4-20250514\",\"max_tokens\":1024,\"messages\":[...]}' /v1/messages\n# [[routes]]\n# path = \"/v1/messages\"\n# provider = \"anthropic\"\n# endpoint_type = \"native\"\n# timeout_secs = 120\n# plugins = [\"rate_limiter\", \"cors\"]\n\n# Gemini generateContent API (native format)\n# curl -d '{\"contents\":[{\"parts\":[{\"text\":\"Hello\"}]}]}' /v1beta/models/gemini-2.5-flash:generateContent\n# [[routes]]\n# path = \"/v1beta/models\"\n# provider = \"gemini\"\n# endpoint_type = \"native\"\n# timeout_secs = 120\n# plugins = [\"rate_limiter\", \"cors\"]\n\n# --- Pass-Through Endpoints ---\n# Raw proxy to provider APIs — zero body parsing or translation.\n# Client-supplied path suffix is forwarded to the provider's base URL.\n\n# Pass-through to Anthropic (any endpoint)\n# curl /passthrough/anthropic/v1/messages -d '...'\n# [[routes]]\n# path = \"/passthrough/anthropic\"\n# provider = \"anthropic\"\n# endpoint_type = \"passthrough\"\n# plugins = [\"rate_limiter\"]\n\n# Pass-through to OpenAI (any endpoint)\n# curl /passthrough/openai/v1/chat/completions -d '...'\n# [[routes]]\n# path = \"/passthrough/openai\"\n# provider = \"openai\"\n# endpoint_type = \"passthrough\"\n# plugins = [\"rate_limiter\"]\n\n# Pass-through to Gemini (any endpoint)\n# curl /passthrough/gemini/v1beta/models/gemini-2.5-flash:generateContent -d '...'\n# [[routes]]\n# path = \"/passthrough/gemini\"\n# provider = \"gemini\"\n# endpoint_type = \"passthrough\"\n# plugins = [\"rate_limiter\"]\n\n# --- Guardrails (content inspection) ---\n# Guardrails operate on parsed message content, not raw HTTP.\n# Clients can select guardrails per-request: {\"guardrails\": [\"pii-check\", \"injection-guard\"]}\n# default_on guardrails always run regardless of client request.\n\n# [[guardrails]]\n# name = \"injection-guard\"\n# provider = \"prompt_guard\" # Built-in: prompt_guard, pii_filter, secret_scan, keyword_block, regex_guard\n# mode = \"pre_call\" # pre_call | post_call | both\n# default_on = true # Always run, even if client doesn't request it\n# action = \"block\" # block | log_only\n# rules = [\"system_override\", \"role_play_jailbreak\", \"developer_mode\",\n# \"encoding_evasion\", \"delimiter_injection\", \"instruction_leak\"]\n\n# [[guardrails]]\n# name = \"pii-check\"\n# provider = \"pii_filter\"\n# mode = \"both\" # Check both input and output\n# default_on = true\n# action = \"redact\" # Redact PII instead of blocking\n# patterns = [\"email\", \"ssn\", \"credit_card\", \"phone\"]\n\n# [[guardrails]]\n# name = \"secret-scan\"\n# provider = \"secret_scan\"\n# mode = \"pre_call\"\n# default_on = true\n# action = \"block\"\n# patterns = [\"aws_access_key\", \"github_token\", \"jwt\", \"private_key\", \"generic_api_key\"]\n\n# [[guardrails]]\n# name = \"keyword-filter\"\n# provider = \"keyword_block\"\n# mode = \"pre_call\"\n# default_on = false # Only runs when client requests it\n# action = \"block\"\n# keywords = [\"DROP TABLE\", \"ignore previous instructions\"]\n\n# [[guardrails]]\n# name = \"custom-safety\"\n# provider = \"webhook\" # Generic HTTP API (works with any guardrail service)\n# mode = \"pre_call\"\n# default_on = false\n# action = \"block\"\n# api_base = \"https://safety.internal/v1/check\"\n# api_key = \"${SAFETY_API_KEY}\"\n# timeout_secs = 5\n# [guardrails.headers]\n# X-Custom-Header = \"value\"\n\n# [[guardrails]]\n# name = \"lakera-guard\"\n# provider = \"lakera\" # Lakera AI prompt injection detection\n# mode = \"pre_call\"\n# default_on = true\n# action = \"block\"\n# api_key = \"${LAKERA_API_KEY}\"\n# api_base = \"https://api.lakera.ai/v2/guard\" # Optional, this is the default\n\n# [[guardrails]]\n# name = \"cel-policy\"\n# provider = \"cel\" # CEL expression-based policy rules\n# mode = \"pre_call\"\n# default_on = true\n# action = \"block\"\n# [[guardrails.rules]]\n# name = \"max-prompt-size\"\n# expr = 'size(content) > 50000'\n# message = \"Prompt exceeds maximum allowed size\"\n# [[guardrails.rules]]\n# name = \"require-auth\"\n# expr = 'client_id == \"\"'\n# message = \"Authentication required\"\n# [[guardrails.rules]]\n# name = \"block-confidential\"\n# expr = 'content.contains(\"CONFIDENTIAL\")'\n# message = \"Confidential content not allowed\"\n\n# Example: weighted load balancing across multiple providers\n# [[routes]]\n# path = \"/v1/balanced\"\n# provider = \"openai\"\n# fallback = [\"anthropic\", \"groq\"]\n# strategy = \"weighted\"\n# plugins = [\"rate_limiter\", \"cors\"]\n\n# Example: round-robin for even distribution\n# [[routes]]\n# path = \"/v1/roundrobin\"\n# provider = \"groq\"\n# fallback = [\"together\", \"fireworks\"]\n# strategy = \"round_robin\"\n# plugins = [\"rate_limiter\"]\n"}, "ffcc6bb8ccbe9a72e423d7888f104ca3687952a0": {"t": 1785750744.7927456, "n": 10626, "h": "7811963fea24223a", "c": "# MaxLLM Gateway Configuration\n# Environment variables can be referenced with ${VAR_NAME} syntax.\n\n# Global plugins run on every request, in order.\nglobal_plugins = [\"request_id\", \"api_auth\"]\n\n[server]\nlisten = \"0.0.0.0:8080\"\nthreads = 4\n# tcp_reuseport = true\n# tcp_fastopen = 256\n\n[metrics]\nenabled = true\n\n# --- Model Aliases ---\n# Map requested model names to actual model names.\n[model_aliases]\n\"gpt-4\" = \"gpt-4o\"\n\"claude-3\" = \"claude-sonnet-4-20250514\"\n\n# --- Admin API (optional) ---\n[admin]\nmaster_key = \"sk-maxllm-dev-key\"\nenabled = true\ndb_path = \"maxllm.db\"\n\n# --- Model Cost Overrides (supplement built-in costs) ---\n# [model_costs.\"custom-model\"]\n# input_per_1m = 1.00\n# output_per_1m = 3.00\n\n# --- Plugins ---\n\n[plugins.request_id]\ncategory = \"request_id\"\nheader_name = \"X-Request-Id\"\n\n[plugins.api_auth]\ncategory = \"key_auth\"\nheader = \"Authorization\"\nstrip_prefix = \"Bearer \"\nkeys = [\"sk-maxllm-dev-key\"]\n\n# [plugins.ip_guard]\n# category = \"ip_restriction\"\n# type = \"deny\"\n# ip_list = [\"10.0.0.0/8\"]\n\n[plugins.rate_limiter]\ncategory = \"rate_limit\"\nrequests_per_minute = 600\nkey = \"client_ip\"\n\n[plugins.cors]\ncategory = \"cors\"\nallow_origin = \"*\"\nallow_methods = \"GET, POST, OPTIONS\"\nallow_headers = \"Content-Type, Authorization\"\nmax_age = \"86400\"\n\n# [plugins.response_cache]\n# category = \"cache\"\n# max_entries = 10000\n# default_ttl_secs = 3600\n\n# [plugins.webhook_logger]\n# category = \"webhook\"\n# target = \"maxllm::webhook\"\n# include_body = false\n\n# [plugins.pii_guard]\n# category = \"pii_filter\"\n# patterns = [\"email\", \"ssn\", \"credit_card\", \"phone\"]\n# action = \"block\"\n# mode = \"pre_call\"\n\n# [plugins.keyword_guard]\n# category = \"keyword_block\"\n# keywords = [\"DROP TABLE\", \"ignore previous instructions\"]\n# case_sensitive = false\n\n# [plugins.size_limit]\n# category = \"max_size\"\n# max_body_bytes = 1048576\n# max_tokens = 128000\n\n# [plugins.prompt_guard]\n# category = \"prompt_guard\"\n# action = \"block\" # block | log_only\n# rules = [\"system_override\", \"role_play_jailbreak\", \"developer_mode\",\n# \"encoding_evasion\", \"delimiter_injection\", \"instruction_leak\"]\n# # Custom rules:\n# # [[plugins.prompt_guard.custom_rules]]\n# # name = \"company_policy\"\n# # regex = \"(?i)reveal.*internal.*policy\"\n\n# [plugins.secret_scan]\n# category = \"secret_scan\"\n# action = \"block\" # block | redact | log_only\n# patterns = [\"aws_access_key\", \"aws_secret_key\", \"github_token\",\n# \"gitlab_token\", \"slack_token\", \"jwt\", \"private_key\",\n# \"password_in_url\", \"generic_api_key\"]\n# # Custom patterns:\n# # [[plugins.secret_scan.custom_patterns]]\n# # name = \"internal_token\"\n# # regex = \"mxl_[A-Za-z0-9]{32}\"\n# # replacement = \"[INTERNAL_TOKEN]\"\n\n# [plugins.regex_guard]\n# category = \"regex_guard\"\n# action = \"block\" # block | redact | log_only\n# mode = \"pre_call\" # pre_call | post_call | both\n# [[plugins.regex_guard.rules]]\n# name = \"sql_injection\"\n# regex = '(?i)\\b(?:SELECT|INSERT|UPDATE|DELETE|DROP)\\b.*\\b(?:FROM|INTO|TABLE|SET)\\b'\n# [[plugins.regex_guard.rules]]\n# name = \"internal_id\"\n# regex = 'PROJ-\\d+'\n# replacement = \"[INTERNAL_ID]\"\n\n# --- Providers ---\n\n[providers.openai]\nkind = \"openai\"\nbase_url = \"https://api.openai.com\"\napi_key = \"${OPENAI_API_KEY}\"\ndefault_model = \"gpt-4o\"\n\n[providers.anthropic]\nkind = \"anthropic\"\nbase_url = \"https://api.anthropic.com\"\napi_key = \"${ANTHROPIC_API_KEY}\"\ndefault_model = \"claude-sonnet-4-20250514\"\n\n[providers.gemini]\nkind = \"gemini\"\nbase_url = \"https://generativelanguage.googleapis.com\"\napi_key = \"${GEMINI_API_KEY}\"\ndefault_model = \"gemini-2.5-flash\"\n\n# [providers.azure_gpt4]\n# kind = \"azure_openai\"\n# base_url = \"https://my-resource.openai.azure.com\"\n# api_key = \"${AZURE_OPENAI_KEY}\"\n# deployment = \"gpt-4o\"\n# api_version = \"2024-02-01\"\n\n# [providers.groq]\n# kind = \"groq\"\n# base_url = \"https://api.groq.com\"\n# api_key = \"${GROQ_API_KEY}\"\n\n# [providers.together]\n# kind = \"together\"\n# base_url = \"https://api.together.xyz\"\n# api_key = \"${TOGETHER_API_KEY}\"\n\n# [providers.fireworks]\n# kind = \"fireworks\"\n# base_url = \"https://api.fireworks.ai\"\n# api_key = \"${FIREWORKS_API_KEY}\"\n\n# [providers.mistral]\n# kind = \"mistral\"\n# base_url = \"https://api.mistral.ai\"\n# api_key = \"${MISTRAL_API_KEY}\"\n\n# [providers.deepseek]\n# kind = \"deepseek\"\n# base_url = \"https://api.deepseek.com\"\n# api_key = \"${DEEPSEEK_API_KEY}\"\n\n# [providers.xai]\n# kind = \"xai\"\n# base_url = \"https://api.x.ai\"\n# api_key = \"${XAI_API_KEY}\"\n\n[providers.ollama]\nkind = \"ollama\"\nbase_url = \"http://127.0.0.1:11434\"\ndefault_model = \"gemma3:1b\"\n\n# [providers.cohere]\n# kind = \"cohere\"\n# base_url = \"https://api.cohere.com\"\n# api_key = \"${COHERE_API_KEY}\"\n\n# Mock provider for perf testing (run: python3 perf/mock_upstream.py)\n[providers.mock]\nkind = \"openai\"\nbase_url = \"http://127.0.0.1:9999\"\napi_key = \"mock\"\n\n# --- Routes ---\n\n[[routes]]\npath = \"/v1/chat/completions\"\nprovider = \"openai\"\nfallback = [\"anthropic\"]\ntimeout_secs = 120\nstrategy = \"fallback\"\nplugins = [\"rate_limiter\", \"cors\"]\n# guardrails = [\"injection-guard\", \"pii-check\", \"secret-scan\"] # Only these guardrails run for this route\n\n[[routes]]\npath = \"/v1/anthropic\"\nprovider = \"anthropic\"\nfallback = [\"openai\"]\nplugins = [\"rate_limiter\", \"cors\"]\n# guardrails = [\"injection-guard\"] # Minimal guardrails for this route\n\n[[routes]]\npath = \"/v1/ollama\"\nprovider = \"ollama\"\ntimeout_secs = 120\nplugins = [\"rate_limiter\", \"cors\"]\n# guardrails = [] # Empty = all default_on guardrails apply\n\n[[routes]]\npath = \"/v1/gemini\"\nprovider = \"gemini\"\ntimeout_secs = 120\nplugins = [\"rate_limiter\", \"cors\"]\n\n# Mock route for perf testing (no rate limit)\n[[routes]]\npath = \"/v1/mock\"\nprovider = \"mock\"\ntimeout_secs = 10\nplugins = [\"cors\"]\n\n# Bare proxy route — no plugins, pure routing + upstream (perf baseline)\n[[routes]]\npath = \"/v1/proxy\"\nprovider = \"mock\"\ntimeout_secs = 10\nplugins = []\n\n# --- Native Provider Endpoints ---\n# Accept provider-native request format directly (no translation).\n# Clients use the provider's own SDK/format, gateway adds auth + logging.\n\n# Anthropic Messages API (native format)\n# curl -d '{\"model\":\"claude-sonnet-4-20250514\",\"max_tokens\":1024,\"messages\":[...]}' /v1/messages\n# [[routes]]\n# path = \"/v1/messages\"\n# provider = \"anthropic\"\n# endpoint_type = \"native\"\n# timeout_secs = 120\n# plugins = [\"rate_limiter\", \"cors\"]\n\n# Gemini generateContent API (native format)\n# curl -d '{\"contents\":[{\"parts\":[{\"text\":\"Hello\"}]}]}' /v1beta/models/gemini-2.5-flash:generateContent\n# [[routes]]\n# path = \"/v1beta/models\"\n# provider = \"gemini\"\n# endpoint_type = \"native\"\n# timeout_secs = 120\n# plugins = [\"rate_limiter\", \"cors\"]\n\n# --- Pass-Through Endpoints ---\n# Raw proxy to provider APIs — zero body parsing or translation.\n# Client-supplied path suffix is forwarded to the provider's base URL.\n\n# Pass-through to Anthropic (any endpoint)\n# curl /passthrough/anthropic/v1/messages -d '...'\n# [[routes]]\n# path = \"/passthrough/anthropic\"\n# provider = \"anthropic\"\n# endpoint_type = \"passthrough\"\n# plugins = [\"rate_limiter\"]\n\n# Pass-through to OpenAI (any endpoint)\n# curl /passthrough/openai/v1/chat/completions -d '...'\n# [[routes]]\n# path = \"/passthrough/openai\"\n# provider = \"openai\"\n# endpoint_type = \"passthrough\"\n# plugins = [\"rate_limiter\"]\n\n# Pass-through to Gemini (any endpoint)\n# curl /passthrough/gemini/v1beta/models/gemini-2.5-flash:generateContent -d '...'\n# [[routes]]\n# path = \"/passthrough/gemini\"\n# provider = \"gemini\"\n# endpoint_type = \"passthrough\"\n# plugins = [\"rate_limiter\"]\n\n# --- Guardrails (content inspection) ---\n# Guardrails operate on parsed message content, not raw HTTP.\n# Clients can select guardrails per-request: {\"guardrails\": [\"pii-check\", \"injection-guard\"]}\n# default_on guardrails always run regardless of client request.\n\n# [[guardrails]]\n# name = \"injection-guard\"\n# provider = \"prompt_guard\" # Built-in: prompt_guard, pii_filter, secret_scan, keyword_block, regex_guard\n# mode = \"pre_call\" # pre_call | post_call | both\n# default_on = true # Always run, even if client doesn't request it\n# action = \"block\" # block | log_only\n# rules = [\"system_override\", \"role_play_jailbreak\", \"developer_mode\",\n# \"encoding_evasion\", \"delimiter_injection\", \"instruction_leak\"]\n\n# [[guardrails]]\n# name = \"pii-check\"\n# provider = \"pii_filter\"\n# mode = \"both\" # Check both input and output\n# default_on = true\n# action = \"redact\" # Redact PII instead of blocking\n# patterns = [\"email\", \"ssn\", \"credit_card\", \"phone\"]\n\n# [[guardrails]]\n# name = \"secret-scan\"\n# provider = \"secret_scan\"\n# mode = \"pre_call\"\n# default_on = true\n# action = \"block\"\n# patterns = [\"aws_access_key\", \"github_token\", \"jwt\", \"private_key\", \"generic_api_key\"]\n\n# [[guardrails]]\n# name = \"keyword-filter\"\n# provider = \"keyword_block\"\n# mode = \"pre_call\"\n# default_on = false # Only runs when client requests it\n# action = \"block\"\n# keywords = [\"DROP TABLE\", \"ignore previous instructions\"]\n\n# [[guardrails]]\n# name = \"custom-safety\"\n# provider = \"webhook\" # Generic HTTP API (works with any guardrail service)\n# mode = \"pre_call\"\n# default_on = false\n# action = \"block\"\n# api_base = \"https://safety.internal/v1/check\"\n# api_key = \"${SAFETY_API_KEY}\"\n# timeout_secs = 5\n# [guardrails.headers]\n# X-Custom-Header = \"value\"\n\n# [[guardrails]]\n# name = \"lakera-guard\"\n# provider = \"lakera\" # Lakera AI prompt injection detection\n# mode = \"pre_call\"\n# default_on = true\n# action = \"block\"\n# api_key = \"${LAKERA_API_KEY}\"\n# api_base = \"https://api.lakera.ai/v2/guard\" # Optional, this is the default\n\n# [[guardrails]]\n# name = \"cel-policy\"\n# provider = \"cel\" # CEL expression-based policy rules\n# mode = \"pre_call\"\n# default_on = true\n# action = \"block\"\n# [[guardrails.rules]]\n# name = \"max-prompt-size\"\n# expr = 'size(content) > 50000'\n# message = \"Prompt exceeds maximum allowed size\"\n# [[guardrails.rules]]\n# name = \"require-auth\"\n# expr = 'client_id == \"\"'\n# message = \"Authentication required\"\n# [[guardrails.rules]]\n# name = \"block-confidential\"\n# expr = 'content.contains(\"CONFIDENTIAL\")'\n# message = \"Confidential content not allowed\"\n\n# Example: weighted load balancing across multiple providers\n# [[routes]]\n# path = \"/v1/balanced\"\n# provider = \"openai\"\n# fallback = [\"anthropic\", \"groq\"]\n# strategy = \"weighted\"\n# plugins = [\"rate_limiter\", \"cors\"]\n\n# Example: round-robin for even distribution\n# [[routes]]\n# path = \"/v1/roundrobin\"\n# provider = \"groq\"\n# fallback = [\"together\", \"fireworks\"]\n# strategy = \"round_robin\"\n# plugins = [\"rate_limiter\"]\n"}, "f5a31dfd339028bdc2ff209388315a40c32d6c44": {"t": 1785750746.06924, "n": 10613, "h": "cedd722d111df8ad", "c": "# MaxLLM Gateway Configuration\n# Environment variables can be referenced with ${VAR_NAME} syntax.\n\n# Global plugins run on every request, in order.\nglobal_plugins = [\"request_id\", \"api_auth\"]\n\n[server]\nlisten = \"0.0.0.0:8080\"\nthreads = 4\n# tcp_reuseport = true\n# tcp_fastopen = 256\n\n[metrics]\nenabled = true\n\n# --- Model Aliases ---\n# Map requested model names to actual model names.\n[model_aliases]\n\"gpt-4\" = \"gpt-4o\"\n\"claude-3\" = \"claude-sonnet-4-20250514\"\n\n# --- Admin API (optional) ---\n# [admin]\n# master_key = \"${MAXLLM_MASTER_KEY}\"\n# enabled = true\n\n# --- Model Cost Overrides (supplement built-in costs) ---\n# [model_costs.\"custom-model\"]\n# input_per_1m = 1.00\n# output_per_1m = 3.00\n\n# --- Plugins ---\n\n[plugins.request_id]\ncategory = \"request_id\"\nheader_name = \"X-Request-Id\"\n\n[plugins.api_auth]\ncategory = \"key_auth\"\nheader = \"Authorization\"\nstrip_prefix = \"Bearer \"\nkeys = [\"sk-maxllm-dev-key\"]\n\n# [plugins.ip_guard]\n# category = \"ip_restriction\"\n# type = \"deny\"\n# ip_list = [\"10.0.0.0/8\"]\n\n[plugins.rate_limiter]\ncategory = \"rate_limit\"\nrequests_per_minute = 600\nkey = \"client_ip\"\n\n[plugins.cors]\ncategory = \"cors\"\nallow_origin = \"*\"\nallow_methods = \"GET, POST, OPTIONS\"\nallow_headers = \"Content-Type, Authorization\"\nmax_age = \"86400\"\n\n# [plugins.response_cache]\n# category = \"cache\"\n# max_entries = 10000\n# default_ttl_secs = 3600\n\n# [plugins.webhook_logger]\n# category = \"webhook\"\n# target = \"maxllm::webhook\"\n# include_body = false\n\n# [plugins.pii_guard]\n# category = \"pii_filter\"\n# patterns = [\"email\", \"ssn\", \"credit_card\", \"phone\"]\n# action = \"block\"\n# mode = \"pre_call\"\n\n# [plugins.keyword_guard]\n# category = \"keyword_block\"\n# keywords = [\"DROP TABLE\", \"ignore previous instructions\"]\n# case_sensitive = false\n\n# [plugins.size_limit]\n# category = \"max_size\"\n# max_body_bytes = 1048576\n# max_tokens = 128000\n\n# [plugins.prompt_guard]\n# category = \"prompt_guard\"\n# action = \"block\" # block | log_only\n# rules = [\"system_override\", \"role_play_jailbreak\", \"developer_mode\",\n# \"encoding_evasion\", \"delimiter_injection\", \"instruction_leak\"]\n# # Custom rules:\n# # [[plugins.prompt_guard.custom_rules]]\n# # name = \"company_policy\"\n# # regex = \"(?i)reveal.*internal.*policy\"\n\n# [plugins.secret_scan]\n# category = \"secret_scan\"\n# action = \"block\" # block | redact | log_only\n# patterns = [\"aws_access_key\", \"aws_secret_key\", \"github_token\",\n# \"gitlab_token\", \"slack_token\", \"jwt\", \"private_key\",\n# \"password_in_url\", \"generic_api_key\"]\n# # Custom patterns:\n# # [[plugins.secret_scan.custom_patterns]]\n# # name = \"internal_token\"\n# # regex = \"mxl_[A-Za-z0-9]{32}\"\n# # replacement = \"[INTERNAL_TOKEN]\"\n\n# [plugins.regex_guard]\n# category = \"regex_guard\"\n# action = \"block\" # block | redact | log_only\n# mode = \"pre_call\" # pre_call | post_call | both\n# [[plugins.regex_guard.rules]]\n# name = \"sql_injection\"\n# regex = '(?i)\\b(?:SELECT|INSERT|UPDATE|DELETE|DROP)\\b.*\\b(?:FROM|INTO|TABLE|SET)\\b'\n# [[plugins.regex_guard.rules]]\n# name = \"internal_id\"\n# regex = 'PROJ-\\d+'\n# replacement = \"[INTERNAL_ID]\"\n\n# --- Providers ---\n\n[providers.openai]\nkind = \"openai\"\nbase_url = \"https://api.openai.com\"\napi_key = \"${OPENAI_API_KEY}\"\ndefault_model = \"gpt-4o\"\n\n[providers.anthropic]\nkind = \"anthropic\"\nbase_url = \"https://api.anthropic.com\"\napi_key = \"${ANTHROPIC_API_KEY}\"\ndefault_model = \"claude-sonnet-4-20250514\"\n\n[providers.gemini]\nkind = \"gemini\"\nbase_url = \"https://generativelanguage.googleapis.com\"\napi_key = \"${GEMINI_API_KEY}\"\ndefault_model = \"gemini-2.5-flash\"\n\n# [providers.azure_gpt4]\n# kind = \"azure_openai\"\n# base_url = \"https://my-resource.openai.azure.com\"\n# api_key = \"${AZURE_OPENAI_KEY}\"\n# deployment = \"gpt-4o\"\n# api_version = \"2024-02-01\"\n\n# [providers.groq]\n# kind = \"groq\"\n# base_url = \"https://api.groq.com\"\n# api_key = \"${GROQ_API_KEY}\"\n\n# [providers.together]\n# kind = \"together\"\n# base_url = \"https://api.together.xyz\"\n# api_key = \"${TOGETHER_API_KEY}\"\n\n# [providers.fireworks]\n# kind = \"fireworks\"\n# base_url = \"https://api.fireworks.ai\"\n# api_key = \"${FIREWORKS_API_KEY}\"\n\n# [providers.mistral]\n# kind = \"mistral\"\n# base_url = \"https://api.mistral.ai\"\n# api_key = \"${MISTRAL_API_KEY}\"\n\n# [providers.deepseek]\n# kind = \"deepseek\"\n# base_url = \"https://api.deepseek.com\"\n# api_key = \"${DEEPSEEK_API_KEY}\"\n\n# [providers.xai]\n# kind = \"xai\"\n# base_url = \"https://api.x.ai\"\n# api_key = \"${XAI_API_KEY}\"\n\n[providers.ollama]\nkind = \"ollama\"\nbase_url = \"http://127.0.0.1:11434\"\ndefault_model = \"gemma3:1b\"\n\n# [providers.cohere]\n# kind = \"cohere\"\n# base_url = \"https://api.cohere.com\"\n# api_key = \"${COHERE_API_KEY}\"\n\n# Mock provider for perf testing (run: python3 perf/mock_upstream.py)\n[providers.mock]\nkind = \"openai\"\nbase_url = \"http://127.0.0.1:9999\"\napi_key = \"mock\"\n\n# --- Routes ---\n\n[[routes]]\npath = \"/v1/chat/completions\"\nprovider = \"openai\"\nfallback = [\"anthropic\"]\ntimeout_secs = 120\nstrategy = \"fallback\"\nplugins = [\"rate_limiter\", \"cors\"]\n# guardrails = [\"injection-guard\", \"pii-check\", \"secret-scan\"] # Only these guardrails run for this route\n\n[[routes]]\npath = \"/v1/anthropic\"\nprovider = \"anthropic\"\nfallback = [\"openai\"]\nplugins = [\"rate_limiter\", \"cors\"]\n# guardrails = [\"injection-guard\"] # Minimal guardrails for this route\n\n[[routes]]\npath = \"/v1/ollama\"\nprovider = \"ollama\"\ntimeout_secs = 120\nplugins = [\"rate_limiter\", \"cors\"]\n# guardrails = [] # Empty = all default_on guardrails apply\n\n[[routes]]\npath = \"/v1/gemini\"\nprovider = \"gemini\"\ntimeout_secs = 120\nplugins = [\"rate_limiter\", \"cors\"]\n\n# Mock route for perf testing (no rate limit)\n[[routes]]\npath = \"/v1/mock\"\nprovider = \"mock\"\ntimeout_secs = 10\nplugins = [\"cors\"]\n\n# Bare proxy route — no plugins, pure routing + upstream (perf baseline)\n[[routes]]\npath = \"/v1/proxy\"\nprovider = \"mock\"\ntimeout_secs = 10\nplugins = []\n\n# --- Native Provider Endpoints ---\n# Accept provider-native request format directly (no translation).\n# Clients use the provider's own SDK/format, gateway adds auth + logging.\n\n# Anthropic Messages API (native format)\n# curl -d '{\"model\":\"claude-sonnet-4-20250514\",\"max_tokens\":1024,\"messages\":[...]}' /v1/messages\n# [[routes]]\n# path = \"/v1/messages\"\n# provider = \"anthropic\"\n# endpoint_type = \"native\"\n# timeout_secs = 120\n# plugins = [\"rate_limiter\", \"cors\"]\n\n# Gemini generateContent API (native format)\n# curl -d '{\"contents\":[{\"parts\":[{\"text\":\"Hello\"}]}]}' /v1beta/models/gemini-2.5-flash:generateContent\n# [[routes]]\n# path = \"/v1beta/models\"\n# provider = \"gemini\"\n# endpoint_type = \"native\"\n# timeout_secs = 120\n# plugins = [\"rate_limiter\", \"cors\"]\n\n# --- Pass-Through Endpoints ---\n# Raw proxy to provider APIs — zero body parsing or translation.\n# Client-supplied path suffix is forwarded to the provider's base URL.\n\n# Pass-through to Anthropic (any endpoint)\n# curl /passthrough/anthropic/v1/messages -d '...'\n# [[routes]]\n# path = \"/passthrough/anthropic\"\n# provider = \"anthropic\"\n# endpoint_type = \"passthrough\"\n# plugins = [\"rate_limiter\"]\n\n# Pass-through to OpenAI (any endpoint)\n# curl /passthrough/openai/v1/chat/completions -d '...'\n# [[routes]]\n# path = \"/passthrough/openai\"\n# provider = \"openai\"\n# endpoint_type = \"passthrough\"\n# plugins = [\"rate_limiter\"]\n\n# Pass-through to Gemini (any endpoint)\n# curl /passthrough/gemini/v1beta/models/gemini-2.5-flash:generateContent -d '...'\n# [[routes]]\n# path = \"/passthrough/gemini\"\n# provider = \"gemini\"\n# endpoint_type = \"passthrough\"\n# plugins = [\"rate_limiter\"]\n\n# --- Guardrails (content inspection) ---\n# Guardrails operate on parsed message content, not raw HTTP.\n# Clients can select guardrails per-request: {\"guardrails\": [\"pii-check\", \"injection-guard\"]}\n# default_on guardrails always run regardless of client request.\n\n# [[guardrails]]\n# name = \"injection-guard\"\n# provider = \"prompt_guard\" # Built-in: prompt_guard, pii_filter, secret_scan, keyword_block, regex_guard\n# mode = \"pre_call\" # pre_call | post_call | both\n# default_on = true # Always run, even if client doesn't request it\n# action = \"block\" # block | log_only\n# rules = [\"system_override\", \"role_play_jailbreak\", \"developer_mode\",\n# \"encoding_evasion\", \"delimiter_injection\", \"instruction_leak\"]\n\n# [[guardrails]]\n# name = \"pii-check\"\n# provider = \"pii_filter\"\n# mode = \"both\" # Check both input and output\n# default_on = true\n# action = \"redact\" # Redact PII instead of blocking\n# patterns = [\"email\", \"ssn\", \"credit_card\", \"phone\"]\n\n# [[guardrails]]\n# name = \"secret-scan\"\n# provider = \"secret_scan\"\n# mode = \"pre_call\"\n# default_on = true\n# action = \"block\"\n# patterns = [\"aws_access_key\", \"github_token\", \"jwt\", \"private_key\", \"generic_api_key\"]\n\n# [[guardrails]]\n# name = \"keyword-filter\"\n# provider = \"keyword_block\"\n# mode = \"pre_call\"\n# default_on = false # Only runs when client requests it\n# action = \"block\"\n# keywords = [\"DROP TABLE\", \"ignore previous instructions\"]\n\n# [[guardrails]]\n# name = \"custom-safety\"\n# provider = \"webhook\" # Generic HTTP API (works with any guardrail service)\n# mode = \"pre_call\"\n# default_on = false\n# action = \"block\"\n# api_base = \"https://safety.internal/v1/check\"\n# api_key = \"${SAFETY_API_KEY}\"\n# timeout_secs = 5\n# [guardrails.headers]\n# X-Custom-Header = \"value\"\n\n# [[guardrails]]\n# name = \"lakera-guard\"\n# provider = \"lakera\" # Lakera AI prompt injection detection\n# mode = \"pre_call\"\n# default_on = true\n# action = \"block\"\n# api_key = \"${LAKERA_API_KEY}\"\n# api_base = \"https://api.lakera.ai/v2/guard\" # Optional, this is the default\n\n# [[guardrails]]\n# name = \"cel-policy\"\n# provider = \"cel\" # CEL expression-based policy rules\n# mode = \"pre_call\"\n# default_on = true\n# action = \"block\"\n# [[guardrails.rules]]\n# name = \"max-prompt-size\"\n# expr = 'size(content) > 50000'\n# message = \"Prompt exceeds maximum allowed size\"\n# [[guardrails.rules]]\n# name = \"require-auth\"\n# expr = 'client_id == \"\"'\n# message = \"Authentication required\"\n# [[guardrails.rules]]\n# name = \"block-confidential\"\n# expr = 'content.contains(\"CONFIDENTIAL\")'\n# message = \"Confidential content not allowed\"\n\n# Example: weighted load balancing across multiple providers\n# [[routes]]\n# path = \"/v1/balanced\"\n# provider = \"openai\"\n# fallback = [\"anthropic\", \"groq\"]\n# strategy = \"weighted\"\n# plugins = [\"rate_limiter\", \"cors\"]\n\n# Example: round-robin for even distribution\n# [[routes]]\n# path = \"/v1/roundrobin\"\n# provider = \"groq\"\n# fallback = [\"together\", \"fireworks\"]\n# strategy = \"round_robin\"\n# plugins = [\"rate_limiter\"]\n"}, "04231bb71a4957a6933910fc15efff6ef29fe014": {"t": 1785750747.2922893, "n": 8980, "h": "ba3e1e9d515a805a", "c": "# MaxLLM Gateway Configuration\n# Environment variables can be referenced with ${VAR_NAME} syntax.\n\n# Global plugins run on every request, in order.\nglobal_plugins = [\"request_id\", \"api_auth\"]\n\n[server]\nlisten = \"0.0.0.0:8080\"\nthreads = 4\n# tcp_reuseport = true\n# tcp_fastopen = 256\n\n[metrics]\nenabled = true\n\n# --- Model Aliases ---\n# Map requested model names to actual model names.\n[model_aliases]\n\"gpt-4\" = \"gpt-4o\"\n\"claude-3\" = \"claude-sonnet-4-20250514\"\n\n# --- Admin API (optional) ---\n# [admin]\n# master_key = \"${MAXLLM_MASTER_KEY}\"\n# enabled = true\n\n# --- Model Cost Overrides (supplement built-in costs) ---\n# [model_costs.\"custom-model\"]\n# input_per_1m = 1.00\n# output_per_1m = 3.00\n\n# --- Plugins ---\n\n[plugins.request_id]\ncategory = \"request_id\"\nheader_name = \"X-Request-Id\"\n\n[plugins.api_auth]\ncategory = \"key_auth\"\nheader = \"Authorization\"\nstrip_prefix = \"Bearer \"\nkeys = [\"sk-maxllm-dev-key\"]\n\n# [plugins.ip_guard]\n# category = \"ip_restriction\"\n# type = \"deny\"\n# ip_list = [\"10.0.0.0/8\"]\n\n[plugins.rate_limiter]\ncategory = \"rate_limit\"\nrequests_per_minute = 600\nkey = \"client_ip\"\n\n[plugins.cors]\ncategory = \"cors\"\nallow_origin = \"*\"\nallow_methods = \"GET, POST, OPTIONS\"\nallow_headers = \"Content-Type, Authorization\"\nmax_age = \"86400\"\n\n# [plugins.response_cache]\n# category = \"cache\"\n# max_entries = 10000\n# default_ttl_secs = 3600\n\n# [plugins.webhook_logger]\n# category = \"webhook\"\n# target = \"maxllm::webhook\"\n# include_body = false\n\n# [plugins.pii_guard]\n# category = \"pii_filter\"\n# patterns = [\"email\", \"ssn\", \"credit_card\", \"phone\"]\n# action = \"block\"\n# mode = \"pre_call\"\n\n# [plugins.keyword_guard]\n# category = \"keyword_block\"\n# keywords = [\"DROP TABLE\", \"ignore previous instructions\"]\n# case_sensitive = false\n\n# [plugins.size_limit]\n# category = \"max_size\"\n# max_body_bytes = 1048576\n# max_tokens = 128000\n\n# [plugins.prompt_guard]\n# category = \"prompt_guard\"\n# action = \"block\" # block | log_only\n# rules = [\"system_override\", \"role_play_jailbreak\", \"developer_mode\",\n# \"encoding_evasion\", \"delimiter_injection\", \"instruction_leak\"]\n# # Custom rules:\n# # [[plugins.prompt_guard.custom_rules]]\n# # name = \"company_policy\"\n# # regex = \"(?i)reveal.*internal.*policy\"\n\n# [plugins.secret_scan]\n# category = \"secret_scan\"\n# action = \"block\" # block | redact | log_only\n# patterns = [\"aws_access_key\", \"aws_secret_key\", \"github_token\",\n# \"gitlab_token\", \"slack_token\", \"jwt\", \"private_key\",\n# \"password_in_url\", \"generic_api_key\"]\n# # Custom patterns:\n# # [[plugins.secret_scan.custom_patterns]]\n# # name = \"internal_token\"\n# # regex = \"mxl_[A-Za-z0-9]{32}\"\n# # replacement = \"[INTERNAL_TOKEN]\"\n\n# [plugins.regex_guard]\n# category = \"regex_guard\"\n# action = \"block\" # block | redact | log_only\n# mode = \"pre_call\" # pre_call | post_call | both\n# [[plugins.regex_guard.rules]]\n# name = \"sql_injection\"\n# regex = '(?i)\\b(?:SELECT|INSERT|UPDATE|DELETE|DROP)\\b.*\\b(?:FROM|INTO|TABLE|SET)\\b'\n# [[plugins.regex_guard.rules]]\n# name = \"internal_id\"\n# regex = 'PROJ-\\d+'\n# replacement = \"[INTERNAL_ID]\"\n\n# --- Providers ---\n\n[providers.openai]\nkind = \"openai\"\nbase_url = \"https://api.openai.com\"\napi_key = \"${OPENAI_API_KEY}\"\ndefault_model = \"gpt-4o\"\n\n[providers.anthropic]\nkind = \"anthropic\"\nbase_url = \"https://api.anthropic.com\"\napi_key = \"${ANTHROPIC_API_KEY}\"\ndefault_model = \"claude-sonnet-4-20250514\"\n\n[providers.gemini]\nkind = \"gemini\"\nbase_url = \"https://generativelanguage.googleapis.com\"\napi_key = \"${GEMINI_API_KEY}\"\ndefault_model = \"gemini-2.5-flash\"\n\n# [providers.azure_gpt4]\n# kind = \"azure_openai\"\n# base_url = \"https://my-resource.openai.azure.com\"\n# api_key = \"${AZURE_OPENAI_KEY}\"\n# deployment = \"gpt-4o\"\n# api_version = \"2024-02-01\"\n\n# [providers.groq]\n# kind = \"groq\"\n# base_url = \"https://api.groq.com\"\n# api_key = \"${GROQ_API_KEY}\"\n\n# [providers.together]\n# kind = \"together\"\n# base_url = \"https://api.together.xyz\"\n# api_key = \"${TOGETHER_API_KEY}\"\n\n# [providers.fireworks]\n# kind = \"fireworks\"\n# base_url = \"https://api.fireworks.ai\"\n# api_key = \"${FIREWORKS_API_KEY}\"\n\n# [providers.mistral]\n# kind = \"mistral\"\n# base_url = \"https://api.mistral.ai\"\n# api_key = \"${MISTRAL_API_KEY}\"\n\n# [providers.deepseek]\n# kind = \"deepseek\"\n# base_url = \"https://api.deepseek.com\"\n# api_key = \"${DEEPSEEK_API_KEY}\"\n\n# [providers.xai]\n# kind = \"xai\"\n# base_url = \"https://api.x.ai\"\n# api_key = \"${XAI_API_KEY}\"\n\n[providers.ollama]\nkind = \"ollama\"\nbase_url = \"http://127.0.0.1:11434\"\ndefault_model = \"gemma3:1b\"\n\n# [providers.cohere]\n# kind = \"cohere\"\n# base_url = \"https://api.cohere.com\"\n# api_key = \"${COHERE_API_KEY}\"\n\n# Mock provider for perf testing (run: python3 perf/mock_upstream.py)\n[providers.mock]\nkind = \"openai\"\nbase_url = \"http://127.0.0.1:9999\"\napi_key = \"mock\"\n\n# --- Routes ---\n\n[[routes]]\npath = \"/v1/chat/completions\"\nprovider = \"openai\"\nfallback = [\"anthropic\"]\ntimeout_secs = 120\nstrategy = \"fallback\"\nplugins = [\"rate_limiter\", \"cors\"]\n# guardrails = [\"injection-guard\", \"pii-check\", \"secret-scan\"] # Only these guardrails run for this route\n\n[[routes]]\npath = \"/v1/anthropic\"\nprovider = \"anthropic\"\nfallback = [\"openai\"]\nplugins = [\"rate_limiter\", \"cors\"]\n# guardrails = [\"injection-guard\"] # Minimal guardrails for this route\n\n[[routes]]\npath = \"/v1/ollama\"\nprovider = \"ollama\"\ntimeout_secs = 120\nplugins = [\"rate_limiter\", \"cors\"]\n# guardrails = [] # Empty = all default_on guardrails apply\n\n[[routes]]\npath = \"/v1/gemini\"\nprovider = \"gemini\"\ntimeout_secs = 120\nplugins = [\"rate_limiter\", \"cors\"]\n\n# Mock route for perf testing (no rate limit)\n[[routes]]\npath = \"/v1/mock\"\nprovider = \"mock\"\ntimeout_secs = 10\nplugins = [\"cors\"]\n\n# Bare proxy route — no plugins, pure routing + upstream (perf baseline)\n[[routes]]\npath = \"/v1/proxy\"\nprovider = \"mock\"\ntimeout_secs = 10\nplugins = []\n\n# --- Guardrails (content inspection) ---\n# Guardrails operate on parsed message content, not raw HTTP.\n# Clients can select guardrails per-request: {\"guardrails\": [\"pii-check\", \"injection-guard\"]}\n# default_on guardrails always run regardless of client request.\n\n# [[guardrails]]\n# name = \"injection-guard\"\n# provider = \"prompt_guard\" # Built-in: prompt_guard, pii_filter, secret_scan, keyword_block, regex_guard\n# mode = \"pre_call\" # pre_call | post_call | both\n# default_on = true # Always run, even if client doesn't request it\n# action = \"block\" # block | log_only\n# rules = [\"system_override\", \"role_play_jailbreak\", \"developer_mode\",\n# \"encoding_evasion\", \"delimiter_injection\", \"instruction_leak\"]\n\n# [[guardrails]]\n# name = \"pii-check\"\n# provider = \"pii_filter\"\n# mode = \"both\" # Check both input and output\n# default_on = true\n# action = \"redact\" # Redact PII instead of blocking\n# patterns = [\"email\", \"ssn\", \"credit_card\", \"phone\"]\n\n# [[guardrails]]\n# name = \"secret-scan\"\n# provider = \"secret_scan\"\n# mode = \"pre_call\"\n# default_on = true\n# action = \"block\"\n# patterns = [\"aws_access_key\", \"github_token\", \"jwt\", \"private_key\", \"generic_api_key\"]\n\n# [[guardrails]]\n# name = \"keyword-filter\"\n# provider = \"keyword_block\"\n# mode = \"pre_call\"\n# default_on = false # Only runs when client requests it\n# action = \"block\"\n# keywords = [\"DROP TABLE\", \"ignore previous instructions\"]\n\n# [[guardrails]]\n# name = \"custom-safety\"\n# provider = \"webhook\" # Generic HTTP API (works with any guardrail service)\n# mode = \"pre_call\"\n# default_on = false\n# action = \"block\"\n# api_base = \"https://safety.internal/v1/check\"\n# api_key = \"${SAFETY_API_KEY}\"\n# timeout_secs = 5\n# [guardrails.headers]\n# X-Custom-Header = \"value\"\n\n# [[guardrails]]\n# name = \"lakera-guard\"\n# provider = \"lakera\" # Lakera AI prompt injection detection\n# mode = \"pre_call\"\n# default_on = true\n# action = \"block\"\n# api_key = \"${LAKERA_API_KEY}\"\n# api_base = \"https://api.lakera.ai/v2/guard\" # Optional, this is the default\n\n# [[guardrails]]\n# name = \"cel-policy\"\n# provider = \"cel\" # CEL expression-based policy rules\n# mode = \"pre_call\"\n# default_on = true\n# action = \"block\"\n# [[guardrails.rules]]\n# name = \"max-prompt-size\"\n# expr = 'size(content) > 50000'\n# message = \"Prompt exceeds maximum allowed size\"\n# [[guardrails.rules]]\n# name = \"require-auth\"\n# expr = 'client_id == \"\"'\n# message = \"Authentication required\"\n# [[guardrails.rules]]\n# name = \"block-confidential\"\n# expr = 'content.contains(\"CONFIDENTIAL\")'\n# message = \"Confidential content not allowed\"\n\n# Example: weighted load balancing across multiple providers\n# [[routes]]\n# path = \"/v1/balanced\"\n# provider = \"openai\"\n# fallback = [\"anthropic\", \"groq\"]\n# strategy = \"weighted\"\n# plugins = [\"rate_limiter\", \"cors\"]\n\n# Example: round-robin for even distribution\n# [[routes]]\n# path = \"/v1/roundrobin\"\n# provider = \"groq\"\n# fallback = [\"together\", \"fireworks\"]\n# strategy = \"round_robin\"\n# plugins = [\"rate_limiter\"]\n"}}}}