Spaces:
Sleeping
Sleeping
Commit ·
ebf62dc
1
Parent(s): 04475cf
nav: icon tabs, and a roomier bid token cap
Browse filesChat 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 +2 -2
- frontend/app/page.tsx +10 -3
- frontend/components/icons.tsx +21 -0
backend/app/config.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
"""Central configuration for
|
| 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 =
|
| 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 |
-
{([
|
|
|
|
|
|
|
|
|
|
| 59 |
<button
|
| 60 |
key={t}
|
| 61 |
onClick={() => setTab(t)}
|
| 62 |
-
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 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 (
|