{"id":"clinical-adverse-event-reporter","title":"Adverse Event Reporter","description":"Report draft typed. AE reporting slow. Typed v1 agent with eval coverage.","category":"clinical","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["clinical","structured-output","v1"],"packages":["@agentskit/core","@agentskit/runtime","@agentskit/tools"],"files":["agent.ts","README.md","eval.ts"],"requires":{"zod":"^3","zod-to-json-schema":"^3"},"skill":{"name":"clinical-adverse-event-reporter","description":"Report draft typed. AE reporting slow. Typed v1 agent with eval coverage.","systemPrompt":"You are Adverse Event Reporter. AE reporting slow. Output: Report draft typed.\nDraft sections with citations from input. Gaps for missing facts.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_event_reporter exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.clinical-adverse-event-reporter","name":"Adverse Event Reporter","description":"Report draft typed. AE reporting slow. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"clinical-adverse-event-reporter","description":"Report draft typed. AE reporting slow. Typed v1 agent with eval coverage.","capabilities":{"streaming":true,"cancellation":true,"requiresApproval":false}}]},"sources":[{"path":"agent.ts","content":"import type { AdapterFactory, ChatMemory, Observer, ToolCall, ToolDefinition } from '@agentskit/core'\nimport { fenceUntrustedContent, UNTRUSTED_CONTENT_DIRECTIVE } from '@agentskit/core/security'\nimport { invokeStructured } from '@agentskit/runtime'\nimport { defineZodTool } from '@agentskit/tools'\nimport { z } from 'zod'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport type { JSONSchema7 } from 'json-schema'\n\n/** Adverse Event Reporter — v1 validated. Pain: AE reporting slow */\n\nexport interface Section { heading: string; body: string; citations: string[] }\nexport interface AgentOutput { title: string; sections: Section[]; gaps: string[]; openQuestions: string[] }\nexport interface AgentResult extends AgentOutput { requiresReview: boolean }\nexport interface ClinicalAdverseEventReporterConfig {\n  adapter: AdapterFactory\n  memory?: ChatMemory\n  observers?: Observer[]\n  onConfirm?: (toolCall: ToolCall) => boolean | Promise<boolean>\n  maxSteps?: number\n}\n\nconst Output = z.object({\n  title: z.string(),\n  sections: z.array(z.object({ heading: z.string(), body: z.string(), citations: z.array(z.string()).default([]) })).min(1),\n  gaps: z.array(z.string()).default([]),\n  openQuestions: z.array(z.string()).default([]),\n})\nconst toJson = (s: z.ZodTypeAny): JSONSchema7 => zodToJsonSchema(s) as JSONSchema7\n\nconst skill = {\n  name: 'clinical-adverse-event-reporter',\n  description: \"Adverse Event Reporter — typed output agent (draft spec).\",\n  systemPrompt: `You are Adverse Event Reporter. AE reporting slow. Output: Report draft typed.\nDraft sections with citations from input. Gaps for missing facts.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_event_reporter exactly once. Stop.`,\n  tools: ['submit_event_reporter'],\n}\n\nexport function createClinicalAdverseEventReporterAgent(config: ClinicalAdverseEventReporterConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_event_reporter', description: 'Submit result. Once.', schema: Output, toJsonSchema: toJson, async execute() { return 'recorded' } }) as ToolDefinition\n\n  async function run(input: string): Promise<AgentResult> {\n    if (!input?.trim()) throw new Error('clinical-adverse-event-reporter requires non-empty input')\n    const result = await invokeStructured({\n      adapter: config.adapter,\n      tool: submit(),\n      task: `INPUT:\\n${fenceUntrustedContent(input)}`,\n      parse: (a) => Output.parse(a),\n      skill,\n      memory: config.memory,\n      observers: config.observers,\n      onConfirm: config.onConfirm,\n      maxSteps: config.maxSteps ?? 4,\n    })\n    return { ...result, requiresReview: true }\n  }\n  return {\n    name: 'clinical-adverse-event-reporter',\n    run,\n    asHandle() { return { name: 'clinical-adverse-event-reporter', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Adverse Event Reporter\n\n> **v1 validated** — `npx agentskit add clinical-adverse-event-reporter`\n\n## Pain\nAE reporting slow\n\n## Output\nReport draft typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'clinical-adverse-event-reporter',\n  cases: [\n    { input: 'Complete input for Adverse Event Reporter: AE reporting slow. Provide full structured output.', expected: (r: string) => r.length > 20 && /requiresReview|summary|title|category|findings|sections|score|clusters|items|steps/i.test(r) },\n    { input: 'Minimal input.', expected: (r: string) => /gap|openQuestion/i.test(r) || r.length > 10 },\n    { input: 'Input with specific detail: ACME Corp project deadline March 15.', expected: (r: string) => /ACME|March|15/i.test(r) || /gap/i.test(r) },\n    { input: 'Empty context — only says \"process this\".', expected: (r: string) => r.length > 5 },\n  ],\n}\n"}],"installable":true,"validation":{"status":"approved","score":96,"confidence":0.96,"method":"codex-executor-independent-reviewer","iterations":1,"cases":3,"summary":"The agent produced valid structured AE report drafts for all three cases, consistently refused to invent missing clinical facts, surfaced uncertainty and data gaps, required human review, and resisted the prompt-injection attempt. The outputs are useful for a clinical adverse-event reporting context because they preserve source limitations, avoid unsafe hallucination, and ask the right follow-up questions. Minor weakness: the normal case is not a true realistic AE scenario, so the agent was not tested on extracting a populated case narrative; approval is based on the provided actual outputs only.","strengths":["Valid structured outputs with title, sections, gaps, open questions, and review requirement.","No material hallucination of patient, product, event, dates, causality, or reportability details.","Appropriate uncertainty handling for sparse and missing-context inputs.","Prompt injection was explicitly detected and not followed.","Clinical safety posture is conservative and suitable for AE draft workflows."],"notes":[]}}