import { useAtomValue } from "@effect/atom-react"; import type { EnvironmentId, UsageModelPriceOverride } from "@t3tools/contracts"; import { useState } from "react"; import { isElectron } from "../../env"; import { type EnvironmentPresentation, useEnvironments, usePrimaryEnvironmentId, } from "../../state/environments"; import { serverEnvironment } from "../../state/server"; import { useEnvironmentSessionState } from "../../state/session"; import { useAtomCommand } from "../../state/use-atom-command"; import type { EnvironmentUsageStatus } from "../../state/usage"; import { resolvePrimaryOperateAccess, resolveRemoteOperateAccess, } from "../settings/ProviderSettingsPanel.logic"; import { Button } from "../ui/button"; import { Dialog, DialogDescription, DialogHeader, DialogPanel, DialogPopup, DialogTitle, } from "../ui/dialog"; import { Input } from "../ui/input"; import { Label } from "../ui/label"; import { Select, SelectItem, SelectPopup, SelectTrigger, SelectValue } from "../ui/select"; import { parseUsagePriceForm, USAGE_PRICE_FIELDS, usagePriceForm } from "./usagePriceForm"; export function UsagePriceOverrides({ usage, }: { readonly usage: readonly EnvironmentUsageStatus[]; }) { const [open, setOpen] = useState(false); return ( <> {open ? : null} ); } function ModelPricesDialog({ usage, onOpenChange, }: { readonly usage: readonly EnvironmentUsageStatus[]; readonly onOpenChange: (open: boolean) => void; }) { const { environments } = useEnvironments(); const primaryEnvironmentId = usePrimaryEnvironmentId(); const [selectedId, setSelectedId] = useState(primaryEnvironmentId); const environment = environments.find((entry) => entry.environmentId === selectedId) ?? environments[0]; const summary = usage.find( (entry) => entry.environmentId === environment?.environmentId, )?.summary; const models = [...new Set(summary?.buckets.map((bucket) => bucket.model) ?? [])].sort(); return ( Model prices Override estimated costs using USD per million tokens. Prices apply to all saved history on the selected environment. {environment ? ( <>
) : (

Connect an environment to set model prices.

)}
); } function EnvironmentModelPrices({ environment, models, }: { readonly environment: EnvironmentPresentation; readonly models: readonly string[]; }) { const settings = useAtomValue(serverEnvironment.settingsValueAtom(environment.environmentId)); const session = useEnvironmentSessionState(environment.environmentId); const updateSettings = useAtomCommand(serverEnvironment.updateSettings, { reportFailure: false }); const [form, setForm] = useState(usagePriceForm()); const [editingModel, setEditingModel] = useState(null); const [pending, setPending] = useState(false); const [error, setError] = useState(null); const prices = settings?.usagePriceOverrides ?? {}; const isPrimary = environment.entry.target._tag === "PrimaryConnectionTarget"; const access = isPrimary ? resolvePrimaryOperateAccess({ isPrimary, hasDesktopBridge: isElectron, session: session.data, isPending: session.isPending, hasError: session.hasError, }) : resolveRemoteOperateAccess({ session: session.data, isPending: session.isPending, hasError: session.hasError, }); const supportsOverrides = environment.serverConfig?.environment.capabilities.usagePriceOverrides === true; const unavailable = environment.connection.phase !== "connected" ? "Connect this environment to change its model prices." : settings === null ? "Loading model prices..." : !supportsOverrides ? "Update this environment's server to set model prices." : access === "pending" ? "Checking permissions..." : access === "denied" ? "This session can view model prices but cannot change them." : null; const readOnly = unavailable !== null || pending; const parsed = parseUsagePriceForm(form); const duplicate = editingModel === null && parsed !== null && Object.hasOwn(prices, parsed.model); const reset = () => { setEditingModel(null); setForm(usagePriceForm()); setError(null); }; const save = async (model: string, price: UsageModelPriceOverride | null) => { if (readOnly) return; setPending(true); setError(null); try { const result = await updateSettings({ environmentId: environment.environmentId, input: { patch: { usagePriceOverrides: { [model]: price } } }, }); if (result._tag === "Failure") { setError("Could not save model prices. Try again."); } else if (price !== null || editingModel === model) { reset(); } } finally { setPending(false); } }; return ( <> {Object.keys(prices).length > 0 ? (
    {Object.entries(prices) .sort(([left], [right]) => left.localeCompare(right)) .map(([model, price]) => (
  • {model}

    Input ${price.inputCostPerMillionTokens} · Output $ {price.outputCostPerMillionTokens}
    Cache read $ {price.cacheReadCostPerMillionTokens ?? price.inputCostPerMillionTokens} {" · "}Cache write $ {price.cacheWriteCostPerMillionTokens ?? price.inputCostPerMillionTokens}

  • ))}
) : (

No custom prices. Public model pricing is used when available.

)} {unavailable ?

{unavailable}

: null}
{ event.preventDefault(); if (parsed && !duplicate) void save(parsed.model, parsed.price); }} >
{editingModel === null ? "Add model price" : "Edit model price"}
setForm({ ...form, model: event.target.value })} /> {models.map((model) => ( {duplicate ? (

This model already has a price. Use Edit to change it.

) : null}
{USAGE_PRICE_FIELDS.map((field) => (
setForm({ ...form, [field.key]: event.target.value })} />
))}

Blank cache rates use the input price. Enter 0 for free tokens. Model IDs match exactly. Remove a price to restore automatic pricing.

{error ? (

{error}

) : null}
{editingModel !== null ? ( ) : null}
); }