Skip to content

fix(assets): match the tool catalog to its sources and credit them - #128

Open
3mei wants to merge 8 commits into
yev/refactor/self-contained-built-in-probesfrom
yev/fix/tool-catalog-sources
Open

3mei wants to merge 8 commits into
yev/refactor/self-contained-built-in-probesfrom
yev/fix/tool-catalog-sources

Conversation

@3mei

@3mei 3mei commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

What changed and why

Every spec in the catalog is one the tested providers accept, the AutoTools and RestGPT tools take the parameters their upstream declares, and every toolset names the project its specs come from, with the revision they match, the changes made to them, the license and a citation.

Builds on #127.

  • Game tool parameters (first commit). Each tool in the AutoTools Game toolset has the parameters game.tools.json at commit 09c88df lists for its endpoint. That file lists them under params, where the Food, Music and Weather files use parameters. Eleven of the 18 tools take parameters, 20 in all; seven require an id or a year.
  • Path parameters (second commit). Each TMDB tool whose endpoint names a path parameter, such as movie_id in /movie/{movie_id}, has that parameter and requires it. RestGPT's tmdb_oas.json declares them on the path item, which applies them to every operation under it. 34 of the 54 tools gain 44 parameters, and the 12 distinct ones, which have no upstream description, each have a short one.
  • Required flags and request bodies (third commit). A Spotify tool requires a parameter only when spotify_oas.json marks it required. The spec writes that mark as the string "true" or "false", and "false" leaves 50 parameters, such as market, limit and offset, optional. The fields of a JSON request body are parameters as well (14 fields on four tools), so post_users_user_id_playlists takes the name of the playlist it creates. 24 of the 40 tools change.
  • Valid names (fourth commit). Each tool name is unique within its toolset, and each parameter name fits the pattern providers accept. In ToolEyes, the second drivers in API F1 is teams and the second blacklist_ip in Anti Malware is blacklist_url, the functions their specs describe in the toolset's upstream tool.py; spoonacular products keeps one of its two identical classify_grocery_product specs; and Execute's code: and return_err_outputpersistent=False are code and return_err_output, as in the functions' signatures. The catalog holds 3,406 tools, and both READMEs give that count.
  • Valid schemas (fifth commit). Every parameter schema declares a JSON Schema type, and enum values have that type: float is number in one UltraTool tool, the integer enum values of TMDB's with_status and with_type are strings, and the Custom set_device_setting.value has type string. The results schema two UltraTool tools nest in their arguments is removed.
  • Catalog test (sixth commit). tests/engine/probes/test_tool_catalog.py checks the invariants above for every spec the probe ships.
  • Source labels and credits (seventh commit). toolset_source is RestGPT for the Spotify and TMDB toolsets and AutoTools for the Food, Game, Music and Weather toolsets. The README's Sources and licenses section gives, for each of the six sources, the upstream revision the specs match, every change made to them, the license and a citation, with the MIT notices of RestGPT and DAMO-ConvAI and a trademarks note.
  • README accuracy (eighth commit). The example tool spec is the catalog's google_trends_search, abridged, in its upstream wording. The README describes each tool response as a model writes it from the tool's schema, notes that only the ToolEyes rows set toolset_name, and gives the long tail as 64 categories.

How it was verified

At each commit, on that commit's tree:

$ make check-all && make test && make smoke
All checks passed!
370 files already formatted
4662 passed in 92.57s (0:01:32)
All checks passed.

That is the first commit's tree; the next four pass with the same count, and the last three with 4670 tests, the catalog test's eight included.

At the head:

$ make check-license-headers
🎉 All files have correct license headers!
$ make check-doc-links
✓ every relative link, and every link into this repository's main branch, resolves
$ make check-notebooks-clean
OK 4 notebook(s) carry no outputs
$ make check-dist
✓ installed package runs from a clean environment
$ make check-extensions
all extension seams work against an installed distribution
  • The catalog test fails on the base catalog, six of its eight tests:

    E  names repeated within a toolset, which a provider rejects: ['ToolEyes/Food/spoonacular products:classify_grocery_product', 'ToolEyes/Competition/API F1:drivers', 'ToolEyes/Anti-Malware/An
    E  parameter names a provider rejects: ['ToolEyes/Execute/Execute:execute_pycode.code:', 'ToolEyes/Execute/Execute:execute_bash_code.return_err_outputpersistent=False']
    E  schemas without a JSON Schema type: ['Custom/Smart Home Controller:set_device_setting.value: None', "UltraTools/Finance:analyze_impact_on_economy.population_growth_rate: 'float'"]
    E  enum values of another type: ['Auto-generated/TMDB:get_discover_tv.with_status: string [0, 1, 2, 3, 4, 5]', 'Auto-generated/TMDB:get_discover_tv.with_type: string [0, 1, 2, 3, 4, 5, 6]']
    E  parameters schemas carrying a results schema: ['UltraTools/Flight:seat_preference_query', 'UltraTools/Train:select_and_change_ticket']
    E  endpoint placeholders that are not required parameters: ['Auto-generated/Game:get_game_hall_of_fame_year: year', 'Auto-generated/Game:get_game_id: id', 'Auto-generated/Game:get_reviews_fo
    
  • Every spec was compared with its upstream at the pinned commits. Rebuilding the AutoTools and RestGPT specs under the README's rules gives the shipped specs, except get_game_reviewed_today, whose upstream url field holds its description, and TMDB's get_discover_tv, whose enum values are strings:

    Food: 22 in catalog, 22 upstream, 22 identical, differing: []
      row is byte for byte the rebuilt specs: True
      differing outside parameters: []
    Game: 18 in catalog, 18 upstream, 17 identical, differing: ['get_game_reviewed_today']
      row is byte for byte the rebuilt specs: False
      differing outside parameters: ['get_game_reviewed_today']
    Music: 32 in catalog, 32 upstream, 32 identical, differing: []
      row is byte for byte the rebuilt specs: True
      differing outside parameters: []
    Weather: 11 in catalog, 11 upstream, 11 identical, differing: []
      row is byte for byte the rebuilt specs: True
      differing outside parameters: []
    TMDB: 54 in catalog, 54 upstream, 53 identical
      only upstream: [] only catalog: []
      get_discover_tv: differs in [] added=[] changed=['with_status', 'with_type']
    Spotify: 40 in catalog, 40 upstream, 40 identical
      only upstream: [] only catalog: []
    

    The UltraTool, ToolEyes and API-Bank specs equal upstream's, apart from the changes the README lists:

    UltraTools: 2328 specs, one per distinct upstream spec, 2325 equal upstream's; differing: ['analyze_impact_on_economy', 'seat_preference_query', 'select_and_change_ticket']
    ToolEyes: 95 toolsets, 91 equal upstream's; differing: ['API F1', 'Anti Malware', 'Execute', 'spoonacular products']
    API-Bank: 225 specs in 10 toolsets, 225 with upstream's descriptions and parameters; differing: []
    
  • Between the base and the head, the catalog differs in these cells:

    rows: 143 -> 143
    toolset_source [AutoTools/Music]: Auto-generated -> AutoTools
    toolset_source [AutoTools/Game]: Auto-generated -> AutoTools
    toolset_source [AutoTools/Food]: Auto-generated -> AutoTools
    toolset_source [AutoTools/Weather]: Auto-generated -> AutoTools
    toolset_source [RestGPT/Spotify]: Auto-generated -> RestGPT
    toolset_source [RestGPT/TMDB]: Auto-generated -> RestGPT
    num_tools [ToolEyes/Food/spoonacular products]: 9 -> 8
    tools [AutoTools/Game]: 4680 -> 8427 characters
    tools [UltraTools/Flight]: 89097 -> 88946 characters
    tools [Custom/Smart Home Controller]: 4057 -> 4075 characters
    tools [ToolEyes/Food/spoonacular products]: 5927 -> 5282 characters
    tools [UltraTools/Train]: 44232 -> 44103 characters
    tools [ToolEyes/Execute/Execute]: 2580 -> 2562 characters
    tools [ToolEyes/Competition/API F1]: 5628 -> 5626 characters
    tools [RestGPT/Spotify]: 38224 -> 41296 characters
    tools [UltraTools/Finance]: 154726 -> 154727 characters
    tools [ToolEyes/Anti-Malware/Anti Malware]: 2980 -> 2981 characters
    tools [RestGPT/TMDB]: 37346 -> 42508 characters
                    toolsets  tools
    toolset_source                 
    API-Bank              10    225
    AutoTools              4     83
    Custom                10    109
    RestGPT                2     94
    ToolEyes              95    567
    UltraTools            22   2328
    
  • Against a custom provider config, requests carrying the base catalog's float parameter were rejected by the OpenAI and Anthropic routes, and requests carrying a toolset with a repeated name or with code: by the Anthropic route:

    OpenAI route
      type float               1 tools  400  Invalid schema for function 'analyze_impact_on_economy': 'float' is not valid under any of the given schemas.
      API F1 toolset          10 tools  200
      Anti Malware toolset     7 tools  200
      spoonacular products     9 tools  200
      Execute toolset          5 tools  200
      Finance toolset[:64]    64 tools  400  Invalid schema for function 'analyze_impact_on_economy': 'float' is not valid under any of the given schemas.
    Anthropic route
      type float               1 tools  400  JSON schema is invalid. It must match JSON Schema draft 2020-12
      API F1 toolset          10 tools  400  The tool drivers is already defined at toolConfig.tools.6
      Anti Malware toolset     7 tools  400  The tool blacklist_ip is already defined at toolConfig.tools.3
      spoonacular products     9 tools  400  The tool classify_grocery_product is already defined at toolConfig.tools.6
      Execute toolset          5 tools  400  Property keys should match pattern '^[a-zA-Z0-9_.-]{1,64}$'
      Finance toolset[:64]    64 tools  400  JSON schema is invalid. It must match JSON Schema draft 2020-12
    NVIDIA route
      type float               1 tools  200
      API F1 toolset          10 tools  200
      Anti Malware toolset     7 tools  200
      spoonacular products     9 tools  200
      Execute toolset          5 tools  200
      Finance toolset[:64]    64 tools  200
    

    Every spec of the head's catalog, sent in batches of up to 64 per toolset, was accepted by all three routes:

    == OpenAI route: 171 requests, 3406 tools, 0 not accepted
    == Anthropic route: 171 requests, 3406 tools, 0 not accepted
    == NVIDIA route: 171 requests, 3406 tools, 0 not accepted
    
  • usersim simulate --probe-mix tool_calling=1.0 --toolset-seed-path <catalog>, then usersim eval --scorers auto, ran against the same config in en_GB: 3 rows on a catalog holding only the Game row and 4 rows on one holding only the Spotify and TMDB rows, with every model's requests at failed=0. Every tool call the rows record passes only parameters its spec defines, and each of the seven rows' evaluations reads:

    judge: scored
    language_compliance: ok (error=None)
    refusal_basics: ok (error=None)
    response_shape: ok (error=None)
    tool_use: ok (error=None)
    
  • make health-check ran against the same config for tool_calling in en_GB on the head's catalog. It ended with ✓ simulate, eval and report all completed, and every model's requests show failed=0.

Results impact

  • Runs that sample the AutoTools Game toolset, the TMDB or Spotify toolsets, or a toolset whose names or schemas the fourth and fifth commits fix, give the assistant different specs: tools that take the parameters their endpoints need, optional parameters that are optional, and toolsets a provider accepts. Conversations and tool_use scores for those rows move. A row offers the assistant five tools sampled from its toolset, so rows whose sample drew analyze_impact_on_economy (rejected on the OpenAI and Anthropic routes), both copies of a repeated name or an Execute tool with a malformed key (rejected on the Anthropic route) complete.
  • Trajectories carry their toolset's toolset_source. Rows that sample the six RestGPT and AutoTools toolsets record RestGPT or AutoTools, where runs of earlier releases record Auto-generated, so a comparison grouped by toolset_source across releases splits that group.

3mei added 8 commits November 3, 2026 23:53
Each tool in the Game toolset has the parameters that game.tools.json
in the AutoTools repository, at commit 09c88df, lists for its endpoint.
They are converted as the Food, Music and Weather tools' parameters are:
the type in lower case, the description ending with the parameter's
location, and a parameter named in the endpoint's URL required. That
file lists them under params, where the other three use parameters.
Eleven of the 18 tools take parameters, 20 in all; seven require an id
or a year.

Signed-off-by: Yev Meyer <ymeyer@nvidia.com>
Each TMDB tool whose endpoint names a path parameter, such as movie_id
in /movie/{movie_id}, has that parameter and requires it. RestGPT's
tmdb_oas.json, at commit d990128, declares these parameters on the path
item, which applies them to every operation under it. Upstream gives
them no description, so each of the 12 has a short one written for this
catalog. 34 of the 54 tools gain parameters, 44 in all.

Signed-off-by: Yev Meyer <ymeyer@nvidia.com>
A Spotify tool requires a parameter only when RestGPT's
spotify_oas.json, at commit d990128, marks it required. The spec writes
that mark as the string true or false, and false leaves a parameter
such as market, limit or offset optional. The fields of an operation's
JSON request body are parameters as well, so the tool
post_users_user_id_playlists takes the name of the playlist it creates,
and the type parameter of get_search keeps the values upstream lists
for its items. 24 of the 40 tools change.

Signed-off-by: Yev Meyer <ymeyer@nvidia.com>
Each tool name is unique within its toolset, and each parameter name
fits the pattern providers accept: a request that repeats a tool name
or carries an invalid parameter name is rejected. Three ToolEyes
toolsets repeat a name in their upstream config. In API F1 and Anti
Malware the second spec describes another function in the toolset's
tool.py, teams and blacklist_url, and in spoonacular products the
repeat is identical and appears once. In Execute, code and
return_err_output are the names the functions' signatures use. The
catalog holds 3,406 tools, and both READMEs give that count.

Signed-off-by: Yev Meyer <ymeyer@nvidia.com>
Every parameter schema in the catalog declares a JSON Schema type, and
enum values have that type. population_growth_rate in the UltraTool
analyze_impact_on_economy tool has type number, where upstream writes
float, which providers reject. with_status and with_type in TMDB's
get_discover_tv list their values as strings, and the value parameter
of the Custom set_device_setting tool has type string. The results
schema that two UltraTool tools nest in their arguments is removed.

Signed-off-by: Yev Meyer <ymeyer@nvidia.com>
tests/engine/probes/test_tool_catalog.py checks the catalog the
tool_calling probe ships. num_tools counts each toolset's specs. Tool
names are valid and unique within a toolset, and parameter names,
types and enum values are ones JSON Schema and providers accept. Every
required name is a declared parameter, no parameters schema carries a
results schema, and each placeholder in a tool's endpoint is a required
parameter.

Signed-off-by: Yev Meyer <ymeyer@nvidia.com>
Each row's toolset_source names the project its specs come from. The
Spotify and TMDB toolsets are RestGPT, from RestBench's OpenAPI specs,
and the Food, Game, Music and Weather toolsets are AutoTools, from the
tools folder of the AutoTools repository. The commit changes no tool
spec and no count.

The tool_calling README has a Sources and licenses section. For each
source it gives the upstream revision the specs match, the changes made
to them, the license and a citation. It carries the MIT notices of
RestGPT and DAMO-ConvAI and a note on the trademarks the specs name.

Signed-off-by: Yev Meyer <ymeyer@nvidia.com>
The example tool spec is the catalog's google_trends_search spec,
abridged to two of its 11 parameters, with the upstream wording and its
required list. The README describes each tool response as a model
writes it: shaped by the tool's schema, with no live service behind it.
The schema table notes that only the ToolEyes rows set toolset_name,
and the long tail holds 64 categories.

Signed-off-by: Yev Meyer <ymeyer@nvidia.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant