1import type { ProviderDriverKind, ProviderOptionDescriptor } from "@t3tools/contracts";
2import { getProviderOptionCurrentValue } from "@t3tools/shared/model";
3import { ZapIcon } from "lucide-react";
4import { UltrafastIcon } from "../Icons";
5import { cn } from "~/lib/utils";
6import { ComposerControlIcon, type ComposerControlSize } from "./ComposerControl";
7
8export function getTraitsSpeedDisplay(
9 provider: ProviderDriverKind,
10 descriptor: ProviderOptionDescriptor,
11): { label: string; speedIcon: "fast" | "ultrafast" | null } | null {
12 if (descriptor.id === "fastMode" && descriptor.type === "boolean") {
13 return {
14 label: descriptor.currentValue === true ? "Fast" : "Normal",
15 speedIcon: descriptor.currentValue === true ? "fast" : null,
16 };
17 }
18 if (provider !== "codex" || descriptor.id !== "serviceTier" || descriptor.type !== "select") {
19 return null;
20 }
21 const currentValue = getProviderOptionCurrentValue(descriptor);
22 const fastTier = descriptor.options.find(({ label }) => label === "Fast");
23 const ultrafastTier = descriptor.options.find(({ label }) => label === "Ultrafast");
24 if (
25 ((fastTier || ultrafastTier) && currentValue === "default") ||
26 (fastTier && currentValue === fastTier.id) ||
27 (ultrafastTier && currentValue === ultrafastTier.id)
28 ) {
29 return {
30 label: descriptor.options.find(({ id }) => id === currentValue)?.label ?? "Normal",
31 speedIcon:
32 ultrafastTier && currentValue === ultrafastTier.id
33 ? "ultrafast"
34 : fastTier && currentValue === fastTier.id
35 ? "fast"
36 : null,
37 };
38 }
39 return null;
40}
41
42export function TraitsSpeedIcon({
43 provider,
44 speedIcon,
45 size = "sm",
46}: {
47 provider: ProviderDriverKind;
48 speedIcon: "fast" | "ultrafast";
49 size?: ComposerControlSize;
50}) {
51 return (
52 <>
53 <ComposerControlIcon
54 icon={speedIcon === "ultrafast" ? UltrafastIcon : ZapIcon}
55 size={size}
56 className={cn(
57 "fill-current opacity-80",
58 size === "xs"
59 ? "text-current"
60 : provider === "claudeAgent"
61 ? "text-[#d97757]"
62 : "text-foreground",
63 )}
64 />
65 <span className="sr-only">
66 {speedIcon === "ultrafast" ? "Ultrafast mode on" : "Fast mode on"}
67 </span>
68 </>
69 );
70}