import { AadHttpClient, HttpClientResponse } from '@microsoft/sp-http'; import { WebPartContext } from '@microsoft/sp-webpart-base'; import { APPROVAL_API_CLIENT_ID, DICTIONARY_API_BASE_URL } from '../config'; /** JSON-схема ответа в формате, который принимает прокси Gemini (как в СТ). */ export interface IGeminiSchema { type: 'object' | 'array' | 'string' | 'number' | 'integer' | 'boolean'; properties?: Record; items?: IGeminiSchema; required?: string[]; } /** * POST /Proxy/Gemini { prompt, responseSchema } → объект, подогнанный под схему. * Тот же вызов делает СТ (CtService.scorePaymentTerms); ответ прокси — уже * разобранный JSON, без обёртки. */ export async function askGemini(context: WebPartContext, prompt: string, responseSchema: IGeminiSchema): Promise { const client = await context.aadHttpClientFactory.getClient(APPROVAL_API_CLIENT_ID); const response: HttpClientResponse = await client.post( `${DICTIONARY_API_BASE_URL}/Proxy/Gemini`, AadHttpClient.configurations.v1, { headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ prompt, responseSchema }) } ); if (!response.ok) { throw new Error(`Proxy/Gemini: ${response.status} ${response.statusText}`); } const body = (await response.json()) as T & { error?: unknown }; // Пустой ответ модели прокси отдаёт как 200 с { error } — это сбой, а не данные. if (body && typeof body.error === 'string') { throw new Error(`Proxy/Gemini: ${body.error}`); } return body; }