import type { ClientModel, LatencyMode, ReasoningEffort } from "@opengeni/sdk"; import { type CSSProperties, type ReactNode } from "react"; import { defaultModelPolicyPickerMessages, groupPresentationFor, SCOPED_BILLING_HINTS, type ModelPickerGroupPresentation, type ModelPolicyPickerMessages } from "../model-picker-model.js"; import { type PickerBillingClass, type PickerModelRow } from "../model-policy.js"; import { type OpenGeniText } from "../messages/runtime.js"; type ClientPickerModelRow = PickerModelRow; /** Presentation only; never changes model identity, billing or availability. */ export type ModelPolicyPickerGroupPresentation = ModelPickerGroupPresentation; export { defaultModelPolicyPickerMessages, groupPresentationFor, SCOPED_BILLING_HINTS }; export type { ModelPolicyPickerMessages }; export type ModelPolicyPickerProps = { /** Host branding for payment-source groups, shared by menu and trigger. */ groupPresentation?: ModelPolicyPickerGroupPresentation | undefined; /** Lightweight deployment models. Catalog rows take precedence when supplied. */ models?: ClientModel[] | undefined; /** Warn only when the draft actually contains images this model cannot view. */ hasImageAttachments?: boolean | undefined; /** Catalog-backed rows with availability and billing-class truth. */ rows?: PickerModelRow[] | undefined; model: string; effort: ReasoningEffort; latencyMode: LatencyMode; disabled?: boolean | undefined; loading?: boolean | undefined; error?: string | null | undefined; /** Controlled menu state. Omit for the built-in uncontrolled behavior. */ open?: boolean | undefined; /** Initial menu state when `open` is uncontrolled. */ defaultOpen?: boolean | undefined; onOpenChange?: ((open: boolean) => void) | undefined; /** Non-Codex models stay visible but cannot be selected. */ codexOnly?: boolean | undefined; /** Identity of the current session scope. */ sessionKey?: string | undefined; /** Prefer bottom on new-chat surfaces and top for bottom-docked composers. */ menuSide?: "top" | "bottom" | undefined; /** * Default true: show models the way people choose them, with clean names, * maker marks, one "API keys" group for organization- and workspace-connected * keys, and one row for identical copies. Models settings passes false to * keep its scope-aware presentation (raw catalog labels, scoped groups). */ collapseScopes?: boolean | undefined; /** Hide latency controls on surfaces whose saved policy does not include latency. */ allowLatencyMode?: boolean | undefined; /** Hide effort and latency controls when the saved policy chooses only a model identity. */ allowModelOptions?: boolean | undefined; /** Settings → Models. Shown when the catalog has no model that can run. */ connectModelsHref?: string | undefined; /** Classes for the portalled menu surface. Prefer --og-* tokens for theming. */ contentClassName?: string | undefined; /** Inline styles for the portalled menu, applied after inherited --og-* tokens. */ contentStyle?: CSSProperties | undefined; className?: string | undefined; /** * "pill" (default) is the composer's quiet rounded trigger with the effort. * "field" is a settings control: a bordered rectangle with the model name * and `triggerMeta` (for example the payer) in muted text. The effort stays * in the menu. */ triggerStyle?: "pill" | "field" | undefined; /** Muted text after the model name in the "field" trigger. */ triggerMeta?: ReactNode; messages?: Partial | undefined; onModelChange: (modelId: string) => void; onEffortChange: (effort: ReasoningEffort) => void; onLatencyModeChange: (latencyMode: LatencyMode) => void; }; export declare function BillingClassMark(props: { billingClass: PickerBillingClass; presentation?: ModelPolicyPickerGroupPresentation[PickerBillingClass] | undefined; className?: string | undefined; "aria-label"?: string | undefined; }): import("react").JSX.Element | null; export declare function effectiveRows(t: OpenGeniText, props: ModelPolicyPickerProps): ClientPickerModelRow[]; export declare function PickerNavRow(props: { label: string; hint?: string | undefined; icon?: ReactNode; trailing?: ReactNode; showChevron?: boolean | undefined; disabled?: boolean | undefined; title?: string | undefined; description?: string | undefined; active?: boolean | undefined; testId?: string | undefined; onClick: () => void; }): import("react").JSX.Element; export declare function PickerBackHeader(props: { label: string; icon?: ReactNode; onBack: () => void; trailing?: ReactNode; }): import("react").JSX.Element; export declare function PickerAnimatedPage(props: { pageKey: string; direction: 1 | -1; children: ReactNode; }): import("react").JSX.Element; /** @internal Shared controlled/uncontrolled state seam. */ export declare function useModelPolicyPickerState(props: ModelPolicyPickerProps): { open: boolean; setOpen: (next: boolean) => void; rows: ClientPickerModelRow[]; }; export declare function ModelPolicyPicker(props: ModelPolicyPickerProps): import("react").JSX.Element;