Files
buzz/crates/buzz-agent/tests/fqn_capabilities.rs
Bradley Axen cd54e26823 fix(agent): route GPT-5+ model-service FQNs to Responses (#7358)
## Summary
Route Databricks Unity Catalog model services to OpenAI Responses when
their service name matches GPT-5 or newer. These models can reject tools
plus reasoning on Chat Completions.

Match only the service component, using the existing family-token
boundaries and a numeric major version. Catalog and schema names cannot
select the protocol. Keep neutral effort capabilities and the full model
ID unchanged; other services still use MLflow Chat Completions.

Keep the Rust and desktop resolvers in sync, add shared boundary cases
and a captured-HTTP regression for completion and summarization, and
update the documented FQN rule.

### Related issue
No duplicate found in searches for “FQN responses” PRs or “astra”
issues. Related: #6918 introduced Unity Catalog discovery.

Originating conversation:
buzz://message?channel=0b881928-a3a6-4c01-b981-8e64268f01ce&id=770949343bc96a9ed88acd90a1b37d358a0efc52c79237d0fdb491ce02b8d4ed

### Testing
No live Databricks inference test. The gateway must accept the full
model-service ID on its OpenAI Responses route; this remains the
integration risk.

The local `just ci` attempt exceeded its five-minute deadline during
`mobile-check`, so the full repository gate was not completed. All
push-hook checks passed.

Generated with Codex

Signed-off-by: Fizz <400e8babadcee6a7f420103f10a2849d84c4a9c71d5bd04f3948c814216648a3@buzz.block.builderlab.xyz>
Co-authored-by: Fizz <400e8babadcee6a7f420103f10a2849d84c4a9c71d5bd04f3948c814216648a3@buzz.block.builderlab.xyz>
2026-09-08 08:23:48 -06:00

64 lines
2.2 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//! UC route selection must change only the route, never effort or model identity.
use buzz_agent::model_capabilities::{resolve, DatabricksV2Route};
#[test]
fn gpt_fqn_route_preserves_neutral_capabilities() {
let fallback = resolve("databricks_v2", "catalog.schema.unknown");
for model in [
"catalog.schema.goose-gpt-6-astra",
"catalog.schema.gpt-5",
"catalog.schema.goose-gpt-5-5",
"catalog.schema.gpt-10",
"catalog.schema.GOOSE-GPT-6-ASTRA",
"catalog.schema.team-gpt-6-astra",
] {
let got = resolve(" DATABRICKS-V2 ", model);
assert_eq!(
got.databricks_v2_wire_route,
DatabricksV2Route::OpenaiResponses,
"{model}"
);
assert_eq!(got.thinking_mode, fallback.thinking_mode, "{model}");
assert_eq!(got.supported_efforts, fallback.supported_efforts, "{model}");
assert_eq!(got.default_effort, fallback.default_effort, "{model}");
assert_eq!(
got.normalization_policy, fallback.normalization_policy,
"{model}"
);
assert_eq!(got.registry_label, None, "{model}");
}
}
#[test]
fn unrelated_fqns_do_not_select_responses() {
for model in [
"gpt-6.schema.other",
"catalog.gpt-5.other",
"catalog.schema.claude-gpt-6",
"catalog.schema.mygpt-6-astra",
"catalog.schema.gpt-4",
"catalog.schema.gpt-4o",
"catalog.schema.gpt-6x",
"catalog.schema.gpt-oss-120b",
"catalog.schema.gpt-",
"catalog.schema.gpt-6",
"catalog.schema.gpt-4294967296",
"catalog.schema.kimi-k3",
] {
assert_eq!(
resolve("databricks_v2", model).databricks_v2_wire_route,
DatabricksV2Route::MlflowChat,
"{model}"
);
}
// The new rule is not an endpoint-family or cross-provider capability change.
assert_eq!(
resolve("databricks_v2", "goose-gpt-6-astra").databricks_v2_wire_route,
DatabricksV2Route::MlflowChat
);
assert_eq!(
resolve("openai", "catalog.schema.goose-gpt-6-astra").databricks_v2_wire_route,
DatabricksV2Route::NotApplicable
);
}