---
title: Schemas
description: Use Effect Schemas for structured output with effectSchema.
---

`effectSchema` turns an Effect `Schema` into an AI SDK schema, for places that take one directly, such as structured output. `tool` calls it for you on `inputSchema` and `outputSchema`; you need it yourself for `Output`:

```ts main.ts
import { Output } from 'ai';
import { effectSchema, generateText } from 'ai-effect';
import { Effect, Schema } from 'effect';

const Recipe = Schema.Struct({
	name: Schema.String,
	steps: Schema.Array(Schema.String),
});

const recipe = generateText({
	model: 'openai/gpt-5',
	prompt: 'Give me a pancake recipe.',
	output: Output.object({ schema: effectSchema(Recipe) }),
}).pipe(Effect.map((result) => result.output));
```

The model's JSON is decoded with your schema, so transformations such as `Schema.NumberFromString` apply and `result.output` has the decoded type.

## Validation failures

When the model's output does not match the schema, validation fails with the SDK's `TypeValidationError`, which `generateText` reports as an [`AiError`](/concepts/errors) with an `ai-effect/InvalidOutputError` reason. That reason is retryable, so you can retry it as shown in [Errors](/concepts/errors#retry).

## JSON Schema

The JSON Schema sent to the model is generated by Effect (draft-07). Structs are closed with `additionalProperties: false`, but free-form records such as `Schema.Record(Schema.String, Schema.Unknown)` stay open, so the model can still return arbitrary keys there. The AI SDK on its own would close every object, including those.
