Skip to main content

gproxy_protocol/adapt/models/
mod.rs

1//! Bounded full-directory collection and typed cross-vendor return mapping.
2//! Collection always begins at the first page. Vendor cursors stay private to
3//! the selected upstream; no cursor is renamed into another vendor's token.
4
5mod collect;
6mod convert;
7mod query;
8
9use crate::{HttpBody, WireResponse, codec::CodecLimits, transform::TransformError};
10
11pub use collect::{collect_claude, collect_gemini, collect_openai};
12pub use convert::*;
13
14#[derive(Debug, Clone, Copy)]
15pub struct ModelListLimits {
16    pub codec: CodecLimits,
17
18    /// Sum of encoded declared page sizes retained by this operation. Limits
19    /// both collection memory and the amount of data traversed across pages.
20    pub max_declared_bytes: u64,
21}
22
23#[derive(Debug)]
24pub struct ModelDirectory<T> {
25    pub value: T,
26    pub completed_calls: usize,
27}
28
29#[derive(Debug)]
30pub enum ModelListFailure {
31    Transform(TransformError),
32    Rejected(Box<WireResponse<HttpBody>>),
33}
34
35/// No partial directory is returned as success. `completed_calls` counts only
36/// decoded 2xx pages; a failed transport/decode may already have reached the
37/// upstream. This counter never authorizes retry.
38#[derive(Debug)]
39pub struct ModelListError {
40    pub completed_calls: usize,
41    pub completed_models: usize,
42    pub failure: ModelListFailure,
43}
44
45impl From<TransformError> for ModelListError {
46    fn from(error: TransformError) -> Self {
47        Self {
48            completed_calls: 0,
49            completed_models: 0,
50            failure: ModelListFailure::Transform(error),
51        }
52    }
53}