summaryrefslogtreecommitdiff
path: root/packages/core/src/code_assist/converter.test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/core/src/code_assist/converter.test.ts')
-rw-r--r--packages/core/src/code_assist/converter.test.ts222
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,
+ );
+ });
+ });
+});