{"id":"support-multilang-reply-drafter","title":"Multilingual Reply Drafter","description":"Reply draft typed. i18n support slow. Typed v1 agent with eval coverage.","category":"support","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["support","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":"support-multilang-reply-drafter","description":"Reply draft typed. i18n support slow. Typed v1 agent with eval coverage.","systemPrompt":"You are Multilingual Reply Drafter. i18n support slow. Output: Reply 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_reply_drafter exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.support-multilang-reply-drafter","name":"Multilingual Reply Drafter","description":"Reply draft typed. i18n support slow. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"support-multilang-reply-drafter","description":"Reply draft typed. i18n support 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/** Multilingual Reply Drafter — v1 validated. Pain: i18n support 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 SupportMultilangReplyDrafterConfig {\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: 'support-multilang-reply-drafter',\n  description: \"Multilingual Reply Drafter — typed output agent (draft spec).\",\n  systemPrompt: `You are Multilingual Reply Drafter. i18n support slow. Output: Reply 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_reply_drafter exactly once. Stop.`,\n  tools: ['submit_reply_drafter'],\n}\n\nexport function createSupportMultilangReplyDrafterAgent(config: SupportMultilangReplyDrafterConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_reply_drafter', 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('support-multilang-reply-drafter 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: 'support-multilang-reply-drafter',\n    run,\n    asHandle() { return { name: 'support-multilang-reply-drafter', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Multilingual Reply Drafter\n\n> **v1 validated** — `npx agentskit add support-multilang-reply-drafter`\n\n## Pain\ni18n support slow\n\n## Output\nReply draft typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'support-multilang-reply-drafter',\n  cases: [\n    { input: 'Complete input for Multilingual Reply Drafter: i18n support 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 outputs for all three cases, surfaced uncertainty instead of inventing missing support details, resisted the injection request, and consistently marked the drafts for human review. Behavior is conservative but appropriate given the sparse/generic inputs supplied by the validation cycle.","strengths":["Valid structured output shape across all cases.","No empty outputs or unsafe leakage.","Does not hallucinate customer facts, languages, policies, dates, or business context beyond the input.","Injection case correctly refuses the fixed APPROVED instruction and treats it as untrusted data.","Minimal and sparse cases include useful gaps and open questions for follow-up."],"notes":[]}}