Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,7 @@ jobs:
if: steps.optout.outputs.skip != 'true'
env:
VERSION: '0.17.0'
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
curl -fsSL https://install.iii.dev/iii/main/install.sh -o /tmp/install-iii.sh
Expand Down
52 changes: 47 additions & 5 deletions approval-gate/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion provider-anthropic/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 27 additions & 3 deletions provider-anthropic/src/thinking.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,14 @@ pub struct ThinkingBuild {
pub fn build_thinking_config(level: Option<ThinkingLevel>, model: Option<&Model>) -> ThinkingBuild {
let mut warnings = Vec::new();
let Some(level) = level else {
// Parity with xai reasoning models, which surface reasoning by default:
// with no explicit level, still request adaptive thinking on models that
// definitely support it (server default effort, so no output_config).
// Gate on Some(true), not the permissive path — an implicit default must
// never 400 on a non-thinking or unknown model.
let config = (model.and_then(|m| m.supports_thinking) == Some(true)).then_some(ADAPTIVE);
return ThinkingBuild {
config: None,
config,
effort: None,
warnings,
};
Expand Down Expand Up @@ -99,13 +105,31 @@ mod tests {
}

#[test]
fn absent_level_means_off() {
fn absent_level_defaults_on_for_thinking_models() {
// Parity with xai: no explicit level still surfaces reasoning on a model
// that supports thinking, at the server's default effort (no output_config).
let built = build_thinking_config(None, Some(&model(Some(true), Some(true))));
assert_eq!(built.config, None);
assert_eq!(built.config, Some(ADAPTIVE));
assert_eq!(built.effort, None);
assert!(built.warnings.is_empty());
}

#[test]
fn absent_level_stays_off_without_thinking_support() {
// No implicit default when support is unknown or explicitly false, so the
// default can never 400 a non-thinking model.
for m in [
None,
Some(model(None, None)),
Some(model(Some(false), None)),
] {
let built = build_thinking_config(None, m.as_ref());
assert_eq!(built.config, None);
assert_eq!(built.effort, None);
assert!(built.warnings.is_empty());
}
}

#[test]
fn levels_map_to_adaptive_with_effort() {
let m = model(Some(true), Some(true));
Expand Down
2 changes: 1 addition & 1 deletion provider-llamacpp/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion provider-openai-codex/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 9 additions & 9 deletions provider-openai-codex/src/stream_fn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,17 +92,17 @@ async fn fetch_fresh_credential(iii: &IIIClient) -> Option<Value> {
.ok()
.flatten()
{
if near_expiry(&cred) {
if matches!(
if near_expiry(&cred)
&& matches!(
router_client::refresh_if_available(iii, PROVIDER_ID).await,
Ok(true)
) {
return router_client::get_token_if_available(iii, PROVIDER_ID)
.await
.ok()
.flatten()
.or(Some(cred));
}
)
{
return router_client::get_token_if_available(iii, PROVIDER_ID)
.await
.ok()
.flatten()
.or(Some(cred));
}
return Some(cred);
}
Expand Down
2 changes: 1 addition & 1 deletion provider-openai/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion provider-xai/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion provider-zai/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading