genaicode 0.0.37 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/genaicode-dev.js +11 -0
- package/bin/genaicode.cjs +8 -1
- package/dist/ai-service/ai-studio.d.ts +5 -0
- package/dist/ai-service/ai-studio.js +135 -0
- package/dist/ai-service/ai-studio.js.map +1 -0
- package/dist/ai-service/anthropic.d.ts +5 -0
- package/dist/ai-service/anthropic.js +133 -0
- package/dist/ai-service/anthropic.js.map +1 -0
- package/dist/ai-service/chat-gpt.d.ts +5 -0
- package/dist/ai-service/chat-gpt.js +131 -0
- package/dist/ai-service/chat-gpt.js.map +1 -0
- package/dist/ai-service/common.d.ts +57 -0
- package/dist/ai-service/common.js +38 -0
- package/dist/ai-service/common.js.map +1 -0
- package/dist/ai-service/common.test.d.ts +1 -0
- package/dist/ai-service/common.test.js +85 -0
- package/dist/ai-service/common.test.js.map +1 -0
- package/dist/ai-service/dall-e.d.ts +14 -0
- package/dist/ai-service/dall-e.js +47 -0
- package/dist/ai-service/dall-e.js.map +1 -0
- package/dist/ai-service/vertex-ai-claude.d.ts +5 -0
- package/dist/ai-service/vertex-ai-claude.js +93 -0
- package/dist/ai-service/vertex-ai-claude.js.map +1 -0
- package/dist/ai-service/vertex-ai-imagen.d.ts +14 -0
- package/dist/ai-service/vertex-ai-imagen.js +74 -0
- package/dist/ai-service/vertex-ai-imagen.js.map +1 -0
- package/dist/ai-service/vertex-ai.d.ts +7 -0
- package/dist/ai-service/vertex-ai.js +147 -0
- package/dist/ai-service/vertex-ai.js.map +1 -0
- package/dist/cli/cli-options.d.ts +10 -0
- package/dist/cli/cli-options.js +124 -0
- package/dist/cli/cli-options.js.map +1 -0
- package/dist/cli/cli-options.test.d.ts +1 -0
- package/dist/cli/cli-options.test.js +34 -0
- package/dist/cli/cli-options.test.js.map +1 -0
- package/dist/cli/cli-params.d.ts +29 -0
- package/dist/cli/cli-params.js +103 -0
- package/dist/cli/cli-params.js.map +1 -0
- package/dist/cli/cli-params.test.d.ts +1 -0
- package/dist/cli/cli-params.test.js +38 -0
- package/dist/cli/cli-params.test.js.map +1 -0
- package/dist/cli/service-autodetect.d.ts +2 -0
- package/dist/cli/service-autodetect.js +17 -0
- package/dist/cli/service-autodetect.js.map +1 -0
- package/dist/cli/service-autodetect.test.d.ts +1 -0
- package/dist/cli/service-autodetect.test.js +38 -0
- package/dist/cli/service-autodetect.test.js.map +1 -0
- package/dist/cli/validate-cli-params.d.ts +18 -0
- package/dist/cli/validate-cli-params.js +128 -0
- package/dist/cli/validate-cli-params.js.map +1 -0
- package/dist/cli/validate-cli-params.test.d.ts +1 -0
- package/dist/cli/validate-cli-params.test.js +106 -0
- package/dist/cli/validate-cli-params.test.js.map +1 -0
- package/dist/files/file-utils.d.ts +2 -0
- package/dist/files/file-utils.js +7 -0
- package/dist/files/file-utils.js.map +1 -0
- package/dist/files/file-utils.test.d.ts +1 -0
- package/dist/files/file-utils.test.js +18 -0
- package/dist/files/file-utils.test.js.map +1 -0
- package/dist/files/find-files.d.ts +8 -0
- package/dist/files/find-files.js +76 -0
- package/dist/files/find-files.js.map +1 -0
- package/dist/files/read-files.d.ts +13 -0
- package/dist/files/read-files.js +61 -0
- package/dist/files/read-files.js.map +1 -0
- package/dist/files/read-files.test.d.ts +1 -0
- package/dist/files/read-files.test.js +89 -0
- package/dist/files/read-files.test.js.map +1 -0
- package/dist/files/temp-buffer.d.ts +2 -0
- package/dist/files/temp-buffer.js +12 -0
- package/dist/files/temp-buffer.js.map +1 -0
- package/dist/files/update-files.d.ts +5 -0
- package/dist/files/update-files.js +197 -0
- package/dist/files/update-files.js.map +1 -0
- package/dist/images/ensure-alpha.d.ts +1 -0
- package/dist/images/ensure-alpha.js +5 -0
- package/dist/images/ensure-alpha.js.map +1 -0
- package/dist/images/imgly-remove-background.d.ts +2 -0
- package/dist/images/imgly-remove-background.js +21 -0
- package/dist/images/imgly-remove-background.js.map +1 -0
- package/dist/images/resize-image.d.ts +19 -0
- package/dist/images/resize-image.js +22 -0
- package/dist/images/resize-image.js.map +1 -0
- package/dist/images/split-image.d.ts +18 -0
- package/dist/images/split-image.js +25 -0
- package/dist/images/split-image.js.map +1 -0
- package/dist/main/codegen.d.ts +2 -0
- package/dist/main/codegen.js +101 -0
- package/dist/main/codegen.js.map +1 -0
- package/dist/main/codegen.test.d.ts +2 -0
- package/dist/main/codegen.test.js +259 -0
- package/dist/main/codegen.test.js.map +1 -0
- package/dist/main/config-lib.d.ts +8 -0
- package/dist/main/config-lib.js +28 -0
- package/dist/main/config-lib.js.map +1 -0
- package/dist/main/config-lib.test.d.ts +1 -0
- package/dist/main/config-lib.test.js +64 -0
- package/dist/main/config-lib.test.js.map +1 -0
- package/dist/main/config.d.ts +5 -0
- package/{src → dist}/main/config.js +16 -22
- package/dist/main/config.js.map +1 -0
- package/dist/prompt/function-calling-validate.d.ts +3 -0
- package/dist/prompt/function-calling-validate.js +27 -0
- package/dist/prompt/function-calling-validate.js.map +1 -0
- package/dist/prompt/function-calling.d.ts +5 -0
- package/{src → dist}/prompt/function-calling.js +25 -24
- package/dist/prompt/function-calling.js.map +1 -0
- package/dist/prompt/function-defs/ask-question.d.ts +31 -0
- package/dist/prompt/function-defs/ask-question.js +32 -0
- package/dist/prompt/function-defs/ask-question.js.map +1 -0
- package/dist/prompt/function-defs/codegen-summary.d.ts +63 -0
- package/dist/prompt/function-defs/codegen-summary.js +80 -0
- package/dist/prompt/function-defs/codegen-summary.js.map +1 -0
- package/dist/prompt/function-defs/create-directory.d.ts +21 -0
- package/dist/prompt/function-defs/create-directory.js +22 -0
- package/dist/prompt/function-defs/create-directory.js.map +1 -0
- package/dist/prompt/function-defs/create-file.d.ts +25 -0
- package/dist/prompt/function-defs/create-file.js +26 -0
- package/dist/prompt/function-defs/create-file.js.map +1 -0
- package/dist/prompt/function-defs/delete-file.d.ts +21 -0
- package/dist/prompt/function-defs/delete-file.js +22 -0
- package/dist/prompt/function-defs/delete-file.js.map +1 -0
- package/dist/prompt/function-defs/download-file.d.ts +25 -0
- package/dist/prompt/function-defs/download-file.js +26 -0
- package/dist/prompt/function-defs/download-file.js.map +1 -0
- package/dist/prompt/function-defs/explanation.d.ts +17 -0
- package/dist/prompt/function-defs/explanation.js +18 -0
- package/dist/prompt/function-defs/explanation.js.map +1 -0
- package/dist/prompt/function-defs/generate-image.d.ts +48 -0
- package/dist/prompt/function-defs/generate-image.js +49 -0
- package/dist/prompt/function-defs/generate-image.js.map +1 -0
- package/dist/prompt/function-defs/get-image-assets.d.ts +20 -0
- package/dist/prompt/function-defs/get-image-assets.js +21 -0
- package/dist/prompt/function-defs/get-image-assets.js.map +1 -0
- package/dist/prompt/function-defs/get-source-code.d.ts +20 -0
- package/dist/prompt/function-defs/get-source-code.js +21 -0
- package/dist/prompt/function-defs/get-source-code.js.map +1 -0
- package/dist/prompt/function-defs/imgly-remove-background.d.ts +25 -0
- package/dist/prompt/function-defs/imgly-remove-background.js +26 -0
- package/dist/prompt/function-defs/imgly-remove-background.js.map +1 -0
- package/dist/prompt/function-defs/move-file.d.ts +25 -0
- package/dist/prompt/function-defs/move-file.js +26 -0
- package/dist/prompt/function-defs/move-file.js.map +1 -0
- package/dist/prompt/function-defs/patch-file.d.ts +25 -0
- package/dist/prompt/function-defs/patch-file.js +39 -0
- package/dist/prompt/function-defs/patch-file.js.map +1 -0
- package/dist/prompt/function-defs/resize-image.d.ts +36 -0
- package/dist/prompt/function-defs/resize-image.js +37 -0
- package/dist/prompt/function-defs/resize-image.js.map +1 -0
- package/dist/prompt/function-defs/split-image.d.ts +57 -0
- package/dist/prompt/function-defs/split-image.js +46 -0
- package/dist/prompt/function-defs/split-image.js.map +1 -0
- package/dist/prompt/function-defs/update-file.d.ts +25 -0
- package/dist/prompt/function-defs/update-file.js +26 -0
- package/dist/prompt/function-defs/update-file.js.map +1 -0
- package/dist/prompt/limits.d.ts +3 -0
- package/dist/prompt/limits.js +19 -0
- package/dist/prompt/limits.js.map +1 -0
- package/dist/prompt/limits.test.d.ts +1 -0
- package/dist/prompt/limits.test.js +35 -0
- package/dist/prompt/limits.test.js.map +1 -0
- package/dist/prompt/prompt-codegen.d.ts +4 -0
- package/dist/prompt/prompt-codegen.js +81 -0
- package/dist/prompt/prompt-codegen.js.map +1 -0
- package/dist/prompt/prompt-codegen.test.d.ts +1 -0
- package/dist/prompt/prompt-codegen.test.js +94 -0
- package/dist/prompt/prompt-codegen.test.js.map +1 -0
- package/dist/prompt/prompt-consts.d.ts +1 -0
- package/{src → dist}/prompt/prompt-consts.js +1 -0
- package/dist/prompt/prompt-consts.js.map +1 -0
- package/dist/prompt/prompt-service-ask-question.test.d.ts +3 -0
- package/dist/prompt/prompt-service-ask-question.test.js +146 -0
- package/dist/prompt/prompt-service-ask-question.test.js.map +1 -0
- package/dist/prompt/prompt-service.d.ts +13 -0
- package/dist/prompt/prompt-service.js +278 -0
- package/dist/prompt/prompt-service.js.map +1 -0
- package/dist/prompt/prompt-service.test.d.ts +1 -0
- package/dist/prompt/prompt-service.test.js +511 -0
- package/dist/prompt/prompt-service.test.js.map +1 -0
- package/dist/prompt/systemprompt.d.ts +2 -0
- package/dist/prompt/systemprompt.js +43 -0
- package/dist/prompt/systemprompt.js.map +1 -0
- package/dist/prompt/systemprompt.test.d.ts +2 -0
- package/dist/prompt/systemprompt.test.js +47 -0
- package/dist/prompt/systemprompt.test.js.map +1 -0
- package/package.json +13 -4
- package/bin/genaicode.js +0 -5
- package/src/ai-service/anthropic.js +0 -126
- package/src/ai-service/chat-gpt.js +0 -126
- package/src/ai-service/common.js +0 -49
- package/src/ai-service/common.test.js +0 -107
- package/src/ai-service/dall-e.js +0 -50
- package/src/ai-service/vertex-ai-claude.js +0 -99
- package/src/ai-service/vertex-ai-imagen.js +0 -78
- package/src/ai-service/vertex-ai.js +0 -156
- package/src/cli/cli-options.js +0 -132
- package/src/cli/cli-options.test.js +0 -50
- package/src/cli/cli-params.js +0 -114
- package/src/cli/cli-params.test.js +0 -43
- package/src/cli/service-autodetect.js +0 -11
- package/src/cli/service-autodetect.test.js +0 -43
- package/src/cli/validate-cli-params.js +0 -137
- package/src/cli/validate-cli-params.test.js +0 -134
- package/src/files/file-utils.js +0 -7
- package/src/files/file-utils.test.js +0 -21
- package/src/files/find-files.js +0 -86
- package/src/files/read-files.js +0 -65
- package/src/files/read-files.test.js +0 -103
- package/src/files/temp-buffer.js +0 -13
- package/src/files/update-files.js +0 -205
- package/src/images/ensure-alpha.js +0 -5
- package/src/images/imgly-remove-background.js +0 -23
- package/src/images/resize-image.js +0 -23
- package/src/images/split-image.js +0 -26
- package/src/main/codegen.js +0 -120
- package/src/main/codegen.test.js +0 -335
- package/src/main/config-lib.js +0 -33
- package/src/main/config-lib.test.js +0 -80
- package/src/prompt/function-calling-validate.js +0 -25
- package/src/prompt/function-defs/ask-question.js +0 -33
- package/src/prompt/function-defs/codegen-summary.js +0 -87
- package/src/prompt/function-defs/create-directory.js +0 -21
- package/src/prompt/function-defs/create-file.js +0 -26
- package/src/prompt/function-defs/delete-file.js +0 -21
- package/src/prompt/function-defs/download-file.js +0 -25
- package/src/prompt/function-defs/explanation.js +0 -17
- package/src/prompt/function-defs/generate-image.js +0 -51
- package/src/prompt/function-defs/get-image-assets.js +0 -21
- package/src/prompt/function-defs/get-source-code.js +0 -21
- package/src/prompt/function-defs/imgly-remove-background.js +0 -25
- package/src/prompt/function-defs/move-file.js +0 -25
- package/src/prompt/function-defs/patch-file.js +0 -39
- package/src/prompt/function-defs/resize-image.js +0 -36
- package/src/prompt/function-defs/split-image.js +0 -45
- package/src/prompt/function-defs/update-file.js +0 -26
- package/src/prompt/limits.js +0 -23
- package/src/prompt/limits.test.js +0 -40
- package/src/prompt/prompt-codegen.js +0 -106
- package/src/prompt/prompt-codegen.test.js +0 -116
- package/src/prompt/prompt-service-ask-question.test.js +0 -163
- package/src/prompt/prompt-service.js +0 -335
- package/src/prompt/prompt-service.test.js +0 -602
- package/src/prompt/systemprompt.js +0 -39
- package/src/prompt/systemprompt.test.js +0 -64
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import mime from 'mime-types';
|
|
3
|
-
import { PredictionServiceClient, helpers } from '@google-cloud/aiplatform';
|
|
4
|
-
import { setTempBuffer } from '../files/temp-buffer.js';
|
|
5
|
-
import { resizeImageBuffer } from '../images/resize-image.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Generate an image using Vertex AI's Imagen model and return the image URL
|
|
9
|
-
* @param {string} prompt - The description of the image to generate
|
|
10
|
-
* @param {string|undefined} contextImagePath - The image to be used as a context
|
|
11
|
-
* @param {{width: number, height: number}} size - The size of the image to generate
|
|
12
|
-
* @param {boolean} cheap - Whether to use a cheaper model
|
|
13
|
-
* @returns {Promise<string>} - The url of the generated image
|
|
14
|
-
*/
|
|
15
|
-
export async function generateImage(prompt, contextImagePath, size, cheap = false) {
|
|
16
|
-
// Initialize the PredictionServiceClient
|
|
17
|
-
const client = new PredictionServiceClient({
|
|
18
|
-
apiEndpoint: `${process.env.GOOGLE_CLOUD_REGION}-aiplatform.googleapis.com`,
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
// Set the project and location
|
|
22
|
-
const projectId = process.env.GOOGLE_CLOUD_PROJECT;
|
|
23
|
-
const location = process.env.GOOGLE_CLOUD_REGION;
|
|
24
|
-
|
|
25
|
-
// Set the model name based on the cheap parameter
|
|
26
|
-
const modelName = contextImagePath
|
|
27
|
-
? 'imagegeneration@002'
|
|
28
|
-
: cheap
|
|
29
|
-
? 'imagen-3.0-fast-generate-001'
|
|
30
|
-
: 'imagen-3.0-generate-001';
|
|
31
|
-
console.log(`Using Vertex AI Imagen model: ${modelName}`);
|
|
32
|
-
|
|
33
|
-
try {
|
|
34
|
-
// Prepare the request
|
|
35
|
-
const request = {
|
|
36
|
-
endpoint: `projects/${projectId}/locations/${location}/publishers/google/models/${modelName}`,
|
|
37
|
-
instances: [
|
|
38
|
-
helpers.toValue({
|
|
39
|
-
prompt: prompt,
|
|
40
|
-
...(contextImagePath
|
|
41
|
-
? {
|
|
42
|
-
image: {
|
|
43
|
-
bytesBase64Encoded: fs.readFileSync(contextImagePath, 'base64'),
|
|
44
|
-
mediaType: mime.lookup(contextImagePath),
|
|
45
|
-
},
|
|
46
|
-
}
|
|
47
|
-
: {}),
|
|
48
|
-
}),
|
|
49
|
-
],
|
|
50
|
-
parameters: helpers.toValue({
|
|
51
|
-
sampleCount: 1,
|
|
52
|
-
safetySetting: 'block_most',
|
|
53
|
-
personGeneration: 'allow_adult',
|
|
54
|
-
includeRaiReason: true,
|
|
55
|
-
language: 'auto',
|
|
56
|
-
aspectRatio: '1:1',
|
|
57
|
-
addWatermark: false,
|
|
58
|
-
}),
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
// Make the prediction request
|
|
62
|
-
const [response] = await client.predict(request);
|
|
63
|
-
|
|
64
|
-
if (response.predictions && response.predictions.length > 0) {
|
|
65
|
-
const prediction = helpers.fromValue(response.predictions[0]);
|
|
66
|
-
if (prediction.bytesBase64Encoded) {
|
|
67
|
-
console.log(`Image generated successfully, resizing to desired dimension`, size);
|
|
68
|
-
const buffer = Buffer.from(prediction.bytesBase64Encoded, 'base64');
|
|
69
|
-
return setTempBuffer(await resizeImageBuffer(buffer, size));
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
throw new Error('No image generated in the response');
|
|
74
|
-
} catch (error) {
|
|
75
|
-
console.error('Error generating image:', error);
|
|
76
|
-
throw error;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert';
|
|
2
|
-
import { VertexAI } from '@google-cloud/vertexai';
|
|
3
|
-
import { printTokenUsageAndCost, processFunctionCalls } from './common.js';
|
|
4
|
-
import { geminiBlockNone } from '../cli/cli-params.js';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* This function generates content using the Gemini Pro model.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
export async function generateContent(prompt, functionDefs, requiredFunctionName, temperature, cheap = false) {
|
|
11
|
-
const messages = prompt
|
|
12
|
-
.filter((item) => item.type !== 'systemPrompt')
|
|
13
|
-
.map((item) => {
|
|
14
|
-
if (item.type === 'user') {
|
|
15
|
-
return {
|
|
16
|
-
role: 'user',
|
|
17
|
-
parts: [
|
|
18
|
-
...(item.functionResponses ?? []).map((response) => ({
|
|
19
|
-
functionResponse: {
|
|
20
|
-
name: response.name,
|
|
21
|
-
response: { name: response.name, content: response.content },
|
|
22
|
-
},
|
|
23
|
-
})),
|
|
24
|
-
...(item.images ?? []).map((image) => ({
|
|
25
|
-
inlineData: {
|
|
26
|
-
mimeType: image.mediaType,
|
|
27
|
-
data: image.base64url,
|
|
28
|
-
},
|
|
29
|
-
})),
|
|
30
|
-
{ text: item.text },
|
|
31
|
-
],
|
|
32
|
-
};
|
|
33
|
-
} else if (item.type === 'assistant') {
|
|
34
|
-
return {
|
|
35
|
-
role: 'model',
|
|
36
|
-
parts: [
|
|
37
|
-
...(item.text ? [{ text: item.text }] : []),
|
|
38
|
-
...item.functionCalls.map((call) => ({
|
|
39
|
-
functionCall: {
|
|
40
|
-
name: call.name,
|
|
41
|
-
args: call.args ?? {},
|
|
42
|
-
},
|
|
43
|
-
})),
|
|
44
|
-
],
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
const req = {
|
|
50
|
-
contents: messages,
|
|
51
|
-
tools: [
|
|
52
|
-
{
|
|
53
|
-
functionDeclarations: functionDefs,
|
|
54
|
-
},
|
|
55
|
-
],
|
|
56
|
-
toolConfig: {
|
|
57
|
-
functionCallingConfig: {
|
|
58
|
-
mode: cheap ? undefined : 'ANY',
|
|
59
|
-
...(!cheap && requiredFunctionName ? { allowedFunctionNames: [requiredFunctionName] } : {}),
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
const model = await getGenModel(prompt.find((item) => item.type === 'systemPrompt').systemPrompt, temperature, cheap);
|
|
65
|
-
|
|
66
|
-
assert(await verifyVertexMonkeyPatch(), 'Vertex AI Tool Config was not monkey patched');
|
|
67
|
-
|
|
68
|
-
const result = await model.generateContent(req);
|
|
69
|
-
|
|
70
|
-
// Print token usage
|
|
71
|
-
const usageMetadata = result.response.usageMetadata;
|
|
72
|
-
const usage = {
|
|
73
|
-
inputTokens: usageMetadata.promptTokenCount,
|
|
74
|
-
outputTokens: usageMetadata.candidatesTokenCount,
|
|
75
|
-
totalTokens: usageMetadata.totalTokenCount,
|
|
76
|
-
};
|
|
77
|
-
printTokenUsageAndCost(usage, 0.000125 / 1000, 0.000375 / 1000);
|
|
78
|
-
|
|
79
|
-
if (result.response.promptFeedback) {
|
|
80
|
-
console.log('Prompt feedback:');
|
|
81
|
-
console.log(JSON.stringify(result.response.promptFeedback, null, 2));
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (!result.response.candidates?.length > 0) {
|
|
85
|
-
console.log('Response:', result);
|
|
86
|
-
throw new Error('No candidates found');
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
const functionCalls = result.response.candidates
|
|
90
|
-
.map((candidate) => candidate.content.parts?.map((part) => part.functionCall))
|
|
91
|
-
.flat()
|
|
92
|
-
.filter((functionCall) => !!functionCall);
|
|
93
|
-
|
|
94
|
-
if (functionCalls.length === 0) {
|
|
95
|
-
const textResponse = result.response.candidates
|
|
96
|
-
.map((candidate) => candidate.content.parts?.map((part) => part.text))
|
|
97
|
-
.flat()
|
|
98
|
-
.filter((text) => !!text)
|
|
99
|
-
.join('\n');
|
|
100
|
-
console.log('No function calls, output text response if it exists:', textResponse);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return processFunctionCalls(functionCalls);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// A function to get the generative model
|
|
107
|
-
// Modified to accept temperature parameter and cheap flag
|
|
108
|
-
export function getGenModel(systemPrompt, temperature, cheap = false) {
|
|
109
|
-
// Initialize Vertex with your Cloud project and location
|
|
110
|
-
const vertex_ai = new VertexAI({});
|
|
111
|
-
const model = cheap ? 'gemini-1.5-flash-001' : 'gemini-1.5-pro-001';
|
|
112
|
-
|
|
113
|
-
console.log(`Using Vertex AI model: ${model}`);
|
|
114
|
-
|
|
115
|
-
// Instantiate the models
|
|
116
|
-
return vertex_ai.preview.getGenerativeModel({
|
|
117
|
-
model: model,
|
|
118
|
-
generationConfig: {
|
|
119
|
-
maxOutputTokens: 8192,
|
|
120
|
-
temperature: temperature,
|
|
121
|
-
topP: 0.95,
|
|
122
|
-
},
|
|
123
|
-
safetySettings: [
|
|
124
|
-
{
|
|
125
|
-
category: 'HARM_CATEGORY_HATE_SPEECH',
|
|
126
|
-
threshold: geminiBlockNone ? 'BLOCK_NONE' : 'BLOCK_LOW_AND_ABOVE',
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
category: 'HARM_CATEGORY_DANGEROUS_CONTENT',
|
|
130
|
-
threshold: geminiBlockNone ? 'BLOCK_NONE' : 'BLOCK_LOW_AND_ABOVE',
|
|
131
|
-
},
|
|
132
|
-
{
|
|
133
|
-
category: 'HARM_CATEGORY_SEXUALLY_EXPLICIT',
|
|
134
|
-
threshold: geminiBlockNone ? 'BLOCK_NONE' : 'BLOCK_LOW_AND_ABOVE',
|
|
135
|
-
},
|
|
136
|
-
{
|
|
137
|
-
category: 'HARM_CATEGORY_HARASSMENT',
|
|
138
|
-
threshold: geminiBlockNone ? 'BLOCK_NONE' : 'BLOCK_LOW_AND_ABOVE',
|
|
139
|
-
},
|
|
140
|
-
],
|
|
141
|
-
systemInstruction: {
|
|
142
|
-
role: 'system',
|
|
143
|
-
parts: [
|
|
144
|
-
{
|
|
145
|
-
text: systemPrompt,
|
|
146
|
-
},
|
|
147
|
-
],
|
|
148
|
-
},
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export async function verifyVertexMonkeyPatch() {
|
|
153
|
-
return (await import('@google-cloud/vertexai/build/src/functions/generate_content.js')).generateContent
|
|
154
|
-
.toString()
|
|
155
|
-
.includes('// MONKEY PATCH TOOL_CONFIG');
|
|
156
|
-
}
|
package/src/cli/cli-options.js
DELETED
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
// CLI options and their descriptions
|
|
2
|
-
const cliOptions = [
|
|
3
|
-
{
|
|
4
|
-
name: '--help',
|
|
5
|
-
description: 'Display this help message.',
|
|
6
|
-
},
|
|
7
|
-
{
|
|
8
|
-
name: '--dry-run',
|
|
9
|
-
description: 'Run the codegen script without updating the source code.',
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
name: '--consider-all-files',
|
|
13
|
-
description: "Consider all files for code generation, even if they don't contain the @" + 'CODEGEN comments.',
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
name: '--allow-file-create',
|
|
17
|
-
description: 'Allow the codegen script to create new files.',
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
name: '--allow-file-delete',
|
|
21
|
-
description: 'Allow the codegen script to delete files.',
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
name: '--allow-directory-create',
|
|
25
|
-
description: 'Allow codegen script to create directories.',
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
name: '--allow-file-move',
|
|
29
|
-
description: 'Allow the codegen script to move files.',
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
name: '--chat-gpt',
|
|
33
|
-
description: "Use the OpenAI model for code generation instead of Vertex AI with Google's Gemini Pro model.",
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
name: '--anthropic',
|
|
37
|
-
description: "Use Anthropic's Claude model for code generation.",
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
name: '--vertex-ai',
|
|
41
|
-
description:
|
|
42
|
-
"Use Vertex AI with Google's Gemini Pro model for code generation (default if no AI model is specified).",
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
name: '--vertex-ai-claude',
|
|
46
|
-
description: 'Use Claude via Vertex AI for code generation.',
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
name: '--explicit-prompt=<prompt>',
|
|
50
|
-
description: 'An explicit prompt to use for code generation.',
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
name: '--task-file=<file>',
|
|
54
|
-
description: 'Specifies a file with a task description for code generation.',
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
name: '--dependency-tree',
|
|
58
|
-
description: 'Limit the scope of codegen only to files marked with @' + 'CODEGEN and their dependencies.',
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
name: '--verbose-prompt',
|
|
62
|
-
description: 'Print the prompt used for code generation.',
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
name: '--require-explanations',
|
|
66
|
-
description: 'Require explanations for all code generation operations.',
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
name: '--disable-context-optimization',
|
|
70
|
-
description: 'Disable the optimization that uses context paths for more efficient code generation.',
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
name: '--gemini-block-none',
|
|
74
|
-
description: 'Disable safety settings for Gemini Pro model (requires whitelisted Cloud project).',
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
name: '--disable-initial-lint',
|
|
78
|
-
description: 'Skip the initial lint check before running the code generation process.',
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
name: '--temperature=<value>',
|
|
82
|
-
description: 'Set the temperature parameter for the AI model (default: 0.7).',
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
name: '--vision',
|
|
86
|
-
description:
|
|
87
|
-
'Enable vision capabilities for processing image inputs. This option allows the tool to analyze and generate code based on image content when used with compatible AI models.',
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
name: '--imagen=<service>',
|
|
91
|
-
description:
|
|
92
|
-
'Enable image generation functionality and specify the service to use (either "vertex-ai" or "dall-e").',
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
name: '--cheap',
|
|
96
|
-
description: 'Switch to cheaper models in AI services for content and image generation.',
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
name: '--content-mask=<path>',
|
|
100
|
-
description:
|
|
101
|
-
'Apply a content mask to limit the initial source code files included in the request. The value should be a prefix of the path relative to rootDir.',
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
name: '--ignore-pattern=<pattern>',
|
|
105
|
-
description: 'Specify a pattern of files to ignore during the initial source code fetching.',
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
name: '--disable-cache',
|
|
109
|
-
description: 'Disable caching for the application.',
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
name: '--ask-question',
|
|
113
|
-
description: 'Allows the AI assistant to ask questions for clarification during the code generation process.',
|
|
114
|
-
},
|
|
115
|
-
];
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Print the help message with all available CLI options
|
|
119
|
-
*/
|
|
120
|
-
export function printHelpMessage() {
|
|
121
|
-
console.log('GenAIcode - AI-powered code generation tool');
|
|
122
|
-
console.log('\nUsage: npx genaicode [options]');
|
|
123
|
-
console.log('\nOptions:');
|
|
124
|
-
|
|
125
|
-
cliOptions.forEach((option) => {
|
|
126
|
-
console.log(` ${option.name.padEnd(30)} ${option.description}`);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
console.log('\nFor more information, please refer to the project home page: https://github.com/gtanczyk/genaicode/');
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
export { cliOptions };
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { printHelpMessage, cliOptions } from './cli-options.js';
|
|
3
|
-
|
|
4
|
-
describe('CLI Options', () => {
|
|
5
|
-
describe('printHelpMessage', () => {
|
|
6
|
-
it('should print the help message with all CLI options', () => {
|
|
7
|
-
const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
8
|
-
|
|
9
|
-
printHelpMessage();
|
|
10
|
-
|
|
11
|
-
expect(consoleSpy).toHaveBeenCalledWith('GenAIcode - AI-powered code generation tool');
|
|
12
|
-
expect(consoleSpy).toHaveBeenCalledWith('\nUsage: npx genaicode [options]');
|
|
13
|
-
expect(consoleSpy).toHaveBeenCalledWith('\nOptions:');
|
|
14
|
-
|
|
15
|
-
cliOptions.forEach((option) => {
|
|
16
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining(option.name));
|
|
17
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining(option.description));
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('For more information'));
|
|
21
|
-
|
|
22
|
-
consoleSpy.mockRestore();
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('should include the --imagen option in the help message', () => {
|
|
26
|
-
const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
27
|
-
|
|
28
|
-
printHelpMessage();
|
|
29
|
-
|
|
30
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('--imagen=<service>'));
|
|
31
|
-
expect(consoleSpy).toHaveBeenCalledWith(
|
|
32
|
-
expect.stringContaining(
|
|
33
|
-
'Enable image generation functionality and specify the service to use (either "vertex-ai" or "dall-e").',
|
|
34
|
-
),
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
consoleSpy.mockRestore();
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
describe('cliOptions', () => {
|
|
42
|
-
it('should include the --imagen option', () => {
|
|
43
|
-
const imagenOption = cliOptions.find((option) => option.name === '--imagen=<service>');
|
|
44
|
-
expect(imagenOption).toBeDefined();
|
|
45
|
-
expect(imagenOption.description).toBe(
|
|
46
|
-
'Enable image generation functionality and specify the service to use (either "vertex-ai" or "dall-e").',
|
|
47
|
-
);
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
});
|
package/src/cli/cli-params.js
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { serviceAutoDetect } from './service-autodetect.js';
|
|
4
|
-
import { rcConfig } from '../main/config.js';
|
|
5
|
-
|
|
6
|
-
const params = process.argv.slice(2);
|
|
7
|
-
|
|
8
|
-
export const dryRun = params.includes('--dry-run');
|
|
9
|
-
export const considerAllFiles = params.includes('--consider-all-files');
|
|
10
|
-
export const allowFileCreate = params.includes('--allow-file-create');
|
|
11
|
-
export const allowFileDelete = params.includes('--allow-file-delete');
|
|
12
|
-
export const allowDirectoryCreate = params.includes('--allow-directory-create');
|
|
13
|
-
export const allowFileMove = params.includes('--allow-file-move');
|
|
14
|
-
export let chatGpt = params.includes('--chat-gpt');
|
|
15
|
-
export let anthropic = params.includes('--anthropic');
|
|
16
|
-
export let vertexAi = params.includes('--vertex-ai');
|
|
17
|
-
export let vertexAiClaude = params.includes('--vertex-ai-claude');
|
|
18
|
-
export const dependencyTree = params.includes('--dependency-tree');
|
|
19
|
-
export const verbosePrompt = params.includes('--verbose-prompt');
|
|
20
|
-
export const disableCache = params.includes('--disable-cache');
|
|
21
|
-
export let explicitPrompt = params.find((param) => param.startsWith('--explicit-prompt'))?.split('=')[1];
|
|
22
|
-
export const disableContextOptimization = params.includes('--disable-context-optimization');
|
|
23
|
-
export let taskFile = params.find((param) => param.startsWith('--task-file'))?.split('=')[1];
|
|
24
|
-
export const requireExplanations = params.includes('--require-explanations');
|
|
25
|
-
export const geminiBlockNone = params.includes('--gemini-block-none');
|
|
26
|
-
export const disableInitialLint = params.includes('--disable-initial-lint');
|
|
27
|
-
export const vision = params.includes('--vision');
|
|
28
|
-
export const imagen = params.find((param) => param.startsWith('--imagen'))?.split('=')[1];
|
|
29
|
-
export const cheap = params.includes('--cheap');
|
|
30
|
-
export const askQuestion = params.includes('--ask-question');
|
|
31
|
-
|
|
32
|
-
// Add support for --help option
|
|
33
|
-
export const helpRequested = params.includes('--help');
|
|
34
|
-
|
|
35
|
-
// Export the lintCommand from rcConfig
|
|
36
|
-
export const lintCommand = rcConfig.lintCommand || null;
|
|
37
|
-
|
|
38
|
-
// Temperature parameter
|
|
39
|
-
export const temperature = parseFloat(
|
|
40
|
-
params.find((param) => param.startsWith('--temperature='))?.split('=')[1] || '0.7',
|
|
41
|
-
); // Default temperature value: 0.7
|
|
42
|
-
|
|
43
|
-
// New content mask parameter
|
|
44
|
-
export const contentMask = params.find((param) => param.startsWith('--content-mask='))?.split('=')[1] || null;
|
|
45
|
-
|
|
46
|
-
// New ignore pattern parameter
|
|
47
|
-
export const ignorePatterns = params
|
|
48
|
-
.filter((param) => param.startsWith('--ignore-pattern='))
|
|
49
|
-
.map((param) => param.split('=')[1]);
|
|
50
|
-
|
|
51
|
-
if (taskFile) {
|
|
52
|
-
if (explicitPrompt) {
|
|
53
|
-
throw new Error('The --task-file option is exclusive with the --explicit-prompt option');
|
|
54
|
-
}
|
|
55
|
-
if (!fs.existsSync(taskFile)) {
|
|
56
|
-
throw new Error(`The task file ${taskFile} does not exist`);
|
|
57
|
-
}
|
|
58
|
-
if (!path.isAbsolute(taskFile)) {
|
|
59
|
-
taskFile = path.join(process.cwd(), taskFile);
|
|
60
|
-
}
|
|
61
|
-
explicitPrompt = `I want you to perform a coding task. The task is described in the ${taskFile} file. Use those instructions.`;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (considerAllFiles && dependencyTree) {
|
|
65
|
-
throw new Error('--consider-all-files and --dependency-tree are exclusive.');
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if ([chatGpt, anthropic, vertexAi, vertexAiClaude].filter(Boolean).length > 1) {
|
|
69
|
-
throw new Error('--chat-gpt, --anthropic, --vertex-ai, and --vertex-ai-claude are mutually exclusive.');
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (!chatGpt && !anthropic && !vertexAi && !vertexAiClaude && !helpRequested) {
|
|
73
|
-
const detected = serviceAutoDetect();
|
|
74
|
-
if (detected === 'anthropic') {
|
|
75
|
-
console.log('Autodetected --anthropic');
|
|
76
|
-
anthropic = true;
|
|
77
|
-
} else if (detected === 'chat-gpt') {
|
|
78
|
-
console.log('Autodetected --chat-gpt');
|
|
79
|
-
chatGpt = true;
|
|
80
|
-
} else if (detected === 'vertex-ai') {
|
|
81
|
-
console.log('Autodetected --vertex-ai');
|
|
82
|
-
vertexAi = true;
|
|
83
|
-
} else {
|
|
84
|
-
throw new Error('Missing --chat-gpt, --anthropic, --vertex-ai, or --vertex-ai-claude');
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if (lintCommand) {
|
|
89
|
-
console.log(`Lint command detected: ${lintCommand}`);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
if (temperature) {
|
|
93
|
-
console.log(`Temperature value: ${temperature}`);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if (imagen) {
|
|
97
|
-
console.log('Image generation functionality enabled');
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
if (cheap) {
|
|
101
|
-
console.log('Cheaper AI models will be used for content and image generation');
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (contentMask) {
|
|
105
|
-
console.log(`Content mask: ${contentMask}`);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (ignorePatterns) {
|
|
109
|
-
console.log(`Ignore pattern: ${ignorePatterns}`);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (askQuestion) {
|
|
113
|
-
console.log('Assistant can ask questions to the user');
|
|
114
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
-
import { serviceAutoDetect } from './service-autodetect';
|
|
3
|
-
|
|
4
|
-
describe('serviceAutoDetect', () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
// Clean up environment variables after each test
|
|
7
|
-
delete process.env.ANTHROPIC_API_KEY;
|
|
8
|
-
delete process.env.OPENAI_API_KEY;
|
|
9
|
-
delete process.env.GOOGLE_CLOUD_PROJECT;
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
it('should return "anthropic" when ANTHROPIC_API_KEY is set', () => {
|
|
13
|
-
process.env.ANTHROPIC_API_KEY = 'test-key';
|
|
14
|
-
expect(serviceAutoDetect()).toBe('anthropic');
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it('should return "chat-gpt" when OPENAI_API_KEY is set', () => {
|
|
18
|
-
process.env.OPENAI_API_KEY = 'test-key';
|
|
19
|
-
expect(serviceAutoDetect()).toBe('chat-gpt');
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it('should return "vertex-ai" when GOOGLE_CLOUD_PROJECT is set', () => {
|
|
23
|
-
process.env.GOOGLE_CLOUD_PROJECT = 'test-project';
|
|
24
|
-
expect(serviceAutoDetect()).toBe('vertex-ai');
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should return null when no service is configured', () => {
|
|
28
|
-
expect(serviceAutoDetect()).toBeNull();
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('should prioritize anthropic over other services', () => {
|
|
32
|
-
process.env.ANTHROPIC_API_KEY = 'test-key';
|
|
33
|
-
process.env.OPENAI_API_KEY = 'test-key';
|
|
34
|
-
process.env.GOOGLE_CLOUD_PROJECT = 'test-project';
|
|
35
|
-
expect(serviceAutoDetect()).toBe('anthropic');
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('should prioritize chat-gpt over vertex-ai', () => {
|
|
39
|
-
process.env.OPENAI_API_KEY = 'test-key';
|
|
40
|
-
process.env.GOOGLE_CLOUD_PROJECT = 'test-project';
|
|
41
|
-
expect(serviceAutoDetect()).toBe('chat-gpt');
|
|
42
|
-
});
|
|
43
|
-
});
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/** Detects if one of ai services is configured */
|
|
2
|
-
export function serviceAutoDetect() {
|
|
3
|
-
if (process.env.ANTHROPIC_API_KEY) {
|
|
4
|
-
return 'anthropic';
|
|
5
|
-
} else if (process.env.OPENAI_API_KEY) {
|
|
6
|
-
return 'chat-gpt';
|
|
7
|
-
} else if (process.env.GOOGLE_CLOUD_PROJECT) {
|
|
8
|
-
return 'vertex-ai';
|
|
9
|
-
}
|
|
10
|
-
return null;
|
|
11
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
-
import { serviceAutoDetect } from './service-autodetect';
|
|
3
|
-
|
|
4
|
-
describe('serviceAutoDetect', () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
// Clean up environment variables after each test
|
|
7
|
-
delete process.env.ANTHROPIC_API_KEY;
|
|
8
|
-
delete process.env.OPENAI_API_KEY;
|
|
9
|
-
delete process.env.GOOGLE_CLOUD_PROJECT;
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
it('should return "anthropic" when ANTHROPIC_API_KEY is set', () => {
|
|
13
|
-
process.env.ANTHROPIC_API_KEY = 'test-key';
|
|
14
|
-
expect(serviceAutoDetect()).toBe('anthropic');
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it('should return "chat-gpt" when OPENAI_API_KEY is set', () => {
|
|
18
|
-
process.env.OPENAI_API_KEY = 'test-key';
|
|
19
|
-
expect(serviceAutoDetect()).toBe('chat-gpt');
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it('should return "vertex-ai" when GOOGLE_CLOUD_PROJECT is set', () => {
|
|
23
|
-
process.env.GOOGLE_CLOUD_PROJECT = 'test-project';
|
|
24
|
-
expect(serviceAutoDetect()).toBe('vertex-ai');
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should return null when no service is configured', () => {
|
|
28
|
-
expect(serviceAutoDetect()).toBeNull();
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('should prioritize anthropic over other services', () => {
|
|
32
|
-
process.env.ANTHROPIC_API_KEY = 'test-key';
|
|
33
|
-
process.env.OPENAI_API_KEY = 'test-key';
|
|
34
|
-
process.env.GOOGLE_CLOUD_PROJECT = 'test-project';
|
|
35
|
-
expect(serviceAutoDetect()).toBe('anthropic');
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('should prioritize chat-gpt over vertex-ai', () => {
|
|
39
|
-
process.env.OPENAI_API_KEY = 'test-key';
|
|
40
|
-
process.env.GOOGLE_CLOUD_PROJECT = 'test-project';
|
|
41
|
-
expect(serviceAutoDetect()).toBe('chat-gpt');
|
|
42
|
-
});
|
|
43
|
-
});
|