Skip to main content

LlmCfg

Struct LlmCfg 

Source
pub struct LlmCfg {
Show 14 fields pub enabled: bool, pub api_style: String, pub models: BTreeMap<String, ModelPrice>, pub on_unpriced_model: String, pub budgets: Vec<BudgetCfg>, pub store: String, pub redis_url: String, pub redis_prefix: String, pub fail_open: bool, pub default_max_tokens: u64, pub team_header: String, pub keys: Vec<KeyEntryCfg>, pub dlp: DlpCfg, pub telemetry: TelemetryCfg,
}
Expand description

LLM token-metering settings ([llm]). When enabled, the proxy parses OpenAI-compatible request/response bodies to count tokens (from the upstream’s usage object) and, for any model listed in [llm.models], the cost. Metering is observe-only: it never blocks or alters traffic. An unmapped model still has its tokens counted (cost is simply omitted).

Fields§

§enabled: bool

Turn on the LLM gateway: token metering, cost attribution, budgets, the key vault and DLP. Off by default, and irrelevant unless the upstream is an LLM API.

§api_style: String

Wire format. Only "openai" is understood today (the default).

§models: BTreeMap<String, ModelPrice>

Per-model price book, keyed by the model string clients send. Prices are USD per 1,000,000 tokens. Example: [llm.models."gpt-4o"] input_per_1m = 2.5 / output_per_1m = 10.0.

§on_unpriced_model: String

What to do with a request whose model is not in [llm.models]: "count" (default — meter tokens, omit cost, forward the request) or "block" (reject 402 before it reaches the upstream, so an unpriced model is never served at a silent $0). "block" only bites when a price book is configured — a metering-only deployment (empty [llm.models]) never rejects.

§budgets: Vec<BudgetCfg>

Hard token/cost budgets (gateway L1). Empty by default (no enforcement — L0 metering only). Each [[llm.budgets]] is a ceiling enforced fail-closed via reserve→reconcile. See BudgetCfg.

§store: String

Budget store backend: "memory" (single replica / default) or "redis" (shared across replicas — required for a true fleet-wide cap). "local" is treated as "memory".

§redis_url: String

Redis URL when store = "redis", e.g. redis://127.0.0.1:6379. Note: EDGEGUARD_REDIS_URL only overrides ratelimit.redis_url, not this key — set it here (or via pushed policy).

§redis_prefix: String

Key prefix for budget keys in Redis (namespacing a shared server). Defaults to edgeguard.

§fail_open: bool

On a budget-store error, allow the request (true) or reject it 503 (false, the default — fail-closed, so an outage can’t silently uncap spend).

§default_max_tokens: u64

Completion tokens to assume when a request omits max_tokens, used only for the reserve estimate (the reservation is reconciled to actual usage afterward). Default 1024.

§team_header: String

Request header carrying the team / tag a request is attributed to, for the per-team budget scope and team chargeback. Case-insensitive; default x-edgeguard-team. A request without it falls into the shared _none team bucket.

§keys: Vec<KeyEntryCfg>

BYO-key vault + egress governance (gateway L2). Empty by default (no vault). Each [[llm.keys]] maps a client-facing virtual key to a real provider key (injected upstream, never returned to the client) plus an optional per-key model egress allowlist. When any key is configured, every proxied request must present a known virtual key. See KeyEntryCfg.

§dlp: DlpCfg

Edge DLP — PII / secret detection + redaction (gateway L3). Off by default. See DlpCfg.

§telemetry: TelemetryCfg

OTLP span emission (gateway L4) — SDK-free tracing to an OTel-native store. Off by default. See TelemetryCfg.

Trait Implementations§

Source§

impl Clone for LlmCfg

Source§

fn clone(&self) -> LlmCfg

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 LlmCfg

Source§

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

Formats the value using the given formatter. Read more
Source§

impl Default for LlmCfg

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for LlmCfg
where LlmCfg: Default,

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. 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> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

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> 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 = !

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

fn try_from(value: U) -> Result<T, !>

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