insurance·Independently reviewed · 96/100

Beneficiary Verifier

Verification typed. Beneficiary errors. Typed v1 agent with eval coverage.

insurancestructured-outputv1

Install

npx agentskit add insurance-beneficiary-verifier

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

How validation works
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.

Keep exploring

Related agents

View category