mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-06 02:48:13 +00:00
* refactor(rust): standardize Azure Messages module path * docs(rust): define shared types crate boundaries * refactor(rust): share request helpers and type Anthropic blocks * docs(rust): format shared type invariants as bullets * test(rust): parameterize repeated cases with rstest * refactor(rust): move Responses transform result into llms * fix(anthropic): validate chat and batch responses * docs(rust): clarify API format ownership boundaries * docs: clarify Rust error message construction * refactor(auth): keep shared Rust errors provider-neutral * refactor(rust): separate format contracts from provider policy * fix(rust): type Anthropic chat response text collection * fix(rust): pass audio secret sources through hosts * fix(rust): unblock batch lint and OCR error assertions * test(rust): assert response failures at the adapter boundary * refactor(rust): declare error messages with typed context * wip * fix(rust): adapt Bedrock error details * style(rust): cargo fmt bedrock audio transcription Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(rust): adapt tests and dead code to typed error details Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(rust): keep converse error contracts and read env secrets without litellm Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * ci(rust): raise the native wheel size gate to 45 MB Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix(rust): tolerate missing usage in converse responses on the transcription route Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: Yujong Lee <yujong@berri.ai> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
33 lines
1.3 KiB
Rust
33 lines
1.3 KiB
Rust
use litellm_core_utils::settings::resolve_non_empty;
|
|
use rstest::rstest;
|
|
|
|
#[rstest]
|
|
#[case::explicit_wins(Some(" explicit "), &["FIRST", "SECOND"], Some("explicit"))]
|
|
#[case::absent_falls_back(None, &["FIRST", "SECOND"], Some(" first "))]
|
|
#[case::blank_falls_back(Some(" \t "), &["BLANK", "SECOND"], Some("second"))]
|
|
#[case::skips_missing_and_blank(None, &["MISSING", "BLANK", "SECOND"], Some("second"))]
|
|
#[case::environment_order(None, &["SECOND", "FIRST"], Some("second"))]
|
|
#[case::missing(None, &["MISSING", "BLANK"], None)]
|
|
#[case::no_environment(None, &[], None)]
|
|
fn resolves_explicit_value_then_first_nonblank_environment_value(
|
|
#[case] value: Option<&str>,
|
|
#[case] names: &[&str],
|
|
#[case] expected: Option<&str>,
|
|
) {
|
|
let env = |name: &str| match name {
|
|
"FIRST" => Some(" first ".to_string()),
|
|
"SECOND" => Some("second".to_string()),
|
|
"BLANK" => Some(" \t ".to_string()),
|
|
_ => None,
|
|
};
|
|
assert_eq!(resolve_non_empty(value, &env, names).as_deref(), expected);
|
|
}
|
|
|
|
#[rstest]
|
|
fn explicit_value_does_not_read_the_environment() {
|
|
let env = |_: &str| panic!("an explicit value must short-circuit environment lookup");
|
|
assert_eq!(
|
|
resolve_non_empty(Some("key"), &env, &["KEY"]).as_deref(),
|
|
Some("key")
|
|
);
|
|
}
|