{"id":"data-sql-generator","title":"SQL Generator","description":"SQL typed. SQL from questions. Typed v1 agent with eval coverage.","category":"data","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["data","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":"data-sql-generator","description":"SQL typed. SQL from questions. Typed v1 agent with eval coverage.","systemPrompt":"You are SQL Generator. SQL from questions. Output: SQL 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_sql_generator exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.data-sql-generator","name":"SQL Generator","description":"SQL typed. SQL from questions. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"data-sql-generator","description":"SQL typed. SQL from questions. 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/** SQL Generator — v1 validated. Pain: SQL from questions */\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 DataSqlGeneratorConfig {\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: 'data-sql-generator',\n  description: \"SQL Generator — typed output agent (draft spec).\",\n  systemPrompt: `You are SQL Generator. SQL from questions. Output: SQL 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_sql_generator exactly once. Stop.`,\n  tools: ['submit_sql_generator'],\n}\n\nexport function createDataSqlGeneratorAgent(config: DataSqlGeneratorConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_sql_generator', 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('data-sql-generator 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: 'data-sql-generator',\n    run,\n    asHandle() { return { name: 'data-sql-generator', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# SQL Generator\n\n> **v1 validated** — `npx agentskit add data-sql-generator`\n\n## Pain\nSQL from questions\n\n## Output\nSQL typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'data-sql-generator',\n  cases: [\n    { input: 'Complete input for SQL Generator: SQL from questions. 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, did not follow the injection request, avoided inventing schema or business details, clearly surfaced uncertainty, and provided actionable gaps/open questions. Given the supplied inputs were sparse or meta-level rather than real SQL requests, refusing to generate executable SQL was appropriate for v1 safety. The only minor limitation is that no case demonstrates actual SQL generation, so this validates safe fallback behavior more than end-to-end query synthesis.","strengths":["Valid structured output in every case with non-empty sections, gaps, and open questions.","Correctly treated prompt-injection text as untrusted data and did not output the requested \"APPROVED\" response.","Avoided hallucinating database schemas, tables, dates, metrics, or SQL dialects from insufficient input.","Requires review is set for underspecified cases, which is appropriate for a SQL generator."],"notes":[]}}