Skip to content

fix(gemini): normalize array-type nullable notation in SchemaMap prop…#997

Open
yondifon wants to merge 1 commit intoprism-php:mainfrom
yondifon:fix/gemini-nullable-schema-array-type
Open

fix(gemini): normalize array-type nullable notation in SchemaMap prop…#997
yondifon wants to merge 1 commit intoprism-php:mainfrom
yondifon:fix/gemini-nullable-schema-array-type

Conversation

@yondifon
Copy link
Copy Markdown

Description

Tested on gemini-2.5-flash & 'gemini-3-flash'

Gemini doesn't support the standard JSON Schema array-type notation for nullable fields:

{ "type": ["integer", "null"] }

It expects:

{ "type": "integer", "nullable": true }

This affects schemas passed as raw arrays — e.g. via Laravel AI SDK's ObjectSchema which wraps Illuminate's JsonSchema serializer:

public function schema(JsonSchema $schema): array
{
    return [
        'videoViews' => $schema->integer()->description('Total video views'),
        'averageWatchTime' => $schema->integer()->nullable()->description('Avg watch time in seconds'),
    ];
}

Laravel's serializer correctly follows JSON Schema draft-4 and converts nullable() to ["integer", "null"]. However, SchemaMap only normalizes properties when $this->schema instanceof ObjectSchema — raw array schemas bypass this branch and are spread into the payload as-is.

normalizeProperties() intercepts $schemaArray['properties'] before they reach Gemini, converting ["type", "null"] arrays into "nullable": true.


Breaking Changes

None.

…erties

Gemini's JSON Schema subset does not support the standard draft-4
array-type notation for nullability (e.g. `"type": ["integer", "null"]`).
It expects `"type": "integer", "nullable": true` instead.

When schemas are passed as raw arrays (e.g. via Laravel AI SDK's
ObjectSchema which wraps Illuminate's JsonSchema serializer), the
per-property SchemaMap normalization is never applied — those schemas
bypass the `instanceof ObjectSchema` branch and their properties are
spread directly into the payload with array-type notation intact.

Add `normalizeProperties()` to intercept properties in `$schemaArray`
before they reach Gemini, converting `["type", "null"]` arrays into
the `nullable: true` format Gemini understands.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant