Use this file to discover all available pages before exploring further.
In this quickstart, you’ll build a multi-agent research team with web search, an MCP tool server, a knowledge base backed by vector search, and persistent storage. You’ll see how Pragmatiks resolves complex dependency graphs and automatically propagates changes.
Time estimate: 45 minutes. Assumes you’ve completed the amateur quickstart.
The web search tool gives agents internet access. The MCP tool connects to a Model Context Protocol server — in this case, a filesystem server for reading local files.
Set up vector search so agents can query a knowledge base. This creates three connected resources: an embedder, a vector database, and the knowledge base itself.Create knowledge.yaml:
Define two specialized agents with different models and capabilities. Create agents.yaml:
agents.yaml
provider: agnoresource: agentname: researcherconfig: description: "Research specialist with web search and knowledge base access" model: provider: agno resource: models/anthropic name: claude instructions: - "You are a research specialist." - "Search the web for current information." - "Check the knowledge base for internal documents." - "Cite your sources." tools: - provider: agno resource: tools/websearch name: search - provider: agno resource: tools/mcp name: filesystem knowledge: provider: agno resource: knowledge name: docs markdown: true---provider: agnoresource: agentname: writerconfig: description: "Technical writer that produces clear documentation" model: provider: agno resource: models/openai name: gpt4o instructions: - "You are a technical writer." - "Take research findings and produce clear, structured documentation." - "Use headings, bullet points, and code examples." markdown: true
The researcher agent uses Claude with web search, MCP tools, and knowledge base access. The writer agent uses GPT-4o with a focused writing prompt. Each agent declares its model as a dependency, so model changes propagate automatically.
provider: agnoresource: teamname: research-teamconfig: description: "Research team that finds information and produces documentation" members: - provider: agno resource: agent name: researcher - provider: agno resource: agent name: writer instructions: - "Coordinate research and writing tasks." - "The researcher finds information, the writer produces the final output." markdown: true
The team references both agents as dependencies in its members list. When either agent changes, the team rebuilds.
All 13 resources should reach READY state. Pragmatiks resolved the dependency graph — secrets first, then models and tools, then agents, then the team, then the runner.
This is where reactive dependencies shine. Swap the researcher’s model from Claude to GPT-4o and watch the cascade.Update agents.yaml — change the researcher’s model reference:
provider: agnoresource: agentname: researcherconfig: description: "Research specialist with web search and knowledge base access" model: provider: agno resource: models/openai name: gpt4o instructions: - "You are a research specialist." - "Search the web for current information." - "Check the knowledge base for internal documents." - "Cite your sources." tools: - provider: agno resource: tools/websearch name: search - provider: agno resource: tools/mcp name: filesystem knowledge: provider: agno resource: knowledge name: docs markdown: true
pragma resources apply agents.yaml
Now watch what happens:
pragma resources list
The researcher agent rebuilds with the new model
The research-team automatically rebuilds because its member changed
The runner redeploys because the team spec changed
You changed one line, and Pragmatiks propagated the change through three resources. No manual coordination needed.
Two mechanisms make this possible:Dependencies (Dependency[T]) link resources together. When a resource declares a dependency on another, Pragmatiks tracks the relationship. If the upstream resource changes, the dependent rebuilds.
# This declares: "my agent depends on the claude model"model: provider: agno resource: models/anthropic name: claude
Field references (Field[T]) inject specific output values from other resources. The referenced value is resolved at provisioning time and re-resolved when the source changes.
# This declares: "inject the ANTHROPIC_API_KEY output from the secret"api_key: provider: pragma resource: secret name: anthropic-key field: outputs.ANTHROPIC_API_KEY
Resources can be applied in any order. Pragmatiks holds unresolved resources in PENDING state until their dependencies are ready, then processes them automatically.