Skip to content

[JS] Unable to use jsonSchema for structured output #2864

Open
@christophe-g

Description

@christophe-g

Describe the bug

I have schemas defined with effect

It seems schema definition using identifiers ("$ref": "#/$defs/ID" -> "$defs": {"ID": {...def}}) is not supported.

To Reproduce

import { gemini20Flash, googleAI } from '@genkit-ai/googleai';
import { genkit } from 'genkit';

const schema = {
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$defs": {
    "Name": {
      "type": "string",
      "description": "a string",
      "title": "string"
    },
    "Age": {
      "type": "number",
      "description": "a number",
      "title": "number"
    }
  },
  "type": "object",
  "required": [
    "name",
    "age"
  ],
  "properties": {
    "name": {
      "$ref": "#/$defs/Name"
    },
    "age": {
      "$ref": "#/$defs/Age"
    }
  },
  "additionalProperties": false
}

// configure a Genkit instance
const ai = genkit({
  plugins: [googleAI({ apiKey: process.env.GEMINI_API_KEY! })],
  model: gemini20Flash, // set default model
});

async function main() {
  // make a generation request
  const { text } = await ai.generate({
    model: gemini20Flash,
    system: `
        You are a Person generator. Person has a name and a age
        `,
    prompt: `Create a new person`,
    output: { jsonSchema: schema },
  });
  console.log(text);
}

main();

results in

genkit start -- pnpx tsx src/ai/generatePerson.ts 
[Telemetry Server] initialized local file trace store at root: /home/christophe/Programming/preignition/app/app-survey/functions/.genkit/traces
Telemetry API running on http://localhost:4033
Error reading tools config Unexpected token 'T', "[Telemetry "... is not valid JSON
Error reading tools config Unexpected token 'T', "[Telemetry "... is not valid JSON
Error reading tools config ENOENT: no such file or directory, open '/home/christophe/Programming/preignition/app/app-survey/functions/.genkit/servers/tools-478984.json'
Project root: /home/christophe/Programming/preignition/app/app-survey/functions
Genkit Developer UI: http://localhost:4000
node:internal/process/promises:394
    triggerUncaughtException(err, true /* fromPromise */);
    ^

GoogleGenerativeAIFetchError: [GoogleGenerativeAI Error]: Error fetching from https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent: [400 Bad Request] Invalid JSON payload received. Unknown name "$defs" at 'generation_config.response_schema': Cannot find field.
Invalid JSON payload received. Unknown name "$ref" at 'generation_config.response_schema.properties[0].value': Cannot find field.
Invalid JSON payload received. Unknown name "$ref" at 'generation_config.response_schema.properties[1].value': Cannot find field. [{"@type":"type.googleapis.com/google.rpc.BadRequest","fieldViolations":[{"field":"generation_config.response_schema","description":"Invalid JSON payload received. Unknown name \"$defs\" at 'generation_config.response_schema': Cannot find field."},{"field":"generation_config.response_schema.properties[0].value","description":"Invalid JSON payload received. Unknown name \"$ref\" at 'generation_config.response_schema.properties[0].value': Cannot find field."},{"field":"generation_config.response_schema.properties[1].value","description":"Invalid JSON payload received. Unknown name \"$ref\" at 'generation_config.response_schema.properties[1].value': Cannot find field."}]}]
    at handleResponseNotOk (/home/christophe/Programming/preignition/app/app-survey/functions/node_modules/.pnpm/@google+generative-ai@0.24.1/node_modules/@google/generative-ai/dist/index.js:434:11)
    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
    at async makeRequest (/home/christophe/Programming/preignition/app/app-survey/functions/node_modules/.pnpm/@google+generative-ai@0.24.1/node_modules/@google/generative-ai/dist/index.js:403:9)
    at async generateContent (/home/christophe/Programming/preignition/app/app-survey/functions/node_modules/.pnpm/@google+generative-ai@0.24.1/node_modules/@google/generative-ai/dist/index.js:867:22)
    at async ChatSession.sendMessage (/home/christophe/Programming/preignition/app/app-survey/functions/node_modules/.pnpm/@google+generative-ai@0.24.1/node_modules/@google/generative-ai/dist/index.js:1210:9)
    at async callGemini (/home/christophe/Programming/preignition/app/app-survey/functions/node_modules/.pnpm/@genkit-ai+googleai@1.7.0_genkit@1.7.0/node_modules/@genkit-ai/googleai/src/gemini.ts:1045:26)
    at async <anonymous> (/home/christophe/Programming/preignition/app/app-survey/functions/node_modules/.pnpm/@genkit-ai+googleai@1.7.0_genkit@1.7.0/node_modules/@genkit-ai/googleai/src/gemini.ts:1102:11)
    at async <anonymous> (/home/christophe/Programming/preignition/app/app-survey/functions/node_modules/.pnpm/@genkit-ai+core@1.7.0/node_modules/@genkit-ai/core/src/action.ts:438:14)
    at async <anonymous> (/home/christophe/Programming/preignition/app/app-survey/functions/node_modules/.pnpm/@genkit-ai+core@1.7.0/node_modules/@genkit-ai/core/src/action.ts:334:26)
    at async <anonymous> (/home/christophe/Programming/preignition/app/app-survey/functions/node_modules/.pnpm/@genkit-ai+core@1.7.0/node_modules/@genkit-ai/core/src/tracing/instrumentation.ts:73:16) {
  status: 400,
  statusText: 'Bad Request',
  errorDetails: [
    {
      '@type': 'type.googleapis.com/google.rpc.BadRequest',
      fieldViolations: [
        {
          field: 'generation_config.response_schema',
          description: `Invalid JSON payload received. Unknown name "$defs" at 'generation_config.response_schema': Cannot find field.`
        },
        {
          field: 'generation_config.response_schema.properties[0].value',
          description: `Invalid JSON payload received. Unknown name "$ref" at 'generation_config.response_schema.properties[0].value': Cannot find field.`
        },
        {
          field: 'generation_config.response_schema.properties[1].value',
          description: `Invalid JSON payload received. Unknown name "$ref" at 'generation_config.response_schema.properties[1].value': Cannot find field.`
        }
      ]
    }
  ],
  traceId: '7cb8aa986000cf63231fa47f234d40c0'
}

Node.js v23.6.1
/home/christophe/.local/share/pnpm/global/5/.pnpm/genkit-cli@1.7.0_encoding@0.1.13/node_modules/genkit-cli/dist/commands/start.js:95
                    reject(new Error(`app process exited with code ${code}`));
                           ^

Error: app process exited with code 1
    at ChildProcess.<anonymous> (/home/christophe/.local/share/pnpm/global/5/.pnpm/genkit-cli@1.7.0_encoding@0.1.13/node_modules/genkit-cli/dist/commands/start.js:95:28)
    at ChildProcess.emit (node:events:507:28)
    at ChildProcess._handle.onexit (node:internal/child_process:294:12)

Node.js v23.6.1

Expected behavior

Valid JSON schemas can be used

Runtime (please complete the following information):

  • OS: Linux
  • Version: genkit 1.7.0

** Node version

  • 23.6.1

Additional context
Add any other context about the problem here.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingjs

    Type

    No type

    Projects

    Status

    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions