Skip to main content

A lightweight, flexible API proxy with dynamic token rotation, load balancing, and rate limiting capabilities.

Project description

🐾 NyaProxy - Universal API Proxy

NyaProxy Banner

Your purr-fect Swiss Army Knife for API Proxy Management~

PyPI version Python versions License
Code Coverage CodeQL & Dependencies Scan CI/CD Builds Docker

🌈 Introduction

Your purr-fect Swiss Army Knife for API Proxy Management~

NyaProxy acts like a smart, central manager for accessing various online services (APIs) – think AI tools (like OpenAI, Gemini, Anthropic), image generators, or almost any web service that uses access keys. It helps you use these services more reliably, efficiently, and securely.

Here's how NyaProxy can help:

  • Share the Load: Automatically spreads requests across multiple access keys so no single key gets overwhelmed (Load Balancing).
  • Stay Online: If one key fails, NyaProxy automatically tries another, keeping your application running smoothly (Failover/Resilience).
  • Save Costs: Optimizes how your keys are used, potentially lowering your bills.
  • Boost Security: Hides your actual access keys behind the proxy, adding a layer of protection.
  • Track Usage: Provides a clear dashboard to see how your keys and services are being used in real-time.

🌟 Core Capabilities

Feature Description Config Reference
🔄 Token Rotation Automatic key cycling across multiple providers variables.keys
⚖️ Load Balancing 5 strategies: Round Robin, Random, Least Request, Fastest Response, Weighted load_balancing_strategy
🚦 Rate Limiting Granular controls per endpoint/key with smart queuing rate_limit
🕵️ Request Masking Dynamic header substitution across multiple identity providers headers + variables
📊 Real-time Metrics Interactive dashboard with request analytics and system health dashboard
🔧 Body Substitution Dynamic JSON payload transformation using JSONPath request_body_substitution
🔄 Simulated Streaming Stream chunked responses for better UX simulated_streaming

📥 Quick Start

One-Click Deployment (No Fuss, No Muss!)

Pick your favorite platform and let's go!

Deploy to Render
Deploy to Render
Deploy on Railway
Deploy to Railway

[!NOTE] NyaProxy automatically creates a basic working configuration when it starts. You just need to access the /config endpoint to add your API keys!

[!TIP] You can use Gemini AI Studio to get a free API key for testing. Gemini's API is OpenAI-compatible and works seamlessly with NyaProxy. Get a Gemini API key here.

Local Deployment (For the DIY Enthusiasts!)

Prerequisites

  • Python 3.8 or higher
  • Docker (optional, for containerized deployment)

Installation

1. Install from PyPI (the easiest way!)
pip install nya-proxy
2. Run NyaProxy
nyaproxy

...or provide your own config file:

nyaproxy --config config.yaml
3. Verify Your Setup

Visit http://localhost:8080/config to access the configuration UI.

[!IMPORTANT] If you expose this proxy to the internet, make sure to set a strong API key in your configuration to prevent unauthorized access. The first key in your API keys array will be used as the master key for accessing sensitive interfaces like the dashboard and configuration UI, while additional keys can be used for regular API requests only.

If no master API key is specified, no login page will be shown and anyone can access the dashboard and configuration UI. This is convenient for local testing but not recommended for production environments.

Check out http://localhost:8080/dashboard for the snazzy management dashboard with all your API traffic visualizations.

Detailed Deployment Guides

For step-by-step instructions tailored to beginners, check out our detailed deployment guides:

Install from Source

# Clone the repository
git clone https://github.com/Nya-Foundation/nyaproxy.git
cd nyaproxy

# Install dependencies
pip install -e .

# Run NyaProxy
nyaproxy

Docker

docker run -d \
  -p 8080:8080 \
  # -v ${PWD}/config.yaml:/app/config.yaml \
  # -v ${PWD}/app.log:/app/app.log \
  k3scat/nya-proxy:latest

Configuration

Configuration reference can be found under Configs folder folder

# Basic config.yaml example for Gemini API
server:
  host: 0.0.0.0
  port: 8080
  api_key: 
  logging:
    enabled: true
    level: info
    log_file: app.log
  proxy:
    enabled: false
    address: socks5://username:password@proxy.example.com:1080
  dashboard:
    enabled: true
  queue:
    enabled: true
    max_size: 200
    expiry_seconds: 300

# Default settings for the all apis if not specified
default_settings:
  key_variable: keys
  load_balancing_strategy: round_robin
  rate_limit:
    endpoint_rate_limit: 10/s
    key_rate_limit: 10/m
    rate_limit_paths: 
      - "*"
  retry:
    enabled: true
    mode: key_rotation
    attempts: 3
    retry_after_seconds: 1
    retry_request_methods: [ POST, GET, PUT, DELETE, PATCH, OPTIONS ]
    retry_status_codes: [ 429, 500, 502, 503, 504 ]
  timeouts:
    request_timeout_seconds: 300
  # Simulated streaming settings
  simulated_streaming:
    enabled: false
    delay_seconds: 0.2 # Delay between chunks in seconds
    init_delay_seconds: 0.5 # Initial delay before starting streaming in seconds
    chunk_size_bytes: 256 # Size of each chunk in bytes
    apply_to: ["application/json", "application/xml", "text/plain", "image/png", "image/jpeg"] # Response content types to apply simulated streaming to
  
# API configurations, each API can have its own settings, but will inherit from default_settings if not specified
apis:
  gemini: 
    name: Google Gemini API
    endpoint: https://generativelanguage.googleapis.com/v1beta/openai
    aliases:
    - /gemini
    key_variable: keys
    headers:
      Authorization: 'Bearer ${{keys}}'
    variables:
      keys:
      - your_gemini_key_1
      - your_gemini_key_2
      - your_gemini_key_3
    load_balancing_strategy: least_requests
    rate_limit:
      # For Gemini, the rate limits (gemini-2.5-pro-exp-03-25) for each key are 5 RPM and 25 RPD
      # Ideally, the endpoint rate limit should be n x Per-Key-RPD, where n is the number of keys
      endpoint_rate_limit: 75/d
      key_rate_limit: 5/m
      # Rate limit paths are optional, but you can configure which paths to apply the rate limits to (regex supported), default is all paths "*"
      rate_limit_paths:
        - "/chat/*"
        - "/images/*"

    # [Advanced] Request body substitution settings, do not enable unless you know what you are doing
    request_body_substitution: 
      enabled: true 
      # Substitution rules for request body with JMEPath
      rules: # JMEPath rules for request body substitution
        - name: "Remove frequency_penalty" # if frequency_penalty is present, remove it from the request body since Gemini does not support it
          operation: remove
          path: "frequency_penalty"
          conditions:
            - field: "frequency_penalty"
              operator: "exists"
        - name: "Remove presence_penalty" # if presence_penalty is present, remove it from the request body since Gemini does not support it
          operation: remove
          path: "presence_penalty"
          conditions:
            - field: "presence_penalty"
              operator: "exists"

  # feel free to add more APIs here, just follow the same structure as above

📡 Service Endpoints

Service Endpoint Description
API Proxy http://localhost:8080/api/<endpoint_name> Main proxy endpoint for API requests
Dashboard http://localhost:8080/dashboard Real-time metrics and monitoring
Config UI http://localhost:8080/config Visual configuration interface

[!NOTE] Replace 8080 and localhost with your configured port and host setting if different

🔧 API Configuration

OpenAI-Compatible APIs (Gemini, Anthropic, etc)

gemini:
  name: Google Gemini API
  endpoint: https://generativelanguage.googleapis.com/v1beta/openai
  aliases:
    - /gemini
  key_variable: keys
  headers:
    Authorization: 'Bearer ${{keys}}'
  variables:
    keys:
      - your_gemini_key_1
      - your_gemini_key_2
  load_balancing_strategy: least_requests
  rate_limit:
    endpoint_rate_limit: 75/d     # Total endpoint limit
    key_rate_limit: 5/m          # Per-key limit
    rate_limit_paths:
      - "/chat/*"            # Apply limits to specific paths
      - "/images/*"

Generic REST APIs

novelai:
  name: NovelAI API
  endpoint: https://image.novelai.net
  aliases:
    - /novelai
  key_variable: tokens
  headers:
    Authorization: 'Bearer ${{tokens}}'
  variables:
    tokens:
      - your_novelai_token_1
      - your_novelai_token_2
  load_balancing_strategy: round_robin
  rate_limit:
    endpoint_rate_limit: 10/s
    key_rate_limit: 2/s

🔒 Security Features

Multiple API Keys Support

NyaProxy supports using multiple API keys for authentication:

server:
  api_key: 
    - your_master_key_for_admin_access
    - another_api_key_for_proxy_only
    - yet_another_api_key_for_proxy_only

[!TIP] The first key in the list acts as the master key with full access to the dashboard and configuration UI. Additional keys can only be used for API proxy requests. This enables you to share limited access with different teams or services.

[!CAUTION] When sharing your NyaProxy instance, never share your master key. Instead, create additional keys for different users or applications.

Advanced Features

Dynamic Header Substitution

NyaProxy's powerful templating system allows you to create dynamic headers with variable substitution:

apis:
  my_api:
    headers:
      Authorization: 'Bearer ${{keys}}'
      X-Custom-Header: '${{custom_variables}}'
    variables:
      keys:
        - key1
        - key2
      custom_variables:
        - value1
        - value2

[!NOTE] Variables in headers are automatically substituted with values from your variables list, following your configured load balancing strategy.

Use cases include:

  • Rotating between different authentication tokens
  • Cycling through user agents to avoid detection
  • Alternating between different account identifiers

Request Body Substitution

Dynamically transform JSON payloads using JMESPath expressions to add, replace, or remove fields:

request_body_substitution:
  enabled: true
  rules:
    - name: "Default to GPT-4"
      operation: set
      path: "model"
      value: "gpt-4"
      conditions:
        - field: "model"
          operator: "exists"

For detailed configuration options and examples, see the Request Body Substitution Guide.

🖥️ Management Interfaces

Real-time Metrics Dashboard

Dashboard UI

Monitor at http://localhost:8080/dashboard:

  • Request volumes and response times
  • Rate limit status and queue depth
  • Key usage and performance metrics
  • Error rates and status codes

Visual Configuration Interface

Configuration UI

Manage at http://localhost:8080/config:

  • Live configuration editing
  • Syntax validation
  • Variable management
  • Rate limit adjustments
  • Auto reload on save

🛡️ Reference Architecture

graph TD
    A[Client] --> B[Nginx]
    B --> C[NyaProxyAuth]
    C --> D[NyaProxyApp]
    D --> E[API Providers]
    F[Monitoring] --> D

🌌 Future Roadmap

graph LR
A[Q1 2025] --> B[📡 Documentation Enhancement ]
A --> C[🔄 Border Test Coverage ]
B --> D[📈 API Key Usage/Balance Tracking]
C --> E[📊 UI/UX Enhancement ]
F[Q2 2025] --> G[🧩 Plugin System]
F --> H[🔍 Custom Metrics API]

❤️ Community

Discord

[!NOTE] Need support? Contact k3scat@gmail.com or join our discord community at Nya Foundation

📈 Project Growth

Star History Chart

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nya_proxy-0.2.0.tar.gz (104.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nya_proxy-0.2.0-py3-none-any.whl (110.8 kB view details)

Uploaded Python 3

File details

Details for the file nya_proxy-0.2.0.tar.gz.

File metadata

  • Download URL: nya_proxy-0.2.0.tar.gz
  • Upload date:
  • Size: 104.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for nya_proxy-0.2.0.tar.gz
Algorithm Hash digest
SHA256 dea577066ecd10d2e166448463b06fb5351d98d2b9b4358ae564b54c1a383a1f
MD5 4eed35e12a47495868918dd8975faa9b
BLAKE2b-256 6585002b338f73411fda2d81ddb7a88fe9437e60ce62f695c50cf3cd0404f1e0

See more details on using hashes here.

Provenance

The following attestation bundles were made for nya_proxy-0.2.0.tar.gz:

Publisher: publish.yml on Nya-Foundation/NyaProxy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nya_proxy-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: nya_proxy-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 110.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for nya_proxy-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0113f39825ddeade7df16f496516a5403fe3f3b025192823377d316d33fe84e4
MD5 38c6a24c9374ceaf8b29779cddc7fb97
BLAKE2b-256 ef41c1856a4c50085f25d6d420c23b21b3512100939284f331f398ede209f377

See more details on using hashes here.

Provenance

The following attestation bundles were made for nya_proxy-0.2.0-py3-none-any.whl:

Publisher: publish.yml on Nya-Foundation/NyaProxy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page