Dugout Value
투구·타격·예측 연구와 선수·계약·트레이드 가치를 비교하는 도구 제공
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Ask anything about Formula 1 and get live, streamed charts and tables. A generative UI demo built with OpenUI, OpenF1 and Next.js.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A Formula 1 demo built on OpenUI: a "team radio" chat that answers with live charts, tables and F1 visuals, alongside Home, Standings, Drivers and Teams dashboards. All data comes from OpenF1.
It grew out of the conversational analytics cookbook in the OpenUI repo. The cookbook stays small and matches its walkthrough; this repo is the full demo that gets deployed.
Needs Node 22.13 or later.
Open http://127.0.0.1:3000.README 전문 보기 ↗A Formula 1 demo built on OpenUI: a "team radio" chat that answers with live charts, tables and F1 visuals, alongside Home, Standings, Drivers and Teams dashboards. All data comes from OpenF1.
It grew out of the conversational analytics cookbook in the OpenUI repo. The cookbook stays small and matches its walkthrough; this repo is the full demo that gets deployed.
Needs Node 22.13 or later.
npm install
npm run generate:apiKey # writes THESYS_API_KEY to .env.local
npm run snapshot:f1 # optional: cache finished 2026 sessions so the tools work offline
npm run dev
Open http://127.0.0.1:3000.
| Variable | Default | Purpose |
|---|---|---|
THESYS_API_KEY | (required) | OpenUI Gateway key, used only on the server |
OPENUI_MODEL | openai/gpt-5.5 | Model for the chat |
APP_ID | f1-dashboard | Keeps this app's threads apart from others on the same key |
OPENF1_PER_MINUTE | 28 | OpenF1 request budget per minute |
ALLOWED_ORIGINS | (none) | Extra origins the API accepts, comma-separated, e.g. a preview domain |
| URL | What it shows |
|---|---|
/, /standings, /drivers, /teams | Dashboards; picking anything starts a chat |
/new | A new chat, with three questions suggested from your earlier ones (/api/starters) |
/[threadId] | An earlier chat, loaded from Gateway (only in the browser session that made it) |
Each URL is its own page under src/app/(radio)/. The layout holds what stays mounted between them: the chat store, the sidebar, the input, and the thread once a conversation has messages. That is what lets the URL move from /new (or a dashboard) to the new thread mid-answer without cutting it off.
/api/chat; the route uses only the last one, the new question.get_results, get_lap_times, get_standings, …). The route runs them between completions (src/lib/tool-loop.ts) and streams AG-UI events, so each tool call shows its result live.src/library.ts). The F1 charts take only a session and drivers and fetch their own rows from /api/f1/[tool], so their numbers never pass through the model; tables carry the values the model copies from tool results.The tools (src/lib/f1/tools) call OpenF1 through one rate-limited client with a disk cache under data/openf1. Finished sessions are cached forever, and a stale copy is served if OpenF1 is down. npm run snapshot:f1 fills that cache ahead of time; npm run snapshot:f1 -- --year 2025 --light adds last season's races (results, standings and stints only).
Driver, team colour and circuit data for the visuals is committed under src/assets/f1. Refresh it for a new season with npx tsx scripts/snapshot-f1-assets.ts.
next.config.ts bundles data/** into the API routes, so run npm run snapshot:f1 before building. Hosts with a read-only filesystem keep new OpenF1 responses in memory only.
There's no sign-in; it follows the OpenUI docs chat. Each browser tab session makes up an anonymous visitor id (src/lib/user-id.ts, kept in sessionStorage) and sends it when asking /api/frontend-token for a token. Gateway scopes that token to the id, so a visitor lists and opens only their own threads, which are stored as Gateway conversations. Closing the tab starts a new visitor with an empty list. The id keeps visitors apart; it doesn't prove who anyone is.
The API routes accept only requests from the app's own pages: a request with no Origin header (a script, curl) is refused, so it can't spend Gateway credit from outside. There's no rate limiting, so add some before promoting the demo widely.