dakshtaneja Claude Opus 5 commited on
Commit
ebf62dc
·
1 Parent(s): 04475cf

nav: icon tabs, and a roomier bid token cap

Browse files

Chat and metrics tabs become a speech bubble and a bar chart -- the
analytics glyph SaaS dashboards use -- keeping the orange active state
and adding aria-label/title so the words aren't lost.

max_bid_tokens 3500 -> 5000, since the cap only bites on the winning
speculative drafts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

backend/app/config.py CHANGED
@@ -1,4 +1,4 @@
1
- """Central configuration for AuctionRouter.
2
 
3
  All model choices, auction weights, and thresholds from the PRD live here so
4
  they can be tuned without touching pipeline code.
@@ -225,7 +225,7 @@ class Settings(BaseSettings):
225
  max_answer_tokens: int = 3500
226
  # Bids without a speculative answer stay ~100 tokens; the cap only
227
  # bites on answer-carrying bids (which are the winning drafts)
228
- max_bid_tokens: int = 3500
229
 
230
  # Conversation history caps per pipeline stage (turns are single
231
  # messages, so 4 turns = 2 user/assistant exchanges)
 
1
+ """Central configuration for GAVL.
2
 
3
  All model choices, auction weights, and thresholds from the PRD live here so
4
  they can be tuned without touching pipeline code.
 
225
  max_answer_tokens: int = 3500
226
  # Bids without a speculative answer stay ~100 tokens; the cap only
227
  # bites on answer-carrying bids (which are the winning drafts)
228
+ max_bid_tokens: int = 5000
229
 
230
  # Conversation history caps per pipeline stage (turns are single
231
  # messages, so 4 turns = 2 user/assistant exchanges)
frontend/app/page.tsx CHANGED
@@ -5,6 +5,7 @@ import { AccessGate } from "@/components/AccessGate";
5
  import { AuctionPanel } from "@/components/AuctionPanel";
6
  import { BidArcade } from "@/components/BidArcade";
7
  import { Chat } from "@/components/Chat";
 
8
  import { MetricsDashboard } from "@/components/MetricsDashboard";
9
  import { RoutingGraph } from "@/components/RoutingGraph";
10
  import { VerificationPanel } from "@/components/VerificationPanel";
@@ -55,17 +56,23 @@ export default function Home() {
55
  <span className="blink text-orange-500">_</span>
56
  </h1>
57
  <nav className="flex gap-2">
58
- {(["chat", "metrics"] as Tab[]).map((t) => (
 
 
 
59
  <button
60
  key={t}
61
  onClick={() => setTab(t)}
62
- className={`rounded px-2.5 py-1.5 font-[family-name:var(--font-pixel)] text-[10px] uppercase sm:px-4 sm:py-2 sm:text-[12px] ${
 
 
 
63
  tab === t
64
  ? "glow-text bg-orange-950 text-orange-400"
65
  : "bg-stone-900 text-stone-500 hover:text-stone-300"
66
  }`}
67
  >
68
- {tab === t ? `▶ ${t}` : t}
69
  </button>
70
  ))}
71
  </nav>
 
5
  import { AuctionPanel } from "@/components/AuctionPanel";
6
  import { BidArcade } from "@/components/BidArcade";
7
  import { Chat } from "@/components/Chat";
8
+ import { ChatIcon, MetricsIcon } from "@/components/icons";
9
  import { MetricsDashboard } from "@/components/MetricsDashboard";
10
  import { RoutingGraph } from "@/components/RoutingGraph";
11
  import { VerificationPanel } from "@/components/VerificationPanel";
 
56
  <span className="blink text-orange-500">_</span>
57
  </h1>
58
  <nav className="flex gap-2">
59
+ {([
60
+ ["chat", ChatIcon] as const,
61
+ ["metrics", MetricsIcon] as const,
62
+ ]).map(([t, Icon]) => (
63
  <button
64
  key={t}
65
  onClick={() => setTab(t)}
66
+ aria-label={t}
67
+ aria-current={tab === t ? "page" : undefined}
68
+ title={t === "chat" ? "Chat" : "Metrics"}
69
+ className={`rounded p-2 sm:p-2.5 ${
70
  tab === t
71
  ? "glow-text bg-orange-950 text-orange-400"
72
  : "bg-stone-900 text-stone-500 hover:text-stone-300"
73
  }`}
74
  >
75
+ <Icon className="h-4 w-4 sm:h-5 sm:w-5" />
76
  </button>
77
  ))}
78
  </nav>
frontend/components/icons.tsx CHANGED
@@ -55,6 +55,27 @@ export function RegenerateIcon({ className = "h-4 w-4" }: { className?: string }
55
  );
56
  }
57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  /** Pencil — edit an existing prompt. */
59
  export function PencilIcon({ className = "h-4 w-4" }: { className?: string }) {
60
  return (
 
55
  );
56
  }
57
 
58
+ /** Rounded speech bubble — the chat tab. */
59
+ export function ChatIcon({ className = "h-4 w-4" }: { className?: string }) {
60
+ return (
61
+ <Svg className={className}>
62
+ <path d="M21 11.5a8.4 8.4 0 0 1-9 8.4 9.6 9.6 0 0 1-2.9-.4L3 21l1.6-4.7A8.1 8.1 0 0 1 3.6 11.5a8.4 8.4 0 0 1 9-8.4 8.4 8.4 0 0 1 8.4 8.4Z" />
63
+ </Svg>
64
+ );
65
+ }
66
+
67
+ /** Ascending bar chart — the analytics glyph every SaaS dashboard uses. */
68
+ export function MetricsIcon({ className = "h-4 w-4" }: { className?: string }) {
69
+ return (
70
+ <Svg className={className}>
71
+ <line x1="3" y1="21" x2="21" y2="21" />
72
+ <line x1="7" y1="21" x2="7" y2="14" />
73
+ <line x1="12" y1="21" x2="12" y2="10" />
74
+ <line x1="17" y1="21" x2="17" y2="5" />
75
+ </Svg>
76
+ );
77
+ }
78
+
79
  /** Pencil — edit an existing prompt. */
80
  export function PencilIcon({ className = "h-4 w-4" }: { className?: string }) {
81
  return (