diff options
Diffstat (limited to 'packages/core/src/code_assist/converter.test.ts')
| -rw-r--r-- | packages/core/src/code_assist/converter.test.ts | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/packages/core/src/code_assist/converter.test.ts b/packages/core/src/code_assist/converter.test.ts new file mode 100644 index 00000000..4536d65f --- /dev/null +++ b/packages/core/src/code_assist/converter.test.ts @@ -0,0 +1,222 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { describe, it, expect } from 'vitest'; +import { toCcpaRequest, fromCcpaResponse, CcpaResponse } from './converter.js'; +import { + GenerateContentParameters, + GenerateContentResponse, + FinishReason, + BlockedReason, +} from '@google/genai'; + +describe('converter', () => { + describe('toCcpaRequest', () => { + it('should convert a simple request with project', () => { + const genaiReq: GenerateContentParameters = { + model: 'gemini-pro', + contents: [{ role: 'user', parts: [{ text: 'Hello' }] }], + }; + const ccpaReq = toCcpaRequest(genaiReq, 'my-project'); + expect(ccpaReq).toEqual({ + model: 'gemini-pro', + project: 'my-project', + request: { + contents: [{ role: 'user', parts: [{ text: 'Hello' }] }], + systemInstruction: undefined, + cachedContent: undefined, + tools: undefined, + toolConfig: undefined, + labels: undefined, + safetySettings: undefined, + generationConfig: undefined, + }, + }); + }); + + it('should convert a request without a project', () => { + const genaiReq: GenerateContentParameters = { + model: 'gemini-pro', + contents: [{ role: 'user', parts: [{ text: 'Hello' }] }], + }; + const ccpaReq = toCcpaRequest(genaiReq); + expect(ccpaReq).toEqual({ + model: 'gemini-pro', + project: undefined, + request: { + contents: [{ role: 'user', parts: [{ text: 'Hello' }] }], + systemInstruction: undefined, + cachedContent: undefined, + tools: undefined, + toolConfig: undefined, + labels: undefined, + safetySettings: undefined, + generationConfig: undefined, + }, + }); + }); + + it('should handle string content', () => { + const genaiReq: GenerateContentParameters = { + model: 'gemini-pro', + contents: 'Hello', + }; + const ccpaReq = toCcpaRequest(genaiReq); + expect(ccpaReq.request.contents).toEqual([ + { role: 'user', parts: [{ text: 'Hello' }] }, + ]); + }); + + it('should handle Part[] content', () => { + const genaiReq: GenerateContentParameters = { + model: 'gemini-pro', + contents: [{ text: 'Hello' }, { text: 'World' }], + }; + const ccpaReq = toCcpaRequest(genaiReq); + expect(ccpaReq.request.contents).toEqual([ + { role: 'user', parts: [{ text: 'Hello' }] }, + { role: 'user', parts: [{ text: 'World' }] }, + ]); + }); + + it('should handle system instructions', () => { + const genaiReq: GenerateContentParameters = { + model: 'gemini-pro', + contents: 'Hello', + config: { + systemInstruction: 'You are a helpful assistant.', + }, + }; + const ccpaReq = toCcpaRequest(genaiReq); + expect(ccpaReq.request.systemInstruction).toEqual({ + role: 'user', + parts: [{ text: 'You are a helpful assistant.' }], + }); + }); + + it('should handle generation config', () => { + const genaiReq: GenerateContentParameters = { + model: 'gemini-pro', + contents: 'Hello', + config: { + temperature: 0.8, + topK: 40, + }, + }; + const ccpaReq = toCcpaRequest(genaiReq); + expect(ccpaReq.request.generationConfig).toEqual({ + temperature: 0.8, + topK: 40, + }); + }); + + it('should handle all generation config fields', () => { + const genaiReq: GenerateContentParameters = { + model: 'gemini-pro', + contents: 'Hello', + config: { + temperature: 0.1, + topP: 0.2, + topK: 3, + candidateCount: 4, + maxOutputTokens: 5, + stopSequences: ['a'], + responseLogprobs: true, + logprobs: 6, + presencePenalty: 0.7, + frequencyPenalty: 0.8, + seed: 9, + responseMimeType: 'application/json', + }, + }; + const ccpaReq = toCcpaRequest(genaiReq); + expect(ccpaReq.request.generationConfig).toEqual({ + temperature: 0.1, + topP: 0.2, + topK: 3, + candidateCount: 4, + maxOutputTokens: 5, + stopSequences: ['a'], + responseLogprobs: true, + logprobs: 6, + presencePenalty: 0.7, + frequencyPenalty: 0.8, + seed: 9, + responseMimeType: 'application/json', + }); + }); + }); + + describe('fromCcpaResponse', () => { + it('should convert a simple response', () => { + const ccpaRes: CcpaResponse = { + response: { + candidates: [ + { + index: 0, + content: { + role: 'model', + parts: [{ text: 'Hi there!' }], + }, + finishReason: FinishReason.STOP, + safetyRatings: [], + }, + ], + }, + }; + const genaiRes = fromCcpaResponse(ccpaRes); + expect(genaiRes).toBeInstanceOf(GenerateContentResponse); + expect(genaiRes.candidates).toEqual(ccpaRes.response.candidates); + }); + + it('should handle prompt feedback and usage metadata', () => { + const ccpaRes: CcpaResponse = { + response: { + candidates: [], + promptFeedback: { + blockReason: BlockedReason.SAFETY, + safetyRatings: [], + }, + usageMetadata: { + promptTokenCount: 10, + candidatesTokenCount: 20, + totalTokenCount: 30, + }, + }, + }; + const genaiRes = fromCcpaResponse(ccpaRes); + expect(genaiRes.promptFeedback).toEqual(ccpaRes.response.promptFeedback); + expect(genaiRes.usageMetadata).toEqual(ccpaRes.response.usageMetadata); + }); + + it('should handle automatic function calling history', () => { + const ccpaRes: CcpaResponse = { + response: { + candidates: [], + automaticFunctionCallingHistory: [ + { + role: 'model', + parts: [ + { + functionCall: { + name: 'test_function', + args: { + foo: 'bar', + }, + }, + }, + ], + }, + ], + }, + }; + const genaiRes = fromCcpaResponse(ccpaRes); + expect(genaiRes.automaticFunctionCallingHistory).toEqual( + ccpaRes.response.automaticFunctionCallingHistory, + ); + }); + }); +}); |
