diff --git a/frontend/src/api/admin/gemini.ts b/frontend/src/api/admin/gemini.ts index 366e22d3..a01793dd 100644 --- a/frontend/src/api/admin/gemini.ts +++ b/frontend/src/api/admin/gemini.ts @@ -11,6 +11,11 @@ export interface GeminiAuthUrlResponse { state: string } +export interface GeminiOAuthCapabilities { + ai_studio_oauth_enabled: boolean + required_redirect_uris: string[] +} + export interface GeminiAuthUrlRequest { proxy_id?: number project_id?: string @@ -45,4 +50,9 @@ export async function exchangeCode(payload: GeminiExchangeCodeRequest): Promise< return data } -export default { generateAuthUrl, exchangeCode } +export async function getCapabilities(): Promise { + const { data } = await apiClient.get('/admin/gemini/oauth/capabilities') + return data +} + +export default { generateAuthUrl, exchangeCode, getCapabilities } diff --git a/frontend/src/composables/useGeminiOAuth.ts b/frontend/src/composables/useGeminiOAuth.ts index ac74b57f..fb20cc2f 100644 --- a/frontend/src/composables/useGeminiOAuth.ts +++ b/frontend/src/composables/useGeminiOAuth.ts @@ -2,6 +2,7 @@ import { ref } from 'vue' import { useI18n } from 'vue-i18n' import { useAppStore } from '@/stores/app' import { adminAPI } from '@/api/admin' +import type { GeminiOAuthCapabilities } from '@/api/admin/gemini' export interface GeminiTokenInfo { access_token?: string @@ -119,6 +120,15 @@ export function useGeminiOAuth() { } } + const getCapabilities = async (): Promise => { + try { + return await adminAPI.gemini.getCapabilities() + } catch (err: any) { + // Capabilities are optional for older servers; don't block the UI. + return null + } + } + return { authUrl, sessionId, @@ -128,6 +138,7 @@ export function useGeminiOAuth() { resetState, generateAuthUrl, exchangeAuthCode, - buildCredentials + buildCredentials, + getCapabilities } }