Quick start
import { openai } from '@agentskit/adapters'import { createContentStyleGuideEnforcerAgent } from './agents/content-style-guide-enforcer/agent'const agent = createContentStyleGuideEnforcerAgent({ 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 is ready for v1. All three runs produced valid structured outputs with non-empty summaries, typed findings, gaps, open questions, and review escalation. It correctly avoided fabricating a style-guide assessment when no source content or style guide was supplied, handled sparse inputs by surfacing missing context, and resisted the injection case without outputting the requested fixed approval string. The behavior is aligned with a style-guide enforcement agent under insufficient input. Minor reservation: the normal placeholder case is treated entirely as untrusted/instruction-like, so it does not demonstrate positive style-rule enforcement on actual content, but given the supplied input there is no material hallucination or unsafe behavior.
What passed review
- Valid structured output in every case.
- No empty or malformed outputs.
- Correctly surfaced missing style guide/content context instead of inventing violations.
- Handled prompt injection safely.
- Recommendations and open questions are actionable.
Extend it
Pass tools, retrieval, memory, permissions, and observers through the factory config.
const agent = createContentStyleGuideEnforcerAgent({ 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'/** Style Guide Enforcer — v1 validated. Pain: Style drift */export interface Finding { id: string; severity: 'critical' | 'high' | 'medium' | 'low' | 'info'; message: string; source?: string; recommendation?: string }export interface AgentOutput { summary: string; findings: Finding[]; gaps: string[]; openQuestions: string[] }export interface AgentResult extends AgentOutput { requiresReview: boolean }export interface ContentStyleGuideEnforcerConfig { adapter: AdapterFactory memory?: ChatMemory observers?: Observer[] onConfirm?: (toolCall: ToolCall) => boolean | Promise<boolean> maxSteps?: number}const Output = z.object({ summary: z.string(), findings: z.array(z.object({ id: z.string(), severity: z.enum(['critical', 'high', 'medium', 'low', 'info']), message: z.string(), source: z.string().optional(), recommendation: z.string().optional(), })), gaps: z.array(z.string()).default([]), openQuestions: z.array(z.string()).default([]),})const toJson = (s: z.ZodTypeAny): JSONSchema7 => zodToJsonSchema(s) as JSONSchema7const skill = { name: 'content-style-guide-enforcer', description: "Style Guide Enforcer — typed output agent (draft spec).", systemPrompt: `You are Style Guide Enforcer. Style drift. Output: Violations typed.Actionable findings citing input sources. No invented issues.NEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.${UNTRUSTED_CONTENT_DIRECTIVE}Call submit_guide_enforcer exactly once. Stop.`, tools: ['submit_guide_enforcer'],}export function createContentStyleGuideEnforcerAgent(config: ContentStyleGuideEnforcerConfig) { const submit = (): ToolDefinition => defineZodTool({ name: 'submit_guide_enforcer', 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('content-style-guide-enforcer 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: 'content-style-guide-enforcer', run, asHandle() { return { name: 'content-style-guide-enforcer', 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: 'content-style-guide-enforcer', cases: [ { input: 'Complete input for Style Guide Enforcer: Style drift. 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.