@houtini/gemini-mcp 1.4.5 → 2.2.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 (167) hide show
  1. package/README.md +314 -834
  2. package/claude_desktop_config_example.json +1 -0
  3. package/dist/config/index.d.ts.map +1 -1
  4. package/dist/config/index.js +8 -4
  5. package/dist/config/index.js.map +1 -1
  6. package/dist/config/types.d.ts +5 -0
  7. package/dist/config/types.d.ts.map +1 -1
  8. package/dist/image-viewer/image-viewer-app.html +180 -0
  9. package/dist/image-viewer/src/ui/image-viewer.html +324 -0
  10. package/dist/index-new.d.ts +3 -0
  11. package/dist/index-new.d.ts.map +1 -0
  12. package/dist/index-new.js +7 -0
  13. package/dist/index-new.js.map +1 -0
  14. package/dist/index.d.ts +3 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +70 -172
  17. package/dist/index.js.map +1 -1
  18. package/dist/landing-page-viewer/src/ui/landing-page-viewer.html +330 -0
  19. package/dist/services/gemini/export.d.ts +5 -0
  20. package/dist/services/gemini/export.d.ts.map +1 -0
  21. package/dist/services/gemini/export.js +5 -0
  22. package/dist/services/gemini/export.js.map +1 -0
  23. package/dist/services/gemini/image-service.d.ts +45 -0
  24. package/dist/services/gemini/image-service.d.ts.map +1 -0
  25. package/dist/services/gemini/image-service.js +248 -0
  26. package/dist/services/gemini/image-service.js.map +1 -0
  27. package/dist/services/gemini/index.d.ts +7 -2
  28. package/dist/services/gemini/index.d.ts.map +1 -1
  29. package/dist/services/gemini/index.js +132 -56
  30. package/dist/services/gemini/index.js.map +1 -1
  31. package/dist/services/gemini/types.d.ts +32 -0
  32. package/dist/services/gemini/types.d.ts.map +1 -1
  33. package/dist/services/gemini/video-service.d.ts +58 -0
  34. package/dist/services/gemini/video-service.d.ts.map +1 -0
  35. package/dist/services/gemini/video-service.js +325 -0
  36. package/dist/services/gemini/video-service.js.map +1 -0
  37. package/dist/services/media-server.d.ts +28 -0
  38. package/dist/services/media-server.d.ts.map +1 -0
  39. package/dist/services/media-server.js +195 -0
  40. package/dist/services/media-server.js.map +1 -0
  41. package/dist/svg-viewer/src/ui/svg-viewer.html +325 -0
  42. package/dist/tools/gemini-chat.d.ts.map +1 -1
  43. package/dist/tools/gemini-chat.js +7 -1
  44. package/dist/tools/gemini-chat.js.map +1 -1
  45. package/dist/tools/gemini-deep-research.d.ts +1 -2
  46. package/dist/tools/gemini-deep-research.d.ts.map +1 -1
  47. package/dist/tools/gemini-deep-research.js +11 -51
  48. package/dist/tools/gemini-deep-research.js.map +1 -1
  49. package/dist/tools/gemini-help.d.ts +3 -0
  50. package/dist/tools/gemini-help.d.ts.map +1 -0
  51. package/dist/tools/gemini-help.js +534 -0
  52. package/dist/tools/gemini-help.js.map +1 -0
  53. package/dist/tools/gemini-prompt-assistant.d.ts +20 -0
  54. package/dist/tools/gemini-prompt-assistant.d.ts.map +1 -0
  55. package/dist/tools/gemini-prompt-assistant.js +129 -0
  56. package/dist/tools/gemini-prompt-assistant.js.map +1 -0
  57. package/dist/tools/generate-landing-page.d.ts +15 -0
  58. package/dist/tools/generate-landing-page.d.ts.map +1 -0
  59. package/dist/tools/generate-landing-page.js +66 -0
  60. package/dist/tools/generate-landing-page.js.map +1 -0
  61. package/dist/tools/generate-svg.d.ts +14 -0
  62. package/dist/tools/generate-svg.d.ts.map +1 -0
  63. package/dist/tools/generate-svg.js +106 -0
  64. package/dist/tools/generate-svg.js.map +1 -0
  65. package/dist/tools/generate-video.d.ts +24 -0
  66. package/dist/tools/generate-video.d.ts.map +1 -0
  67. package/dist/tools/generate-video.js +163 -0
  68. package/dist/tools/generate-video.js.map +1 -0
  69. package/dist/tools/image-prompt-assistant.d.ts +3 -0
  70. package/dist/tools/image-prompt-assistant.d.ts.map +1 -0
  71. package/dist/tools/image-prompt-assistant.js +790 -0
  72. package/dist/tools/image-prompt-assistant.js.map +1 -0
  73. package/dist/tools/load-image-from-path.d.ts +11 -0
  74. package/dist/tools/load-image-from-path.d.ts.map +1 -0
  75. package/dist/tools/load-image-from-path.js +100 -0
  76. package/dist/tools/load-image-from-path.js.map +1 -0
  77. package/dist/tools/prompt-library/charts.d.ts +325 -0
  78. package/dist/tools/prompt-library/charts.d.ts.map +1 -0
  79. package/dist/tools/prompt-library/charts.js +384 -0
  80. package/dist/tools/prompt-library/charts.js.map +1 -0
  81. package/dist/tools/prompt-library/index.d.ts +8 -0
  82. package/dist/tools/prompt-library/index.d.ts.map +1 -0
  83. package/dist/tools/prompt-library/index.js +10 -0
  84. package/dist/tools/prompt-library/index.js.map +1 -0
  85. package/dist/tools/register-analyze-image.d.ts +3 -0
  86. package/dist/tools/register-analyze-image.d.ts.map +1 -0
  87. package/dist/tools/register-analyze-image.js +67 -0
  88. package/dist/tools/register-analyze-image.js.map +1 -0
  89. package/dist/tools/register-chat.d.ts +3 -0
  90. package/dist/tools/register-chat.d.ts.map +1 -0
  91. package/dist/tools/register-chat.js +71 -0
  92. package/dist/tools/register-chat.js.map +1 -0
  93. package/dist/tools/register-deep-research.d.ts +3 -0
  94. package/dist/tools/register-deep-research.d.ts.map +1 -0
  95. package/dist/tools/register-deep-research.js +59 -0
  96. package/dist/tools/register-deep-research.js.map +1 -0
  97. package/dist/tools/register-describe-image.d.ts +3 -0
  98. package/dist/tools/register-describe-image.d.ts.map +1 -0
  99. package/dist/tools/register-describe-image.js +59 -0
  100. package/dist/tools/register-describe-image.js.map +1 -0
  101. package/dist/tools/register-image-gen.d.ts +3 -0
  102. package/dist/tools/register-image-gen.d.ts.map +1 -0
  103. package/dist/tools/register-image-gen.js +235 -0
  104. package/dist/tools/register-image-gen.js.map +1 -0
  105. package/dist/tools/register-landing-page.d.ts +3 -0
  106. package/dist/tools/register-landing-page.d.ts.map +1 -0
  107. package/dist/tools/register-landing-page.js +79 -0
  108. package/dist/tools/register-landing-page.js.map +1 -0
  109. package/dist/tools/register-list-models.d.ts +3 -0
  110. package/dist/tools/register-list-models.d.ts.map +1 -0
  111. package/dist/tools/register-list-models.js +33 -0
  112. package/dist/tools/register-list-models.js.map +1 -0
  113. package/dist/tools/register-load-image.d.ts +3 -0
  114. package/dist/tools/register-load-image.d.ts.map +1 -0
  115. package/dist/tools/register-load-image.js +66 -0
  116. package/dist/tools/register-load-image.js.map +1 -0
  117. package/dist/tools/register-svg.d.ts +3 -0
  118. package/dist/tools/register-svg.d.ts.map +1 -0
  119. package/dist/tools/register-svg.js +84 -0
  120. package/dist/tools/register-svg.js.map +1 -0
  121. package/dist/tools/register-video.d.ts +3 -0
  122. package/dist/tools/register-video.d.ts.map +1 -0
  123. package/dist/tools/register-video.js +118 -0
  124. package/dist/tools/register-video.js.map +1 -0
  125. package/dist/tools/register-viewers.d.ts +8 -0
  126. package/dist/tools/register-viewers.d.ts.map +1 -0
  127. package/dist/tools/register-viewers.js +89 -0
  128. package/dist/tools/register-viewers.js.map +1 -0
  129. package/dist/tools/schemas.d.ts +33 -0
  130. package/dist/tools/schemas.d.ts.map +1 -0
  131. package/dist/tools/schemas.js +39 -0
  132. package/dist/tools/schemas.js.map +1 -0
  133. package/dist/tools/types.d.ts +12 -0
  134. package/dist/tools/types.d.ts.map +1 -0
  135. package/dist/tools/types.js +2 -0
  136. package/dist/tools/types.js.map +1 -0
  137. package/dist/ui/image-viewer.d.ts +2 -0
  138. package/dist/ui/image-viewer.d.ts.map +1 -0
  139. package/dist/ui/image-viewer.js +42 -0
  140. package/dist/ui/image-viewer.js.map +1 -0
  141. package/dist/utils/chart-design-system.d.ts +92 -0
  142. package/dist/utils/chart-design-system.d.ts.map +1 -0
  143. package/dist/utils/chart-design-system.js +235 -0
  144. package/dist/utils/chart-design-system.js.map +1 -0
  145. package/dist/utils/image-compress.d.ts +9 -0
  146. package/dist/utils/image-compress.d.ts.map +1 -0
  147. package/dist/utils/image-compress.js +43 -0
  148. package/dist/utils/image-compress.js.map +1 -0
  149. package/dist/utils/image-utils.d.ts +9 -0
  150. package/dist/utils/image-utils.d.ts.map +1 -0
  151. package/dist/utils/image-utils.js +257 -0
  152. package/dist/utils/image-utils.js.map +1 -0
  153. package/dist/utils/resolve-images.d.ts +29 -0
  154. package/dist/utils/resolve-images.d.ts.map +1 -0
  155. package/dist/utils/resolve-images.js +56 -0
  156. package/dist/utils/resolve-images.js.map +1 -0
  157. package/dist/utils/tool-wrapper.d.ts +13 -0
  158. package/dist/utils/tool-wrapper.d.ts.map +1 -0
  159. package/dist/utils/tool-wrapper.js +22 -0
  160. package/dist/utils/tool-wrapper.js.map +1 -0
  161. package/dist/utils/video-utils.d.ts +16 -0
  162. package/dist/utils/video-utils.d.ts.map +1 -0
  163. package/dist/utils/video-utils.js +319 -0
  164. package/dist/utils/video-utils.js.map +1 -0
  165. package/dist/video-viewer/src/ui/video-viewer.html +310 -0
  166. package/package.json +21 -7
  167. package/server.json +30 -29
@@ -0,0 +1,5 @@
1
+ export { GeminiService } from './index.js';
2
+ export { GeminiImageService } from './image-service.js';
3
+ export { GeminiVideoService } from './video-service.js';
4
+ export * from './types.js';
5
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/services/gemini/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,cAAc,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { GeminiService } from './index.js';
2
+ export { GeminiImageService } from './image-service.js';
3
+ export { GeminiVideoService } from './video-service.js';
4
+ export * from './types.js';
5
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/services/gemini/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,cAAc,YAAY,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { GeminiConfig } from '../../config/types.js';
2
+ import { BaseService } from '../base-service.js';
3
+ import { GeneratedImageResult } from './types.js';
4
+ export declare const IMAGE_GENERATION_MODELS: readonly ["gemini-3-pro-image-preview", "gemini-2.5-flash-image", "nano-banana-pro-preview"];
5
+ export declare const IMAGE_VISION_MODELS: readonly ["gemini-3-flash-preview", "gemini-3-pro-preview", "gemini-3.1-pro-preview", "gemini-3-pro-image-preview", "gemini-2.5-flash-image"];
6
+ export declare const IMAGE_MODELS: readonly ["gemini-3-pro-image-preview", "gemini-2.5-flash-image", "nano-banana-pro-preview", ...("gemini-3.1-pro-preview" | "gemini-3-pro-image-preview" | "gemini-3-pro-preview" | "gemini-3-flash-preview" | "gemini-2.5-flash-image")[]];
7
+ export type ImageModel = typeof IMAGE_GENERATION_MODELS[number];
8
+ export type AspectRatio = '1:1' | '3:4' | '4:3' | '9:16' | '16:9';
9
+ export type ImageSize = '1K' | '2K' | '4K';
10
+ export type MediaResolution = 'MEDIA_RESOLUTION_LOW' | 'MEDIA_RESOLUTION_MEDIUM' | 'MEDIA_RESOLUTION_HIGH' | 'MEDIA_RESOLUTION_ULTRA_HIGH';
11
+ export interface ImageInput {
12
+ data: string;
13
+ mimeType: string;
14
+ thoughtSignature?: string;
15
+ mediaResolution?: MediaResolution;
16
+ }
17
+ export interface GenerateImageOptions {
18
+ prompt: string;
19
+ model?: string;
20
+ aspectRatio?: AspectRatio;
21
+ imageSize?: ImageSize;
22
+ images?: ImageInput[];
23
+ useSearch?: boolean;
24
+ globalMediaResolution?: Exclude<MediaResolution, 'MEDIA_RESOLUTION_ULTRA_HIGH'>;
25
+ }
26
+ export interface DescribeImageOptions {
27
+ images: ImageInput[];
28
+ prompt?: string;
29
+ model?: string;
30
+ globalMediaResolution?: Exclude<MediaResolution, 'MEDIA_RESOLUTION_ULTRA_HIGH'>;
31
+ }
32
+ export declare class GeminiImageService extends BaseService {
33
+ private apiKey;
34
+ private defaultGenerationModel;
35
+ private defaultDescribeModel;
36
+ constructor(config: GeminiConfig);
37
+ private validateModel;
38
+ private buildContents;
39
+ generateImage(options: GenerateImageOptions): Promise<GeneratedImageResult>;
40
+ describeImage(options: DescribeImageOptions): Promise<string>;
41
+ getDefaultModel(): string;
42
+ getDefaultDescribeModel(): string;
43
+ getAllowedModels(): readonly string[];
44
+ }
45
+ //# sourceMappingURL=image-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-service.d.ts","sourceRoot":"","sources":["../../../src/services/gemini/image-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAqB,MAAM,YAAY,CAAC;AAIrE,eAAO,MAAM,uBAAuB,8FAI1B,CAAC;AAGX,eAAO,MAAM,mBAAmB,+IAMtB,CAAC;AAGX,eAAO,MAAM,YAAY,6OAGf,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAIhE,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAClE,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,MAAM,MAAM,eAAe,GACvB,sBAAsB,GACtB,yBAAyB,GACzB,uBAAuB,GACvB,6BAA6B,CAAC;AAElC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IAGjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IAGtB,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IAEtB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,qBAAqB,CAAC,EAAE,OAAO,CAAC,eAAe,EAAE,6BAA6B,CAAC,CAAC;CACjF;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,qBAAqB,CAAC,EAAE,OAAO,CAAC,eAAe,EAAE,6BAA6B,CAAC,CAAC;CACjF;AAwDD,qBAAa,kBAAmB,SAAQ,WAAW;IACjD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,oBAAoB,CAAS;gBAEzB,MAAM,EAAE,YAAY;IAWhC,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,aAAa;IAwCf,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgI3E,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;IA6DnE,eAAe,IAAI,MAAM;IAIzB,uBAAuB,IAAI,MAAM;IAIjC,gBAAgB,IAAI,SAAS,MAAM,EAAE;CAGtC"}
@@ -0,0 +1,248 @@
1
+ import { GeminiError } from '../../utils/error-handler.js';
2
+ import { BaseService } from '../base-service.js';
3
+ const GEMINI_API_BASE = 'https://generativelanguage.googleapis.com/v1beta/models';
4
+ export const IMAGE_GENERATION_MODELS = [
5
+ 'gemini-3-pro-image-preview', // Nano Banana Pro — Gemini 3 image model, default for generation
6
+ 'gemini-2.5-flash-image', // Gemini 2.5 Flash image generation (stable alias)
7
+ 'nano-banana-pro-preview', // API alias for gemini-3-pro-image-preview
8
+ ];
9
+ // Models valid for describe_image and analyze_image (text output, multimodal input)
10
+ export const IMAGE_VISION_MODELS = [
11
+ 'gemini-3-flash-preview',
12
+ 'gemini-3-pro-preview',
13
+ 'gemini-3.1-pro-preview',
14
+ 'gemini-3-pro-image-preview', // also supports vision
15
+ 'gemini-2.5-flash-image',
16
+ ];
17
+ // Combined set for backwards compat — keep IMAGE_MODELS as an alias
18
+ export const IMAGE_MODELS = [
19
+ ...IMAGE_GENERATION_MODELS,
20
+ ...IMAGE_VISION_MODELS.filter(m => !IMAGE_GENERATION_MODELS.includes(m)),
21
+ ];
22
+ const DEFAULT_IMAGE_GENERATION_MODEL = 'gemini-3-pro-image-preview';
23
+ const DEFAULT_IMAGE_DESCRIBE_MODEL = 'gemini-3-flash-preview';
24
+ // ─── Service ─────────────────────────────────────────────────────────────────
25
+ export class GeminiImageService extends BaseService {
26
+ apiKey;
27
+ defaultGenerationModel;
28
+ defaultDescribeModel;
29
+ constructor(config) {
30
+ super();
31
+ if (!config.apiKey) {
32
+ throw new GeminiError('Missing API key for Gemini image service');
33
+ }
34
+ this.apiKey = config.apiKey;
35
+ this.defaultGenerationModel = config.defaultImageGenerationModel || DEFAULT_IMAGE_GENERATION_MODEL;
36
+ this.defaultDescribeModel = config.defaultImageDescribeModel || DEFAULT_IMAGE_DESCRIBE_MODEL;
37
+ this.logInfo('Gemini image service initialised');
38
+ }
39
+ validateModel(model, operation = 'generation') {
40
+ const allowed = operation === 'generation' ? IMAGE_GENERATION_MODELS : IMAGE_MODELS;
41
+ if (!allowed.includes(model)) {
42
+ throw new GeminiError(`Invalid model for ${operation}: ${model}. Allowed: ${allowed.join(', ')}`);
43
+ }
44
+ }
45
+ // Build a GeminiContent[] from prompt + optional reference images.
46
+ // For conversational editing: thoughtSignature alone is sufficient - we can
47
+ // omit/empty the base64 data to save massive bandwidth and token usage.
48
+ // Per Gemini API docs: "include mimeType but can leave data field empty if thoughtSignature present"
49
+ buildContents(prompt, images) {
50
+ const userParts = [{ text: prompt }];
51
+ if (images?.length) {
52
+ for (const img of images) {
53
+ // If we have a thoughtSignature, use signature-only mode
54
+ // This saves ~2-3MB of base64 data per image (500K+ tokens)
55
+ if (img.thoughtSignature) {
56
+ const part = {
57
+ thoughtSignature: img.thoughtSignature,
58
+ // Include mimeType for output format, but omit data field
59
+ inlineData: { mimeType: img.mimeType, data: '' }
60
+ };
61
+ if (img.mediaResolution) {
62
+ part.mediaResolution = img.mediaResolution;
63
+ }
64
+ userParts.push(part);
65
+ }
66
+ else {
67
+ // No signature = first-time upload, include full image data
68
+ const part = {
69
+ inlineData: { mimeType: img.mimeType, data: img.data }
70
+ };
71
+ if (img.mediaResolution) {
72
+ part.mediaResolution = img.mediaResolution;
73
+ }
74
+ userParts.push(part);
75
+ }
76
+ }
77
+ }
78
+ return [{ role: 'user', parts: userParts }];
79
+ }
80
+ async generateImage(options) {
81
+ const model = options.model || this.defaultGenerationModel;
82
+ this.validateModel(model, 'generation');
83
+ const supportsImageConfig = model.includes('image') || model.includes('imagen');
84
+ const body = {
85
+ contents: this.buildContents(options.prompt, options.images),
86
+ generationConfig: {
87
+ responseModalities: ['TEXT', 'IMAGE'],
88
+ ...(supportsImageConfig && (options.aspectRatio || options.imageSize)
89
+ ? {
90
+ imageConfig: {
91
+ ...(options.aspectRatio && { aspectRatio: options.aspectRatio }),
92
+ ...(options.imageSize && { imageSize: options.imageSize }),
93
+ },
94
+ }
95
+ : {}),
96
+ ...(options.globalMediaResolution && {
97
+ mediaResolution: options.globalMediaResolution
98
+ })
99
+ },
100
+ ...(options.useSearch && {
101
+ tools: [{ google_search: {} }]
102
+ })
103
+ };
104
+ this.logInfo('Generating image', {
105
+ model,
106
+ prompt: options.prompt.slice(0, 80),
107
+ hasReferenceImages: !!(options.images?.length),
108
+ useSearch: options.useSearch,
109
+ globalMediaResolution: options.globalMediaResolution
110
+ });
111
+ const url = `${GEMINI_API_BASE}/${model}:generateContent?key=${this.apiKey}`;
112
+ const response = await fetch(url, {
113
+ method: 'POST',
114
+ headers: { 'Content-Type': 'application/json' },
115
+ body: JSON.stringify(body),
116
+ });
117
+ if (!response.ok) {
118
+ const text = await response.text();
119
+ throw new GeminiError(`Gemini image API error (${response.status}): ${text}`);
120
+ }
121
+ const data = (await response.json());
122
+ if (data.error) {
123
+ throw new GeminiError(`Gemini image API error: ${data.error.message}`);
124
+ }
125
+ if (!data.candidates?.length) {
126
+ throw new GeminiError('No image generated — empty response from Gemini');
127
+ }
128
+ // Extract all parts, preserving thoughtSignatures.
129
+ // The API guarantees signatures on the first part and every inlineData part
130
+ // for gemini-3-pro-image-preview. We must surface them so callers can
131
+ // round-trip them for conversational editing.
132
+ const responseParts = [];
133
+ for (const rawPart of data.candidates[0].content.parts) {
134
+ if (rawPart.inlineData) {
135
+ responseParts.push({
136
+ type: 'image',
137
+ mimeType: rawPart.inlineData.mimeType,
138
+ base64Data: rawPart.inlineData.data,
139
+ thoughtSignature: rawPart.thoughtSignature,
140
+ });
141
+ }
142
+ else if (rawPart.text !== undefined) {
143
+ responseParts.push({
144
+ type: 'text',
145
+ text: rawPart.text,
146
+ thoughtSignature: rawPart.thoughtSignature,
147
+ });
148
+ }
149
+ }
150
+ const firstImage = responseParts.find(p => p.type === 'image');
151
+ if (!firstImage || !firstImage.base64Data || !firstImage.mimeType) {
152
+ throw new GeminiError('No image data in Gemini response');
153
+ }
154
+ const description = responseParts
155
+ .filter(p => p.type === 'text' && p.text)
156
+ .map(p => p.text)
157
+ .join('') || undefined;
158
+ // Extract grounding sources if search was enabled
159
+ let groundingSources;
160
+ if (options.useSearch && data.candidates[0].groundingMetadata) {
161
+ const metadata = data.candidates[0].groundingMetadata;
162
+ const chunks = metadata.groundingChunks || [];
163
+ groundingSources = chunks
164
+ .filter(chunk => chunk.web?.uri && chunk.web?.title)
165
+ .map(chunk => ({
166
+ url: chunk.web.uri,
167
+ title: chunk.web.title
168
+ }));
169
+ if (groundingSources.length > 0) {
170
+ this.logInfo('Grounding sources found', {
171
+ sourceCount: groundingSources.length,
172
+ queries: metadata.webSearchQueries
173
+ });
174
+ }
175
+ }
176
+ this.logInfo('Image generated successfully', {
177
+ mimeType: firstImage.mimeType,
178
+ partsCount: responseParts.length,
179
+ hasSignatures: responseParts.some(p => !!p.thoughtSignature),
180
+ hasGroundingSources: !!(groundingSources?.length)
181
+ });
182
+ return {
183
+ parts: responseParts,
184
+ mimeType: firstImage.mimeType,
185
+ base64Data: firstImage.base64Data,
186
+ description,
187
+ groundingSources
188
+ };
189
+ }
190
+ async describeImage(options) {
191
+ const model = options.model || this.defaultDescribeModel;
192
+ this.validateModel(model, 'vision');
193
+ if (!options.images?.length) {
194
+ throw new GeminiError('At least one image is required for describe_image');
195
+ }
196
+ const prompt = options.prompt || 'Describe this image in detail. What do you see?';
197
+ // Description is text-only — no IMAGE modality needed
198
+ const body = {
199
+ contents: this.buildContents(prompt, options.images),
200
+ generationConfig: {
201
+ responseModalities: ['TEXT'],
202
+ ...(options.globalMediaResolution && {
203
+ mediaResolution: options.globalMediaResolution
204
+ })
205
+ },
206
+ };
207
+ this.logInfo('Describing image', {
208
+ model,
209
+ imageCount: options.images.length,
210
+ globalMediaResolution: options.globalMediaResolution
211
+ });
212
+ const url = `${GEMINI_API_BASE}/${model}:generateContent?key=${this.apiKey}`;
213
+ const response = await fetch(url, {
214
+ method: 'POST',
215
+ headers: { 'Content-Type': 'application/json' },
216
+ body: JSON.stringify(body),
217
+ });
218
+ if (!response.ok) {
219
+ const text = await response.text();
220
+ throw new GeminiError(`Gemini image API error (${response.status}): ${text}`);
221
+ }
222
+ const data = (await response.json());
223
+ if (data.error) {
224
+ throw new GeminiError(`Gemini image API error: ${data.error.message}`);
225
+ }
226
+ if (!data.candidates?.length) {
227
+ throw new GeminiError('No response from Gemini');
228
+ }
229
+ const description = data.candidates[0].content.parts
230
+ .filter(p => p.text)
231
+ .map(p => p.text)
232
+ .join('');
233
+ if (!description) {
234
+ throw new GeminiError('No description in Gemini response');
235
+ }
236
+ return description;
237
+ }
238
+ getDefaultModel() {
239
+ return this.defaultGenerationModel;
240
+ }
241
+ getDefaultDescribeModel() {
242
+ return this.defaultDescribeModel;
243
+ }
244
+ getAllowedModels() {
245
+ return IMAGE_MODELS;
246
+ }
247
+ }
248
+ //# sourceMappingURL=image-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-service.js","sourceRoot":"","sources":["../../../src/services/gemini/image-service.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { BaseService } from '../base-service.js';
2
2
  import { GeminiConfig } from '../../config/types.js';
3
- import { ChatRequest, ChatResponse, ListModelsResponse } from './types.js';
3
+ import { ChatRequest, ImageAnalysisRequest, ChatResponse, ListModelsResponse } from './types.js';
4
+ import { GeminiVideoService, GenerateVideoOptions, GeneratedVideoResult } from './video-service.js';
4
5
  export declare class GeminiService extends BaseService {
5
6
  private genAI;
6
7
  private config;
@@ -8,7 +9,8 @@ export declare class GeminiService extends BaseService {
8
9
  private defaultModel;
9
10
  private modelsInitialized;
10
11
  private initializationPromise;
11
- constructor(config: GeminiConfig);
12
+ private videoService;
13
+ constructor(config: GeminiConfig, outputDir?: string);
12
14
  private ensureModelsInitialized;
13
15
  private initializeModels;
14
16
  private fetchModelsFromAPI;
@@ -21,7 +23,10 @@ export declare class GeminiService extends BaseService {
21
23
  listModels(): Promise<ListModelsResponse>;
22
24
  validateConfig(): Promise<boolean>;
23
25
  private mapSafetySettings;
26
+ analyzeImages(request: ImageAnalysisRequest): Promise<string>;
24
27
  getAvailableModels(): string[];
25
28
  getModelContextWindow(modelName: string): number;
29
+ generateVideo(options: GenerateVideoOptions): Promise<GeneratedVideoResult>;
30
+ getVideoService(): GeminiVideoService;
26
31
  }
27
32
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/gemini/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,kBAAkB,EAGnB,MAAM,YAAY,CAAC;AAGpB,qBAAa,aAAc,SAAQ,WAAW;IAC5C,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,qBAAqB,CAA8B;gBAE/C,MAAM,EAAE,YAAY;YAelB,uBAAuB;YAcvB,gBAAgB;YAsBhB,kBAAkB;IAmChC,OAAO,CAAC,kBAAkB;IAkD1B,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,iBAAiB;IAyCzB,eAAe,IAAI,MAAM;IAIzB,OAAO,CAAC,kBAAkB;IAkEpB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA8IjD,UAAU,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAezC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IA4BxC,OAAO,CAAC,iBAAiB;IAqBzB,kBAAkB,IAAI,MAAM,EAAE;IAI9B,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAIjD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/gemini/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAGnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAgBpG,qBAAa,aAAc,SAAQ,WAAW;IAC5C,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,qBAAqB,CAA8B;IAC3D,OAAO,CAAC,YAAY,CAAqB;gBAE7B,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,MAAM;YAgBtC,uBAAuB;YAcvB,gBAAgB;YAsBhB,kBAAkB;IAmChC,OAAO,CAAC,kBAAkB;IA+D1B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,iBAAiB;IA+BzB,eAAe,IAAI,MAAM;IAIzB,OAAO,CAAC,kBAAkB;IAkEpB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAoIjD,UAAU,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAezC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IA4BxC,OAAO,CAAC,iBAAiB;IAqBnB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;IAsEnE,kBAAkB,IAAI,MAAM,EAAE;IAI9B,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAK1C,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAIjF,eAAe,IAAI,kBAAkB;CAGtC"}