Eval results

40 prompts, each run once against the v1 and once against the v2 tool descriptions with command-a-plus-05-2026 at temperature 0. Same tool names, same parameter names and the same executors in both versions; only descriptions, types, formats and ranges differ. Tool results are cached per (tool, arguments) during a run so both versions see identical API data. Run started 2026-10-01 08:53 UTC.

All prompts (40 cases)

Metricv1 tersev2 tuned
Tool selection92.5%95%
Args correct (any attempt)97.2%97.2%
Args correct on first try88.9%94.4%
Answer correct95%100%
Selection + args + answer90%92.5%
Clean run75%85%
Tool calls5749
Calls beyond the expected146
Calls rejected / failed91
Model calls per question2.302.10
Median latency7.4 s7.0 s

Dev split (24 cases)

Metricv1 tersev2 tuned
Tool selection87.5%91.7%
Args correct (any attempt)100%100%
Args correct on first try90.9%100%
Answer correct95.8%100%
Selection + args + answer87.5%91.7%
Clean run66.7%87.5%
Tool calls3829
Calls beyond the expected123
Calls rejected / failed80
Model calls per question2.462.08
Median latency7.8 s7.0 s

Held-out split (16 cases)

Metricv1 tersev2 tuned
Tool selection100%100%
Args correct (any attempt)92.9%92.9%
Args correct on first try85.7%85.7%
Answer correct93.8%100%
Selection + args + answer93.8%93.8%
Clean run87.5%81.3%
Tool calls1920
Calls beyond the expected23
Calls rejected / failed11
Model calls per question2.062.13
Median latency6.9 s7.1 s

Run history

Run 1 used the first v2 draft (written before any results) on the first 34 prompts. Its dev-split failures led to four v2 changes (see README): stop paging releases unless asked, a stable_only filter, “don't call get_github_repo for general background”, and official Swiss station spellings. Six prompts were added before run 2. Run 2 (above) re-ran v1 and the revised v2 from scratch.

RunVersionCasesSelectionArgs 1st tryAnswerClean runTool calls / rejected
Run 1 (v2 draft)v13497.1%90.3%100%85.3%45 / 6
Run 1 (v2 draft)v23494.1%96.8%100%82.4%45 / 1
Run 2 (current)v14092.5%88.9%95%75%57 / 9
Run 2 (current)v24095%94.4%100%85%49 / 1

By category: clean runs

CategoryCasesv1v2
weather666.7%66.7%
transport771.4%71.4%
knowledge5100%80%
github850%87.5%
currency4100%100%
no tool4100%100%
multi666.7%100%

Tool retrieval from a 37-tool catalog

The 7 real tools plus 30 plausible decoys (flights, air quality, stock quotes, Jira, Slack, PyPI…). For each of the 36 prompts that need tools: does retrieval put the expected tool(s) in the top k? embed-v4.0 cosine similarity vs rerank-v4.0-fast. hit@1 = top result is an expected tool; recall@k = all expected tools in the top k.

DescriptionsEmbed hit@1Embed recall@3Embed recall@5Rerank hit@1Rerank recall@3Rerank recall@5
v152.8%66.7%83.3%88.9%88.9%97.2%
v286.1%91.7%97.2%88.9%94.4%97.2%

Per prompt

Tool selection / first-try args / answer for each version. Expand a row for the calls the model made and its answer.

C1How much is 250 CHF in euros?v1 ✓✓✓v2 ✓✓✓

v1 · dev · expected: convert_currency

  • 1. convert_currency({"amount":250,"from":"CHF","to":"EUR"})

250 CHF converts to **263.77 EUR** at the current exchange rate of 1.05508 CHF/EUR (based on the ECB reference rate published on 2026-09-30).

v2 · dev · expected: convert_currency

  • 1. convert_currency({"amount":250,"from":"CHF","to":"EUR"})

250 CHF equals **263.77 EUR** at the current exchange rate of 1.05508 (ECB reference rate from September 30, 2026).

C2How many yen would I get for 50 quid?v1 ✓✓✓v2 ✓✓✓

v1 · dev · expected: convert_currency

  • 1. convert_currency({"amount":50,"from":"GBP","to":"JPY","date":"2026-10-01"})

For 50 GBP, you would get 10,430 JPY at the current exchange rate of 208.6 JPY per GBP (ECB reference rate from 2026-09-30).

v2 · dev · expected: convert_currency

  • 1. convert_currency({"amount":50,"from":"GBP","to":"JPY"})

50 GBP would get you **10,430 JPY** at the current exchange rate of 208.6 GBP/JPY (ECB reference rate from September 30, 2026).

C3What was the USD to CHF exchange rate on 2 January 2024?v1 ✓✓✓v2 ✓✓✓

v1 · holdout · expected: convert_currency

  • 1. convert_currency({"amount":1,"from":"USD","to":"CHF","date":"2024-01-02"})

On 2 January 2024, the USD to CHF exchange rate was **0.84931 CHF per 1 USD**. This was the ECB reference rate published on that working day around 16:00 CET.

v2 · holdout · expected: convert_currency

  • 1. convert_currency({"amount":1,"from":"USD","to":"CHF","date":"2024-01-02"})

The USD to CHF exchange rate on 2 January 2024 was **0.84931** (1 USD = 0.84931 CHF). This is the European Central Bank reference rate published on that working day.

C4Convert 1,200 Swedish kronor to Swiss francs.v1 ✓✓✓v2 ✓✓✓

v1 · dev · expected: convert_currency

  • 1. convert_currency({"amount":1200,"from":"SEK","to":"CHF","date":"2026-10-01"})

1,200 Swedish kronor (SEK) converts to **100.38 Swiss francs (CHF)** using the ECB reference rate of 0.08365 from September 30, 2026.

v2 · dev · expected: convert_currency

  • 1. convert_currency({"amount":1200,"from":"SEK","to":"CHF"})

1,200 Swedish kronor (SEK) converts to **100.38 Swiss francs (CHF)** at the current exchange rate of 0.08365 SEK/CHF (ECB reference rate from September 30, 2026).

G1How many stars does the Cohere Python SDK have on GitHub?v1 ✓✗✓v2 ✓✓✓

v1 · dev · expected: get_github_repo

  • 1. get_github_repo({"repo":"cohere-python"}) → bad_request
  • 2. get_github_repo({"repo":"cohere-ai/cohere-python"})

The Cohere Python SDK (cohere-ai/cohere-python) has **400 stars** on GitHub.

v2 · dev · expected: get_github_repo

  • 1. get_github_repo({"repo":"cohere-ai/cohere-python"})

The Cohere Python SDK (cohere-ai/cohere-python) has **400 stars** on GitHub.

G2What's the latest release of Next.js?v1 ✗✓✗v2 ✓✓✓

v1 · dev · expected: list_github_releases

  • 1. get_github_repo({"repo":"vercel/next.js"})
  • 2. list_github_releases({"repo":"vercel/next.js","per_page":10,"page":1})
  • 3. list_github_releases({"repo":"vercel/next.js","per_page":100,"page":1}) → bad_request

I couldn't finish within this demo's step/time limit. Try a narrower question.

v2 · dev · expected: list_github_releases

  • 1. list_github_releases({"repo":"vercel/next.js","per_page":5,"page":1,"stable_only":true})

The latest stable release of Next.js is **v16.3.8**, published on September 30, 2026.

G3What license does facebook/react use?v1 ✓✓✓v2 ✓✓✓

v1 · holdout · expected: get_github_repo

  • 1. get_github_repo({"repo":"facebook/react"})

Facebook/react uses the **MIT license**.

v2 · holdout · expected: get_github_repo

  • 1. get_github_repo({"repo":"facebook/react"})

The facebook/react repository uses the **MIT license**.

G4When was the Linux kernel's GitHub mirror last pushed to?v1 ✓✓✓v2 ✓✓✓

v1 · dev · expected: get_github_repo

  • 1. get_github_repo({"repo":"torvalds/linux"})

The Linux kernel's GitHub mirror (torvalds/linux) was last pushed to on 2026-09-30.

v2 · dev · expected: get_github_repo

  • 1. get_github_repo({"repo":"torvalds/linux"})

The Linux kernel's GitHub mirror (torvalds/linux) was last pushed to on **2026-09-30**.

G5List the last 3 releases of langchain-ai/langchain.v1 ✓✓✓v2 ✓✓✓

v1 · dev · expected: list_github_releases

  • 1. list_github_releases({"repo":"langchain-ai/langchain","per_page":3,"page":1})
  • 2. list_github_releases({"repo":"langchain-ai/langchain","per_page":100,"page":1}) → bad_request
  • 3. list_github_releases({"repo":"langchain-ai/langchain","per_page":20,"page":1})

Based on the GitHub releases data, the last 3 releases of langchain-ai/langchain are: 1. **langchain-openai==1.6.7** - Published on 2026-09-30 - Tag: langchain-openai==1.6.7 - URL: https://github.com/langchain-ai/langchain/releases/tag/langchain-openai%3D%3D1.6.7 2. **langchain-core==1.6.6** - Published on 2026-09-29 - Tag: langchain-core==1.6.6 - URL: https://github.com/langchain-ai/langchain/releases/tag/langchain-core%3D%3D1.6.6 3. **langchain-anthropic==1.7.5** - Published on 2026-09-29 - Tag: langchain-anthropic==1.7.5 - URL: https://github.com/langchain-ai/langchain/releases/tag/langchain-anthropic%3D%3D1.7.5 I was able to retrieve the release information from the GitHub API, but I couldn't access additional details like release notes or changelog content for these specific releases.

v2 · dev · expected: list_github_releases

  • 1. list_github_releases({"repo":"langchain-ai/langchain","per_page":3})
  • 2. list_github_releases({"repo":"langchain-ai/langchain","page":2,"per_page":3})

Here are the last 3 releases of langchain-ai/langchain (most recent first): 1. **langchain-openai==1.6.7** - Published 2026-09-30 - Tag: langchain-openai==1.6.7 - URL: https://github.com/langchain-ai/langchain/releases/tag/langchain-openai%3D%3D1.6.7 - Not a prerelease 2. **langchain-core==1.6.6** - Published 2026-09-29 - Tag: langchain-core==1.6.6 - URL: https://github.com/langchain-ai/langchain/releases/tag/langchain-core%3D%3D1.6.6 - Not a prerelease 3. **langchain-anthropic==1.7.5** - Published 2026-09-29 - Tag: langchain-anthropic==1.7.5 - URL: https://github.com/langchain-ai/langchain/releases/tag/langchain-anthropic%3D%3D1.7.5 - Not a prerelease

G6Which language is huggingface/transformers mostly written in, and how many open issues and PRs does it have?v1 ✓✓✓v2 ✓✓✓

v1 · holdout · expected: get_github_repo

  • 1. get_github_repo({"repo":"huggingface/transformers"})

The huggingface/transformers repository is mostly written in **Python**, and it currently has **2,362 open issues and PRs**.

v2 · holdout · expected: get_github_repo

  • 1. get_github_repo({"repo":"huggingface/transformers"})

The huggingface/transformers repository is mostly written in **Python**, and it currently has **2,362 open issues and PRs**.

H1How do I get from Geneva Airport to Montreux by public transport?v1 ✓✓✓v2 ✓✓✓

v1 · holdout · expected: find_connections

  • 1. find_connections({"from":"Geneva Airport","to":"Montreux"})

Based on the Swiss public transport data, here are the connections from Geneva Airport to Montreux today: **Connection 1:** - Departs: 11:04 - Arrives: 12:51 - Duration: 1h 47m - Products: Train 10, RE33 - Transfers: 1 **Connection 2:** - Departs: 11:30 - Arrives: 13:09 - Duration: 1h 39m - Products: Train 5, IR 90 - Transfers: 1 **Connection 3:** - Departs: 11:35 - Arrives: 13:21 - Duration: 1h 46m - Products: Train 10, RE33 - Transfers: 1 All connections require one transfer. The fastest option is the 11:30 departure (1h 39m total travel time). You can check real-time departures at the station for the most up-to-date information.

v2 · holdout · expected: find_connections

  • 1. find_connections({"from":"Genève Aéroport","to":"Montreux"})

Here are the public transport options from Geneva Airport to Montreux today: **Direct trains (no transfers):** - **11:14 departure** (platform 3) → 12:36 arrival - IR 95 train, 1h 21m duration - **11:55 departure** (platform 3) → 13:09 arrival - IR 90 train, 1h 14m duration (fastest) **With transfer:** - 11:25 departure (platform 4) → 12:51 arrival - IC 1 + RE33, 1h 26m, 1 transfer The fastest option is the 11:55 IR 90 train taking 1 hour 14 minutes direct to Montreux. All trains depart from Geneva Airport station (Genève-Aéroport) and arrive at Montreux station.

H2Is it going to be sunny on the Rigi tomorrow?v1 ✓✗✗v2 ✓✗✓

v1 · holdout · expected: get_weather

  • 1. get_weather({"location":"Rigi","date":"2026-10-02"})
  • 2. get_weather({"location":"Rigi, Switzerland","date":"2026-10-02"})

No, it won't be sunny on the Rigi tomorrow (October 2, 2026). The weather forecast shows light showers with a 65% chance of precipitation, temperature between 14-18°C, and wind up to 14.3 km/h.

v2 · holdout · expected: get_weather

  • 1. get_weather({"location":"Rigi","date":"2026-10-02"})
  • 2. get_weather({"location":"Lucerne","date":"2026-10-02"})
  • 3. get_weather({"location":"Rigi Kulm","date":"2026-10-02"})

No, it won't be sunny on the Rigi tomorrow (October 2, 2026). According to the weather forecast for Rigi Kulm (the summit of Rigi mountain), conditions will be **rain** with: - 12.5 mm of precipitation expected - 55% probability of rain - Temperature ranging from 7.9°C to 10.5°C - Maximum wind speed of 11.5 km/h So definitely not sunny weather for your Rigi visit tomorrow!

H3What is 20 degrees Celsius in Fahrenheit?v1 ✓–✓v2 ✓–✓

v1 · holdout · expected: no tools

  • (no tool calls)

20 degrees Celsius is 68 degrees Fahrenheit. The conversion formula is: F = (C × 9/5) + 32 So: (20 × 9/5) + 32 = 36 + 32 = 68°F

v2 · holdout · expected: no tools

  • (no tool calls)

20 degrees Celsius equals 68 degrees Fahrenheit. The conversion formula is: Fahrenheit = (Celsius × 9/5) + 32 So: (20 × 9/5) + 32 = 36 + 32 = 68°F

H4Is cohere-ai/cohere-toolkit archived, and when was it last updated?v1 ✓✓✓v2 ✓✓✓

v1 · holdout · expected: get_github_repo

  • 1. get_github_repo({"repo":"cohere-ai/cohere-toolkit"})

Yes, cohere-ai/cohere-toolkit is archived. It was last updated on 2026-03-31 (the last push date).

v2 · holdout · expected: get_github_repo

  • 1. get_github_repo({"repo":"cohere-ai/cohere-toolkit"})

Yes, cohere-ai/cohere-toolkit is archived. It was last updated on 2026-03-31 (the last push date).

H5Which is longer, the Gotthard Base Tunnel or the Lötschberg Base Tunnel?v1 ✓✓✓v2 ✓✓✓

v1 · holdout · expected: search_wikipedia

  • 1. search_wikipedia({"query":"Gotthard Base Tunnel"})
  • 2. search_wikipedia({"query":"Lötschberg Base Tunnel"})

The Gotthard Base Tunnel is longer. - **Gotthard Base Tunnel**: 57.09 km (35.47 mi) - **Lötschberg Base Tunnel**: 34.57 km (21.48 mi) The Gotthard Base Tunnel is 22.52 km (about 14 miles) longer than the Lötschberg Base Tunnel, making it the world's longest railway tunnel.

v2 · holdout · expected: search_wikipedia

  • 1. search_wikipedia({"query":"Gotthard Base Tunnel"})
  • 2. search_wikipedia({"query":"Lötschberg Base Tunnel"})

The Gotthard Base Tunnel is longer. - **Gotthard Base Tunnel**: 57.09 km (35.47 miles) - **Lötschberg Base Tunnel**: 34.57 km (21.48 miles) The Gotthard Base Tunnel is 22.52 km (about 14 miles) longer than the Lötschberg Base Tunnel, making it the world's longest railway tunnel.

H6What's the latest stable release of Next.js?v1 ✗✓✓v2 ✓✓✓

v1 · dev · expected: list_github_releases

  • 1. list_github_releases({"repo":"vercel/next.js"})
  • 2. list_github_releases({"repo":"vercel/next.js","page":2})
  • 3. get_github_repo({"repo":"vercel/next.js"})

Based on the GitHub releases data, the latest stable release of Next.js is **v16.3.8**, published on 2026-09-30. I couldn't find any newer stable releases beyond what was shown in the first two pages of results, but v16.3.8 is clearly the most recent stable version available.

v2 · dev · expected: list_github_releases

  • 1. list_github_releases({"repo":"vercel/next.js","stable_only":true})

The latest stable release of Next.js is **v16.3.8**, published on September 30, 2026. This is the most recent stable version available from the vercel/next.js repository.

K1When did the Gotthard Base Tunnel open, and how long is it?v1 ✓✓✓v2 ✓✓✓

v1 · dev · expected: search_wikipedia

  • 1. search_wikipedia({"query":"Gotthard Base Tunnel"})

The Gotthard Base Tunnel opened in **June 2016** (with full service beginning that December), and it has a route length of **57.09 km** (35.47 miles).

v2 · dev · expected: search_wikipedia

  • 1. search_wikipedia({"query":"Gotthard Base Tunnel"})

The Gotthard Base Tunnel opened in **June 2016** (with full service beginning December 2016). It has a route length of **57.09 km (35.47 miles)**, making it the world's longest railway tunnel.

K2Give me a short overview of Cohere, the AI company.v1 ✓✓✓v2 ✗✓✓

v1 · dev · expected: search_wikipedia

  • 1. search_wikipedia({"query":"Cohere (AI company)"})

Cohere is a Canadian multinational AI company founded in 2019 by Aidan Gomez, Ivan Zhang, and Nick Frosst. Headquartered in Toronto with global offices, they specialize in large language models and AI solutions for regulated industries like finance, healthcare, manufacturing, energy, and the public sector. In April 2026, they announced acquisition of German AI firm Aleph Alpha, positioning them as a major player in enterprise-focused artificial intelligence.

v2 · dev · expected: search_wikipedia

  • 1. search_wikipedia({"query":"Cohere"})
  • 2. get_github_repo({"repo":"cohere-ai/cohere-python"})

Cohere is a Canadian multinational AI company founded in 2019 by Aidan Gomez, Ivan Zhang, and Nick Frosst. Headquartered in Toronto with global offices (Montreal, NYC, San Francisco, London, Paris, Seoul), they specialize in large language models and AI solutions for regulated industries like finance, healthcare, manufacturing, energy, and public sector. The company is actively developing tools - their Python SDK (cohere-ai/cohere-python) has 400+ stars and recent updates (last push Sept 2026). In April 2026, Cohere acquired German AI firm Aleph Alpha, expanding their European presence and capabilities.

K3What does Wikipedia say about the Jungfraujoch?v1 ✓✓✓v2 ✓✓✓

v1 · holdout · expected: search_wikipedia

  • 1. search_wikipedia({"query":"Jungfraujoch"})

According to Wikipedia, the Jungfraujoch is a glacier saddle in the Swiss Alps that connects two major 4,000-meter peaks of the Bernese Alps: the Jungfrau and the Mönch. It lies at an elevation of 3,463 meters (11,362 feet) above sea level and is directly overlooked by the rocky prominence of the Sphinx. The Jungfraujoch is situated on the upper snows of the Aletsch Glacier and is part of the Jungfrau-Aletsch area, located on the boundary between the cantons of Bern and Valais, halfway between Interlaken and Fiesch.

v2 · holdout · expected: search_wikipedia

  • 1. search_wikipedia({"query":"Jungfraujoch"})

According to Wikipedia, the Jungfraujoch is a glacier saddle in the Swiss Alps that connects two major 4,000-meter peaks: the Jungfrau and the Mönch. It sits at an elevation of 3,463 meters (11,362 feet) above sea level and is directly overlooked by the rocky Sphinx formation. The Jungfraujoch is located on the upper snows of the Aletsch Glacier and is part of the Jungfrau-Aletsch area, situated on the boundary between the cantons of Bern and Valais, halfway between Interlaken and Fiesch. It's also known as the "Top of Europe" and is accessible via the Jungfrau Railway, which takes visitors to the highest railway station in Europe.

K4Look up the Rhaetian Railway. Which canton does it mainly operate in?v1 ✓✓✓v2 ✓✓✓

v1 · dev · expected: search_wikipedia

  • 1. search_wikipedia({"query":"Rhaetian Railway"})

Based on the Wikipedia search results, the Rhaetian Railway (RhB) mainly operates in the **canton of Grisons** (Graubünden). The search shows that: - Headquartered in Chur - Operates all railway lines of the Swiss canton of Grisons - The network is located almost entirely within Grisons - Only has one station across the Italian border at Tirano So the Rhaetian Railway's primary operating area is the canton of Grisons in Switzerland.

v2 · dev · expected: search_wikipedia

  • 1. search_wikipedia({"query":"Rhaetian Railway"})

The Rhaetian Railway (RhB) mainly operates in the canton of **Grisons** (Graubünden). According to Wikipedia, the RhB operates all the railway lines of the Swiss canton of Grisons, and its network is located almost entirely within Grisons, with only one station across the Italian border at Tirano. The company is headquartered in Chur, which is also the cantonal capital of Grisons.

M1How long is the train from Zurich to Geneva, and what's the weather when I arrive?v1 ✓✓✓v2 ✓✓✓

v1 · dev · expected: find_connections, get_weather

  • 1. find_connections({"from":"Zurich","to":"Geneva","date":"2026-10-01","limit":5}) → upstream
  • 2. find_connections({"from":"Zurich","to":"Geneva","date":"2026-10-01","limit":1})
  • 3. get_weather({"location":"Geneva","date":"2026-10-01","time":"13:55"})

The train from Zurich HB to Geneva takes **2 hours 51 minutes**, departing at 11:04 and arriving at 13:55 on October 1st. When you arrive in Geneva at 13:55, the weather will be **light rain** with a temperature of about **18.5°C**. The day has a 73% chance of precipitation, with a high of 19.1°C and low of 17.2°C.

v2 · dev · expected: find_connections, get_weather

  • 1. find_connections({"from":"Zürich HB","to":"Genève"})
  • 2. get_weather({"location":"Geneva","time":"13:55"})

The train from Zürich HB to Genève takes **2 hours 51 minutes** (arriving at 13:55 today). When you arrive in Geneva around 14:00, the weather will be **light rain** at **18.5°C**, with a **73% chance of precipitation** and wind up to 5.6 km/h.

M2I'm going from Bern to Zermatt tomorrow, leaving at 8 in the morning. When do I arrive, and how much is 100 CHF in euros for spending money?v1 ✓✓✓v2 ✓✓✓

v1 · dev · expected: convert_currency, find_connections

  • 1. convert_currency({"amount":100,"from":"CHF","to":"EUR","date":"2026-10-01"})
  • 1. find_connections({"from":"Bern","to":"Zermatt","date":"2026-10-02","time":"08:00","is_arrival_time":false,"limit":5})

Based on the search results: **Train Connection:** - Departing Bern at 08:07 (first train after your 08:00 request) on October 2nd - Arriving in Zermatt at 10:17 - Duration: 2 hours 10 minutes - You'll need 1 transfer for this journey **Currency Conversion:** - 100 CHF = 105.51 EUR (using current exchange rate of 1.0551) So you'll arrive in Zermatt at 10:17 AM, and your 100 CHF converts to 105.51 EUR for spending money.

v2 · dev · expected: convert_currency, find_connections

  • 1. convert_currency({"amount":100,"from":"CHF","to":"EUR"})
  • 1. find_connections({"from":"Bern","to":"Zermatt","date":"2026-10-02","time":"08:00","limit":3})

Based on the search results: **Train from Bern to Zermatt (tomorrow, Oct 2):** - The first available departure is at 08:07 from platform 6 - You arrive in Zermatt at **10:17** (local time) - Journey time: 2 hours 10 minutes with 1 transfer - This route uses IC 6 and R trains **Currency conversion:** - 100 CHF = **105.51 EUR** - Exchange rate: 1.0551 (ECB reference rate from Sept 30) You'll have €105.51 for spending money, and you'll arrive in Zermatt just after 10am.

M3Compare the GitHub stars of facebook/react and vuejs/core.v1 ✓✓✓v2 ✓✓✓

v1 · holdout · expected: get_github_repo

  • 1. get_github_repo({"repo":"facebook/react"})
  • 1. get_github_repo({"repo":"vuejs/core"})

Based on the GitHub data: **facebook/react**: 250,855 stars **vuejs/core**: 54,467 stars Facebook React has approximately 4.6 times more GitHub stars than Vue.js core (196,388 more stars). React is the clear leader in terms of star count, though both are popular frontend JavaScript frameworks.

v2 · holdout · expected: get_github_repo

  • 1. get_github_repo({"repo":"facebook/react"})
  • 1. get_github_repo({"repo":"vuejs/core"})

**GitHub Stars Comparison:** - **facebook/react**: 250,855 stars - **vuejs/core**: 54,467 stars **Result:** facebook/react has **196,388 more stars** than vuejs/core (approximately 3.6x more stars). React is significantly more starred on GitHub than Vue.js core.

M4What's the weather in Lugano and in Geneva tomorrow?v1 ✓✓✓v2 ✓✓✓

v1 · dev · expected: get_weather

  • 1. get_weather({"location":"Lugano","date":"2026-10-02"})
  • 1. get_weather({"location":"Geneva","date":"2026-10-02"})

Here's the weather for tomorrow (October 2, 2026): **Lugano:** - Conditions: Overcast - Temperature: 17.2°C - 24.1°C - Precipitation: 0 mm (3% chance) - Wind: Up to 11.9 km/h **Geneva:** - Conditions: Light rain - Temperature: 17.5°C - 21.6°C - Precipitation: 0.1 mm (33% chance) - Wind: Up to 11.5 km/h

v2 · dev · expected: get_weather

  • 1. get_weather({"location":"Lugano","date":"2026-10-02"})
  • 1. get_weather({"location":"Geneva","date":"2026-10-02"})

Here's the weather for tomorrow (October 2, 2026): **Lugano:** - Temperature: 17.2°C - 24.1°C - Conditions: Overcast - Precipitation: 0 mm (3% chance) - Wind: Up to 11.9 km/h **Geneva:** - Temperature: 17.5°C - 21.6°C - Conditions: Light rain - Precipitation: 0.1 mm (33% chance) - Wind: Up to 11.5 km/h Lugano will be warmer with overcast skies and very little chance of rain, while Geneva will be slightly cooler with light rain expected.

M5What are the Lavaux vineyards known for? Also find me a train from Lausanne to Lutry tomorrow at 10:00.v1 ✓✓✓v2 ✓✓✓

v1 · holdout · expected: find_connections, search_wikipedia

  • 1. find_connections({"from":"Lausanne","to":"Lutry","date":"2026-10-02","time":"10:00"})
  • 1. search_wikipedia({"query":"Lavaux vineyards"})

The Lavaux vineyards are known for being a UNESCO World Heritage Site featuring 830 hectares of terraced vineyards stretching 30 kilometers along the northern shores of Lake Geneva in Switzerland's Canton of Vaud. The cultural landscape of terraced vineyards is their distinctive characteristic. For your train journey from Lausanne to Lutry tomorrow (October 2, 2026), here are the options around 10:00: - Departure: 10:04, Arrival: 10:10 (6 minutes, platform 6) - Departure: 10:24, Arrival: 10:30 (6 minutes, platform 3) - Departure: 10:34, Arrival: 10:40 (6 minutes, platform 3) All trains are regional services (R) with no transfers required.

v2 · holdout · expected: find_connections, search_wikipedia

  • 1. search_wikipedia({"query":"Lavaux vineyards"})
  • 1. find_connections({"from":"Lausanne","to":"Lutry","date":"2026-10-02","time":"10:00"})

The Lavaux vineyards are known for being a UNESCO World Heritage Site featuring 830 hectares of terraced vineyards stretching 30 kilometers along the northern shores of Lake Geneva in Switzerland's Canton of Vaud. For trains from Lausanne to Lutry tomorrow (October 2, 2026), there are three direct trains (R trains): - Departs 10:04, arrives 10:10 (Platform 6) - Departs 10:24, arrives 10:30 (Platform 3) - Departs 10:34, arrives 10:40 (Platform 3) The 10:04 departure is the closest to your requested 10:00 time.

M6What's the newest release of the cohere-python SDK, and what's 1 USD in CHF today?v1 ✓✗✓v2 ✓✓✓

v1 · dev · expected: convert_currency, list_github_releases

  • 1. list_github_releases({"repo":"cohere-python"}) → bad_request
  • 1. convert_currency({"amount":1,"from":"USD","to":"CHF","date":"2026-10-01"})
  • 2. list_github_releases({"repo":"cohere-ai/cohere-python"})

The newest release of the cohere-python SDK is **7.1.0**, published on August 26, 2026. For currency conversion, **1 USD = 0.8347 CHF** (ECB reference rate from September 30, 2026).

v2 · dev · expected: convert_currency, list_github_releases

  • 1. convert_currency({"amount":1,"from":"USD","to":"CHF"})
  • 1. list_github_releases({"repo":"cohere-ai/cohere-python","per_page":5,"stable_only":true})

The newest stable release of the cohere-python SDK is **7.1.0**, published on August 26, 2026. Today's exchange rate: **1 USD = 0.8347 CHF** (ECB reference rate from September 30, 2026).

N1Write a two-line poem about trains.v1 ✓–✓v2 ✓–✓

v1 · dev · expected: no tools

  • (no tool calls)

Steel serpents dance on tracks of time, Carrying dreams in rhythmic rhyme.

v2 · dev · expected: no tools

  • (no tool calls)

Steel serpents dance on tracks of time, Carrying dreams in rhythmic chime.

N2What is 17 times 23?v1 ✓–✓v2 ✓–✓

v1 · dev · expected: no tools

  • (no tool calls)

17 times 23 equals 391.

v2 · dev · expected: no tools

  • (no tool calls)

17 times 23 equals 391.

N3Translate 'good morning' into German.v1 ✓–✓v2 ✓–✓

v1 · holdout · expected: no tools

  • (no tool calls)

"Good morning" translates to **"Guten Morgen"** in German.

v2 · holdout · expected: no tools

  • (no tool calls)

"Good morning" translates to **"Guten Morgen"** in German.

T1How long does the train from Bern to Interlaken Ost take?v1 ✓✓✓v2 ✓✓✓

v1 · dev · expected: find_connections

  • 1. find_connections({"from":"Bern","to":"Interlaken Ost"})

Based on the current train connections from Bern to Interlaken Ost, the travel times vary: - **Fastest**: 52 minutes (departing 11:34, arriving 12:26) - **Other options**: 55 minutes (departing 11:04, arriving 11:59) and 1 hour 21 minutes (departing 11:07, arriving 12:28) So the train journey takes between 52 minutes and 1 hour 21 minutes, depending on which connection you take. The fastest option is just 52 minutes.

v2 · dev · expected: find_connections

  • 1. find_connections({"from":"Bern","to":"Interlaken Ost"})

The train journey from Bern to Interlaken Ost has several options with different durations: - **Direct train (IC 61)**: 55 minutes (departs 11:04, arrives 11:59) - **Fastest option**: 52 minutes (IC 6 + RE9 with one transfer, departs 11:34, arrives 12:26) - **Other option**: 1 hour 21 minutes (IC 8 + 21 with one transfer, departs 11:07, arrives 12:28) So the direct train takes 55 minutes, and there's even a slightly faster option at 52 minutes if you're willing to make one transfer.

T2I need to be in Lausanne by 09:00 tomorrow, coming from Basel. Which train should I take?v1 ✓✓✓v2 ✓✓✓

v1 · holdout · expected: find_connections

  • 1. find_connections({"from":"Basel","to":"Lausanne","date":"2026-10-02","time":"09:00","is_arrival_time":true})

Based on the search results for tomorrow (October 2, 2026), you have three train options from Basel to Lausanne that arrive by 09:00: **Option 1 (Earliest arrival):** - **Departure:** 06:04 from Basel SBB (Platform 6) - **Arrival:** 08:26 in Lausanne - **Duration:** 2h 22m - **Connection:** 1 transfer (IR 26 + IC 5) **Option 2:** - **Departure:** 06:30 from Basel SBB (Platform 8) - **Arrival:** 08:43 in Lausanne - **Duration:** 2h 13m - **Connection:** 1 transfer (IC 6 + IC 1) **Option 3 (Direct train):** - **Departure:** 06:32 from Basel SBB (Platform 19) - **Arrival:** 08:56 in Lausanne - **Duration:** 2h 24m - **Connection:** Direct (IC 51) If you prefer a direct journey with no transfers, take the **IC 51 departing at 06:32** (Option 3). If you don't mind one transfer and want to arrive slightly earlier, Option 2 gets you there at 08:43. All three will get you to Lausanne well before your 09:00 deadline.

v2 · holdout · expected: find_connections

  • 1. find_connections({"from":"Basel","to":"Lausanne","date":"2026-10-02","time":"09:00","is_arrival_time":true,"limit":5})

Based on the search results, you have several train options from Basel to Lausanne that will get you there by 09:00 tomorrow (October 2, 2026). Here are your choices: **Best option (latest departure):** - **IC 51** departing Basel SBB at 06:32, arriving Lausanne at 08:56 (2h 24m, platform 19, no transfers) **Other options:** - IC 6/IC 1: Departs 06:30, arrives 08:43 (platform 8) - IR 26/IC 5: Departs 06:04, arrives 08:26 (platform 6) - IC 61/IR 15: Departs 05:58, arrives 08:20 (platform 3) - IC 61/IC 1: Departs 05:24, arrives 07:43 (platform 7) **Recommendation:** Take the **IC 51 departing at 06:32** - it's the latest departure that still gets you to Lausanne comfortably before your 09:00 deadline, giving you the most sleep time while arriving at 08:56.

T3What trains are leaving Zürich HB right now?v1 ✓✓✓v2 ✓✓✓

v1 · dev · expected: get_departures

  • 1. get_departures({"station":"Zürich HB","date":"2026-10-01","time":"10:53"})

Here are the trains leaving Zürich HB right now (around 10:53): **Immediate departures:** - **IR 35** to Bern at 10:53 (platform 15) - on time - **S 5** to Pfäffikon SZ at 10:54 (platform 43/44) - on time - **S 8** to Winterthur at 10:55 (platform 34) - on time - **S 3** to Zürich Hardbrücke at 10:56 (platform 41/42) - 1 min delay - **S 9** to Uster at 10:58 (platform 43/44) - on time - **ICE 000370** to Basel Bad Bf at 10:59 (platform 16) - on time - **S 11** to Aarau at 10:59 (platform 41/42) - 1 min delay - **S 6** to Uetikon at 11:00 (platform 43/44) - on time All trains are operating on local time (Europe/Zurich). Most are on schedule, with two services experiencing 1-minute delays.

v2 · dev · expected: get_departures

  • 1. get_departures({"station":"Zürich HB"})

Here are the trains currently leaving Zürich HB: **Next departures (local time):** 1. **10:55** - S 8 to Winterthur (Platform 34, on time) 2. **10:56** - S 3 to Zürich Hardbrücke (Platform 41/42, 1 min delay) 3. **10:58** - S 9 to Uster (Platform 43/44, on time) 4. **10:59** - ICE 000370 to Basel Bad Bf (Platform 16, on time) 5. **10:59** - S 11 to Aarau (Platform 41/42, 1 min delay) 6. **11:00** - S 6 to Uetikon (Platform 43/44, on time) 7. **11:01** - S 6 to Baden (Platform 41/42, on time) 8. **11:01** - S 11 to Seuzach (Platform 43/44, 1 min delay) Most trains are S-Bahn services within the Zurich area, with one ICE intercity train to Basel. All are departing from platforms 34, 41/42, 43/44, or 16.

T4When's the next train from Lucerne to Engelberg?v1 ✓✓✓v2 ✓✓✓

v1 · dev · expected: find_connections

  • 1. find_connections({"from":"Lucerne","to":"Engelberg","date":"2026-10-01","time":"10:53","limit":10}) → bad_request
  • 2. find_connections({"from":"Lucerne","to":"Engelberg","date":"2026-10-01","time":"10:53","limit":5})

The next train from Lucerne to Engelberg is at **11:10** today (Thursday, 2026-10-01). Details: - **Departure:** 11:10 from platform 12 - **Arrival:** 11:59 in Engelberg - **Duration:** 49 minutes - **Train type:** IR LEX (InterRegio) - **Transfers:** 1 transfer required This is the first connection after the current time of 10:53.

v2 · dev · expected: find_connections

  • 1. find_connections({"from":"Lucerne","to":"Engelberg"})

The next train from Lucerne to Engelberg departs at **11:10** today (Thursday, October 1st, 2026). Details: - **Departure:** 11:10 from platform 12 - **Arrival:** 11:59 in Engelberg - **Duration:** 49 minutes - **Train:** IR LEX + EV2 (with 1 transfer) There are also later options at 11:27 and 12:10 if you prefer those.

T5Show me the departure board for Bern tomorrow from 7am.v1 ✓✓✓v2 ✓✗✓

v1 · holdout · expected: get_departures

  • 1. get_departures({"station":"Bern","date":"2026-10-02","time":"07:00"})

Here are the departures from Bern tomorrow (October 2, 2026) starting from 7:00 AM: **07:00** - Luzern (IR 15) - Platform 10 - On time - Biel/Bienne (S 3) - Platform 12A-C - On time **07:02** - Romanshorn (IC 8) - Platform 2 - On time - Belp (S 3) - Platform 1A-D - On time **07:04** - Basel Bad Bf (ICE 000374) - Platform 5 - On time - Interlaken Ost (IC 61) - Platform 8 - On time - Genève-Aéroport (IR 15) - Platform 7 - On time **07:06** - Schwarzenburg (S 6) - Platform 12D-F - On time All departures are currently showing no delays. The times are in local time (Europe/Zurich).

v2 · holdout · expected: get_departures

  • 1. get_departures({"station":"Bern","date":"2026-10-03","time":"07:00"})

Here are the departures from Bern tomorrow (Friday, 2 October 2026) starting from 7am: **07:00** - IR 15 to Luzern (Platform 10) - S 3 to Biel/Bienne (Platforms 12A-C) **07:02** - IC 8 to Zürich HB (Platform 2) - S 3 to Belp (Platforms 1A-D) **07:04** - IC 61 to Interlaken Ost (Platform 8) - IR 15 to Genève-Aéroport (Platform 7) - IC 61 to Basel SBB (Platform 5) **07:06** - S 6 to Schwarzenburg (Platforms 13D-F) All trains are on time (0 minutes delay). The board shows the next 8 departures from 7am onward.

T6I want to take a train from Zurich Airport to St. Moritz tonight at half past eight. How many changes are there?v1 ✗✓✓v2 ✗✓✓

v1 · dev · expected: find_connections

  • 1. find_connections({"from":"Zurich Airport","to":"St. Moritz","date":"2026-10-01","time":"20:30"})
  • 2. get_departures({"station":"Zurich Airport","date":"2026-10-01","time":"20:30","limit":10}) → not_found
  • 3. get_departures({"station":"Zürich, Unterwerkstr. 15","date":"2026-10-01","time":"20:30","limit":10}) → not_found

Based on the connection search, there are train options from Zurich area to St. Moritz, but none depart exactly at 20:30. The available connections show: - Two options with 3 changes (departing at 23:41 and 00:45 next day) - One option with 2 changes (departing at 05:26 next day, arriving 09:12) So the minimum number of changes you can expect is 2, though that departs early morning rather than at 20:30. I couldn't verify exact departure times from "Zurich Airport" station because the station name wasn't recognized in the departure lookup. The search used the Zurich area station instead.

v2 · dev · expected: find_connections

  • 1. find_connections({"from":"Zürich Flughafen","to":"St. Moritz","date":"2026-10-01","time":"20:30","limit":3})
  • 2. get_departures({"station":"Zürich Flughafen","date":"2026-10-01","time":"20:30","limit":10})

Based on the search results, there are no trains departing Zurich Airport at exactly 20:30 (half past eight) that go to St. Moritz. The next available connections from Zurich Airport to St. Moritz are: 1. **Departing 23:36 tonight** (platform 1) - arrives 06:43 tomorrow morning - 2 changes (transfers) - Duration: 7h 7m - Lines: S2, EV2, RE3 2. Departing 00:05 tomorrow (platform 3) - arrives 06:43 tomorrow morning - 3 changes - Duration: 6h 38m - Lines: S16, IR 35, EV2, RE3 3. Departing 00:42 tomorrow (platform 3) - arrives 08:55 tomorrow morning - 2 changes - Duration: 8h 13m - Lines: IR 13, IR 35, IR 38 If you need to leave at 20:30, you would need to take a different train from Zurich Airport (like the S16 to Herrliberg-Feldmeilen at 20:31) and then connect, but this would require additional research to find the optimal route. The earliest direct connection option departs at 23:36 with **2 changes**.

W1What's the weather in Lugano tomorrow?v1 ✓✓✓v2 ✓✓✓

v1 · dev · expected: get_weather

  • 1. get_weather({"location":"Lugano","date":"2026-10-02"})

Tomorrow (October 2, 2026) in Lugano: - Temperature: 17.2°C to 24.1°C - Conditions: Overcast - Precipitation: 0 mm (3% chance) - Wind: Up to 11.9 km/h - Source: Open-Meteo

v2 · dev · expected: get_weather

  • 1. get_weather({"location":"Lugano","date":"2026-10-02"})

Tomorrow (October 2, 2026) in Lugano: - **Temperature**: 17.2°C to 24.1°C - **Conditions**: Overcast - **Precipitation**: 0mm (3% chance) - **Wind**: Up to 11.9 km/h The weather will be quite mild with overcast skies and very little chance of rain.

W2Will it rain in Zermatt the day after tomorrow?v1 ✓✓✓v2 ✓✓✓

v1 · dev · expected: get_weather

  • 1. get_weather({"location":"Zermatt","date":"2026-10-03"})

Based on the weather forecast for Zermatt on October 3rd, 2026 (day after tomorrow), it will not rain. The precipitation probability is 0%, with only 0.3mm of precipitation expected and overcast conditions.

v2 · dev · expected: get_weather

  • 1. get_weather({"location":"Zermatt","date":"2026-10-03"})

Based on the weather forecast for Zermatt on October 3rd, 2026 (day after tomorrow), it will **not rain**. The forecast shows: - Conditions: overcast - Precipitation probability: 0% - Expected precipitation: 0.3 mm (very light) While there may be trace amounts of moisture, the probability of actual rain is 0%, so you can expect dry conditions despite overcast skies.

W3What will the temperature be in Geneva at 3pm today?v1 ✓✓✓v2 ✓✓✓

v1 · holdout · expected: get_weather

  • 1. get_weather({"location":"Geneva","date":"2026-10-01","time":"15:00"})

The temperature in Geneva at 3pm today will be 18.9°C (light rain conditions).

v2 · holdout · expected: get_weather

  • 1. get_weather({"location":"Geneva","date":"2026-10-01","time":"15:00"})

At 3pm today in Geneva, the temperature will be **18.9°C** (light rain conditions).

W4How warm did it get in Bern two days ago?v1 ✓✓✓v2 ✓✓✓

v1 · dev · expected: get_weather

  • 1. get_weather({"location":"Bern","date":"2026-09-29"})

Two days ago on September 29, 2026, Bern reached a maximum temperature of 24.3°C (about 75.7°F). The day was overcast with temperatures ranging from a low of 10.3°C to the high of 24.3°C.

v2 · dev · expected: get_weather

  • 1. get_weather({"location":"Bern","date":"2026-09-29"})

Two days ago (September 29, 2026) in Bern, the temperature reached a maximum of **24.3°C**. The day had overcast conditions with a low of 10.3°C and no precipitation.

W5What's the weather like at Geneva Airport right now?v1 ✓✗✓v2 ✓✓✓

v1 · holdout · expected: get_weather

  • 1. get_weather({"location":"Geneva Airport"}) → not_found
  • 2. get_weather({"location":"Geneva"})

The weather at Geneva Airport (Geneva, Switzerland) right now is: - **Conditions**: Light rain - **Temperature**: 17.2°C to 19.1°C - **Precipitation**: 7.6 mm (73% probability) - **Wind**: Up to 5.6 km/h - **Date**: October 1, 2026 - **Timezone**: Europe/Zurich It's currently experiencing light rain with mild temperatures and light winds.

v2 · holdout · expected: get_weather

  • 1. get_weather({"location":"Geneva"})
  • 2. get_weather({"location":"Geneva Airport"}) → not_found

The weather at Geneva (which covers Geneva Airport area) right now is: - **Temperature**: 17.2°C (min) to 19.1°C (max) - **Conditions**: Light rain - **Precipitation**: 7.6mm expected, 73% probability - **Wind**: Up to 5.6 km/h - **Date**: October 1, 2026 It's currently experiencing light rain with mild temperatures and light winds.

The two description sets

get_weather
{
  "name": "get_weather",
  "description": "Get the weather.",
  "parameters": {
    "type": "object",
    "properties": {
      "location": {
        "type": "string"
      },
      "date": {
        "type": "string"
      },
      "time": {
        "type": "string"
      }
    },
    "required": [
      "location"
    ]
  }
}
{
  "name": "get_weather",
  "description": "Weather forecast or recent observed weather for one place on one day (up to 15 days ahead or 60 days back), from Open-Meteo. Returns daily min/max temperature in °C, conditions, precipitation and wind; pass `time` to also get the hourly values for that hour. Call once per place. Not for climate averages or air quality.",
  "parameters": {
    "type": "object",
    "properties": {
      "location": {
        "type": "string",
        "description": "City or town name only, e.g. 'Geneva' or 'Zermatt'. No country suffix, no station names like 'Geneva Airport'."
      },
      "date": {
        "type": "string",
        "description": "Calendar date in YYYY-MM-DD format. Resolve relative dates ('tomorrow', 'next Friday') against today's date from the system message before calling. Omit for today.",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      },
      "time": {
        "type": "string",
        "description": "Optional hour of interest, e.g. the arrival time of a train. Local Swiss time, 24-hour HH:MM (e.g. '15:00' for 3pm).",
        "pattern": "^\\d{2}:\\d{2}$"
      }
    },
    "required": [
      "location"
    ]
  }
}
find_connections
{
  "name": "find_connections",
  "description": "Find train connections.",
  "parameters": {
    "type": "object",
    "properties": {
      "from": {
        "type": "string"
      },
      "to": {
        "type": "string"
      },
      "date": {
        "type": "string"
      },
      "time": {
        "type": "string"
      },
      "is_arrival_time": {
        "type": "boolean"
      },
      "limit": {
        "type": "integer"
      }
    },
    "required": [
      "from",
      "to"
    ]
  }
}
{
  "name": "find_connections",
  "description": "Swiss public transport journeys between two places (train, bus, tram, boat) via transport.opendata.ch. Returns departure/arrival times, duration, platform and number of transfers. Use for 'how do I get from A to B', 'how long does the train take', 'when is the next train to X'. Covers Switzerland and cross-border stops only.",
  "parameters": {
    "type": "object",
    "properties": {
      "from": {
        "type": "string",
        "description": "Origin station or town in its official Swiss spelling, e.g. 'Zürich HB', 'Bern', 'Basel SBB', 'Zürich Flughafen' (Zurich Airport)."
      },
      "to": {
        "type": "string",
        "description": "Destination station or town, same naming as `from`."
      },
      "date": {
        "type": "string",
        "description": "Calendar date in YYYY-MM-DD format. Resolve relative dates ('tomorrow', 'next Friday') against today's date from the system message before calling. Omit for today.",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      },
      "time": {
        "type": "string",
        "description": "Departure time; or the latest arrival time when is_arrival_time is true. Omit for now. Local Swiss time, 24-hour HH:MM (e.g. '15:00' for 3pm).",
        "pattern": "^\\d{2}:\\d{2}$"
      },
      "is_arrival_time": {
        "type": "boolean",
        "description": "Set true when the user must arrive by `time` ('be in Lausanne by 9am'). Default false: `time` is a departure time."
      },
      "limit": {
        "type": "integer",
        "description": "Number of connections to return, 1-6. Default 3.",
        "minimum": 1,
        "maximum": 6
      }
    },
    "required": [
      "from",
      "to"
    ]
  }
}
get_departures
{
  "name": "get_departures",
  "description": "Get departures from a station.",
  "parameters": {
    "type": "object",
    "properties": {
      "station": {
        "type": "string"
      },
      "date": {
        "type": "string"
      },
      "time": {
        "type": "string"
      },
      "limit": {
        "type": "integer"
      }
    },
    "required": [
      "station"
    ]
  }
}
{
  "name": "get_departures",
  "description": "Live departure board for ONE Swiss station: the next trains/buses leaving it, with line, destination, platform and delay. Use when the user asks what is leaving a station, without a specific destination. For travel between two places use find_connections instead.",
  "parameters": {
    "type": "object",
    "properties": {
      "station": {
        "type": "string",
        "description": "Station name in its official Swiss spelling, e.g. 'Zürich HB', 'Bern', 'Zürich Flughafen' (not 'Zurich Airport')."
      },
      "date": {
        "type": "string",
        "description": "Calendar date in YYYY-MM-DD format. Resolve relative dates ('tomorrow', 'next Friday') against today's date from the system message before calling. Omit for today.",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      },
      "time": {
        "type": "string",
        "description": "Start of the board. Omit for now. Local Swiss time, 24-hour HH:MM (e.g. '15:00' for 3pm).",
        "pattern": "^\\d{2}:\\d{2}$"
      },
      "limit": {
        "type": "integer",
        "description": "Number of departures, 1-15. Default 8.",
        "minimum": 1,
        "maximum": 15
      }
    },
    "required": [
      "station"
    ]
  }
}
search_wikipedia
{
  "name": "search_wikipedia",
  "description": "Search Wikipedia.",
  "parameters": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string"
      }
    },
    "required": [
      "query"
    ]
  }
}
{
  "name": "search_wikipedia",
  "description": "Look up general encyclopedic knowledge on English Wikipedia: people, places, history, organisations, concepts. Returns the best-matching article's title and lead summary plus other matching titles. Not for live data (weather, prices, schedules, GitHub stats).",
  "parameters": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "Short topic or article title, e.g. 'Gotthard Base Tunnel' or 'Linus Torvalds'. Not a full question."
      }
    },
    "required": [
      "query"
    ]
  }
}
get_github_repo
{
  "name": "get_github_repo",
  "description": "Get a GitHub repository.",
  "parameters": {
    "type": "object",
    "properties": {
      "repo": {
        "type": "string"
      }
    },
    "required": [
      "repo"
    ]
  }
}
{
  "name": "get_github_repo",
  "description": "Live metadata for one public GitHub repository: stars, forks, open issues+PRs, main language, license, creation date, last push, topics. Only call it when the user asks about a repository or its stats; for general background on a company or project use search_wikipedia. Not for releases or version numbers (use list_github_releases).",
  "parameters": {
    "type": "object",
    "properties": {
      "repo": {
        "type": "string",
        "description": "Repository as 'owner/name', e.g. 'cohere-ai/cohere-python' or 'vercel/next.js'. If the user names a project rather than a repo, use its canonical GitHub owner/name.",
        "pattern": "^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$"
      }
    },
    "required": [
      "repo"
    ]
  }
}
list_github_releases
{
  "name": "list_github_releases",
  "description": "List releases of a GitHub repository.",
  "parameters": {
    "type": "object",
    "properties": {
      "repo": {
        "type": "string"
      },
      "per_page": {
        "type": "integer"
      },
      "page": {
        "type": "integer"
      }
    },
    "required": [
      "repo"
    ]
  }
}
{
  "name": "list_github_releases",
  "description": "Published releases of a public GitHub repository, newest first, with tag, name, date and a prerelease flag. Use for 'latest version', 'when was X released', 'recent releases'. One call answers 'latest release'; only request another page if the user asked for more releases than were returned.",
  "parameters": {
    "type": "object",
    "properties": {
      "repo": {
        "type": "string",
        "description": "Repository as 'owner/name', e.g. 'cohere-ai/cohere-python' or 'vercel/next.js'. If the user names a project rather than a repo, use its canonical GitHub owner/name.",
        "pattern": "^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$"
      },
      "per_page": {
        "type": "integer",
        "description": "Releases per page, 1-20. Default 5.",
        "minimum": 1,
        "maximum": 20
      },
      "page": {
        "type": "integer",
        "description": "1-based page number. Default 1.",
        "minimum": 1
      },
      "stable_only": {
        "type": "boolean",
        "description": "Exclude prereleases (canary, beta, rc). Set true when the user asks for the latest stable version. Default false."
      }
    },
    "required": [
      "repo"
    ]
  }
}
convert_currency
{
  "name": "convert_currency",
  "description": "Convert currency.",
  "parameters": {
    "type": "object",
    "properties": {
      "amount": {
        "type": "number"
      },
      "from": {
        "type": "string"
      },
      "to": {
        "type": "string"
      },
      "date": {
        "type": "string"
      }
    },
    "required": [
      "from",
      "to"
    ]
  }
}
{
  "name": "convert_currency",
  "description": "Convert an amount between two currencies using European Central Bank reference rates (latest working day, or a past date). Also use it to get a plain exchange rate (amount 1). Supports ~30 major fiat currencies; no crypto.",
  "parameters": {
    "type": "object",
    "properties": {
      "amount": {
        "type": "number",
        "description": "Amount in the source currency. Default 1."
      },
      "from": {
        "type": "string",
        "description": "Source currency as an ISO 4217 code, e.g. 'CHF', 'EUR', 'USD', 'GBP' (pounds/quid), 'JPY' (yen).",
        "pattern": "^[A-Z]{3}$"
      },
      "to": {
        "type": "string",
        "description": "Target currency as an ISO 4217 code.",
        "pattern": "^[A-Z]{3}$"
      },
      "date": {
        "type": "string",
        "description": "Historical rate date in YYYY-MM-DD. Omit for the latest rate.",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
    },
    "required": [
      "from",
      "to"
    ]
  }
}