{"record":{"id":"27cc3026244eb04a","repo":"tonhowtf/omniget","slug":"o-chat-do-omniget-fala-openai-anthropic-use-a-rota-openai","errorCode":null,"errorMessage":"o chat do OmniGet fala OpenAI/Anthropic; use a rota OpenAI-compatível do Gemini (…/v1beta/openai) como personalizado","messagePattern":"o chat do OmniGet fala OpenAI/Anthropic; use a rota OpenAI-compatível do Gemini \\(…/v1beta/openai\\) como personalizado","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src-tauri/omniget-core/src/core/tools/ai_keys.rs","lineNumber":635,"sourceCode":"            }\n            serde_json::to_string_pretty(&serde_json::json!({ \"$schema\": \"https://opencode.ai/config.json\", \"provider\": providers }))?\n        }\n        _ => return Err(anyhow!(\"formato desconhecido: {}\", format)),\n    })\n}\n\n/// Usa esta chave como a IA do OmniGet (Ajustes → IA).\npub fn use_in_app(id: &str) -> anyhow::Result<()> {\n    let e = get(id)?;\n    use crate::core::ai::{self, AiProvider};\n    match e.kind.as_str() {\n        \"openai\" => {\n            ai::set(AiProvider::Openai, e.model.clone(), String::new(), Some(e.key.clone()), None);\n        }\n        \"anthropic\" => {\n            ai::set(AiProvider::Anthropic, e.model.clone(), String::new(), None, Some(e.key.clone()));\n        }\n        \"gemini\" => return Err(anyhow!(\"o chat do OmniGet fala OpenAI/Anthropic; use a rota OpenAI-compatível do Gemini (…/v1beta/openai) como personalizado\")),\n        _ => {\n            ai::set(AiProvider::Local, e.model.clone(), e.base_url.clone(), Some(e.key.clone()), None);\n        }\n    }\n    Ok(())\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn hints() {\n        assert_eq!(hint(\"\"), \"\");\n        assert_eq!(hint(\"abc\"), \"•••\");\n        assert_eq!(hint(\"sk-1234567890abcd\"), \"sk-1…abcd\");\n        assert_eq!(site_of(\"https://x.com/v1/\"), \"https://x.com\");\n        assert_eq!(site_of(\"https://x.com\"), \"https://x.com\");","sourceCodeStart":617,"sourceCodeEnd":653,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/core/tools/ai_keys.rs#L617-L653","documentation":"use_in_app() applies a stored key as the app's AI backend; it only maps 'openai', 'anthropic' and a default local/custom kind. The 'gemini' kind is explicitly rejected with a message explaining that OmniGet chat only speaks OpenAI/Anthropic protocols and directing the user to Gemini's OpenAI-compatible route (…/v1beta/openai) configured as a custom provider instead.","triggerScenarios":"Calling use_in_app(id) on a key entry whose provider kind is 'gemini'. Always thrown for gemini entries regardless of key validity.","commonSituations":"User stores a Google AI Studio Gemini key and clicks 'use in app'; apps built before the OpenAI-compat route existed; users unaware Gemini offers an OpenAI-compatible endpoint.","solutions":["Instead of use_in_app, add the Gemini key as a custom provider whose base_url is https://generativelanguage.googleapis.com/v1beta/openai and then use it as local/custom.","Set the model name to a Gemini model (e.g. gemini-2.0-flash) on that custom entry.","Change the entry's provider kind from 'gemini' to a custom kind pointing at the OpenAI-compatible endpoint, then call use_in_app."],"exampleFix":"// before\n{ \"kind\": \"gemini\", \"base_url\": \"https://generativelanguage.googleapis.com\" }\n// after\n{ \"kind\": \"custom\", \"base_url\": \"https://generativelanguage.googleapis.com/v1beta/openai\", \"model\": \"gemini-2.0-flash\" }","handlingStrategy":"validation","validationCode":"let entry = get(id)?;\nif entry.kind == \"gemini\" {\n    eprintln!(\"configure Gemini via its OpenAI-compatible route: https://generativelanguage.googleapis.com/v1beta/openai\");\n    return;\n}","typeGuard":"fn usable_in_app(e: &KeyEntry) -> bool { e.kind != \"gemini\" }","tryCatchPattern":"match use_in_app(id) {\n    Ok(()) => show(\"AI provider applied\"),\n    Err(e) if e.to_string().contains(\"v1beta/openai\") => {\n        show_gemini_compat_instructions();\n    }\n    Err(e) => show_error(e),\n}","preventionTips":["Create Gemini entries as custom providers with base_url …/v1beta/openai","Hide or reroute the 'use in app' action for gemini-kind entries in the UI","Document the OpenAI-compat route in onboarding for Gemini users","Set a Gemini model name (e.g. gemini-2.0-flash) on the custom entry"],"tags":["unsupported-operation","gemini","configuration"],"backgroundTag":"unsupported-operation","analyzedSha":"8600b91f4246848bac346874daa9e61c1fc5677a","analyzedAt":"2026-09-12T14:29:19.317Z","contentChangedAt":"2026-09-12T14:29:19.317Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}