Skip to main content

ProxyConfig

Struct ProxyConfig 

Source
pub struct ProxyConfig {
Show 13 fields pub bind: String, pub upstream_anthropic: String, pub upstream_openai: String, pub db_path: String, pub tenant_id: String, pub require_auth: bool, pub tenant_keys: TenantKeys, pub prompt_salt: String, pub mode: Mode, pub routing: Option<Config>, pub prices: PriceTable, pub max_concurrency: usize, pub tenant_rate_per_sec: Option<NonZeroU32>,
}
Expand description

Runtime configuration for the proxy.

Fields§

§bind: String

Address to bind the HTTP server to, e.g. 127.0.0.1:8080.

§upstream_anthropic: String

Base URL of the upstream Anthropic-compatible API.

§upstream_openai: String

Base URL of the upstream OpenAI-compatible API.

§db_path: String

Path to the SQLite trace database.

§tenant_id: String

Tenant identifier stamped on every trace when require_auth is off (single-operator default). When require_auth is on, the per-request tenant comes from the verified API key instead, and this is only the fallback for operator-scoped tooling.

§require_auth: bool

Multi-tenant auth gate (ADR 0004 §D1). Default false — single-operator behavior is byte-identical: no auth checks, tenant is the static Self::tenant_id. Set via FIRSTPASS_REQUIRE_AUTH. Experimental / pre-external-review (ADR 0004 §D7).

§tenant_keys: TenantKeys

Per-tenant Argon2id API-key hashes (ADR 0004 §D1). Empty unless configured via FIRSTPASS_TENANT_KEYS (path to a JSON { tenant_id: hash }) or FIRSTPASS_TENANT_KEYS_JSON (inline JSON). Only consulted when require_auth is on.

The stored hash is the Argon2id hash of a tenant’s secret (make one with TenantKeys::hash_key). A tenant then authenticates with the key <tenant_id>.<secret> — the tenant id names which hash to verify, so a request does exactly one Argon2 check. Tenant ids must not contain a . (the first . splits id from secret).

§prompt_salt: String

Salt mixed into the prompt hash so raw prompt text never touches storage.

§mode: Mode

Default mode when no routing config matches (observe unless overridden).

§routing: Option<Config>

Optional declarative routing config (§8.4). When present, its routes decide the mode, ladder, and gates per request; enforce routes activate the escalation engine.

§prices: PriceTable

Model pricing table used to cost each attempt.

§max_concurrency: usize

Max in-flight requests before new ones queue behind the concurrency limiter (FIRSTPASS_MAX_CONCURRENCY, default 512). A load-shed valve, not a timeout — it never severs an in-flight SSE stream.

§tenant_rate_per_sec: Option<NonZeroU32>

Per-tenant request rate limit, requests/sec (ADR 0004 §D6). None (the default) means unlimited — single-operator and existing deployments are unaffected. Set via FIRSTPASS_TENANT_RATE_PER_SEC; only enforced when configured.

Implementations§

Source§

impl ProxyConfig

Source

pub fn from_env() -> Result<Self, ConfigError>

Load configuration from environment variables, falling back to local defaults.

§Errors

ConfigError::UnsupportedMode for an unknown FIRSTPASS_MODE; ConfigError::Config if the FIRSTPASS_CONFIG routing file cannot be read or parsed.

Source

pub fn from_lookup( lookup: impl Fn(&str) -> Option<String>, ) -> Result<Self, ConfigError>

Load configuration from an arbitrary key lookup — the seam from_env uses, exposed so tests can exercise defaulting/validation without touching real process env vars. The routing config is supplied inline via the FIRSTPASS_CONFIG_TOML key.

§Errors

ConfigError::UnsupportedMode for an unknown FIRSTPASS_MODE; ConfigError::Config if the inline routing TOML fails to parse.

Trait Implementations§

Source§

impl Clone for ProxyConfig

Source§

fn clone(&self) -> ProxyConfig

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ProxyConfig

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

Source§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more