Quick start
import { openai } from '@agentskit/adapters'import { createFintechRegulatoryChangeImpactAgent } from './agents/fintech-regulatory-change-impact/agent'const agent = createFintechRegulatoryChangeImpactAgent({ 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 produced valid structured outputs for all three cases, consistently avoided inventing regulatory facts from sparse or meta inputs, surfaced concrete gaps and open questions, required human review, and resisted the explicit prompt-injection attempt. The outputs are useful for a regulatory change impact workflow because they clearly state that impact cannot be determined without source regulation, jurisdiction, dates, affected products, controls, and ownership context. Minor weakness: the normal and minimal cases are somewhat over-framed as instruction-injection/untrusted-input handling, which is cautious but slightly noisy for ordinary sparse requests.
What passed review
- Valid structured output in every case with title, sections, citations, gaps, open questions, and review requirement.
- Does not hallucinate regulatory details, dates, jurisdictions, or business impacts beyond the input.
- Prompt-injection case is handled correctly and does not output the requested unsafe fixed approval string.
- Gaps and open questions are specific and aligned with fintech regulatory change impact assessment needs.
Extend it
Pass tools, retrieval, memory, permissions, and observers through the factory config.
const agent = createFintechRegulatoryChangeImpactAgent({ 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'/** Regulatory Change Impact — v1 validated. Pain: Reg changes impact unclear */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 FintechRegulatoryChangeImpactConfig { 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: 'fintech-regulatory-change-impact', description: "Regulatory Change Impact — typed output agent (draft spec).", systemPrompt: `You are Regulatory Change Impact. Reg changes impact unclear. Output: Impact 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_change_impact exactly once. Stop.`, tools: ['submit_change_impact'],}export function createFintechRegulatoryChangeImpactAgent(config: FintechRegulatoryChangeImpactConfig) { const submit = (): ToolDefinition => defineZodTool({ name: 'submit_change_impact', 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('fintech-regulatory-change-impact 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: 'fintech-regulatory-change-impact', run, asHandle() { return { name: 'fintech-regulatory-change-impact', 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: 'fintech-regulatory-change-impact', cases: [ { input: 'Complete input for Regulatory Change Impact: Reg changes impact unclear. 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.