fix(providers): use Bearer auth for Gemini CLI OAuth tokens
* fix(providers): use Bearer auth for Gemini CLI OAuth tokens When credentials come from ~/.gemini/oauth_creds.json (Gemini CLI), send them as Authorization: Bearer header instead of ?key= query parameter. API keys from env vars or config continue using ?key=. Fixes #194 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor(gemini): harden OAuth bearer auth flow and tests * fix(gemini): granular auth source tracking and review fixes Build on chumyin's auth model refactor with: - Expand GeminiAuth to 4 variants (ExplicitKey/EnvGeminiKey/EnvGoogleKey/ OAuthToken) so auth_source() uses stored discriminant without re-reading env vars at call time - Add is_api_key()/credential() helpers on the enum - Upgrade expired OAuth token log from debug to warn - Add tests: provider_rejects_empty_key, auth_source_explicit_key, auth_source_none_without_credentials Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * style: apply rustfmt to fix CI lint failures Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: root <root@instance-20220913-1738.vcn09131738.oraclevcn.com> Co-authored-by: argenis de la rosa <theonlyhennygod@gmail.com>
This commit is contained in:
parent
e057bf4128
commit
49bb20f961
15 changed files with 358 additions and 148 deletions
|
|
@ -452,14 +452,20 @@ mod tests {
|
|||
fn chat_completions_url_standard_openai() {
|
||||
// Standard OpenAI-compatible providers get /chat/completions appended
|
||||
let p = make_provider("openai", "https://api.openai.com/v1", None);
|
||||
assert_eq!(p.chat_completions_url(), "https://api.openai.com/v1/chat/completions");
|
||||
assert_eq!(
|
||||
p.chat_completions_url(),
|
||||
"https://api.openai.com/v1/chat/completions"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn chat_completions_url_trailing_slash() {
|
||||
// Trailing slash is stripped, then /chat/completions appended
|
||||
let p = make_provider("test", "https://api.example.com/v1/", None);
|
||||
assert_eq!(p.chat_completions_url(), "https://api.example.com/v1/chat/completions");
|
||||
assert_eq!(
|
||||
p.chat_completions_url(),
|
||||
"https://api.example.com/v1/chat/completions"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
@ -515,14 +521,20 @@ mod tests {
|
|||
fn chat_completions_url_without_v1() {
|
||||
// Provider configured without /v1 in base URL
|
||||
let p = make_provider("test", "https://api.example.com", None);
|
||||
assert_eq!(p.chat_completions_url(), "https://api.example.com/chat/completions");
|
||||
assert_eq!(
|
||||
p.chat_completions_url(),
|
||||
"https://api.example.com/chat/completions"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn chat_completions_url_base_with_v1() {
|
||||
// Provider configured with /v1 in base URL
|
||||
let p = make_provider("test", "https://api.example.com/v1", None);
|
||||
assert_eq!(p.chat_completions_url(), "https://api.example.com/v1/chat/completions");
|
||||
assert_eq!(
|
||||
p.chat_completions_url(),
|
||||
"https://api.example.com/v1/chat/completions"
|
||||
);
|
||||
}
|
||||
|
||||
// ══════════════════════════════════════════════════════════
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue