summaryrefslogtreecommitdiff
path: root/packages/core/src/code_assist/converter.test.ts
diff options
context:
space:
mode:
authorTommaso Sciortino <[email protected]>2025-06-12 09:33:49 -0700
committerGitHub <[email protected]>2025-06-12 09:33:49 -0700
commit47ce39c46fa95e04442affa004a8a1dc69764c83 (patch)
treee3c8a183319c3887c0d4c2a1274e1823ebdf7ea3 /packages/core/src/code_assist/converter.test.ts
parentf2ab6d08c4cd0ca9a5b3900a6bb66a083c0577ee (diff)
Convert CCPA requests to proper format (#981)
CCPA uses a different format than GenAi. This adds conversion code to get it to the right format. Note that this doesn't work against the current ccpa staging server, The changes it needs are in cl/770266927
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,
+ );
+ });
+ });
+});