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
- 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.