@cravery/core 0.0.23 → 0.0.24

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.
@@ -1,4 +1,5 @@
1
1
  import { z } from "genkit";
2
+ import { ai } from "./genkit";
2
3
  import { AIModelConfig } from "../../types";
3
4
  export declare const ImagenOutputSchema: z.ZodObject<{
4
5
  images: z.ZodArray<z.ZodObject<{
@@ -27,27 +28,6 @@ export type ImageFlowHandler<T> = (input: T, prompt: string) => Promise<{
27
28
  base64Data: string;
28
29
  storagePath: string;
29
30
  }[]>;
30
- export declare const createGeminiFlow: <T, R>(name: string, inputSchema: z.ZodSchema<T>, outputSchema: z.ZodSchema<R>, handler: FlowHandler<T, R>, model?: AIModelConfig) => import("genkit").Action<z.ZodType<T, z.ZodTypeDef, T>, z.ZodType<R, z.ZodTypeDef, R>, z.ZodTypeAny>;
31
- export declare const createImagenFlow: <T>(name: string, inputSchema: z.ZodSchema<T>, handler: ImageFlowHandler<T>, model?: AIModelConfig) => import("genkit").Action<z.ZodType<T, z.ZodTypeDef, T>, z.ZodObject<{
32
- images: z.ZodArray<z.ZodObject<{
33
- url: z.ZodString;
34
- path: z.ZodString;
35
- }, "strip", z.ZodTypeAny, {
36
- url: string;
37
- path: string;
38
- }, {
39
- url: string;
40
- path: string;
41
- }>, "many">;
42
- }, "strip", z.ZodTypeAny, {
43
- images: {
44
- url: string;
45
- path: string;
46
- }[];
47
- }, {
48
- images: {
49
- url: string;
50
- path: string;
51
- }[];
52
- }>, z.ZodTypeAny>;
31
+ export declare const createGeminiFlow: <T, R>(name: string, inputSchema: z.ZodSchema<T>, outputSchema: z.ZodSchema<R>, handler: FlowHandler<T, R>, model?: AIModelConfig) => ReturnType<typeof ai.defineFlow>;
32
+ export declare const createImagenFlow: <T>(name: string, inputSchema: z.ZodSchema<T>, handler: ImageFlowHandler<T>, model?: AIModelConfig) => ReturnType<typeof ai.defineFlow>;
53
33
  //# sourceMappingURL=flow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../../src/lib/ai/flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAK3B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAO7B,CAAC;AAEH,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3E,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,CAChC,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,MAAM,KACX,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAAC;AAE5D,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,CAAC,EACnC,MAAM,MAAM,EACZ,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAC3B,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAC5B,SAAS,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,QAAO,aAAuC,wGA4B/C,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAChC,MAAM,MAAM,EACZ,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAC3B,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAC5B,QAAO,aAAqC;;;;;;;;;;;;;;;;;;;;;iBA2B7C,CAAC"}
1
+ {"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../../src/lib/ai/flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAG3B,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAO7B,CAAC;AAEH,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3E,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,CAChC,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,MAAM,KACX,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAAC;AAE5D,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,CAAC,EACnC,MAAM,MAAM,EACZ,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAC3B,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAC5B,SAAS,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,QAAO,aAAuC,KAmDxC,UAAU,CAAC,OAAO,EAAE,CAAC,UAAU,CACtC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAChC,MAAM,MAAM,EACZ,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAC3B,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAC5B,QAAO,aAAqC,KA+CtC,UAAU,CAAC,OAAO,EAAE,CAAC,UAAU,CACtC,CAAC"}
@@ -13,47 +13,84 @@ exports.ImagenOutputSchema = genkit_1.z.object({
13
13
  })),
14
14
  });
15
15
  const createGeminiFlow = (name, inputSchema, outputSchema, handler, model = ai_1.AI_MODELS.Gemini25Flash) => {
16
- const FlowInputSchema = genkit_2.ai.defineSchema(`${name}InputSchema`, inputSchema);
17
- const FlowOutputSchema = genkit_2.ai.defineSchema(`${name}OutputSchema`, outputSchema);
18
- const prompt = genkit_2.ai.prompt(name);
19
- return genkit_2.ai.defineFlow({
20
- name: name,
21
- inputSchema: inputSchema,
22
- outputSchema: outputSchema,
23
- }, async (input) => {
24
- var _a, _b;
25
- const response = await prompt(input);
26
- (0, cost_1.logAIUsage)({
27
- type: "multimodal",
28
- flowName: name,
29
- model,
30
- inputTokens: ((_a = response.usage) === null || _a === void 0 ? void 0 : _a.inputTokens) || 0,
31
- outputTokens: ((_b = response.usage) === null || _b === void 0 ? void 0 : _b.outputTokens) || 0,
32
- });
33
- return handler(input, response.output);
16
+ // Lazy initialization - don't access ai until the flow is actually called
17
+ let initialized = false;
18
+ let FlowInputSchema;
19
+ let FlowOutputSchema;
20
+ let prompt;
21
+ let flow;
22
+ const initializeFlow = () => {
23
+ if (!initialized) {
24
+ if (!genkit_2.ai) {
25
+ throw new Error("Genkit AI not initialized. Make sure Firebase Functions onInit has been called.");
26
+ }
27
+ FlowInputSchema = genkit_2.ai.defineSchema(`${name}InputSchema`, inputSchema);
28
+ FlowOutputSchema = genkit_2.ai.defineSchema(`${name}OutputSchema`, outputSchema);
29
+ prompt = genkit_2.ai.prompt(name);
30
+ flow = genkit_2.ai.defineFlow({
31
+ name: name,
32
+ inputSchema: inputSchema,
33
+ outputSchema: outputSchema,
34
+ }, async (input) => {
35
+ var _a, _b;
36
+ const response = await prompt(input);
37
+ (0, cost_1.logAIUsage)({
38
+ type: "multimodal",
39
+ flowName: name,
40
+ model,
41
+ inputTokens: ((_a = response.usage) === null || _a === void 0 ? void 0 : _a.inputTokens) || 0,
42
+ outputTokens: ((_b = response.usage) === null || _b === void 0 ? void 0 : _b.outputTokens) || 0,
43
+ });
44
+ return handler(input, response.output);
45
+ });
46
+ initialized = true;
47
+ }
48
+ return flow;
49
+ };
50
+ // Return a proxy function that initializes on first call
51
+ return (async (input) => {
52
+ const actualFlow = initializeFlow();
53
+ return actualFlow(input);
34
54
  });
35
55
  };
36
56
  exports.createGeminiFlow = createGeminiFlow;
37
57
  const createImagenFlow = (name, inputSchema, handler, model = ai_1.AI_MODELS.Imagen4Fast) => {
38
- return genkit_2.ai.defineFlow({
39
- name: name,
40
- inputSchema: inputSchema,
41
- outputSchema: exports.ImagenOutputSchema,
42
- }, async (input) => {
43
- const imageData = await handler(input, name);
44
- const uploadPromises = imageData.map(({ base64Data, storagePath }) => (0, storage_1.uploadImageToStorage)(base64Data, storagePath).catch((err) => {
45
- throw err;
46
- }));
47
- const uploadedImages = await Promise.all(uploadPromises);
48
- (0, cost_1.logAIUsage)({
49
- type: "image",
50
- flowName: name,
51
- model,
52
- imageCount: imageData.length,
53
- });
54
- return {
55
- images: uploadedImages,
56
- };
58
+ // Lazy initialization - don't access ai until the flow is actually called
59
+ let initialized = false;
60
+ let flow;
61
+ const initializeFlow = () => {
62
+ if (!initialized) {
63
+ if (!genkit_2.ai) {
64
+ throw new Error("Genkit AI not initialized. Make sure Firebase Functions onInit has been called.");
65
+ }
66
+ flow = genkit_2.ai.defineFlow({
67
+ name: name,
68
+ inputSchema: inputSchema,
69
+ outputSchema: exports.ImagenOutputSchema,
70
+ }, async (input) => {
71
+ const imageData = await handler(input, name);
72
+ const uploadPromises = imageData.map(({ base64Data, storagePath }) => (0, storage_1.uploadImageToStorage)(base64Data, storagePath).catch((err) => {
73
+ throw err;
74
+ }));
75
+ const uploadedImages = await Promise.all(uploadPromises);
76
+ (0, cost_1.logAIUsage)({
77
+ type: "image",
78
+ flowName: name,
79
+ model,
80
+ imageCount: imageData.length,
81
+ });
82
+ return {
83
+ images: uploadedImages,
84
+ };
85
+ });
86
+ initialized = true;
87
+ }
88
+ return flow;
89
+ };
90
+ // Return a proxy function that initializes on first call
91
+ return (async (input) => {
92
+ const actualFlow = initializeFlow();
93
+ return actualFlow(input);
57
94
  });
58
95
  };
59
96
  exports.createImagenFlow = createImagenFlow;
@@ -1 +1 @@
1
- {"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/lib/ai/flow.ts"],"names":[],"mappings":";;;AAAA,mCAA2B;AAC3B,wCAA4C;AAC5C,iCAAoC;AACpC,qCAA8B;AAC9B,wCAAkD;AAGrC,QAAA,kBAAkB,GAAG,UAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,UAAC,CAAC,KAAK,CACb,UAAC,CAAC,MAAM,CAAC;QACP,GAAG,EAAE,UAAC,CAAC,MAAM,EAAE;QACf,IAAI,EAAE,UAAC,CAAC,MAAM,EAAE;KACjB,CAAC,CACH;CACF,CAAC,CAAC;AAQI,MAAM,gBAAgB,GAAG,CAC9B,IAAY,EACZ,WAA2B,EAC3B,YAA4B,EAC5B,OAA0B,EAC1B,QAAuB,cAAS,CAAC,aAAa,EAC9C,EAAE;IACF,MAAM,eAAe,GAAG,WAAE,CAAC,YAAY,CAAC,GAAG,IAAI,aAAa,EAAE,WAAW,CAAC,CAAC;IAC3E,MAAM,gBAAgB,GAAG,WAAE,CAAC,YAAY,CAAC,GAAG,IAAI,cAAc,EAAE,YAAY,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,WAAE,CAAC,MAAM,CAItB,IAAI,CAAC,CAAC;IAER,OAAO,WAAE,CAAC,UAAU,CAClB;QACE,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,WAAW;QACxB,YAAY,EAAE,YAAY;KAC3B,EACD,KAAK,EAAE,KAAQ,EAAE,EAAE;;QACjB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,IAAA,iBAAU,EAAC;YACT,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,IAAI;YACd,KAAK;YACL,WAAW,EAAE,CAAA,MAAA,QAAQ,CAAC,KAAK,0CAAE,WAAW,KAAI,CAAC;YAC7C,YAAY,EAAE,CAAA,MAAA,QAAQ,CAAC,KAAK,0CAAE,YAAY,KAAI,CAAC;SAChD,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC,CACF,CAAC;AACJ,CAAC,CAAC;AAjCW,QAAA,gBAAgB,oBAiC3B;AAEK,MAAM,gBAAgB,GAAG,CAC9B,IAAY,EACZ,WAA2B,EAC3B,OAA4B,EAC5B,QAAuB,cAAS,CAAC,WAAW,EAC5C,EAAE;IACF,OAAO,WAAE,CAAC,UAAU,CAClB;QACE,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,WAAW;QACxB,YAAY,EAAE,0BAAkB;KACjC,EACD,KAAK,EAAE,KAAQ,EAAE,EAAE;QACjB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE,CACnE,IAAA,8BAAoB,EAAC,UAAU,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1D,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CACH,CAAC;QACF,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACzD,IAAA,iBAAU,EAAC;YACT,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,IAAI;YACd,KAAK;YACL,UAAU,EAAE,SAAS,CAAC,MAAM;SAC7B,CAAC,CAAC;QACH,OAAO;YACL,MAAM,EAAE,cAAc;SACvB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,CAAC;AA/BW,QAAA,gBAAgB,oBA+B3B"}
1
+ {"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/lib/ai/flow.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cravery/core",
3
- "version": "0.0.23",
3
+ "version": "0.0.24",
4
4
  "description": "Clean architecture foundation for Cravery",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -27,32 +27,56 @@ export const createGeminiFlow = <T, R>(
27
27
  handler: FlowHandler<T, R>,
28
28
  model: AIModelConfig = AI_MODELS.Gemini25Flash,
29
29
  ) => {
30
- const FlowInputSchema = ai.defineSchema(`${name}InputSchema`, inputSchema);
31
- const FlowOutputSchema = ai.defineSchema(`${name}OutputSchema`, outputSchema);
32
- const prompt = ai.prompt<
33
- typeof FlowInputSchema,
34
- typeof FlowOutputSchema,
35
- z.ZodTypeAny
36
- >(name);
30
+ // Lazy initialization - don't access ai until the flow is actually called
31
+ let initialized = false;
32
+ let FlowInputSchema: any;
33
+ let FlowOutputSchema: any;
34
+ let prompt: any;
35
+ let flow: any;
37
36
 
38
- return ai.defineFlow(
39
- {
40
- name: name,
41
- inputSchema: inputSchema,
42
- outputSchema: outputSchema,
43
- },
44
- async (input: T) => {
45
- const response = await prompt(input);
46
- logAIUsage({
47
- type: "multimodal",
48
- flowName: name,
49
- model,
50
- inputTokens: response.usage?.inputTokens || 0,
51
- outputTokens: response.usage?.outputTokens || 0,
52
- });
53
- return handler(input, response.output);
54
- },
55
- );
37
+ const initializeFlow = () => {
38
+ if (!initialized) {
39
+ if (!ai) {
40
+ throw new Error(
41
+ "Genkit AI not initialized. Make sure Firebase Functions onInit has been called.",
42
+ );
43
+ }
44
+ FlowInputSchema = ai.defineSchema(`${name}InputSchema`, inputSchema);
45
+ FlowOutputSchema = ai.defineSchema(`${name}OutputSchema`, outputSchema);
46
+ prompt = ai.prompt<
47
+ typeof FlowInputSchema,
48
+ typeof FlowOutputSchema,
49
+ z.ZodTypeAny
50
+ >(name);
51
+
52
+ flow = ai.defineFlow(
53
+ {
54
+ name: name,
55
+ inputSchema: inputSchema,
56
+ outputSchema: outputSchema,
57
+ },
58
+ async (input: T) => {
59
+ const response = await prompt(input);
60
+ logAIUsage({
61
+ type: "multimodal",
62
+ flowName: name,
63
+ model,
64
+ inputTokens: response.usage?.inputTokens || 0,
65
+ outputTokens: response.usage?.outputTokens || 0,
66
+ });
67
+ return handler(input, response.output);
68
+ },
69
+ );
70
+ initialized = true;
71
+ }
72
+ return flow;
73
+ };
74
+
75
+ // Return a proxy function that initializes on first call
76
+ return (async (input: T) => {
77
+ const actualFlow = initializeFlow();
78
+ return actualFlow(input);
79
+ }) as ReturnType<typeof ai.defineFlow>;
56
80
  };
57
81
 
58
82
  export const createImagenFlow = <T>(
@@ -61,29 +85,50 @@ export const createImagenFlow = <T>(
61
85
  handler: ImageFlowHandler<T>,
62
86
  model: AIModelConfig = AI_MODELS.Imagen4Fast,
63
87
  ) => {
64
- return ai.defineFlow(
65
- {
66
- name: name,
67
- inputSchema: inputSchema,
68
- outputSchema: ImagenOutputSchema,
69
- },
70
- async (input: T) => {
71
- const imageData = await handler(input, name);
72
- const uploadPromises = imageData.map(({ base64Data, storagePath }) =>
73
- uploadImageToStorage(base64Data, storagePath).catch((err) => {
74
- throw err;
75
- }),
88
+ // Lazy initialization - don't access ai until the flow is actually called
89
+ let initialized = false;
90
+ let flow: any;
91
+
92
+ const initializeFlow = () => {
93
+ if (!initialized) {
94
+ if (!ai) {
95
+ throw new Error(
96
+ "Genkit AI not initialized. Make sure Firebase Functions onInit has been called.",
97
+ );
98
+ }
99
+ flow = ai.defineFlow(
100
+ {
101
+ name: name,
102
+ inputSchema: inputSchema,
103
+ outputSchema: ImagenOutputSchema,
104
+ },
105
+ async (input: T) => {
106
+ const imageData = await handler(input, name);
107
+ const uploadPromises = imageData.map(({ base64Data, storagePath }) =>
108
+ uploadImageToStorage(base64Data, storagePath).catch((err) => {
109
+ throw err;
110
+ }),
111
+ );
112
+ const uploadedImages = await Promise.all(uploadPromises);
113
+ logAIUsage({
114
+ type: "image",
115
+ flowName: name,
116
+ model,
117
+ imageCount: imageData.length,
118
+ });
119
+ return {
120
+ images: uploadedImages,
121
+ };
122
+ },
76
123
  );
77
- const uploadedImages = await Promise.all(uploadPromises);
78
- logAIUsage({
79
- type: "image",
80
- flowName: name,
81
- model,
82
- imageCount: imageData.length,
83
- });
84
- return {
85
- images: uploadedImages,
86
- };
87
- },
88
- );
124
+ initialized = true;
125
+ }
126
+ return flow;
127
+ };
128
+
129
+ // Return a proxy function that initializes on first call
130
+ return (async (input: T) => {
131
+ const actualFlow = initializeFlow();
132
+ return actualFlow(input);
133
+ }) as ReturnType<typeof ai.defineFlow>;
89
134
  };