mirror of
https://github.com/Routstr/routstr-core.git
synced 2026-07-22 12:22:20 +00:00
Add TinfoilUpstreamProvider that uses inference.tinfoil.sh as a direct
EHBP upstream. Routstr acts as a blind relay: it forwards the opaque
encrypted body to the Tinfoil enclave without ever seeing plaintext,
and bills from the X-Tinfoil-Usage-Metrics response header.
- New routstr/upstream/tinfoil.py: fetches models from public
GET /v1/models, parses Tinfoil pricing into standard Model/Pricing
schema, supports_ehbp=True, proxies /attestation to atc.tinfoil.sh
- Updated routstr/upstream/ehbp.py:
- parse_tinfoil_usage_metrics() parses prompt=N,completion=N header
- _resolve_ehbp_target_url() honors X-Tinfoil-Enclave-Url from SDK
- _strip_proxy_headers() removes proxy-only headers before forwarding
- _compute_ehbp_actual_cost() converts usage to msats via calculate_cost
- forward_ehbp_request() finalizes with exact token cost when usage
header is present (non-streaming), falls back to max-cost otherwise
- forward_ehbp_x_cashu_request() computes refund from actual cost
when usage is available
- Updated routstr/proxy.py: forward /attestation and /.well-known/ paths
without model/cost/auth lookups
- Updated routstr/upstream/__init__.py and helpers.py: register and
auto-seed Tinfoil provider from TINFOIL_API_KEY env var
- Updated .env.example with TINFOIL_API_KEY
- 22 new unit tests in tests/unit/test_tinfoil_integration.py
- Updated docs/tinfoil-direct-integration.md and docs/ehbp-proxy-support.md
with implementation status and billing behavior table
48 lines
1.3 KiB
Plaintext
48 lines
1.3 KiB
Plaintext
# Core Configuration
|
|
UPSTREAM_BASE_URL=https://api.openai.com/v1
|
|
UPSTREAM_API_KEY=your-upstream-api-key
|
|
|
|
# Tinfoil (confidential inference enclaves, EHBP)
|
|
# TINFOIL_API_KEY=your-tinfoil-api-key
|
|
|
|
# ADMIN_PASSWORD=secure-admin-password
|
|
|
|
# Database
|
|
# DATABASE_URL=sqlite+aiosqlite:///keys.db
|
|
|
|
# Node Information
|
|
# NAME=My Routstr Node
|
|
# DESCRIPTION=Fast AI API access with Bitcoin payments
|
|
# NSEC=nsec1...
|
|
# HTTP_URL=https://api.mynode.com
|
|
# ONION_URL=http://mynode.onion (auto fetched from compose)
|
|
# RELAYS="wss://relay.damus.io,wss://relay.nostr.band,wss://eden.nostr.land,wss://relay.routstr.com"
|
|
# ENABLE_ANALYTICS_SHARING=true
|
|
# CASHU_MINTS="https://mint.minibits.cash/Bitcoin,https://mint.cubabitcoin.org,https://ecashmint.otrta.me"
|
|
# RECEIVE_LN_ADDRESS=
|
|
|
|
# Custom Pricing Configuration
|
|
# MODEL_BASED_PRICING=true
|
|
# COST_PER_REQUEST=1
|
|
# COST_PER_1K_INPUT_TOKENS=0
|
|
# COST_PER_1K_OUTPUT_TOKENS=0
|
|
# EXCHANGE_FEE=1.005
|
|
# UPSTREAM_PROVIDER_FEE=1.05
|
|
|
|
# Network Configuration
|
|
# CORS_ORIGINS=*
|
|
# TOR_PROXY_URL=socks5://127.0.0.1:9050
|
|
|
|
# Logging
|
|
# LOG_LEVEL=INFO
|
|
# ENABLE_CONSOLE_LOGGING=true
|
|
|
|
# Custom Model Management
|
|
# BASE_URL=https://openrouter.ai/api/v1
|
|
# MODELS_PATH=models.json
|
|
# SOURCE=
|
|
|
|
# UI Configuration (for Next.js frontend)
|
|
# These variables are prefixed with NEXT_PUBLIC_ to be accessible in the browser
|
|
# NEXT_PUBLIC_API_URL=http://127.0.0.1:8000
|