Quick start
import { openai } from '@agentskit/adapters'import { createInsuranceBeneficiaryVerifierAgent } from './agents/insurance-beneficiary-verifier/agent'const agent = createInsuranceBeneficiaryVerifierAgent({ adapter: openai({ apiKey: process.env.OPENAI_API_KEY!, model: 'gpt-4o', }),})const result = await agent.run('Describe your task here')console.log(result.content)Independent reviewer approved
Validation evidence
- Review score
- 96/100
- Confidence
- 96%
- Evaluation cases
- 3
- Iterations
- 1
The agent consistently returns valid structured output, avoids inventing beneficiary facts, surfaces concrete missing information, marks the case as requiring review, and resists the injection attempt without leaking or following unsafe instructions. The normal case is conservative rather than expansive, but that is appropriate for a verifier where fabricating policy details would be worse than declining to verify.
What passed review
- Valid structured outputs for all cases.
- No empty responses or schema issues observed.
- Correctly refuses to fabricate names, dates, allocations, or verification decisions from insufficient input.
- Clearly lists actionable gaps and open questions.
- Injection case is handled safely and explicitly treated as untrusted input.
- Maintains a conservative not-verified status pending authoritative records.
Extend it
Pass tools, retrieval, memory, permissions, and observers through the factory config.
const agent = createInsuranceBeneficiaryVerifierAgent({ adapter, tools, retriever, memory, onConfirm: (call) => approve(call), observers: [tracer],})View agent factory source
import type { AdapterFactory, ChatMemory, Observer, ToolCall, ToolDefinition } from '@agentskit/core'import { fenceUntrustedContent, UNTRUSTED_CONTENT_DIRECTIVE } from '@agentskit/core/security'import { invokeStructured } from '@agentskit/runtime'import { defineZodTool } from '@agentskit/tools'import { z } from 'zod'import { zodToJsonSchema } from 'zod-to-json-schema'import type { JSONSchema7 } from 'json-schema'/** Beneficiary Verifier — v1 validated. Pain: Beneficiary errors */export interface Section { heading: string; body: string; citations: string[] }export interface AgentOutput { title: string; sections: Section[]; gaps: string[]; openQuestions: string[] }export interface AgentResult extends AgentOutput { requiresReview: boolean }export interface InsuranceBeneficiaryVerifierConfig { adapter: AdapterFactory memory?: ChatMemory observers?: Observer[] onConfirm?: (toolCall: ToolCall) => boolean | Promise<boolean> maxSteps?: number}const Output = z.object({ title: z.string(), sections: z.array(z.object({ heading: z.string(), body: z.string(), citations: z.array(z.string()).default([]) })).min(1), gaps: z.array(z.string()).default([]), openQuestions: z.array(z.string()).default([]),})const toJson = (s: z.ZodTypeAny): JSONSchema7 => zodToJsonSchema(s) as JSONSchema7const skill = { name: 'insurance-beneficiary-verifier', description: "Beneficiary Verifier — typed output agent (draft spec).", systemPrompt: `You are Beneficiary Verifier. Beneficiary errors. Output: Verification typed.Draft sections with citations from input. Gaps for missing facts.NEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.${UNTRUSTED_CONTENT_DIRECTIVE}Call submit_beneficiary_verifier exactly once. Stop.`, tools: ['submit_beneficiary_verifier'],}export function createInsuranceBeneficiaryVerifierAgent(config: InsuranceBeneficiaryVerifierConfig) { const submit = (): ToolDefinition => defineZodTool({ name: 'submit_beneficiary_verifier', description: 'Submit result. Once.', schema: Output, toJsonSchema: toJson, async execute() { return 'recorded' } }) as ToolDefinition async function run(input: string): Promise<AgentResult> { if (!input?.trim()) throw new Error('insurance-beneficiary-verifier requires non-empty input') const result = await invokeStructured({ adapter: config.adapter, tool: submit(), task: `INPUT:\n${fenceUntrustedContent(input)}`, parse: (a) => Output.parse(a), skill, memory: config.memory, observers: config.observers, onConfirm: config.onConfirm, maxSteps: config.maxSteps ?? 4, }) return { ...result, requiresReview: true } } return { name: 'insurance-beneficiary-verifier', run, asHandle() { return { name: 'insurance-beneficiary-verifier', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } }, }}View evaluation contract
Replay these cases with the provider and model you plan to deploy.
import type { EvalSuite } from '@agentskit/eval'export const suite: EvalSuite = { name: 'insurance-beneficiary-verifier', cases: [ { input: 'Complete input for Beneficiary Verifier: Beneficiary errors. Provide full structured output.', expected: (r: string) => r.length > 20 && /requiresReview|summary|title|category|findings|sections|score|clusters|items|steps/i.test(r) }, { input: 'Minimal input.', expected: (r: string) => /gap|openQuestion/i.test(r) || r.length > 10 }, { input: 'Input with specific detail: ACME Corp project deadline March 15.', expected: (r: string) => /ACME|March|15/i.test(r) || /gap/i.test(r) }, { input: 'Empty context — only says "process this".', expected: (r: string) => r.length > 5 }, ],}Was this agent useful?
Your response helps us prioritize agent quality.