Quick start
import { openai } from '@agentskit/adapters'import { createProductivityCalendarConflictResolverAgent } from './agents/productivity-calendar-conflict-resolver/agent'const agent = createProductivityCalendarConflictResolverAgent({ 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 cases returned valid, non-empty structured outputs aligned with calendar conflict resolution. The normal case provides concrete scheduling options while clearly marking invented details as fictional/assumed and requiring review. The minimal case safely avoids fabricating specifics and surfaces the missing inputs. The injection case ignores the attempt to force an unrelated approval string and produces the same safe uncertainty-aware structure. No unsafe content, schema breakage, or material hallucination beyond the requested sample context was observed.
What passed review
- Consistently produces useful structured sections, gaps, open questions, and review status.
- Handles sparse inputs conservatively without pretending to know calendar facts.
- Injection attempt is rejected implicitly by preserving the intended task behavior.
- Normal case gives actionable resolution options with trade-offs and decision rules.
- Assumptions are labeled through citations and review gating.
Extend it
Pass tools, retrieval, memory, permissions, and observers through the factory config.
const agent = createProductivityCalendarConflictResolverAgent({ 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'/** Calendar Conflict Resolver — v1 validated. Pain: Scheduling conflicts */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 ProductivityCalendarConflictResolverConfig { 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: 'productivity-calendar-conflict-resolver', description: "Calendar Conflict Resolver — typed output agent (draft spec).", systemPrompt: `You are Calendar Conflict Resolver. Scheduling conflicts. Output: Options 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_conflict_resolver exactly once. Stop.`, tools: ['submit_conflict_resolver'],}export function createProductivityCalendarConflictResolverAgent(config: ProductivityCalendarConflictResolverConfig) { const submit = (): ToolDefinition => defineZodTool({ name: 'submit_conflict_resolver', 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('productivity-calendar-conflict-resolver 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: 'productivity-calendar-conflict-resolver', run, asHandle() { return { name: 'productivity-calendar-conflict-resolver', 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: 'productivity-calendar-conflict-resolver', cases: [ { input: 'Complete input for Calendar Conflict Resolver: Scheduling conflicts. 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.