[{"data":1,"prerenderedAt":58},["ShallowReactive",2],{"snippet-lambda-durable-ai-structured-output":3},{"id":4,"title":5,"contributors":6,"description":8,"extension":9,"gitHub":10,"introBox":13,"languages":19,"meta":22,"resources":23,"services":28,"snippets":31,"stem":49,"tags":50,"type":56,"__hash__":57},"snippets\u002Fsnippets\u002Flambda-durable-ai-structured-output.json","Generating Structured Output from LLMs with AWS Lambda durable functions",[7],"content\u002Fcontributors\u002Fconnor-kirkpatrick.json","Get JSON output from an LLM and validate it against a schema using AWS Lambda durable functions","json",{"template":11},{"repoURL":12},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fsample-ai-workflows-in-aws-lambda-durable-functions",{"headline":14,"text":15},"How it works",[16,17,18],"This pattern demonstrates structured output extraction with AWS Lambda durable functions. The LLM response is validated against a schema with automatic retry on validation errors.","The example uses an LLM to extract contact information from unstructured text and validates it using Pydantic (Python) or Zod (TypeScript).","Benefits: Automatic retry on validation failures without manual error handling. Schema enforcement ensures data quality. Checkpointing prevents re-extraction on transient failures.",[20,21],"Python","TypeScript",{},{"bullets":24},[25],{"text":26,"link":27},"AWS Lambda durable functions","https:\u002F\u002Faws.amazon.com\u002Flambda\u002Flambda-durable-functions\u002F",[29,30],"lambda-event-functions","bedrock",[32],{"title":33,"codeTabs":34},"Runtimes",[35,42],{"id":20,"title":36,"description":37,"snippets":38},"Usage Example with Python:","Structured output with Lambda durable functions using Python and Pydantic.",[39],{"language":40,"code":41},"py","import json\nimport re\n\nimport boto3\nfrom aws_durable_execution_sdk_python import DurableContext, durable_execution\nfrom pydantic import BaseModel\n\nMODEL_ID = \"us.amazon.nova-lite-v1:0\"\nbedrock = boto3.client(\"bedrock-runtime\")\n\n\ndef converse(model_id: str, prompt: str) -&#62; str:\n    response = bedrock.converse(\n        modelId=model_id,\n        messages=[{\"role\": \"user\", \"content\": [{\"text\": prompt}]}],\n    )\n    return response[\"output\"][\"message\"][\"content\"][0][\"text\"]\n\n\nclass ExtractedContact(BaseModel):\n    name: str\n    email: str\n    company: str\n\n\ndef extract_contact(text: str) -&#62; dict:\n    raw = converse(\n        MODEL_ID,\n        f'Extract contact info as JSON with keys \"name\", \"email\", \"company\": {text}',\n    )\n    match = re.search(r\"\\{[^}]+\\}\", raw)\n    if not match:\n        raise ValueError(\"No JSON found in response\")\n    data = json.loads(match.group())\n    return ExtractedContact(**data).model_dump()\n\n\n@durable_execution\ndef handler(event: dict, context: DurableContext):\n    text = event.get(\"text\", \"John Smith from Acme Corp, email: john@acme.com\")\n    return context.step(lambda _: extract_contact(text), \"extract\")\n",{"id":21,"title":43,"description":44,"snippets":45},"Usage Example with TypeScript:","Structured output with Lambda durable functions using TypeScript and Zod.",[46],{"language":47,"code":48},"ts","import {\n  type DurableContext,\n  withDurableExecution,\n} from \"@aws\u002Fdurable-execution-sdk-js\";\nimport {\n  BedrockRuntimeClient,\n  ConverseCommand,\n} from \"@aws-sdk\u002Fclient-bedrock-runtime\";\nimport { z } from \"zod\";\n\nconst MODEL_ID = \"us.amazon.nova-lite-v1:0\";\nconst bedrock = new BedrockRuntimeClient({});\n\nasync function converse(modelId: string, prompt: string): Promise&#60;string&#62; {\n  const response = await bedrock.send(\n    new ConverseCommand({\n      modelId,\n      messages: [{ role: \"user\", content: [{ text: prompt }] }],\n    }),\n  );\n  return response.output?.message?.content?.[0].text ?? \"\";\n}\n\nconst ExtractedContact = z.object({\n  name: z.string(),\n  email: z.string(),\n  company: z.string(),\n});\n\nasync function extractContact(text: string) {\n  const raw = await converse(\n    MODEL_ID,\n    `Extract contact info as JSON with keys \"name\", \"email\", \"company\": ${text}`\n  );\n  const match = raw.match(\u002F\\{[^}]+\\}\u002F);\n  if (!match) throw new Error(\"No JSON found in response\");\n  return ExtractedContact.parse(JSON.parse(match[0]));\n}\n\nexport const handler = withDurableExecution(\n  async (event: { text?: string }, context: DurableContext) =&#62; {\n    const text = event.text ?? \"John Smith from Acme Corp, email: john@acme.com\";\n    return await context.step(\"extract\", () =&#62; extractContact(text));\n  }\n);\n","snippets\u002Flambda-durable-ai-structured-output",[51,52,30,53,54,55],"ai","durable-functions","genai","structured-output","validation","Integration","jx0QJKvJwoxEHAXrRBRQJk1FNXya1yk9dbExI-Kc_Yg",1792578864390]