Repository navigation
Conversation
tool_calling's themes live in assets/tool_calling/en_US/themes.json, which every locale reads unless it has a themes.json of its own, and the probe's themes() reads them with load_seeds, as the general probes read their topics. The run setup draws them as it draws every other probe's, so build_simulator_config_builder and materialize_episode_inputs take no tool_calling_themes, and the run manifest's scope records none; a manifest that holds the key still loads. The README says the themes reach a row only when its toolset has no category, since the probe takes a row's theme from its toolset's category and name. asset_problems checks the themes file, and notebook 01 follows. Signed-off-by: Yev Meyer <ymeyer@nvidia.com>
BaseProbe.seed_dataset names a table in the probe's asset folder, <name>.parquet or <name>.jsonl, that a run attaches as its seed dataset, so each row gets the columns of one of the table's rows. tool_calling declares its toolset catalog, toolsets_seed, and reads its tools from the row's tools column unless the run sets tools_column, so the run setup names no probe: resolve_seed_dataset_for_mix finds the table of the probe in the mix that declares one, refuses a mix with two, and keeps --toolset-seed-path and toolset_seed_path= as the override for it. usersim smoke and assert_probe_conforms check that the declared table is there, the extension fixture declares one so make check-extensions resolves it from an installed package, and the tool-calling template declares one. architecture/probes.md, the catalog README, the engine README's config table and the --toolset-seed-path help describe it. Signed-off-by: Yev Meyer <ymeyer@nvidia.com>
The probe test template runs every episode through usersim.testing.run_episode with scripted models and patches nothing: registration and conformance, a run end to end, the row's area in the user model's instructions, the columns the probe writes, a declining assistant scripted by a ScriptedModel subclass, the placeholder warning, and hosted parity. AUTHORING_A_PROBE.md's test sections and the template README describe the same tests, and the README's checklist says a probe's scorer and capabilities live in its own package. The template imports only usersim.extension, usersim.testing and the probe's own module, as test_extension_api.py checks. Signed-off-by: Yev Meyer <ymeyer@nvidia.com>
The README's Extending it list links docs/extensions.md and docs/extension_api.md. docs/extensions.md says how a package builds against a change in User Sim before a release has it: ask for it in general terms, install a checkout without recording it, depend on the merged commit until a release includes it, and work around the gap only with public names. Signed-off-by: Yev Meyer <ymeyer@nvidia.com>
The run manifest's code block records each installed package that advertises a User Sim entry point, with its version (extension_distributions in core/_extensions.py), and its asset_versions block records the folder each probe in the run's mix read its assets from, under assets_dir when the run pinned one. A manifest without them still loads. Signed-off-by: Yev Meyer <ymeyer@nvidia.com>
HealthDisclosureProbe.asset_problems loads the clinical-profile bank each client's rows draw from, where a run reads it, so usersim smoke and assert_probe_conforms report a bank that does not load, a customer bank named by the client's profiles variable included. Signed-off-by: Yev Meyer <ymeyer@nvidia.com>
The extension package template and the extension guide's pyproject.toml set asyncio_default_fixture_loop_scope to function, so pytest-asyncio runs each async fixture on its test's event loop and the template's tests run without a deprecation warning. Signed-off-by: Yev Meyer <ymeyer@nvidia.com>
tests/_asset_audit.py takes its locales from SHIPPED_LOCALES, so a locale added to User Sim is one the audit recognises. Signed-off-by: Yev Meyer <ymeyer@nvidia.com>
3mei
force-pushed
the
yev/feat/close-out-probe-work
branch
from
November 4, 2026 17:10
dde9924 to
9dc4434
Compare
A tool_calling row's user prompt takes its theme from the row's toolset: its category, and its name where it has one. Every toolset in the shipped catalog has a category, so a theme drawn from themes.json reaches no conversation, while the row stores it in its theme column, where the preview and exports show it beside an unrelated toolset. The probe lists no themes, so its rows hold the run's __not_used__ placeholder, as the rows of every probe that draws its area from its own data do, and themes.json is removed. A catalog without categories gives each row its toolset's name as its theme, and a row that names no toolset gets a theme of using the offered tools. The preview shows a tool_calling row's toolset and category. No prompt, judge or scorer reads the theme column of these rows, so shipped conversations, scores and trajectory ids stay the same. Signed-off-by: Yev Meyer <ymeyer@nvidia.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed and why
A probe declares the seed table its rows sample, so the run setup names no probe; a
tool_callingrow's theme is its toolset; new probes get a test template that runs throughrun_episodewith nothing patched; and the run manifest records the extensions installed and where each probe read its assets.Builds on #133.
assets/tool_calling/en_US/themes.jsonholds them, read by the probe'sthemes()withload_seeds, as the general probes read their topics.build_simulator_config_builderandmaterialize_episode_inputstake notool_calling_themes, and the run manifest's scope records none; a manifest that holds the key still loads. The catalog README says the themes reach a row only when its toolset has no category: the probe takes a row's theme from its toolset's category and name, and every shipped toolset has one.BaseProbe.seed_datasetnames a table in the probe's asset folder,<name>.parquetor<name>.jsonl, that a run attaches as its seed dataset, so each row gets the columns of one of its rows.tool_callingdeclares its toolset catalog,toolsets_seed, and reads its tools from the row'stoolscolumn unless the run setstools_column.resolve_seed_dataset_for_mixfinds the table of the probe in the mix that declares one and refuses a mix with two;--toolset-seed-pathandtoolset_seed_path=keep their names and override that table.usersim smokeandassert_probe_conformscheck the table is there, the extension fixture declares one somake check-extensionsresolves it from an installed package, and the tool-calling template declares one. The CLI pipeline namestool_callingonly in the default probe mix.usersim.testing.run_episodewith scripted models, nothing patched: conformance, a run end to end, the row's area in the user model's instructions, the columns the probe writes, a declining assistant scripted by aScriptedModelsubclass, the placeholder warning, and hosted parity.AUTHORING_A_PROBE.mdand the template README describe the same tests, and the README's checklist says a probe's scorer and capabilities live in its own package.docs/extensions.mdanddocs/extension_api.md, anddocs/extensions.mdsays how a package builds against a change in User Sim before a release has it.code.extensionsrecords each installed package that advertises a User Sim entry point, with its version, andasset_versions.probe_assetsthe folder each probe in the mix read its assets from.asset_problemsloads each client's clinical-profile bank, sousersim smokechecks all 14 probes' assets; the extension template and guide setasyncio_default_fixture_loop_scope, so the template's tests run without a deprecation warning; andtests/_asset_audit.pyreadsSHIPPED_LOCALES.tool_callingrow's theme is its toolset (ninth commit). The user prompt takes a row's theme from its toolset's category and name. Every shipped toolset has a category, so a theme drawn fromthemes.jsonreaches no conversation, while the row stores it in itsthemecolumn, where the preview and exports show it beside an unrelated toolset. The probe lists no themes, so its rows hold the run's__not_used__placeholder, as the rows of every probe that draws its area from its own data do, andthemes.jsonis removed. A catalog without categories gives each row its toolset's name; the preview shows the toolset and its category. No prompt, judge or scorer reads thethemecolumn of these rows, so shipped conversations, scores and trajectory ids stay the same.Changes for callers
build_simulator_config_builderandmaterialize_episode_inputsinusersim.cli._pipeline, andbuild_run_manifestandwrite_simulator_manifestinusersim.engine.core.manifest, take notool_calling_themes, and a run manifest's scope has notool_calling_themeskey.resolve_toolset_seed_path,resolve_toolset_seed_for_mixandTOOLSET_SEED_SUFFIXESinusersim.cli._pipelinebecomeresolve_seed_dataset_path,resolve_seed_dataset_for_mixandSEED_DATASET_SUFFIXES(inusersim.engine.core.probes).DEFAULT_TOOL_CALLING_THEMEShas no counterpart, since atool_callingrow's theme is its toolset.tool_callingrow'sthemecolumn holds__not_used__; itstoolset_categoryandtoolset_namecolumns say what the conversation is about.How it was verified
At each commit, on that commit's tree:
That is the first commit's tree. The later ones pass with 4711, 4711, 4711, 4715, 4724, 4724, 4724 and 4731, as each adds its tests. The pre-commit hooks pass on every file the commits touch, at each commit.
At the head:
The probe test template, filled in for
general_open_endedin a scratch folder (the placeholder-warning test left out, since that probe has no bank), passed its six tests.make health-checkran against a custom provider config fortool_callinginen_USand for the default probe,sov_ai_dynamicinja_JP. Both ended with✓ simulate, eval and report all completed, and every model's requests showfailed=0.usersim simulatewith the default mix (tool_callingand the two general probes), thenusersim eval --scorers auto, against the same config: eachtool_callingrow drew a toolset from the attached catalog, stores__not_used__as its theme, and opens with a request in its toolset's area; the manifest records each probe's asset folder and the seed table and notool_calling_themes; the judge scored every row and every scorer reported ok.