|
import gradio as gr |
|
|
|
|
|
import fastf1_tools |
|
from utils.constants import ( |
|
DRIVER_NAMES, |
|
CONSTRUCTOR_NAMES, |
|
CURRENT_YEAR, |
|
AVAILABLE_SESSION_TYPES, |
|
DROPDOWN_SESSION_TYPES, |
|
DRIVER_DETAILS |
|
) |
|
|
|
iface_driver_championship_standings = gr.Interface( |
|
fn=fastf1_tools.driver_championship_standings, |
|
inputs=[ |
|
gr.Number(label="Calendar year", value=CURRENT_YEAR, minimum=1950, maximum=CURRENT_YEAR), |
|
gr.Dropdown(label="Driver", choices=DRIVER_NAMES) |
|
], |
|
outputs="text", |
|
title="Driver Championship Standings", |
|
description="Get the driver championship standings" |
|
) |
|
|
|
iface_constructor_championship_standings = gr.Interface( |
|
fn=fastf1_tools.constructor_championship_standings, |
|
inputs=[ |
|
gr.Number(label="Calendar year", value=CURRENT_YEAR, minimum=1950, maximum=CURRENT_YEAR), |
|
gr.Dropdown(label="Constructor", choices=CONSTRUCTOR_NAMES) |
|
], |
|
outputs="text", |
|
title="Constructor Championship Standings", |
|
description="Get the constructor championship standings" |
|
) |
|
|
|
iface_event_info = gr.Interface( |
|
fn=fastf1_tools.get_event_info, |
|
inputs=[ |
|
gr.Number(label="Calendar year", value=CURRENT_YEAR, minimum=1950, maximum=CURRENT_YEAR), |
|
gr.Textbox(label="Grand Prix", placeholder="Ex: Monaco", info="The name of the GP/country/location (Fuzzy matching supported)"), |
|
gr.Radio(["human", "LLM"], label="Display format", value="human") |
|
], |
|
outputs="text", |
|
title="Event Info", |
|
description="Get the Grand Prix event info for a specific race week" |
|
) |
|
|
|
iface_season_calendar = gr.Interface( |
|
fn=fastf1_tools.get_season_calendar, |
|
inputs=[ |
|
gr.Number(label="Calendar year", value=CURRENT_YEAR, minimum=1950, maximum=CURRENT_YEAR), |
|
], |
|
outputs="text", |
|
title="Season Calendar", |
|
description="Get the season calendar information for the given year" |
|
) |
|
|
|
iface_track_visualization = gr.Interface( |
|
fn=fastf1_tools.track_visualization, |
|
inputs=[ |
|
gr.Number(label="Calendar year", value=CURRENT_YEAR, minimum=1950, maximum=CURRENT_YEAR), |
|
gr.Textbox(label="Grand Prix", placeholder="Ex: Monaco", info="The name of the GP/country/location (Fuzzy matching supported)"), |
|
gr.Radio(["speed", "corners", "gear"], label="Visualization type", value="speed"), |
|
gr.Dropdown(DRIVER_NAMES) |
|
], |
|
outputs="image", |
|
title="Track Visualizations", |
|
description="Get the track visualization for the given Grand Prix" |
|
) |
|
|
|
iface_session_results = gr.Interface( |
|
fn=fastf1_tools.get_session_results, |
|
inputs=[ |
|
gr.Number(label="Calendar year", value=CURRENT_YEAR, minimum=1950, maximum=CURRENT_YEAR), |
|
gr.Textbox(label="Grand Prix", placeholder="Ex: Monaco", info="The name of the GP/country/location (Fuzzy matching supported)"), |
|
gr.Dropdown([session_type for session_type in DROPDOWN_SESSION_TYPES if "practice" not in session_type], label="Session type", value="race") |
|
], |
|
outputs=gr.DataFrame(), |
|
title="Session Results", |
|
description="Get the session results for the given Grand Prix" |
|
) |
|
|
|
iface_driver_info = gr.Interface( |
|
fn=fastf1_tools.get_driver_info, |
|
inputs=[ |
|
gr.Dropdown(label="Driver", choices=DRIVER_NAMES) |
|
], |
|
outputs="text", |
|
title="Driver Info", |
|
description="Get personal information about a driver" |
|
) |
|
|
|
|
|
with gr.Blocks() as markdown_tab: |
|
gr.Markdown(""" |
|
# π Formula 1 MCP server ποΈ |
|
|
|
Welcome to the Formula 1 MCP server, your one-stop destination for comprehensive Formula 1 data and visualizations. |
|
<br> |
|
This application leverages the FastF1 library to provide detailed insights into Formula 1 races, drivers, and teams. |
|
|
|
## Available Tools |
|
|
|
### Championship Standings |
|
- **Driver Championship**: Track driver positions, points, and wins |
|
- **Constructor Championship**: Monitor team performances and rankings |
|
|
|
### Race Information |
|
- **Event Info**: Get detailed information about specific Grand Prix events |
|
- **Season Calendar**: View the complete race calendar for any season |
|
- **Session Results**: Access race, qualifying, and sprint session results |
|
|
|
### Driver & Team Data |
|
- **Driver Info**: View detailed driver profiles and statistics |
|
- **Track Visualizations**: Explore interactive track maps with speed, gear, and corner data |
|
|
|
## Usage |
|
Use the tabs above to navigate between different sections and explore the wealth of F1 data available at your fingertips. |
|
""") |
|
|
|
|
|
|
|
|
|
|
|
named_interfaces = { |
|
"About": markdown_tab, |
|
"Driver Championship Standings": iface_driver_championship_standings, |
|
"Constructor Championship Standings": iface_constructor_championship_standings, |
|
"Event Info": iface_event_info, |
|
"Season Calendar": iface_season_calendar, |
|
"Track Visualizations": iface_track_visualization, |
|
"Session Results": iface_session_results, |
|
"Driver Info": iface_driver_info, |
|
"Test": iface_test |
|
} |
|
|
|
|
|
tab_names = list(named_interfaces.keys()) |
|
interface_list = list(named_interfaces.values()) |
|
|
|
|
|
|
|
gradio_server = gr.TabbedInterface( |
|
interface_list, |
|
tab_names=tab_names, |
|
title="π Formula 1 MCP server ποΈ" |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
gradio_server.launch(mcp_server=True) |