Portable identity
Keep an agent's name, description, model, tools, skills, tags, instructions, and runtime limits in one file.
Agent identity as code: a minimal schema and parser that defines what an agent is — name, model, tools, skills, handoff instructions, output schema, and hard runtime limits — in one human-readable Markdown file, following the SKILL.md convention.
PROFILE.md Keep an agent's name, description, model, tools, skills, tags, instructions, and runtime limits in one file.
Use PROFILE.md plus optional provider.json and output-schema.json companion files.
Pydantic enforces version 1, the ^[a-zA-Z0-9_-]+$ name pattern (max 64), required fields, and runtime limits. Unknown fields are ignored.
Load the same profile from any agent runtime, test harness, or deployment tool.
Frontmatter holds structured metadata. The Markdown body becomes the system prompt unless a system prompt is explicitly set in frontmatter.
---
version: 1
name: researcher
description: Research agent
model: deepseek:deepseek-v4-pro
tools:
- web_search
skills:
- literature-review
tags:
- research
- citations
max_llm_calls: 50
cost_limit_usd: 1.0
timeout_seconds: 300
handoff_instructions: |
Hand off open questions to the writer agent
with a short evidence summary.
provider: provider.json
output_schema: output-schema.json
---
You are a careful research agent. Cite sources, separate facts from assumptions,
and hand off unresolved questions clearly. from agentprofile import load_profile, loads_profile, dumps_profile
# From a file
profile = load_profile("./researcher/PROFILE.md")
# Or from a string you already have in memory
profile = loads_profile(profile_md_text, base_dir="./researcher")
print(profile.name, profile.version)
print(profile.max_llm_calls, profile.cost_limit_usd, profile.timeout_seconds)
print(profile.system_prompt)
# Round-trip back to PROFILE.md
markdown = dumps_profile(profile) Author PROFILE.md — YAML frontmatter for metadata, Markdown body for the system prompt.
Pydantic checks the version, the ^[a-zA-Z0-9_-]+$ name pattern, required fields, and runtime limits.
load_profile splits frontmatter from the body; the body becomes the system prompt unless frontmatter overrides it.
dumps_profile re-emits canonical PROFILE.md, dropping runtime-only fields — edit, reload, repeat.
AgentProfile is an early prototype with a validated Pydantic schema and a PROFILE.md parser. It is not yet published on PyPI and ships no command-line tool or MCP server. The format is subject to change as we learn what fields matter for multi-agent teams.
The roadmap is a bridge library — the pandoc of agent definitions — that converts between agent formats (Agent Format, Open Agent Spec, SKILL.md, ...). Feedback is welcome on GitHub.
Share feedback on GitHubPROFILE.md defines who the agent is.
Agent Skills define reusable capabilities and workflows.
ConnectKit connects user accounts and tools.
CoreMem retrieves what the agent remembers.
HybridDB stores local searchable data.
AgentProfile is a portable agent identity format: a PROFILE.md that declares an agent's name, description, model, tools, skills, tags, handoff instructions, provider, output schema, and cost limits — so any runtime can load the same agent.
name, description, model, tools, skills, tags, handoff_instructions, provider, output_schema, max_llm_calls, cost_limit_usd, and timeout_seconds — parsed from PROFILE.md by agentprofile/parser.py.
Write a PROFILE.md with the schema fields and run the parser — it validates the profile and produces a structured agent definition any runtime can consume.
AGENTS.md is guidance for coding agents working in a repo. AgentProfile is a structured, validated identity for the agent itself — with typed fields, output schemas, and hard cost and time limits.
Those package whole agent directories — tools, scripts, assets — as portable runtime artifacts. AgentProfile is the unit of identity itself: a single PROFILE.md with a validating parser and enforceable runtime limits, small enough to version control, diff, and hand off.
Yes. max_llm_calls, cost_limit_usd, and timeout_seconds are first-class fields, so runtimes can cap spend and runtime per agent.
Yes — MIT-licensed, on PyPI (pip install agentprofile), and part of the Open Assistants stack.
Python 3.11 through 3.13 (3.14 incoming). The parser is pure Python with Pydantic validation — no runtime dependencies beyond the schema layer.