
F1verse
io.github.jinsim由 GitHub 账号 jinsim 发布v0.15.0更新于 Nov 7, 2026
Formula 1 race data with the domain rules applied: stints, tyre wear, publish-safety. Zero deps.
概览
F1verse 让助手获取已套用领域规则的一级方程式赛事数据:比赛故事、配速、进站策略、数据质量检查与冠军预测。
- 可以做什么
- 加载比赛与各阶段赛程,取得成绩、逐圈排名、领先变化、缠斗与比赛配速
- 查看进站段、轮胎衰退、进站交换、圈速取消以及遥测与天气采样
- 检查数据质量、交叉核对、修订记录,以及成绩是否适合发布
- 比较赛季、车手生涯、赛道与队友对决,并获取赛道几何与实测数据
- 计算冠军数学可能性,并运行带回测的赛季模拟预测
- 获取实时计时数据源,如车队无线电链接、计时统计与 FIA 文件
- 适用场景
- 适合让助手用计算得出的数字而非原始计时表来回答关于 F1 比赛、赛季或赛道的问题,或生成有依据的比赛摘要与冠军预测。
- 运行要求
- 以 stdio 本地运行,通过 uvx 从 f1verse 的 PyPI 包启动,因此需要 Python 与 uv。未声明任何 API 密钥或账号。运行时读取公开的 F1 接口与官方实时计时存档,需要网络访问。
安装
在 SourceWeft 中
- 打开 控制台中的 F1verse,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
f1verse
[PyPI] [Python] [Tests] [Dependencies] [License]
Documentation · MCP server · Agent skill · llms.txt · Changelog · Contributing · Security · License
Methods and evidence explains which answers are observations, model scenarios or retrospective evaluations, and how to reproduce their checks.
The story layer for Formula 1 data. Data libraries fetch and tidy — f1verse tells you what happened: lead changes, laps led, event timelines, stint strategy, race pace — and what happens next: title probabilities from a season simulation that ships with its own backtest.
Zero dependencies. Standard library only. Full live-timing coverage from 2023; lap-by-lap racing back to 1996, pit stops to 2011, and results, qualifying and standings to 1950 — each answer stating which era it came from and what that era does not hold.
Give it to an AI agent
f1verse provides both an agent skill (analysis instructions) and an MCP server (callable data tools). They can be used together or separately.
The f1verse skill teaches event discovery,
source checks, strategy interpretation and statistical limits. Codex discovers
it in this checkout under .agents/skills/f1verse; invoke it with $f1verse.
To use it in other projects, install that directory with a GitHub skill
installer or copy it to ~/.agents/skills/f1verse. It works with the Python
package or a connected MCP server. Installing the skill does not connect MCP.
For MCP, configure your client with:
The uvx launcher installs the package on demand; the server itself has no
runtime dependencies. Discover tools with tools/list, analysis instructions
with resources/list, and the race-brief and strategy-review templates
with prompts/list. Resources and prompts do not fetch race data. The tool
catalogue includes input/output schemas and read-only hints; call
f1verse.tools() for the current list.
The server manifest is server.json, and its official registry
name is io.github.jinsim/f1verse.
An MCP registry listing and a GitHub agent skill are separate distribution
paths; publishing one does not publish the other. A clone runs local changes
with python -m f1verse.mcp after pip install -e .; uvx runs the latest
published PyPI version, which may differ from this checkout.
For any other LLM pipeline, the library describes itself:
Errors are written for the caller that has to fix them without reading this page:
The whole weekend, not just the race
Each kind gets the classification it actually has. Qualifying gaps are to
the fastest lap of that segment — the pole-sitter above was 0.085 s
off in Q1 — because a single "gap to leader" column would misreport the
session. A sprint loads as a Race; practice is a best-lap table.
Is this data safe to publish?
crosscheck answers do independent sources agree. quality_report adds
the three things that verdict is silent about: how complete the data is,
how old the copy is, and whether the classification is still provisional.
The chequered flag is not the final classification — scrutineering disqualifications and penalties land hours later and rewrite rows in place. So the rows the stewards can change are not cached forever until the session is final, and any change that is seen is recorded:
There is deliberately no as_of= time travel: f1verse can tell you what
it sees now and when it saw a value change, not reconstruct a value
nobody here ever fetched.
How the race actually unfolded
battles finds pairs that held consecutive positions within 1.5 s for at
least three laps. A scrap for eighth that ran a third of the race never
shows up in a classification; it is often the best part of the afternoon.
Races from before the live feeds
The coverage block is not decoration. 2008 has no stint data anywhere, so
ArchiveRace has no stints() — rather than returning an empty dict that
reads like "no pit stops happened". What the era recorded, you get; what it
did not, it says.
Seasons against each other
Points systems changed repeatedly, so a raw margin cannot compare eras — one point in 1958 was most of a win. Every row also carries the gap measured in wins, which is the comparison that survives the rule changes.
Where the passing happened
The timing feed publishes an OvertakeState per car that almost never
changes — about a hundred transitions in nineteen thousand records. That
sparsity is the value: the transitions are a free index of the moments worth
looking at, from the same feed that times the race. Read it as "something
happened here", then confirm against running_order.
Beyond a single race
Tyre life, and what the stewards struck out
Fuel load is not observed. For 2026 onward, stint_degradation returns a raw
clean-lap trend and declines fuel-corrected wear unless you supply an explicit
fuel_model scenario. Earlier seasons retain labelled legacy assumptions.
tyre_outlook is a constant-trend scenario, not measured physical tyre life.
A car's fuel burn can mask tyre wear. Corrected rates use a declared fuel
scenario and clean laps only. Assumptions and sensitivity accompany the
number. A stint with too few laps returns
{'degradation_s_per_lap': None, 'reason': 'too few clean laps'} rather
than a number fitted to noise.
A reinstated lap keeps the reversal visible instead of being quietly dropped. Check this before treating a fastest lap or a qualifying position as settled.
Live timing, straight off the wire
The official SignalR feed over a WebSocket written in the standard library — no websocket package, no SignalR client. Connecting takes three undocumented courtesies (an affinity cookie only handed to a pre-flight request, the official application's user agent, an invocation id on the subscription); they live in one place so no caller rediscovers them.
Recorded frames carry a millisecond arrival stamp — the difference
between an archive and a screenshot — so replay() runs a session back at
true speed. The stream is not a lap table, so
f1verse.sources.timing.laps_from_stream rebuilds one: arrival order
lies, sector times land after the next lap has begun, and qualifying
carries phantom lap times that are really the gap between two runs. Every
rebuilt lap row carries its provenance.
Running this on a schedule
Caching is policy-driven, not blanket: lap and telemetry data is immutable
and cached forever, schedules expire every few hours — a calendar cached
for a season would hide a cancelled round for the rest of the year — and
rows the stewards can still rewrite expire until the session is final.
f1verse.cache_info() and f1verse.clear_cache(older_than=...) are there
for operators; clear_cache never drops the revision journal.
Telemetry, track position, conditions
Telemetry is high-frequency, so these take a bounded window and filter server-side rather than downloading a session and trimming it locally.
Grounded narration
narrate accepts any text-generation callback; f1verse has no model SDK
dependency. The callback selects IDs from fact_catalog(facts) by returning
JSON such as {"fact_ids": ["result.winner", "led.NOR"]}. Python renders the
selected facts. A limited grammar of exact fact-bound phrases is also accepted;
arbitrary free prose is not verified. Generation is retried at most twice,
and a deterministic summary is returned if verification still fails. The
optional cache is exact-match only and stores verified text.
Who wins the championship — and who still can
Two different questions, and mixing them is how a projection ends up implying somebody is out when the arithmetic says otherwise.
A simulated finish is resampled from the positions that driver has
actually finished in, not drawn from a curve around their average. The
distinction decides championships: alternating wins and retirements is a
different proposition from finishing fourth every weekend, and the mean
is the same for both. Retirement uncertainty uses a declared Beta prior;
sprints draw their own outcomes and score on their own table. The model's
countback and other limitations are listed in assumptions.
Every run also re-draws the driver's own level first, bootstrapping their results before playing the season against that version of them — twelve races is a small sample, and treating it as settled truth is how a forecast becomes more confident than anyone should be.
These are replays using today's corrected data and calendar, not a record of predictions issued at the time. Multiple checkpoints in one season are dependent; the effective sample is seasons, not the number of driver probabilities.
Evidence-linked changes
pace_changes compares adjacent clean-lap windows without crossing excluded or
missing laps. It uses future laps, so it is not a live detector. Neither a gap
change nor a pace shift identifies a causal effect. Survival uses completed-lap
exposure and all-cause DNF flags; it does not identify physical tyre life.
championship_prediction(infeeds) is a different thing — F1's own live "if it ended now" table.championship_projectionis this model. One reports, the other forecasts.
Predictions, pit-stop verdicts, official documents
Why this exists
Raw timing data needs a lot of domain knowledge before it means anything:
- Classified gaps are not comparable across lapped cars. A car one lap
down can show a smaller number than one that finished ahead on the lead
lap. →
format_gapapplies the broadcast convention (+1 LAP). - "Who led the race" has to be derived. Lead changes, laps led and the
moments they happened are not published as such.
→
leader_runs,laps_led,timeline. - Race pace needs rules, not just a threshold: in/out laps and laps run
under SC/VSC have to go, or the number is meaningless.
→
race_paceapplies them by default. - Web and video pipelines need plain JSON. Every f1verse output is JSON-safe Python, ready to serialise.
- Data quality should be checkable in code, not read from logs.
→
crosscheckandquality_reportreturn structured verdicts. - Results change after the flag. A cache that treats a classification as immutable makes a stewards' decision invisible. → revisable rows expire until the session is final; changes are recorded.
Additional live-timing feeds
The official live-timing archive publishes several feeds that are rarely surfaced. f1verse parses three of them, with the same caching and rate-limit etiquette as the rest of the library:
Running continuously
See OPERATIONS.md for caching policy, rate limits and scheduling.
Tests
Sources
All are public endpoints, read at runtime. See src/f1verse/sources/ for
the exact hosts, and NOTICE for how upstream data rights relate to this
project's own license.
Design rules
- Zero required dependencies. The native loader reads public REST endpoints and the official live-timing archive directly, with its own on-disk cache and polite pacing.
- Everything returned is plain JSON-safe Python.
- F1 domain rules are defaults, not options.
- Cross-checked where possible — lapped-car gaps, for instance, are computed by convention and confirmed against a second source.
- Code only. No timing data, media, or images are bundled or redistributed; data is fetched by the end user.
License
Apache-2.0. See LICENSE and NOTICE.
Use it privately or commercially; read it, change it, redistribute it, and build products or hosted services on it. Preserve the license and notices, state significant changes, and observe the license's patent terms. There is no source-disclosure requirement for software or services that use f1verse.
This license covers f1verse's own source. The Formula 1 data it reads at runtime belongs to its respective rights holders under their own terms.
Roadmap
- Broader cross-validation coverage
- Deviation detection: expected range, actual, evidence
- Localisation packages
Unofficial fan project. Not affiliated with, endorsed by, or associated with Formula 1, FIA, FOM, or any F1 team. F1, FORMULA 1 and related marks are trademarks of Formula One Licensing BV. This library contains code only — no timing data, media, or images are included or redistributed; data is fetched by the end user from publicly accessible endpoints, subject to the respective providers' terms.
来源:README.md,提交 ecb58ee
工具
0版本历史
2- v0.15.0最新Nov 7, 2026
- v0.14.0Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分