@michelabboud/visual-forge-mcp 0.7.0 → 0.9.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.
Files changed (41) hide show
  1. package/CHANGELOG.md +272 -0
  2. package/README.md +196 -2
  3. package/config/pricing.json +32 -4
  4. package/dist/providers/base-provider.d.ts +10 -2
  5. package/dist/providers/base-provider.d.ts.map +1 -1
  6. package/dist/providers/base-provider.js +53 -3
  7. package/dist/providers/base-provider.js.map +1 -1
  8. package/dist/providers/index.d.ts +2 -0
  9. package/dist/providers/index.d.ts.map +1 -1
  10. package/dist/providers/index.js +40 -2
  11. package/dist/providers/index.js.map +1 -1
  12. package/dist/providers/zai/zai-provider.d.ts +22 -0
  13. package/dist/providers/zai/zai-provider.d.ts.map +1 -0
  14. package/dist/providers/zai/zai-provider.js +154 -0
  15. package/dist/providers/zai/zai-provider.js.map +1 -0
  16. package/dist/quality/index.d.ts +1 -0
  17. package/dist/quality/index.d.ts.map +1 -1
  18. package/dist/quality/index.js +1 -0
  19. package/dist/quality/index.js.map +1 -1
  20. package/dist/quality/model-tester.d.ts +87 -0
  21. package/dist/quality/model-tester.d.ts.map +1 -0
  22. package/dist/quality/model-tester.js +357 -0
  23. package/dist/quality/model-tester.js.map +1 -0
  24. package/dist/server/mcp-server.d.ts +5 -0
  25. package/dist/server/mcp-server.d.ts.map +1 -1
  26. package/dist/server/mcp-server.js +371 -5
  27. package/dist/server/mcp-server.js.map +1 -1
  28. package/dist/types/generation.d.ts +1 -1
  29. package/dist/types/generation.d.ts.map +1 -1
  30. package/dist/types/provider.d.ts +28 -1
  31. package/dist/types/provider.d.ts.map +1 -1
  32. package/dist/utils/index.d.ts +1 -0
  33. package/dist/utils/index.d.ts.map +1 -1
  34. package/dist/utils/index.js +1 -0
  35. package/dist/utils/index.js.map +1 -1
  36. package/dist/utils/user-config-manager.d.ts +68 -0
  37. package/dist/utils/user-config-manager.d.ts.map +1 -0
  38. package/dist/utils/user-config-manager.js +131 -0
  39. package/dist/utils/user-config-manager.js.map +1 -0
  40. package/docs/guides/comprehensive-guide.md +1552 -0
  41. package/package.json +2 -2
@@ -0,0 +1,357 @@
1
+ /**
2
+ * Model Tester - Test models with standard or custom prompts and score quality
3
+ */
4
+ import { providerFactory } from '../providers/index.js';
5
+ import { QualityInspector } from './quality-inspector.js';
6
+ import { userConfigManager } from '../utils/user-config-manager.js';
7
+ import { logger } from '../utils/logger.js';
8
+ import * as path from 'path';
9
+ import * as fs from 'fs/promises';
10
+ export class ModelTester {
11
+ qualityInspector;
12
+ outputDir;
13
+ constructor(outputDir) {
14
+ this.qualityInspector = new QualityInspector();
15
+ this.outputDir = outputDir || path.join(process.cwd(), 'generated-images', 'tests');
16
+ }
17
+ /**
18
+ * Generate standard test image
19
+ */
20
+ async generateStandardTest(provider, modelId, aspectRatio = '16:9') {
21
+ const providerInstance = providerFactory.getProvider(provider);
22
+ const models = providerInstance.getModels();
23
+ const model = models.find(m => m.id === modelId);
24
+ if (!model) {
25
+ throw new Error(`Model ${modelId} not found for provider ${provider}`);
26
+ }
27
+ const standardPrompt = this.buildStandardTestPrompt(model.name);
28
+ const spec = {
29
+ id: `test-${provider}-${modelId.replace(/[^a-z0-9]/gi, '-')}-${Date.now()}`,
30
+ sourceFile: 'model-test',
31
+ type: 'diagram',
32
+ placement: {
33
+ section: 'Standard Quality Test',
34
+ line: 0,
35
+ context: 'Automated model quality test',
36
+ suggestedFilename: `test-${provider}-${modelId}`,
37
+ },
38
+ prompt: standardPrompt,
39
+ aspectRatio: aspectRatio,
40
+ metadata: {
41
+ altText: `Standard quality test for ${model.name}`,
42
+ priority: 'high',
43
+ },
44
+ };
45
+ return await this.executeTest(provider, modelId, spec);
46
+ }
47
+ /**
48
+ * Generate user-provided test image
49
+ */
50
+ async generateUserTest(provider, modelId, prompt, aspectRatio = '16:9', globalContext) {
51
+ const providerInstance = providerFactory.getProvider(provider);
52
+ const models = providerInstance.getModels();
53
+ const model = models.find(m => m.id === modelId);
54
+ const spec = {
55
+ id: `test-${provider}-${modelId.replace(/[^a-z0-9]/gi, '-')}-${Date.now()}`,
56
+ sourceFile: 'model-test',
57
+ type: 'diagram',
58
+ placement: {
59
+ section: 'User Test',
60
+ line: 0,
61
+ context: 'User-provided test prompt',
62
+ suggestedFilename: `test-${provider}-${modelId}`,
63
+ },
64
+ prompt,
65
+ aspectRatio: aspectRatio,
66
+ metadata: {
67
+ altText: `User test for ${model?.name || modelId}`,
68
+ priority: 'high',
69
+ },
70
+ globalContext,
71
+ };
72
+ return await this.executeTest(provider, modelId, spec);
73
+ }
74
+ /**
75
+ * Compare multiple models with same prompt
76
+ */
77
+ async compareModels(prompt, providers, aspectRatio = '16:9', globalContext) {
78
+ logger.info('Starting model comparison', {
79
+ prompt: prompt.substring(0, 100),
80
+ providerCount: providers.length,
81
+ aspectRatio,
82
+ });
83
+ const results = [];
84
+ let totalCost = 0;
85
+ let totalTime = 0;
86
+ // Run all tests
87
+ for (const { provider, model } of providers) {
88
+ try {
89
+ const result = await this.generateUserTest(provider, model, prompt, aspectRatio, globalContext);
90
+ results.push(result);
91
+ totalCost += result.cost;
92
+ totalTime += result.generationTime;
93
+ logger.info('Model test completed', {
94
+ provider,
95
+ model,
96
+ score: result.qualityScore.overall,
97
+ cost: result.cost,
98
+ });
99
+ }
100
+ catch (error) {
101
+ logger.error('Model test failed', {
102
+ provider,
103
+ model,
104
+ error: error.message,
105
+ });
106
+ const providerInstance = providerFactory.getProvider(provider);
107
+ const models = providerInstance.getModels();
108
+ const modelInfo = models.find(m => m.id === model);
109
+ results.push({
110
+ provider,
111
+ providerName: providerInstance.displayName,
112
+ modelId: model,
113
+ modelName: modelInfo?.name || model,
114
+ success: false,
115
+ qualityScore: {
116
+ overall: 0,
117
+ sharpness: 0,
118
+ brightness: 0,
119
+ textRendering: 0,
120
+ colorAccuracy: 0,
121
+ passed: false,
122
+ },
123
+ generationTime: 0,
124
+ cost: 0,
125
+ error: error.message,
126
+ });
127
+ }
128
+ }
129
+ // Rank results by quality score
130
+ const rankedResults = results
131
+ .map(r => ({ ...r, rank: 0 }))
132
+ .sort((a, b) => b.qualityScore.overall - a.qualityScore.overall)
133
+ .map((r, idx) => ({ ...r, rank: idx + 1 }));
134
+ // Generate recommendation
135
+ const recommendation = this.generateRecommendation(rankedResults, prompt);
136
+ return {
137
+ prompt,
138
+ aspectRatio,
139
+ totalCost,
140
+ totalTime,
141
+ results: rankedResults,
142
+ recommendation,
143
+ };
144
+ }
145
+ /**
146
+ * Execute a single test
147
+ */
148
+ async executeTest(provider, modelId, spec) {
149
+ const startTime = Date.now();
150
+ try {
151
+ // Ensure output directory exists
152
+ await fs.mkdir(this.outputDir, { recursive: true });
153
+ // Get provider and model info
154
+ const providerInstance = providerFactory.getProvider(provider);
155
+ const models = providerInstance.getModels();
156
+ const model = models.find(m => m.id === modelId);
157
+ if (!model) {
158
+ throw new Error(`Model ${modelId} not found`);
159
+ }
160
+ // Generate image
161
+ logger.info('Generating test image', {
162
+ provider,
163
+ model: modelId,
164
+ imageId: spec.id,
165
+ });
166
+ const generated = await providerInstance.generate(spec, { model: modelId });
167
+ const generationTime = Date.now() - startTime;
168
+ // Copy to test directory
169
+ const testFilename = `${provider}-${modelId.replace(/[^a-z0-9]/gi, '-')}-${Date.now()}.png`;
170
+ const testFilepath = path.join(this.outputDir, testFilename);
171
+ await fs.copyFile(generated.filepath, testFilepath);
172
+ // Update filepath for inspection
173
+ const testGenerated = { ...generated, filepath: testFilepath };
174
+ // Inspect quality
175
+ const qualityReport = await this.qualityInspector.inspect(testGenerated, spec);
176
+ // Calculate enhanced quality score
177
+ const enhancedScore = this.calculateEnhancedScore(qualityReport, spec);
178
+ // Record test result
179
+ await userConfigManager.recordModelTest(provider, modelId, enhancedScore.overall, enhancedScore.passed);
180
+ return {
181
+ provider,
182
+ providerName: providerInstance.displayName,
183
+ modelId,
184
+ modelName: model.name,
185
+ success: true,
186
+ generatedImage: testGenerated,
187
+ qualityScore: enhancedScore,
188
+ generationTime,
189
+ cost: model.costPerImage,
190
+ };
191
+ }
192
+ catch (error) {
193
+ const generationTime = Date.now() - startTime;
194
+ logger.error('Test failed', {
195
+ provider,
196
+ model: modelId,
197
+ error: error.message,
198
+ });
199
+ const providerInstance = providerFactory.getProvider(provider);
200
+ const models = providerInstance.getModels();
201
+ const model = models.find(m => m.id === modelId);
202
+ return {
203
+ provider,
204
+ providerName: providerInstance.displayName,
205
+ modelId,
206
+ modelName: model?.name || modelId,
207
+ success: false,
208
+ qualityScore: {
209
+ overall: 0,
210
+ sharpness: 0,
211
+ brightness: 0,
212
+ textRendering: 0,
213
+ colorAccuracy: 0,
214
+ passed: false,
215
+ },
216
+ generationTime,
217
+ cost: 0,
218
+ error: error.message,
219
+ };
220
+ }
221
+ }
222
+ /**
223
+ * Build standard test prompt
224
+ */
225
+ buildStandardTestPrompt(modelName) {
226
+ return `Generate a professional quality test image with the following elements:
227
+
228
+ 1. Large title text: "Visual Forge Quality Test"
229
+ 2. Subtitle: "Model: ${modelName}"
230
+ 3. Geometric shapes: red circle, blue square, green triangle
231
+ 4. Color gradient background from #1a365d to #0891b2
232
+ 5. Small detailed text: "Sharpness Test: 0.123456789"
233
+ 6. Technical diagram element: Simple flowchart with 3 boxes and arrows
234
+ 7. Professional style, clean layout, high contrast
235
+
236
+ This is a standardized test image for quality validation.`;
237
+ }
238
+ /**
239
+ * Calculate enhanced quality score with text rendering and color accuracy
240
+ */
241
+ calculateEnhancedScore(qualityReport, spec) {
242
+ const metrics = qualityReport.metrics;
243
+ // Sharpness score (0-100): Normalize Laplacian variance
244
+ const sharpnessRaw = metrics.sharpness || 0;
245
+ const sharpness = Math.min(100, (sharpnessRaw / 500) * 100); // 500 is good sharpness
246
+ // Brightness score (0-100): Penalize extremes
247
+ const brightnessRaw = metrics.meanBrightness || 128;
248
+ let brightness = 100;
249
+ if (brightnessRaw < 30 || brightnessRaw > 240) {
250
+ brightness = 0; // Too dark or too bright
251
+ }
252
+ else if (brightnessRaw < 60 || brightnessRaw > 200) {
253
+ brightness = 50; // Suboptimal
254
+ }
255
+ else {
256
+ brightness = 100; // Good range
257
+ }
258
+ // Text rendering score (0-100)
259
+ // For now, estimate based on sharpness and contrast
260
+ // In future, could integrate OCR (Tesseract) to verify actual text
261
+ const textRendering = this.estimateTextQuality(spec, sharpnessRaw);
262
+ // Color accuracy score (0-100)
263
+ // For now, use basic heuristics
264
+ // In future, could analyze actual color values
265
+ const colorAccuracy = this.estimateColorAccuracy(spec);
266
+ // Overall score: weighted average
267
+ // sharpness * 0.3 + brightness * 0.2 + textRendering * 0.4 + colorAccuracy * 0.1
268
+ const overall = sharpness * 0.3 +
269
+ brightness * 0.2 +
270
+ textRendering * 0.4 +
271
+ colorAccuracy * 0.1;
272
+ const passed = overall >= 60; // Default threshold
273
+ return {
274
+ overall: Math.round(overall * 10) / 10,
275
+ sharpness: Math.round(sharpness * 10) / 10,
276
+ brightness: brightnessRaw,
277
+ textRendering: Math.round(textRendering * 10) / 10,
278
+ colorAccuracy: Math.round(colorAccuracy * 10) / 10,
279
+ passed,
280
+ };
281
+ }
282
+ /**
283
+ * Estimate text quality (placeholder for OCR)
284
+ */
285
+ estimateTextQuality(spec, sharpness) {
286
+ // Check if prompt mentions text
287
+ const hasText = spec.prompt.toLowerCase().includes('text') ||
288
+ spec.prompt.toLowerCase().includes('label') ||
289
+ spec.prompt.toLowerCase().includes('title');
290
+ if (!hasText) {
291
+ return 100; // No text expected, perfect score
292
+ }
293
+ // Estimate based on sharpness (text needs sharp edges)
294
+ if (sharpness > 400)
295
+ return 95;
296
+ if (sharpness > 300)
297
+ return 85;
298
+ if (sharpness > 200)
299
+ return 75;
300
+ if (sharpness > 100)
301
+ return 65;
302
+ return 50;
303
+ }
304
+ /**
305
+ * Estimate color accuracy (placeholder for actual color analysis)
306
+ */
307
+ estimateColorAccuracy(spec) {
308
+ // Check if prompt mentions specific colors
309
+ const hasColors = spec.prompt.toLowerCase().includes('color') ||
310
+ spec.prompt.toLowerCase().includes('red') ||
311
+ spec.prompt.toLowerCase().includes('blue') ||
312
+ spec.prompt.toLowerCase().includes('green') ||
313
+ spec.prompt.match(/#[0-9a-f]{6}/i);
314
+ if (!hasColors) {
315
+ return 100; // No specific colors requested
316
+ }
317
+ // For now, give benefit of the doubt
318
+ // In future, could analyze actual RGB values
319
+ return 90;
320
+ }
321
+ /**
322
+ * Generate recommendation from ranked results
323
+ */
324
+ generateRecommendation(results, prompt) {
325
+ const winner = results[0];
326
+ const alternatives = results.slice(1, 3); // Top 2 alternatives
327
+ // Determine reason based on scores and cost
328
+ let reason = `Highest overall quality (${winner.qualityScore.overall}/100)`;
329
+ if (winner.qualityScore.textRendering > 90) {
330
+ reason += ', especially excellent text rendering';
331
+ }
332
+ if (winner.cost > 0) {
333
+ reason += `. Worth the $${winner.cost.toFixed(3)} cost`;
334
+ if (prompt.toLowerCase().includes('technical') || prompt.toLowerCase().includes('diagram')) {
335
+ reason += ' for technical diagrams';
336
+ }
337
+ }
338
+ else {
339
+ reason += '. Best free option';
340
+ }
341
+ return {
342
+ provider: winner.provider,
343
+ model: winner.modelId,
344
+ reason,
345
+ alternatives: alternatives
346
+ .filter(a => a.success)
347
+ .map(alt => ({
348
+ provider: alt.provider,
349
+ model: alt.modelId,
350
+ reason: alt.cost === 0
351
+ ? `Free alternative with ${alt.qualityScore.overall === 0 ? 'failed generation' : `good quality (${alt.qualityScore.overall}/100)`}`
352
+ : `Quality: ${alt.qualityScore.overall}/100, Cost: $${alt.cost.toFixed(3)}`,
353
+ })),
354
+ };
355
+ }
356
+ }
357
+ //# sourceMappingURL=model-tester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-tester.js","sourceRoot":"","sources":["../../src/quality/model-tester.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ export declare class VisualForgeMCPServer {
10
10
  private workflowOrchestrator?;
11
11
  private workflowTools;
12
12
  private configManager;
13
+ private modelTester;
13
14
  constructor();
14
15
  /**
15
16
  * Initialize server
@@ -46,6 +47,10 @@ export declare class VisualForgeMCPServer {
46
47
  private handleGetProviderStatus;
47
48
  private handleTestProviderConnection;
48
49
  private handleRemoveProvider;
50
+ private handleSetDefaultModel;
51
+ private handleGetModelInfo;
52
+ private handleTestModel;
53
+ private handleCompareModels;
49
54
  /**
50
55
  * Handle approve_changes tool
51
56
  */
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,oBAAoB,CAAC,CAAuB;IACpD,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAgB;;IAwBrC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBjC;;OAEG;IACH,OAAO,CAAC,aAAa;IA0CrB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAsjBhB;;OAEG;YACW,cAAc;IAoG5B;;OAEG;YAEW,mBAAmB;YAiCnB,mBAAmB;YAmBnB,mBAAmB;YAyBnB,mBAAmB;YA8CnB,eAAe;YAkBf,oBAAoB;YASpB,gBAAgB;YAqBhB,mBAAmB;YAanB,oBAAoB;IAalC;;OAEG;YAEW,uBAAuB;YAmBvB,uBAAuB;YAavB,4BAA4B;YA4C5B,oBAAoB;IAmBlC;;OAEG;YACW,oBAAoB;IAsClC;;OAEG;YACW,wBAAwB;IAyCtC;;OAEG;YACW,iBAAiB;IAiD/B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAS7B"}
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,oBAAoB,CAAC,CAAuB;IACpD,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;;IAyBjC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBjC;;OAEG;IACH,OAAO,CAAC,aAAa;IA0CrB;;OAEG;IACH,OAAO,CAAC,QAAQ;IA6qBhB;;OAEG;YACW,cAAc;IAgH5B;;OAEG;YAEW,mBAAmB;YAiCnB,mBAAmB;YAmBnB,mBAAmB;YAyBnB,mBAAmB;YA8CnB,eAAe;YAkBf,oBAAoB;YASpB,gBAAgB;YAqBhB,mBAAmB;YAanB,oBAAoB;IAalC;;OAEG;YAEW,uBAAuB;YAgCvB,uBAAuB;YAavB,4BAA4B;YA4C5B,oBAAoB;YAmBpB,qBAAqB;YAwCrB,kBAAkB;YAqDlB,eAAe;YA4Gf,mBAAmB;IA+EjC;;OAEG;YACW,oBAAoB;IAsClC;;OAEG;YACW,wBAAwB;IAyCtC;;OAEG;YACW,iBAAiB;IAiD/B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAS7B"}