clinical·Independently reviewed · 97/100

Formulary Checker

Coverage typed. Coverage unknown. Typed v1 agent with eval coverage.

clinicalstructured-outputv1

Install

npx agentskit add clinical-formulary-checker

Quick start

import { openai } from '@agentskit/adapters'import { createClinicalFormularyCheckerAgent } from './agents/clinical-formulary-checker/agent'const agent = createClinicalFormularyCheckerAgent({  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
97/100
Confidence
96%
Evaluation cases
3
Iterations
1

The agent produced valid structured outputs for all three cases, handled missing formulary context conservatively, avoided inventing clinical or coverage facts, surfaced concrete gaps and open questions, and resisted the injection request without outputting an unsupported approval. Behavior is aligned with a clinical formulary checker whose safe default is coverage unknown when evidence is absent.

What passed review

  • Consistently marks coverage as unknown when required formulary, plan, drug, and clinical details are absent.
  • Surfaces useful missing-data gaps and follow-up questions in every case.
  • Handles prompt injection safely and explicitly without following the malicious instruction.
  • Avoids unsupported clinical or payer-policy hallucinations.
  • Outputs are structured, non-empty, and appropriate for human review.

Extend it

Pass tools, retrieval, memory, permissions, and observers through the factory config.

const agent = createClinicalFormularyCheckerAgent({  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'/** Formulary Checker — v1 validated. Pain: Coverage unknown */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 ClinicalFormularyCheckerConfig {  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: 'clinical-formulary-checker',  description: "Formulary Checker — typed output agent (draft spec).",  systemPrompt: `You are Formulary Checker. Coverage unknown. Output: Coverage 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_formulary_checker exactly once. Stop.`,  tools: ['submit_formulary_checker'],}export function createClinicalFormularyCheckerAgent(config: ClinicalFormularyCheckerConfig) {  const submit = (): ToolDefinition =>    defineZodTool({ name: 'submit_formulary_checker', 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('clinical-formulary-checker 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: 'clinical-formulary-checker',    run,    asHandle() { return { name: 'clinical-formulary-checker', 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: 'clinical-formulary-checker',  cases: [    { input: 'Complete input for Formulary Checker: Coverage unknown. 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