-
Notifications
You must be signed in to change notification settings - Fork 139
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[JS] Genkit flows failing with zod schema #972
Comments
+1 I'm also running into this |
Strangely, I was able to fix it by changing line 1831 in
|
This is an odd issue. Feel like zod bug... I'm trying to come up with a narrower repro. |
This seems to work fine import { z } from 'zod';
export const nutritionGoalInputSchema = z.object({
age: z
.number()
.min(0, 'Age must be a non-negative number.')
.describe(
'The age of the individual in years. Must be a non-negative number.'
),
gender: z
.enum(['female', 'male'])
.describe(
'The biological gender of the individual, either "female" or "male".'
),
weightKg: z
.number()
.min(0, 'Weight must be a non-negative number.')
.describe(
'The body weight of the individual in kilograms. Must be a non-negative number.'
),
lengthCm: z
.number()
.min(0, 'Height must be a non-negative number.')
.describe(
'The height of the individual in centimeters. Must be a non-negative number.'
),
activityLevel: z
.enum([
'extra_active',
'very_active',
'moderately_active',
'lightly_active',
'sedentary',
])
.describe(
'The general activity level (Physical Activity Level) of the individual throughout the day excluding formal exercise."'
),
dietaryGoals: z.object({
goalType: z
.enum(['fat_loss', 'muscle_gain'])
.describe(
'The primary dietary objective of the individual. Options are: "fat_loss" for reducing body fat percentage, and "muscle_gain" for increasing muscle mass.'
),
}),
dietaryRestrictions: z
.array(z.union([z.enum(['1', '2', '3']), z.string()]))
.optional()
.describe(
'A list of dietary restrictions or preferences for the individual. These can include specific dietary patterns like "vegan", "vegetarian", "kosher" or "halal"'
),
});
export const nutritionGoalOutputSchema = z.object({
specs: z.object({
calories: z
.number()
.min(0, 'Calories must be a non-negative number.')
.describe(
"The total estimated energy requirement for the individual in kilocalories (kcal) per day. This is calculated based on the individual's activity level, age, weight, height, gender, and dietary goals."
),
protein: z
.number()
.min(0, 'Protein must be a non-negative number.')
.describe(
'The total daily recommended protein intake in grams (g) for the individual, calculated based on body weight, activity level, and dietary objectives.'
),
fat: z
.number()
.min(0, 'Fat must be a non-negative number.')
.describe(
'The total daily recommended fat intake in grams (g) for the individual, derived from the percentage of total calories allocated to dietary fat based on activity level and goals.'
),
carbs: z
.number()
.min(0, 'Carbohydrates must be a non-negative number.')
.describe(
'The total daily recommended carbohydrate intake in grams (g) for the individual, derived from the remaining calories after accounting for protein and fat, adjusted for dietary preferences and activity level.'
),
}),
});
console.log(
nutritionGoalInputSchema.parse({
age: 33,
gender: 'female',
weightKg: 88,
lengthCm: 33,
activityLevel: 'sedentary',
dietaryGoals: {
goalType: 'muscle_gain',
},
dietaryRestrictions: ['1'],
} as z.infer<typeof nutritionGoalInputSchema>)
);
console.log(
nutritionGoalOutputSchema.parse({
specs: {
calories: 123,
carbs: 2344,
fat: 343,
protein: 233
},
} as z.infer<typeof nutritionGoalOutputSchema>)
); |
There's some kind of weird race condition or something where the strict null check fails but then returns an undefined object. See firebase/genkit#972 for details on how to reproduce. ``` name: 'TypeError', message: "Cannot destructure property 'shape' of 'this._getCached(...)' as it is undefined.", stack: "TypeError: Cannot destructure property 'shape' of 'this._getCached(...)' as it is undefined.\n" + ' at ZodObject._parse (/Users/fuego/Documents/development/gemineye-server/node_modules/zod/lib/types.js:1848:17)\n' + ' at ZodObject._parseSync (/Users/fuego/Documents/development/gemineye-server/node_modules/zod/lib/types.js:146:29)\n' + ' at /Users/fuego/Documents/development/gemineye-server/node_modules/zod/lib/types.js:1711:29\n' + ' at Array.map (<anonymous>)\n' + ' at ZodArray._parse (/Users/fuego/Documents/development/gemineye-server/node_modules/zod/lib/types.js:1710:38)\n' + ' at ZodObject._parse (/Users/fuego/Documents/development/gemineye-server/node_modules/zod/lib/types.js:1864:37)\n' + ' at ZodObject._parseSync (/Users/fuego/Documents/development/gemineye-server/node_modules/zod/lib/types.js:146:29)\n' + ' at ZodObject.safeParse (/Users/fuego/Documents/development/gemineye-server/node_modules/zod/lib/types.js:176:29)\n' + ' at ZodObject.parse (/Users/fuego/Documents/development/gemineye-server/node_modules/zod/lib/types.js:157:29)\n' + ' at /Users/fuego/Documents/development/gemineye-server/node_modules/@genkit-ai/flow/lib/flow.js:522:55', ```
I had the same issue and needed a fix. I used patch-package to create a patch for this and I am waiting until zod merges the PR. |
Here's a smaller repro: EDIT: See https://github.com/jiahaog/genkit-zod-schema-repro for the complete repro. Seems like the issue is with the zod schema being reused in |
This can be temporarily fixed locally with a tiny patch to zod, if waiting for colinhacks/zod#3841 to land isn't a possibility. Here's the patch (you can apply automatically if you install diff --git a/node_modules/zod/lib/types.js b/node_modules/zod/lib/types.js
index 731ffd8..86d5a14 100644
--- a/node_modules/zod/lib/types.js
+++ b/node_modules/zod/lib/types.js
@@ -1973,7 +1973,7 @@ class ZodObject extends ZodType {
this.augment = this.extend;
}
_getCached() {
- if (this._cached !== null)
+ if (this._cached != null)
return this._cached;
const shape = this._def.shape();
const keys = util_1.util.objectKeys(shape); |
Not having any luck reproducing the error with the above code... could you please also share your |
If someone could share zip with a repro I'd be eternally grateful! |
Sorry for the noise. It turns out that both the code as well as a dotprompt file that uses schema declared in the code are necessary for the repro. I've created https://github.com/jiahaog/genkit-zod-schema-repro as a full repro, and edited my previous comment. |
Describe the bug
I have configured Genkit to be working with Cloud Functions using the onFlow wrapper. When running a flow from Genkit Tools UI I receive the following error:
Cannot destructure property 'shape' of 'this._getCached(...)' as it is undefined.
To Reproduce
Init Genkit:
Zod schema's:
Flow:
Expected behavior
I expected the flow to run as desired. When I test the prompt from the Genkit Tools UI, it works as expected.
Screenshots
Failing flow:
Runtime (please complete the following information):
** Node version
Additional context
Using Cloud Functions 2nd gen with local emulators.
The text was updated successfully, but these errors were encountered: