mycontext-cli 2.0.37 → 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 +213 -159
- 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,15 +30,19 @@ 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
|
-
private apiKey
|
|
37
|
-
private
|
|
38
|
-
private client;
|
|
37
|
+
private apiKey?;
|
|
38
|
+
private genAI?;
|
|
39
39
|
private model;
|
|
40
|
+
private readonly MODELS;
|
|
40
41
|
constructor();
|
|
42
|
+
/**
|
|
43
|
+
* Initialize SDK client
|
|
44
|
+
*/
|
|
45
|
+
private initializeClient;
|
|
41
46
|
/**
|
|
42
47
|
* Get Gemini API key from environment
|
|
43
48
|
*/
|
|
@@ -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,116 +1,183 @@
|
|
|
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
|
-
|
|
24
|
-
|
|
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
|
+
}
|
|
25
68
|
}
|
|
26
69
|
/**
|
|
27
70
|
* Get Gemini API key from environment
|
|
28
71
|
*/
|
|
29
72
|
getApiKey() {
|
|
73
|
+
if (this.apiKey) {
|
|
74
|
+
return this.apiKey;
|
|
75
|
+
}
|
|
30
76
|
const key = process.env.GEMINI_API_KEY ||
|
|
31
77
|
process.env.GOOGLE_API_KEY ||
|
|
32
78
|
process.env.MYCONTEXT_GEMINI_API_KEY;
|
|
33
|
-
if (
|
|
34
|
-
|
|
79
|
+
if (key) {
|
|
80
|
+
this.apiKey = key;
|
|
35
81
|
}
|
|
36
|
-
return key;
|
|
82
|
+
return key || "";
|
|
37
83
|
}
|
|
38
84
|
/**
|
|
39
85
|
* Check if Gemini client has a valid API key
|
|
40
86
|
*/
|
|
41
87
|
hasApiKey() {
|
|
42
|
-
|
|
43
|
-
this.getApiKey();
|
|
44
|
-
return true;
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
88
|
+
return !!this.getApiKey();
|
|
49
89
|
}
|
|
50
90
|
/**
|
|
51
|
-
* Generate text completion using Gemini
|
|
91
|
+
* Generate text completion using Gemini with fallback
|
|
52
92
|
*/
|
|
53
|
-
async generateText(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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 = {
|
|
61
119
|
temperature: config?.temperature ?? 0.7,
|
|
62
|
-
maxOutputTokens: config?.maxTokens ??
|
|
120
|
+
maxOutputTokens: config?.maxTokens ?? 8192,
|
|
63
121
|
topP: config?.topP ?? 0.95,
|
|
64
122
|
topK: config?.topK ?? 40,
|
|
65
123
|
stopSequences: config?.stopSequences,
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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;
|
|
71
155
|
}
|
|
72
|
-
const content = candidate.content?.parts?.[0]?.text || "";
|
|
73
|
-
const usage = response.data.usageMetadata;
|
|
74
|
-
return {
|
|
75
|
-
content,
|
|
76
|
-
model: this.model,
|
|
77
|
-
finishReason: candidate.finishReason,
|
|
78
|
-
usage: usage
|
|
79
|
-
? {
|
|
80
|
-
promptTokens: usage.promptTokenCount || 0,
|
|
81
|
-
completionTokens: usage.candidatesTokenCount || 0,
|
|
82
|
-
totalTokens: usage.totalTokenCount || 0,
|
|
83
|
-
}
|
|
84
|
-
: undefined,
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
logger_1.logger.error("Gemini generation failed:", error.message);
|
|
89
|
-
throw new Error(`Gemini generation failed: ${error.message}`);
|
|
90
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
|
+
}));
|
|
91
168
|
}
|
|
92
169
|
/**
|
|
93
170
|
* Generate visual screen (HTML + optional screenshot) using Gemini + nanobanana
|
|
94
|
-
* This uses Gemini's multimodal capabilities to generate HTML
|
|
95
171
|
*/
|
|
96
172
|
async generateVisualScreen(prompt, context, config) {
|
|
97
173
|
try {
|
|
98
174
|
logger_1.logger.debug("Gemini: Generating visual screen");
|
|
99
|
-
// Build comprehensive prompt for HTML generation
|
|
100
175
|
const systemPrompt = this.buildVisualPrompt(prompt, context);
|
|
101
176
|
const response = await this.generateText([
|
|
102
|
-
{
|
|
103
|
-
|
|
104
|
-
content: systemPrompt,
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
role: "user",
|
|
108
|
-
content: prompt,
|
|
109
|
-
},
|
|
177
|
+
{ role: "system", content: systemPrompt },
|
|
178
|
+
{ role: "user", content: prompt },
|
|
110
179
|
], config);
|
|
111
|
-
// Extract HTML from response
|
|
112
180
|
const html = this.extractHtml(response.content);
|
|
113
|
-
// Optionally generate screenshot using nanobanana-style rendering
|
|
114
181
|
let screenshot;
|
|
115
182
|
if (config?.includeScreenshot) {
|
|
116
183
|
screenshot = await this.generateScreenshot(html);
|
|
@@ -130,105 +197,42 @@ class GeminiClient {
|
|
|
130
197
|
throw new Error(`Visual screen generation failed: ${error.message}`);
|
|
131
198
|
}
|
|
132
199
|
}
|
|
133
|
-
/**
|
|
134
|
-
* Build comprehensive prompt for visual screen generation
|
|
135
|
-
*/
|
|
136
200
|
buildVisualPrompt(userPrompt, context) {
|
|
137
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.
|
|
138
|
-
|
|
139
|
-
IMPORTANT INSTRUCTIONS:
|
|
140
|
-
- Generate COMPLETE, VALID HTML with inline CSS
|
|
141
|
-
- Use modern, responsive design principles
|
|
142
|
-
- Include realistic content and data
|
|
143
|
-
- Use semantic HTML5 elements
|
|
144
|
-
- Make it mobile-first and accessible
|
|
145
|
-
- Include all necessary meta tags and viewport settings
|
|
146
|
-
- Use CSS Grid or Flexbox for layouts
|
|
147
|
-
- Add smooth transitions and hover states
|
|
148
|
-
- Ensure high contrast for readability
|
|
149
|
-
- Output ONLY the HTML code, wrapped in \`\`\`html code blocks
|
|
150
|
-
|
|
202
|
+
IMPORTANT: Output ONLY valid HTML code within \`\`\`html blocks.
|
|
151
203
|
`;
|
|
152
|
-
if (context?.brand)
|
|
153
|
-
prompt += `\n## BRAND
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
if (context?.
|
|
159
|
-
prompt += `\n##
|
|
160
|
-
}
|
|
161
|
-
if (context?.sampleData) {
|
|
162
|
-
prompt += `\n## SAMPLE DATA (use this for realistic content):\n${JSON.stringify(context.sampleData, null, 2)}\n`;
|
|
163
|
-
}
|
|
164
|
-
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`;
|
|
165
213
|
return prompt;
|
|
166
214
|
}
|
|
167
|
-
/**
|
|
168
|
-
* Extract HTML from Gemini response (handles markdown code blocks)
|
|
169
|
-
*/
|
|
170
215
|
extractHtml(content) {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
if (codeBlockMatch && codeBlockMatch[1]) {
|
|
179
|
-
return codeBlockMatch[1].trim();
|
|
180
|
-
}
|
|
181
|
-
// If no code blocks, check if it's already HTML
|
|
182
|
-
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"))
|
|
183
223
|
return content.trim();
|
|
184
|
-
}
|
|
185
|
-
// Last resort: return as-is and hope for the best
|
|
186
|
-
logger_1.logger.warn("Could not extract HTML from response, using raw content");
|
|
187
224
|
return content;
|
|
188
225
|
}
|
|
189
|
-
/**
|
|
190
|
-
* Generate screenshot from HTML using nanobanana-style approach
|
|
191
|
-
* For now, this is a placeholder - actual implementation would use puppeteer/playwright
|
|
192
|
-
* or a headless browser API
|
|
193
|
-
*/
|
|
194
226
|
async generateScreenshot(html) {
|
|
195
|
-
// TODO: Implement actual screenshot generation
|
|
196
|
-
// Options:
|
|
197
|
-
// 1. Use Puppeteer/Playwright locally
|
|
198
|
-
// 2. Use a screenshot API service
|
|
199
|
-
// 3. Use Gemini's native screenshot capabilities (if available)
|
|
200
227
|
logger_1.logger.debug("Screenshot generation not yet implemented");
|
|
201
|
-
return "";
|
|
202
|
-
// Future implementation:
|
|
203
|
-
// const browser = await puppeteer.launch();
|
|
204
|
-
// const page = await browser.newPage();
|
|
205
|
-
// await page.setContent(html);
|
|
206
|
-
// const screenshot = await page.screenshot({ encoding: 'base64' });
|
|
207
|
-
// await browser.close();
|
|
208
|
-
// return screenshot;
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Convert messages to Gemini API format
|
|
212
|
-
*/
|
|
213
|
-
convertMessages(messages) {
|
|
214
|
-
return messages
|
|
215
|
-
.filter((msg) => msg.role !== "system") // Gemini doesn't support system messages directly
|
|
216
|
-
.map((msg) => ({
|
|
217
|
-
role: msg.role === "assistant" ? "model" : "user",
|
|
218
|
-
parts: [{ text: msg.content }],
|
|
219
|
-
}));
|
|
228
|
+
return "";
|
|
220
229
|
}
|
|
221
230
|
/**
|
|
222
231
|
* Test Gemini API connection
|
|
223
232
|
*/
|
|
224
233
|
async testConnection() {
|
|
225
234
|
try {
|
|
226
|
-
await this.generateText(
|
|
227
|
-
{
|
|
228
|
-
role: "user",
|
|
229
|
-
content: "Say 'Hello from Gemini' if you can read this.",
|
|
230
|
-
},
|
|
231
|
-
]);
|
|
235
|
+
await this.generateText("Say 'Hello' if connected.");
|
|
232
236
|
return true;
|
|
233
237
|
}
|
|
234
238
|
catch (error) {
|
|
@@ -237,16 +241,66 @@ IMPORTANT INSTRUCTIONS:
|
|
|
237
241
|
}
|
|
238
242
|
}
|
|
239
243
|
/**
|
|
240
|
-
*
|
|
244
|
+
* Generate text from image input (multimodal)
|
|
241
245
|
*/
|
|
242
|
-
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");
|
|
243
251
|
try {
|
|
244
|
-
|
|
245
|
-
|
|
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");
|
|
246
285
|
}
|
|
247
286
|
catch (error) {
|
|
248
|
-
logger_1.logger.
|
|
249
|
-
|
|
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';
|
|
250
304
|
}
|
|
251
305
|
}
|
|
252
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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"}
|