16
16
17
17
import { EmbedderReference , ModelReference , z } from 'genkit' ;
18
18
import { GenkitPluginV2 , genkitPluginV2 } from 'genkit/plugin' ;
19
+ import type { ActionType } from 'genkit/registry' ;
19
20
20
21
// These are namespaced because they all intentionally have
21
22
// functions of the same name with the same arguments.
22
23
// (All exports from these files are used here)
24
+ import { listModels } from './client.js' ;
23
25
import * as embedder from './embedder.js' ;
24
26
import * as gemini from './gemini.js' ;
25
27
import * as imagen from './imagen.js' ;
26
28
import { GoogleAIPluginOptions } from './types.js' ;
29
+ import { getApiKeyFromEnvVar } from './utils.js' ;
27
30
import * as veo from './veo.js' ;
28
31
29
32
export { type EmbeddingConfig } from './embedder.js' ;
@@ -37,6 +40,9 @@ export { type GoogleAIPluginOptions };
37
40
export function googleAIPlugin (
38
41
options ?: GoogleAIPluginOptions
39
42
) : GenkitPluginV2 {
43
+ // Cache for list function - per plugin instance
44
+ let listCache : any [ ] | null = null ;
45
+
40
46
return genkitPluginV2 ( {
41
47
name : 'googleai' ,
42
48
init : async ( ) => {
@@ -47,32 +53,85 @@ export function googleAIPlugin(
47
53
...embedder . defineKnownModels ( options ) ,
48
54
] ;
49
55
} ,
56
+ resolve : async ( actionType : ActionType , name : string ) => {
57
+ // Extract the model name without the plugin prefix
58
+ const modelName = name . replace ( / ^ g o o g l e a i \/ / , '' ) ;
59
+
60
+ if ( actionType === 'model' ) {
61
+ if ( veo . isVeoModelName ( modelName ) ) {
62
+ return veo . defineModel ( modelName , options ) ;
63
+ }
64
+ if ( imagen . isImagenModelName ( modelName ) ) {
65
+ return imagen . defineModel ( modelName , options ) ;
66
+ }
67
+ // For gemini, tts, gemma, and unknown model families
68
+ return gemini . defineModel ( modelName , options ) ;
69
+ } else if ( actionType === 'embedder' ) {
70
+ return embedder . defineEmbedder ( modelName , options ) ;
71
+ } else if ( actionType === 'background-model' ) {
72
+ if ( veo . isVeoModelName ( modelName ) ) {
73
+ return veo . defineModel ( modelName , options ) ;
74
+ }
75
+ }
76
+
77
+ return undefined ;
78
+ } ,
79
+ list : async ( ) => {
80
+ // Return cached result if available
81
+ if ( listCache !== null ) {
82
+ return listCache ;
83
+ }
84
+
85
+ const apiKey = options ?. apiKey || getApiKeyFromEnvVar ( ) ;
86
+
87
+ if ( ! apiKey ) {
88
+ return [ ] ;
89
+ }
90
+
91
+ try {
92
+ const models = await listModels ( apiKey , options ) ;
93
+ const result = [
94
+ ...imagen . listActions ( models ) ,
95
+ ...gemini . listActions ( models ) ,
96
+ ...veo . listActions ( models ) ,
97
+ ...embedder . listActions ( models ) ,
98
+ ] ;
99
+
100
+ // Cache the result
101
+ listCache = result ;
102
+ return result ;
103
+ } catch ( error ) {
104
+ // Handle API errors gracefully by returning empty array
105
+ console . warn ( 'GoogleAI plugin: Failed to fetch models list:' , error ) ;
106
+ return [ ] ;
107
+ }
108
+ } ,
50
109
} ) ;
51
110
}
52
111
53
112
export type GoogleAIPlugin = {
54
113
( pluginOptions ?: GoogleAIPluginOptions ) : GenkitPluginV2 ;
55
- model (
114
+ createModelRef (
56
115
name : gemini . KnownGemmaModels | ( gemini . GemmaModelName & { } ) ,
57
116
config : gemini . GemmaConfig
58
117
) : ModelReference < gemini . GemmaConfigSchemaType > ;
59
- model (
118
+ createModelRef (
60
119
name : gemini . KnownTtsModels | ( gemini . TTSModelName & { } ) ,
61
120
config : gemini . GeminiTtsConfig
62
121
) : ModelReference < gemini . GeminiTtsConfigSchemaType > ;
63
- model (
122
+ createModelRef (
64
123
name : gemini . KnownGeminiModels | ( gemini . GeminiModelName & { } ) ,
65
124
config ?: gemini . GeminiConfig
66
125
) : ModelReference < gemini . GeminiConfigSchemaType > ;
67
- model (
126
+ createModelRef (
68
127
name : imagen . KnownModels | ( imagen . ImagenModelName & { } ) ,
69
128
config ?: imagen . ImagenConfig
70
129
) : ModelReference < imagen . ImagenConfigSchemaType > ;
71
- model (
130
+ createModelRef (
72
131
name : veo . KnownModels | ( veo . VeoModelName & { } ) ,
73
132
config ?: veo . VeoConfig
74
133
) : ModelReference < veo . VeoConfigSchemaType > ;
75
- model ( name : string , config ?: any ) : ModelReference < z . ZodTypeAny > ;
134
+ createModelRef ( name : string , config ?: any ) : ModelReference < z . ZodTypeAny > ;
76
135
77
136
embedder (
78
137
name : string ,
0 commit comments