mycontext-cli 2.0.38 → 3.0.0
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/README.md +53 -266
- package/dist/cli.js +15 -202
- package/dist/cli.js.map +1 -1
- package/dist/clients/XAIClient.d.ts.map +1 -1
- package/dist/clients/XAIClient.js +6 -2
- package/dist/clients/XAIClient.js.map +1 -1
- package/dist/commands/analyze-screenshot.d.ts +8 -0
- package/dist/commands/analyze-screenshot.d.ts.map +1 -0
- package/dist/commands/analyze-screenshot.js +101 -0
- package/dist/commands/analyze-screenshot.js.map +1 -0
- package/dist/commands/analyze.d.ts +5 -0
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +59 -0
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/generate-actions.d.ts +23 -0
- package/dist/commands/generate-actions.d.ts.map +1 -0
- package/dist/commands/generate-actions.js +342 -0
- package/dist/commands/generate-actions.js.map +1 -0
- package/dist/commands/generate-components-manifest.d.ts +25 -0
- package/dist/commands/generate-components-manifest.d.ts.map +1 -0
- package/dist/commands/generate-components-manifest.js +288 -0
- package/dist/commands/generate-components-manifest.js.map +1 -0
- package/dist/commands/generate-screens-list.d.ts +23 -0
- package/dist/commands/generate-screens-list.d.ts.map +1 -0
- package/dist/commands/generate-screens-list.js +282 -0
- package/dist/commands/generate-screens-list.js.map +1 -0
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +5 -1
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +26 -70
- package/dist/commands/init.js.map +1 -1
- package/dist/package.json +4 -2
- package/dist/services/gemini-vision.d.ts +57 -0
- package/dist/services/gemini-vision.d.ts.map +1 -0
- package/dist/services/gemini-vision.js +282 -0
- package/dist/services/gemini-vision.js.map +1 -0
- package/dist/utils/geminiClient.d.ts +21 -24
- package/dist/utils/geminiClient.d.ts.map +1 -1
- package/dist/utils/geminiClient.js +211 -162
- package/dist/utils/geminiClient.js.map +1 -1
- package/dist/utils/hybridAIClient.d.ts +1 -1
- package/dist/utils/hybridAIClient.d.ts.map +1 -1
- package/dist/utils/hybridAIClient.js +40 -23
- package/dist/utils/hybridAIClient.js.map +1 -1
- package/dist/utils/visionUtils.d.ts +19 -0
- package/dist/utils/visionUtils.d.ts.map +1 -0
- package/dist/utils/visionUtils.js +86 -0
- package/dist/utils/visionUtils.js.map +1 -0
- package/package.json +4 -2
|
@@ -11,6 +11,7 @@ export interface GeminiGenerationConfig {
|
|
|
11
11
|
}
|
|
12
12
|
export interface GeminiResponse {
|
|
13
13
|
content: string;
|
|
14
|
+
text?: string;
|
|
14
15
|
model: string;
|
|
15
16
|
finishReason?: string;
|
|
16
17
|
usage?: {
|
|
@@ -29,17 +30,21 @@ export interface GeminiVisualResponse {
|
|
|
29
30
|
};
|
|
30
31
|
}
|
|
31
32
|
/**
|
|
32
|
-
* Gemini API Client
|
|
33
|
-
* Supports
|
|
33
|
+
* Gemini API Client using official Google Generative AI SDK
|
|
34
|
+
* Supports text generation, multimodal interaction, and visual generation
|
|
34
35
|
*/
|
|
35
36
|
export declare class GeminiClient {
|
|
36
37
|
private apiKey?;
|
|
37
|
-
private
|
|
38
|
-
private client;
|
|
38
|
+
private genAI?;
|
|
39
39
|
private model;
|
|
40
|
+
private readonly MODELS;
|
|
40
41
|
constructor();
|
|
41
42
|
/**
|
|
42
|
-
*
|
|
43
|
+
* Initialize SDK client
|
|
44
|
+
*/
|
|
45
|
+
private initializeClient;
|
|
46
|
+
/**
|
|
47
|
+
* Get Gemini API key from environment
|
|
43
48
|
*/
|
|
44
49
|
private getApiKey;
|
|
45
50
|
/**
|
|
@@ -47,12 +52,15 @@ export declare class GeminiClient {
|
|
|
47
52
|
*/
|
|
48
53
|
hasApiKey(): boolean;
|
|
49
54
|
/**
|
|
50
|
-
* Generate text completion using Gemini
|
|
55
|
+
* Generate text completion using Gemini with fallback
|
|
56
|
+
*/
|
|
57
|
+
generateText(input: GeminiMessage[] | string, config?: GeminiGenerationConfig): Promise<GeminiResponse>;
|
|
58
|
+
/**
|
|
59
|
+
* Convert simplified messages to SDK Content format
|
|
51
60
|
*/
|
|
52
|
-
|
|
61
|
+
private convertMessagesToContent;
|
|
53
62
|
/**
|
|
54
63
|
* Generate visual screen (HTML + optional screenshot) using Gemini + nanobanana
|
|
55
|
-
* This uses Gemini's multimodal capabilities to generate HTML
|
|
56
64
|
*/
|
|
57
65
|
generateVisualScreen(prompt: string, context?: {
|
|
58
66
|
prd?: string;
|
|
@@ -62,31 +70,20 @@ export declare class GeminiClient {
|
|
|
62
70
|
}, config?: GeminiGenerationConfig & {
|
|
63
71
|
includeScreenshot?: boolean;
|
|
64
72
|
}): Promise<GeminiVisualResponse>;
|
|
65
|
-
/**
|
|
66
|
-
* Build comprehensive prompt for visual screen generation
|
|
67
|
-
*/
|
|
68
73
|
private buildVisualPrompt;
|
|
69
|
-
/**
|
|
70
|
-
* Extract HTML from Gemini response (handles markdown code blocks)
|
|
71
|
-
*/
|
|
72
74
|
private extractHtml;
|
|
73
|
-
/**
|
|
74
|
-
* Generate screenshot from HTML using nanobanana-style approach
|
|
75
|
-
* For now, this is a placeholder - actual implementation would use puppeteer/playwright
|
|
76
|
-
* or a headless browser API
|
|
77
|
-
*/
|
|
78
75
|
private generateScreenshot;
|
|
79
|
-
/**
|
|
80
|
-
* Convert messages to Gemini API format
|
|
81
|
-
*/
|
|
82
|
-
private convertMessages;
|
|
83
76
|
/**
|
|
84
77
|
* Test Gemini API connection
|
|
85
78
|
*/
|
|
86
79
|
testConnection(): Promise<boolean>;
|
|
87
80
|
/**
|
|
88
|
-
*
|
|
81
|
+
* Generate text from image input (multimodal)
|
|
89
82
|
*/
|
|
83
|
+
generateFromImage(prompt: string, imagePath: string, config?: GeminiGenerationConfig & {
|
|
84
|
+
systemPrompt?: string;
|
|
85
|
+
}): Promise<GeminiResponse>;
|
|
90
86
|
listModels(): Promise<string[]>;
|
|
87
|
+
private getMimeType;
|
|
91
88
|
}
|
|
92
89
|
//# sourceMappingURL=geminiClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geminiClient.d.ts","sourceRoot":"","sources":["../../src/utils/geminiClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"geminiClient.d.ts","sourceRoot":"","sources":["../../src/utils/geminiClient.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,KAAK,CAAC,CAAqB;IACnC,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAMrB;;IAOF;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,SAAS;IAgBjB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACG,YAAY,CAChB,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,EAC/B,MAAM,CAAC,EAAE,sBAAsB,GAC9B,OAAO,CAAC,cAAc,CAAC;IAiF1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAOhC;;OAEG;IACG,oBAAoB,CACxB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,GAAG,CAAC;KAClB,EACD,MAAM,CAAC,EAAE,sBAAsB,GAAG;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GAChE,OAAO,CAAC,oBAAoB,CAAC;IAoChC,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,WAAW;YAWL,kBAAkB;IAKhC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAUxC;;OAEG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,sBAAsB,GAAG;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1D,OAAO,CAAC,cAAc,CAAC;IAmDpB,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIrC,OAAO,CAAC,WAAW;CAYpB"}
|
|
@@ -1,29 +1,73 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
5
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
36
|
exports.GeminiClient = void 0;
|
|
37
|
+
const generative_ai_1 = require("@google/generative-ai");
|
|
7
38
|
const logger_1 = require("./logger");
|
|
8
|
-
const axios_1 = __importDefault(require("axios"));
|
|
9
39
|
/**
|
|
10
|
-
* Gemini API Client
|
|
11
|
-
* Supports
|
|
40
|
+
* Gemini API Client using official Google Generative AI SDK
|
|
41
|
+
* Supports text generation, multimodal interaction, and visual generation
|
|
12
42
|
*/
|
|
13
43
|
class GeminiClient {
|
|
14
44
|
constructor() {
|
|
15
|
-
this.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
45
|
+
this.MODELS = [
|
|
46
|
+
"gemini-1.5-flash",
|
|
47
|
+
"gemini-2.0-flash",
|
|
48
|
+
"gemini-1.5-pro",
|
|
49
|
+
"gemini-2.0-flash-exp",
|
|
50
|
+
"gemini-1.5-flash-latest"
|
|
51
|
+
];
|
|
52
|
+
this.model = this.MODELS[0] || "gemini-1.5-flash";
|
|
53
|
+
this.initializeClient();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Initialize SDK client
|
|
57
|
+
*/
|
|
58
|
+
initializeClient() {
|
|
59
|
+
try {
|
|
60
|
+
const key = this.getApiKey();
|
|
61
|
+
if (key) {
|
|
62
|
+
this.genAI = new generative_ai_1.GoogleGenerativeAI(key);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
// Ignore if key missing, will ensure check availability later
|
|
67
|
+
}
|
|
24
68
|
}
|
|
25
69
|
/**
|
|
26
|
-
* Get Gemini API key from environment
|
|
70
|
+
* Get Gemini API key from environment
|
|
27
71
|
*/
|
|
28
72
|
getApiKey() {
|
|
29
73
|
if (this.apiKey) {
|
|
@@ -32,90 +76,108 @@ class GeminiClient {
|
|
|
32
76
|
const key = process.env.GEMINI_API_KEY ||
|
|
33
77
|
process.env.GOOGLE_API_KEY ||
|
|
34
78
|
process.env.MYCONTEXT_GEMINI_API_KEY;
|
|
35
|
-
if (
|
|
36
|
-
|
|
79
|
+
if (key) {
|
|
80
|
+
this.apiKey = key;
|
|
37
81
|
}
|
|
38
|
-
|
|
39
|
-
return key;
|
|
82
|
+
return key || "";
|
|
40
83
|
}
|
|
41
84
|
/**
|
|
42
85
|
* Check if Gemini client has a valid API key
|
|
43
86
|
*/
|
|
44
87
|
hasApiKey() {
|
|
45
|
-
|
|
46
|
-
const key = process.env.GEMINI_API_KEY ||
|
|
47
|
-
process.env.GOOGLE_API_KEY ||
|
|
48
|
-
process.env.MYCONTEXT_GEMINI_API_KEY;
|
|
49
|
-
return !!key;
|
|
50
|
-
}
|
|
51
|
-
catch {
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
88
|
+
return !!this.getApiKey();
|
|
54
89
|
}
|
|
55
90
|
/**
|
|
56
|
-
* Generate text completion using Gemini
|
|
91
|
+
* Generate text completion using Gemini with fallback
|
|
57
92
|
*/
|
|
58
|
-
async generateText(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
93
|
+
async generateText(input, config) {
|
|
94
|
+
if (!this.genAI) {
|
|
95
|
+
this.initializeClient();
|
|
96
|
+
if (!this.genAI)
|
|
97
|
+
throw new Error("Gemini API key not configured");
|
|
98
|
+
}
|
|
99
|
+
let lastError;
|
|
100
|
+
// Normalize input to array of messages
|
|
101
|
+
const messages = typeof input === "string" ? [{ role: "user", content: input }] : input;
|
|
102
|
+
// Extract system instruction if present
|
|
103
|
+
const systemMessage = messages.find(m => m.role === "system");
|
|
104
|
+
const systemInstruction = systemMessage ? systemMessage.content : undefined;
|
|
105
|
+
// Convert remaining messages to SDK Content format
|
|
106
|
+
const history = this.convertMessagesToContent(messages.filter(m => m.role !== "system"));
|
|
107
|
+
// Try models in order
|
|
108
|
+
for (const modelName of this.MODELS) {
|
|
109
|
+
try {
|
|
110
|
+
this.model = modelName;
|
|
111
|
+
// Check if model supports system instructions (Pro Vision didn't, but Flash/Pro 1.5+ do)
|
|
112
|
+
// We blindly try passing it. SDK/API handles 400 if unsupported usually.
|
|
113
|
+
const model = this.genAI.getGenerativeModel({
|
|
114
|
+
model: modelName,
|
|
115
|
+
systemInstruction: systemInstruction
|
|
116
|
+
});
|
|
117
|
+
logger_1.logger.debug(`Gemini: Generating with ${modelName}`);
|
|
118
|
+
const generationConfig = {
|
|
66
119
|
temperature: config?.temperature ?? 0.7,
|
|
67
|
-
maxOutputTokens: config?.maxTokens ??
|
|
120
|
+
maxOutputTokens: config?.maxTokens ?? 8192,
|
|
68
121
|
topP: config?.topP ?? 0.95,
|
|
69
122
|
topK: config?.topK ?? 40,
|
|
70
123
|
stopSequences: config?.stopSequences,
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
124
|
+
};
|
|
125
|
+
// If history is empty (and we have no system prompt), we need at least one user message.
|
|
126
|
+
if (history.length === 0) {
|
|
127
|
+
throw new Error("No user content provided for generation");
|
|
128
|
+
}
|
|
129
|
+
const result = await model.generateContent({
|
|
130
|
+
contents: history,
|
|
131
|
+
generationConfig
|
|
132
|
+
});
|
|
133
|
+
const response = await result.response;
|
|
134
|
+
const text = response.text();
|
|
135
|
+
const usage = result.response.usageMetadata;
|
|
136
|
+
return {
|
|
137
|
+
content: text,
|
|
138
|
+
text: text, // Alias for backward compatibility
|
|
139
|
+
model: modelName,
|
|
140
|
+
finishReason: response.candidates?.[0]?.finishReason,
|
|
141
|
+
usage: usage ? {
|
|
142
|
+
promptTokens: usage.promptTokenCount,
|
|
143
|
+
completionTokens: usage.candidatesTokenCount,
|
|
144
|
+
totalTokens: usage.totalTokenCount
|
|
145
|
+
} : undefined
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
lastError = error;
|
|
150
|
+
console.error(`⚠️ Gemini model ${modelName} failed: ${error.message}`);
|
|
151
|
+
if (process.env.DEBUG || process.env.VERBOSE) {
|
|
152
|
+
logger_1.logger.warn(`Gemini (${modelName}) failed: ${error.message}, trying next...`);
|
|
153
|
+
}
|
|
154
|
+
continue;
|
|
76
155
|
}
|
|
77
|
-
const content = candidate.content?.parts?.[0]?.text || "";
|
|
78
|
-
const usage = response.data.usageMetadata;
|
|
79
|
-
return {
|
|
80
|
-
content,
|
|
81
|
-
model: this.model,
|
|
82
|
-
finishReason: candidate.finishReason,
|
|
83
|
-
usage: usage
|
|
84
|
-
? {
|
|
85
|
-
promptTokens: usage.promptTokenCount || 0,
|
|
86
|
-
completionTokens: usage.candidatesTokenCount || 0,
|
|
87
|
-
totalTokens: usage.totalTokenCount || 0,
|
|
88
|
-
}
|
|
89
|
-
: undefined,
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
catch (error) {
|
|
93
|
-
logger_1.logger.error("Gemini generation failed:", error.message);
|
|
94
|
-
throw new Error(`Gemini generation failed: ${error.message}`);
|
|
95
156
|
}
|
|
157
|
+
logger_1.logger.error("All Gemini models failed:", lastError?.message);
|
|
158
|
+
throw new Error(`Gemini generation failed: ${lastError?.message || "Unknown error"}`);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Convert simplified messages to SDK Content format
|
|
162
|
+
*/
|
|
163
|
+
convertMessagesToContent(messages) {
|
|
164
|
+
return messages.map(msg => ({
|
|
165
|
+
role: msg.role === "assistant" ? "model" : "user",
|
|
166
|
+
parts: [{ text: msg.content }]
|
|
167
|
+
}));
|
|
96
168
|
}
|
|
97
169
|
/**
|
|
98
170
|
* Generate visual screen (HTML + optional screenshot) using Gemini + nanobanana
|
|
99
|
-
* This uses Gemini's multimodal capabilities to generate HTML
|
|
100
171
|
*/
|
|
101
172
|
async generateVisualScreen(prompt, context, config) {
|
|
102
173
|
try {
|
|
103
174
|
logger_1.logger.debug("Gemini: Generating visual screen");
|
|
104
|
-
// Build comprehensive prompt for HTML generation
|
|
105
175
|
const systemPrompt = this.buildVisualPrompt(prompt, context);
|
|
106
176
|
const response = await this.generateText([
|
|
107
|
-
{
|
|
108
|
-
|
|
109
|
-
content: systemPrompt,
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
role: "user",
|
|
113
|
-
content: prompt,
|
|
114
|
-
},
|
|
177
|
+
{ role: "system", content: systemPrompt },
|
|
178
|
+
{ role: "user", content: prompt },
|
|
115
179
|
], config);
|
|
116
|
-
// Extract HTML from response
|
|
117
180
|
const html = this.extractHtml(response.content);
|
|
118
|
-
// Optionally generate screenshot using nanobanana-style rendering
|
|
119
181
|
let screenshot;
|
|
120
182
|
if (config?.includeScreenshot) {
|
|
121
183
|
screenshot = await this.generateScreenshot(html);
|
|
@@ -135,105 +197,42 @@ class GeminiClient {
|
|
|
135
197
|
throw new Error(`Visual screen generation failed: ${error.message}`);
|
|
136
198
|
}
|
|
137
199
|
}
|
|
138
|
-
/**
|
|
139
|
-
* Build comprehensive prompt for visual screen generation
|
|
140
|
-
*/
|
|
141
200
|
buildVisualPrompt(userPrompt, context) {
|
|
142
201
|
let prompt = `You are an expert UI/UX designer and frontend developer. Generate a complete, production-ready HTML page based on the following requirements.
|
|
143
|
-
|
|
144
|
-
IMPORTANT INSTRUCTIONS:
|
|
145
|
-
- Generate COMPLETE, VALID HTML with inline CSS
|
|
146
|
-
- Use modern, responsive design principles
|
|
147
|
-
- Include realistic content and data
|
|
148
|
-
- Use semantic HTML5 elements
|
|
149
|
-
- Make it mobile-first and accessible
|
|
150
|
-
- Include all necessary meta tags and viewport settings
|
|
151
|
-
- Use CSS Grid or Flexbox for layouts
|
|
152
|
-
- Add smooth transitions and hover states
|
|
153
|
-
- Ensure high contrast for readability
|
|
154
|
-
- Output ONLY the HTML code, wrapped in \`\`\`html code blocks
|
|
155
|
-
|
|
202
|
+
IMPORTANT: Output ONLY valid HTML code within \`\`\`html blocks.
|
|
156
203
|
`;
|
|
157
|
-
if (context?.brand)
|
|
158
|
-
prompt += `\n## BRAND
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
if (context?.
|
|
164
|
-
prompt += `\n##
|
|
165
|
-
}
|
|
166
|
-
if (context?.sampleData) {
|
|
167
|
-
prompt += `\n## SAMPLE DATA (use this for realistic content):\n${JSON.stringify(context.sampleData, null, 2)}\n`;
|
|
168
|
-
}
|
|
169
|
-
prompt += `\n## USER REQUEST:\n${userPrompt}\n`;
|
|
204
|
+
if (context?.brand)
|
|
205
|
+
prompt += `\n## BRAND:\n${context.brand}\n`;
|
|
206
|
+
if (context?.prd)
|
|
207
|
+
prompt += `\n## CONTEXT:\n${context.prd}\n`;
|
|
208
|
+
if (context?.flows)
|
|
209
|
+
prompt += `\n## FLOWS:\n${context.flows}\n`;
|
|
210
|
+
if (context?.sampleData)
|
|
211
|
+
prompt += `\n## DATA:\n${JSON.stringify(context.sampleData, null, 2)}\n`;
|
|
212
|
+
prompt += `\n## REQUEST:\n${userPrompt}\n`;
|
|
170
213
|
return prompt;
|
|
171
214
|
}
|
|
172
|
-
/**
|
|
173
|
-
* Extract HTML from Gemini response (handles markdown code blocks)
|
|
174
|
-
*/
|
|
175
215
|
extractHtml(content) {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
if (codeBlockMatch && codeBlockMatch[1]) {
|
|
184
|
-
return codeBlockMatch[1].trim();
|
|
185
|
-
}
|
|
186
|
-
// If no code blocks, check if it's already HTML
|
|
187
|
-
if (content.includes("<!DOCTYPE html>") || content.includes("<html")) {
|
|
216
|
+
const htmlBlock = content.match(/```html\n([\s\S]*?)\n```/);
|
|
217
|
+
if (htmlBlock?.[1])
|
|
218
|
+
return htmlBlock[1].trim();
|
|
219
|
+
const codeBlock = content.match(/```\n([\s\S]*?)\n```/);
|
|
220
|
+
if (codeBlock?.[1])
|
|
221
|
+
return codeBlock[1].trim();
|
|
222
|
+
if (content.includes("<!DOCTYPE html>") || content.includes("<html"))
|
|
188
223
|
return content.trim();
|
|
189
|
-
}
|
|
190
|
-
// Last resort: return as-is and hope for the best
|
|
191
|
-
logger_1.logger.warn("Could not extract HTML from response, using raw content");
|
|
192
224
|
return content;
|
|
193
225
|
}
|
|
194
|
-
/**
|
|
195
|
-
* Generate screenshot from HTML using nanobanana-style approach
|
|
196
|
-
* For now, this is a placeholder - actual implementation would use puppeteer/playwright
|
|
197
|
-
* or a headless browser API
|
|
198
|
-
*/
|
|
199
226
|
async generateScreenshot(html) {
|
|
200
|
-
// TODO: Implement actual screenshot generation
|
|
201
|
-
// Options:
|
|
202
|
-
// 1. Use Puppeteer/Playwright locally
|
|
203
|
-
// 2. Use a screenshot API service
|
|
204
|
-
// 3. Use Gemini's native screenshot capabilities (if available)
|
|
205
227
|
logger_1.logger.debug("Screenshot generation not yet implemented");
|
|
206
|
-
return "";
|
|
207
|
-
// Future implementation:
|
|
208
|
-
// const browser = await puppeteer.launch();
|
|
209
|
-
// const page = await browser.newPage();
|
|
210
|
-
// await page.setContent(html);
|
|
211
|
-
// const screenshot = await page.screenshot({ encoding: 'base64' });
|
|
212
|
-
// await browser.close();
|
|
213
|
-
// return screenshot;
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Convert messages to Gemini API format
|
|
217
|
-
*/
|
|
218
|
-
convertMessages(messages) {
|
|
219
|
-
return messages
|
|
220
|
-
.filter((msg) => msg.role !== "system") // Gemini doesn't support system messages directly
|
|
221
|
-
.map((msg) => ({
|
|
222
|
-
role: msg.role === "assistant" ? "model" : "user",
|
|
223
|
-
parts: [{ text: msg.content }],
|
|
224
|
-
}));
|
|
228
|
+
return "";
|
|
225
229
|
}
|
|
226
230
|
/**
|
|
227
231
|
* Test Gemini API connection
|
|
228
232
|
*/
|
|
229
233
|
async testConnection() {
|
|
230
234
|
try {
|
|
231
|
-
await this.generateText(
|
|
232
|
-
{
|
|
233
|
-
role: "user",
|
|
234
|
-
content: "Say 'Hello from Gemini' if you can read this.",
|
|
235
|
-
},
|
|
236
|
-
]);
|
|
235
|
+
await this.generateText("Say 'Hello' if connected.");
|
|
237
236
|
return true;
|
|
238
237
|
}
|
|
239
238
|
catch (error) {
|
|
@@ -242,16 +241,66 @@ IMPORTANT INSTRUCTIONS:
|
|
|
242
241
|
}
|
|
243
242
|
}
|
|
244
243
|
/**
|
|
245
|
-
*
|
|
244
|
+
* Generate text from image input (multimodal)
|
|
246
245
|
*/
|
|
247
|
-
async
|
|
246
|
+
async generateFromImage(prompt, imagePath, config) {
|
|
247
|
+
if (!this.genAI)
|
|
248
|
+
this.initializeClient();
|
|
249
|
+
if (!this.genAI)
|
|
250
|
+
throw new Error("Gemini API key not configured");
|
|
248
251
|
try {
|
|
249
|
-
|
|
250
|
-
|
|
252
|
+
logger_1.logger.debug(`Gemini: Generating from image: ${imagePath}`);
|
|
253
|
+
// Helper to encode image
|
|
254
|
+
// We need just the base64 data and mimeType, assuming VisionUtils provides that or path
|
|
255
|
+
// Note: VisionUtils usually returns a Part object correct for REST API.
|
|
256
|
+
// For SDK, we use inlineData.
|
|
257
|
+
// Let's assume we read file ourselves to be safe and dependent-less if possible.
|
|
258
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
259
|
+
const imageBuffer = await fs.promises.readFile(imagePath);
|
|
260
|
+
const mimeType = this.getMimeType(imagePath);
|
|
261
|
+
const imagePart = {
|
|
262
|
+
inlineData: {
|
|
263
|
+
data: imageBuffer.toString('base64'),
|
|
264
|
+
mimeType: mimeType
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
const systemInstruction = config?.systemPrompt;
|
|
268
|
+
// Try models
|
|
269
|
+
for (const modelName of this.MODELS) {
|
|
270
|
+
try {
|
|
271
|
+
const model = this.genAI.getGenerativeModel({ model: modelName, systemInstruction });
|
|
272
|
+
const result = await model.generateContent([prompt, imagePart]);
|
|
273
|
+
const response = await result.response;
|
|
274
|
+
return {
|
|
275
|
+
content: response.text(),
|
|
276
|
+
model: modelName,
|
|
277
|
+
finishReason: response.candidates?.[0]?.finishReason
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
catch (e) {
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
throw new Error("All vision models failed");
|
|
251
285
|
}
|
|
252
286
|
catch (error) {
|
|
253
|
-
logger_1.logger.
|
|
254
|
-
|
|
287
|
+
logger_1.logger.error("Gemini vision generation failed:", error.message);
|
|
288
|
+
throw new Error(`Gemini vision generation failed: ${error.message}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
async listModels() {
|
|
292
|
+
return this.MODELS;
|
|
293
|
+
}
|
|
294
|
+
getMimeType(filePath) {
|
|
295
|
+
const ext = filePath.toLowerCase().split('.').pop();
|
|
296
|
+
switch (ext) {
|
|
297
|
+
case 'png': return 'image/png';
|
|
298
|
+
case 'jpg':
|
|
299
|
+
case 'jpeg': return 'image/jpeg';
|
|
300
|
+
case 'webp': return 'image/webp';
|
|
301
|
+
case 'heic': return 'image/heic';
|
|
302
|
+
case 'heif': return 'image/heif';
|
|
303
|
+
default: return 'image/jpeg';
|
|
255
304
|
}
|
|
256
305
|
}
|
|
257
306
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geminiClient.js","sourceRoot":"","sources":["../../src/utils/geminiClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"geminiClient.js","sourceRoot":"","sources":["../../src/utils/geminiClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -71,7 +71,7 @@ export declare class HybridAIClient {
|
|
|
71
71
|
/**
|
|
72
72
|
* Generate generic text (used for PRD, types, brand, etc.)
|
|
73
73
|
*/
|
|
74
|
-
generateText(prompt: string, options?: any): Promise<{
|
|
74
|
+
generateText(prompt: string, options?: any, attemptedProviders?: Set<string>): Promise<{
|
|
75
75
|
text: string;
|
|
76
76
|
provider: string;
|
|
77
77
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybridAIClient.d.ts","sourceRoot":"","sources":["../../src/utils/hybridAIClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"hybridAIClient.d.ts","sourceRoot":"","sources":["../../src/utils/hybridAIClient.ts"],"names":[],"mappings":"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"}
|