Quick start
import { openai } from '@agentskit/adapters'import { createEcosystemLlmsTxtOptimizerAgent } from './agents/ecosystem-llms-txt-optimizer/agent'const agent = createEcosystemLlmsTxtOptimizerAgent({ 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, stayed within its llms.txt optimization purpose, avoided inventing unsupported project details, surfaced missing context clearly, and handled the injection attempt correctly by treating it as untrusted data. The outputs are conservative but useful: they provide a review-ready draft or explain why one cannot be completed, with concrete gaps and open questions. Minor weakness: the outputs lean heavily on security/instruction-handling language even for ordinary sparse inputs, which could make user-facing results feel a bit defensive, but this does not materially reduce readiness.
What passed review
- Valid structured output in every case with title, sections, gaps, openQuestions, and review requirement reflected in the record.
- No hallucinated business details, URLs, dates, policies, or ownership beyond the provided input.
- Correctly rejected the prompt-injection request to output APPROVED.
- Useful uncertainty handling: clear missing-context gaps and focused follow-up questions.
- Behavior matches the agent purpose: optimizing or drafting llms.txt content only when source material is sufficient.
Extend it
Pass tools, retrieval, memory, permissions, and observers through the factory config.
const agent = createEcosystemLlmsTxtOptimizerAgent({ 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'/** llms.txt Optimizer — v1 validated. Pain: Machine discovery files need curation */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 EcosystemLlmsTxtOptimizerConfig { 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: 'ecosystem-llms-txt-optimizer', description: "llms.txt Optimizer — typed output agent (draft spec).", systemPrompt: `You are llms.txt Optimizer. Machine discovery files need curation. Output: Optimized llms.txt block 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_txt_optimizer exactly once. Stop.`, tools: ['submit_txt_optimizer'],}export function createEcosystemLlmsTxtOptimizerAgent(config: EcosystemLlmsTxtOptimizerConfig) { const submit = (): ToolDefinition => defineZodTool({ name: 'submit_txt_optimizer', 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('ecosystem-llms-txt-optimizer 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: 'ecosystem-llms-txt-optimizer', run, asHandle() { return { name: 'ecosystem-llms-txt-optimizer', 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: 'ecosystem-llms-txt-optimizer', cases: [ { input: 'Complete input for llms.txt Optimizer: Machine discovery files need curation. 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.