Skip to content

Markdown Agent Loader ​

Load agents defined as markdown files with YAML frontmatter. Integrates with the Agent Registry so loaded agents are immediately available via getAgent() and agentTool().

Functions ​

loadAgentsFrom(dir, options?) ​

ts
async function loadAgentsFrom(
  dir: string,
  options?: LoadAgentOptions,
): Promise<void>

Read every .md file in dir, parse each one as an agent, and register it by its name frontmatter field. If agents reference {{partial:name}} placeholders, call loadPartialsFrom() first.

ts
await loadPartialsFrom('./partials');
await loadAgentsFrom('./agents', {
  tools: { 'web-fetch': new WebFetch() },
});

loadAgent(filePath, options?) ​

ts
async function loadAgent(
  filePath: string,
  options?: LoadAgentOptions,
): Promise<AgentRunner>

Load a single agent file and return an AgentRunner directly (without registering it).

ts
const runner = await loadAgent('./agents/researcher.md', {
  tools: { 'web-fetch': new WebFetch() },
});

const response = await runner.prompt('...');

parseAgent(content, options?) ​

ts
function parseAgent(
  content: string,
  options?: LoadAgentOptions,
): AgentRunner

Parse an agent from a markdown string. Useful in tests or when loading definitions from a database or CMS.

ts
const runner = parseAgent(`
---
name: assistant
model: openai/gpt-4o-mini
---
You are a helpful assistant.
`);

yamlSchemaToJsonSchema(yamlSchema) ​

ts
function yamlSchemaToJsonSchema(
  yamlSchema: Record<string, unknown>,
): JsonSchemaObject

Convert a YAML schema declaration to a JsonSchemaObject. Used internally by the loader but exported for advanced use cases.

Supports shorthand:

ts
yamlSchemaToJsonSchema({
  summary: 'string!',   // required string
  tags:    'string[]',  // optional array of strings
  score:   'number!',   // required number
});

And the full object form:

ts
yamlSchemaToJsonSchema({
  summary: { type: 'string', required: true, description: 'A short summary' },
  score:   { type: 'integer', required: true },
});

LoadAgentOptions ​

ts
interface LoadAgentOptions {
  /** Map of tool name → Tool instance for resolving tools listed in frontmatter. */
  tools?: Record<string, Tool>;
}

Frontmatter fields ​

FieldTypeDescription
namestringRequired. Registry key and display name.
modelstringModel identifier. Falls back to the global default set by configure().
toolsstring[]Tool names resolved from options.tools.
maxIterationsnumberMax iterations for the agent loop (default: 10).
temperaturenumberSampling temperature passed to the provider.
maxTokensnumberMax output tokens.
schemaobjectStructured output schema in YAML shorthand or object form.

Errors ​

MessageCause
Agent markdown must have a "name" field in frontmatter.Frontmatter is missing name.
Tool "<name>" listed in agent "<agent>" frontmatter but not provided in options.tools.A tool name in tools: has no matching entry in options.tools.
Partial "<name>" referenced in agent instructions but not registered.{{partial:name}} used before the partial was registered.

Released under the MIT License.