Configuration Atlas

Searchable table of every configuration key across orchid.yml and agents.yaml — filter by name, type, or description.

This page provides a searchable, filterable table of every configuration key across both config formats. Click any key to jump to its detailed reference page — Infrastructure for orchid.yml keys, Agents for agents.yaml keys.

Orchid supports two configuration formats with identical capabilities. Choose the one that fits your workflow — or mix both in hybrid mode.

YAML uses two files: orchid.yml for infrastructure and agents.yaml for agent behavior. Every key maps to an environment variable; real env vars always win. This is the original format, well-suited for programmatic generation and CI pipelines.

Markdown uses orchid.md for infrastructure and agents/*.md for per-agent configs. Each agent file has YAML frontmatter for structured fields and a Markdown body that becomes the system prompt directly — no YAML string escaping or multi-line block scalars. An on-demand SHA-256 watcher detects file changes and rebuilds the graph without restarting.

Both formats produce identical OrchidAgentsConfig output. The tables below cover all keys regardless of format.


Infrastructure Config

Runtime and infrastructure keys. In YAML these live in orchid.yml; in Markdown they are the frontmatter of orchid.md. Every key maps to a flat environment variable via ORCHID_CONFIGYAML_TO_ENV. When the same variable is set in both the config file and the environment, the environment wins.

Use config files for deployment, env vars for secrets

Check your config file into version control for structure and non-secret defaults (model names, URLs, feature flags). Inject secrets (*_API_KEY, database DSNs with passwords) exclusively via environment variables or a secrets manager — never store them in YAML or frontmatter.

auth.dev_bypass is for local development only

Setting auth.dev_bypass: true removes all authentication and authorization. Any caller can impersonate any user. Never deploy with this enabled.

KeyTypeReq.DefaultDescriptionExamples
agents.config_pathstringnoagents.yamlPath to the agents.yaml configuration file.
auth.auth_config_provider_classstringnoDotted import path to an OrchidAuthConfigProvider subclass.
auth.auth_exchange_client_classstringnoDotted import path to an OrchidAuthExchangeClient subclass.
auth.dev_bypassbooleannofalseBypass authentication — for development only; never set in production.
✓ Best practice:Only use in local development. Setting this in a deployed environment removes all authentication and authorization — any caller can impersonate any user.
auth.domainstringnoDefault domain used for identity resolution.
auth.identity_resolver_classstringnoDotted import path to an OrchidIdentityResolver subclass.
auth.oauth_client_id_envstringnoName of the env var holding the public OAuth client_id.
auth.oauth_scopestringnoAdvertised OAuth scope for downstream clients.
checkpointer.dsnstringnoConnection string or file path for the LangGraph checkpointer.
checkpointer.typestringnoLangGraph state persistence backend ('memory', 'sqlite', 'postgres', or class path).
cli_rag.embedding_modelstringnoMaps to environment variable EMBEDDING_MODEL.
cli_rag.gemini_api_keystringnoMaps to environment variable GEMINI_API_KEY.
cli_rag.openai_api_keystringnoMaps to environment variable OPENAI_API_KEY.
cli_rag.qdrant_urlstringnoMaps to environment variable QDRANT_URL.
cli_rag.vector_backendstringnoMaps to environment variable VECTOR_BACKEND.
llm.anthropic_api_keystringnoAnthropic API key for Claude models.
llm.gemini_api_keystringnoGoogle AI (Gemini) API key.
llm.groq_api_keystringnoGroq API key for Groq-hosted models.
llm.modelstringnoollama/llama3.2Default LLM model in LiteLLM format (e.g. 'ollama/llama3.2', 'gemini/gemini-2.5-flash').
llm.ollama_api_basestringnoOllama server base URL for local model serving.
llm.openai_api_keystringnoOpenAI API key.
mcp_auth.client_registration_store_classstringnoorchid_ai.persistence.mcp_client_registration_sqlite.OrchidSQLiteMCPClientRegistrationStoreDotted import path to an OrchidMCPClientRegistrationStore subclass.
mcp_auth.client_registration_store_dsnstringno~/.orchid/chats.dbDatabase DSN for per-server MCP OAuth endpoints and DCR credentials.
mcp_auth.token_store_classstringnoorchid_ai.persistence.mcp_token_sqlite.OrchidSQLiteMCPTokenStoreDotted import path to an OrchidMCPTokenStore subclass.
mcp_auth.token_store_dsnstringno~/.orchid/chats.dbDatabase DSN for per-user outbound MCP OAuth tokens.
rag.embedding_modelstringnotext-embedding-3-smallEmbedding model in LiteLLM format (e.g. 'ollama/nomic-embed-text').
rag.gemini_api_keystringnoGoogle AI (Gemini) API key used by the embedding model.
rag.openai_api_keystringnoOpenAI API key used by the embedding model.
rag.qdrant_urlstringnohttp://qdrant:6333Qdrant server URL.
rag.vector_backendstringnoqdrantVector database backend — 'qdrant' is the only supported backend.
startup.hookstringnoDotted import path to a startup hook function called after graph init.
storage.classstringnoorchid_ai.persistence.sqlite.OrchidSQLiteChatStorageDotted import path to an OrchidChatStorage subclass.
✓ Best practice:The built-in `OrchidSQLiteChatStorage` is sufficient for single-process deployments (demos, CLi tools). Switch to `OrchidPostgresChatStorage` (or a custom subclass) for multi-replica API deployments where all instances must share the same chat history.
storage.dsnstringno~/.orchid/chats.dbDatabase connection string for chat persistence (SQLite path or Postgres URL).
storage.extra_migrations_packagestringnoDotted package path for consumer-supplied DB migrations.
tracing.langsmith_api_keystringnoLangSmith API key.
tracing.langsmith_projectstringnoagentsLangSmith project name.
tracing.langsmith_tracingbooleannofalseEnable LangSmith tracing for debugging and observability.
upload.chunk_overlapintno200Character overlap between consecutive chunks.
upload.chunk_sizeintno1000Text chunk size in characters for document ingestion.
upload.max_size_mbintno20Maximum upload size in megabytes.
upload.namespacestringnouploadsQdrant namespace for uploaded documents.
upload.vision_modelstringnoVision model for PDF/image OCR (e.g. 'ollama/minicpm-v').

Agent Behavior Config

Agent behavior and orchestration configuration. In YAML these live in agents.yaml; in Markdown they are individual agents/<name>.md files with YAML frontmatter + Markdown body. Validated against OrchidAgentsConfig at startup — unknown keys raise an error, so typos surface immediately. Defaults cascade: values set under defaults: apply to every agent unless overridden per-agent.

supervisor.history_summary_enabled

Enable sliding-window summarization for long-running chat sessions with token-priced LLMs. When enabled, the supervisor compresses older turns via a cheap LLM call and keeps only the most recent history_summary_recent_turns exchanges verbatim. Disable for short-form workflows or real-time pipelines where the summarization call adds latency with no benefit.

agents[].mcp_servers[].auth.mode

Default to none for local MCP servers that share the process or a private network — no credentials needed. Use passthrough when the MCP server trusts your bearer token (same identity provider). Use oauth when each user must independently authorize the MCP server; Orchid discovers everything from the server's 401 response via RFC 9728 and RFC 7591 — no client_id or client_secret lives in config.

defaults.llm.fallback_model

Always configure a fallback model in production environments. Pairing a cloud-hosted primary (e.g. gemini/gemini-2.5-flash) with a local Ollama model as a fallback ensures the service degrades gracefully during provider outages or rate-limit events rather than returning errors to users.

KeyTypeReq.DefaultDescriptionExamples
versionstringno1Schema version — only '1' is currently supported.
defaults.llm.modelstringnogemini/gemini-2.5-flashDefault LLM model for all agents (LiteLLM format).
defaults.llm.temperaturefloatno0.2Sampling temperature (0.0–1.0). Lower = more deterministic.
defaults.llm.fallback_modelstringnoModel tried automatically when the primary model fails.
✓ Best practice:Always set a fallback model in production to survive provider outages. Pair a cloud-hosted primary (e.g. `gemini/gemini-2.5-flash`) with a local Ollama model as fallback so the service degrades gracefully rather than returning errors.
defaults.llm.retry_attemptsintno0Retry count on transient LLM errors (0 = disabled).
defaults.rag.kintno5Number of chunks retrieved per RAG query.
✓ Best practice:Raise `k` for knowledge-base agents that must surface multiple relevant documents per query (e.g. catalog search, document Q&A). Lower it for precision-focused agents to keep prompts concise and reduce hallucination from noisy context.
defaults.rag.enabledbooleannotrueEnable RAG context retrieval for all agents.
defaults.rag.rag_ttlintno0Cache TTL for RAG results in seconds (0 = no cache).
defaults.rag.max_context_charsintno3000Maximum characters of RAG context injected into the system prompt.
defaults.rag.ingestion.strategystringnoDefault chunking strategy: 'recursive', 'semantic', 'hierarchical', 'headered'.
defaults.rag.ingestion.chunk_sizeintno1000Default text chunk size in characters.
defaults.rag.ingestion.chunk_overlapintno200Default character overlap between chunks.
defaults.rag.ingestion.parent_chunk_sizeintno0Parent chunk size for hierarchical chunking (0 = disabled).
defaults.rag.ingestion.parent_chunk_overlapintno200Overlap for parent chunks in hierarchical chunking.
defaults.rag.ingestion.post_processorslist[string]no[]Post-processors applied after chunking (e.g. 'contextual_headers', 'entity_extraction').
defaults.rag.retrieval.strategystringnoDefault retrieval strategy: 'simple', 'multi_query', 'hyde', 'hybrid', 'graph_rag'.
defaults.rag.retrieval.query_transformerslist[string]noOrdered list of query transformers (e.g. 'multi_query', 'hyde', 'reformulate').
defaults.rag.retrieval.metadata_filtersdict[string, any]no{}Metadata filter expressions applied to all retrievals.
defaults.rag.retrieval.exclude_dynamicbooleannofalseExclude dynamically-injected tool output from retrieval results.
defaults.rag.retrieval.hyde.n_hypotheticalintno1Number of hypothetical answers generated per HyDE query.
defaults.rag.retrieval.hybrid.sparse_encoderstringnobm25Sparse encoder for hybrid retrieval: 'bm25' or 'splade'.
defaults.rag.retrieval.hybrid.sparse_weightfloatno0.4Weight of the sparse score in linear fusion (0.0–1.0).
defaults.rag.retrieval.hybrid.fusion"rrf" | "linear"norrfFusion method for hybrid retrieval: 'rrf' (Reciprocal Rank Fusion) or 'linear'.
defaults.rag.retrieval.hybrid.rrf_kintno60RRF constant k (default 60, per Cormack et al.).
defaults.rag.retrieval.graph.enabledbooleannofalseEnable graph entity extraction and traversal for retrieval.
defaults.rag.retrieval.graph.max_hopsintno2Maximum BFS depth from seed entities during graph traversal.
defaults.rag.retrieval.graph.fuse_with_vectorsbooleannotrueMerge graph context with vector hits in the response.
defaults.rag.retrieval.graph.relation_filterlist[string]no[]Restrict graph traversal to these edge labels (empty = all).
defaults.rag.retrieval.transformer_prompts.multi_querystringnoOverride prompt for the multi-query query transformer.
defaults.rag.retrieval.transformer_prompts.hyde.singlestringnoHyDE prompt for a single hypothetical answer (n_hypothetical=1).
defaults.rag.retrieval.transformer_prompts.hyde.multistringnoHyDE prompt for multiple hypothetical answers (uses {n} placeholder).
defaults.rag.retrieval.transformer_prompts.decomposestringnoOverride prompt for the decompose query transformer.
defaults.rag.retrieval.transformer_prompts.reformulatestringnoOverride prompt for the reformulate query transformer.
defaults.cache_enabledbooleannofalseActivate a global in-memory LLM response cache (LangChain InMemoryCache). Identical prompts return cached results.
toolsdict[string, object]no{}Global built-in tool declarations, keyed by tool name.
tools[].classstringno
tools[].handlerstringnoDotted import path to the Python function implementing this tool.
tools[].descriptionstringno""Tool description shown to the LLM for invocation decisions.
tools[].parametersdict[string, object]no{}Parameter declarations for this tool (auto-extracted from Python signature when omitted).
tools[].parameters[].typestringnostringParameter type: 'string', 'int', 'float', or 'bool'.
tools[].parameters[].descriptionstringno""Human-readable parameter description.
tools[].parameters[].requiredbooleannotrueWhether this parameter must be provided.
tools[].parameters[].defaultanynoDefault value when the parameter is not provided.
tools[].inject_to_ragbooleannofalseStore this tool's results in the RAG context store.
tools[].rag_ttlintnoCache TTL for RAG-stored tool results (None = agent default).
tools[].requires_approvalbooleannofalsePause and prompt for human approval before executing (HITL).
tools[].parallel_safebooleannoDeclare the tool safe for parallel dispatch.
tools[].rag.namespacestringno""Qdrant namespace for this tool's RAG data.
tools[].rag.kintno5Number of chunks retrieved for this tool.
tools[].rag.enabledbooleannotrueEnable RAG for this tool.
tools[].rag.rag_ttlintno0RAG cache TTL for this tool in seconds.
tools[].rag.max_context_charsintnoMax RAG context characters for this tool.
tools[].rag.ingestion.strategystringnoChunking strategy for this tool.
tools[].rag.ingestion.chunk_sizeintno1000Chunk size for this tool.
tools[].rag.ingestion.chunk_overlapintno200Chunk overlap for this tool.
tools[].rag.ingestion.parent_chunk_sizeintno0Parent chunk size for hierarchical chunking.
tools[].rag.ingestion.parent_chunk_overlapintno200Parent chunk overlap.
tools[].rag.ingestion.post_processorslist[string]no[]Post-processors applied after chunking.
tools[].rag.retrieval.strategystringnoRetrieval strategy for this tool.
tools[].rag.retrieval.query_transformerslist[string]noQuery transformer chain for this tool.
tools[].rag.retrieval.metadata_filtersdict[string, any]no{}Metadata filter expressions for this tool.
tools[].rag.retrieval.exclude_dynamicbooleannofalseExclude dynamically-injected output from retrieval.
tools[].rag.retrieval.hyde.n_hypotheticalintno1Number of hypothetical answers for HyDE queries.
tools[].rag.retrieval.hybrid.sparse_encoderstringnobm25Sparse encoder for hybrid retrieval.
tools[].rag.retrieval.hybrid.sparse_weightfloatno0.4Weight of sparse score in linear fusion.
tools[].rag.retrieval.hybrid.fusion"rrf" | "linear"norrfFusion method for hybrid retrieval.
tools[].rag.retrieval.hybrid.rrf_kintno60RRF constant k.
tools[].rag.retrieval.graph.enabledbooleannofalseEnable graph-based retrieval.
tools[].rag.retrieval.graph.max_hopsintno2Maximum BFS depth for graph traversal.
tools[].rag.retrieval.graph.fuse_with_vectorsbooleannotrueMerge graph context with vector hits.
tools[].rag.retrieval.graph.relation_filterlist[string]no[]Restrict graph traversal to these edge labels.
tools[].rag.retrieval.transformer_prompts.multi_querystringnoOverride multi-query prompt for this tool.
tools[].rag.retrieval.transformer_prompts.hyde.singlestringnoHyDE single-answer prompt for this tool.
tools[].rag.retrieval.transformer_prompts.hyde.multistringnoHyDE multi-answer prompt for this tool.
tools[].rag.retrieval.transformer_prompts.decomposestringnoOverride decompose prompt for this tool.
tools[].rag.retrieval.transformer_prompts.reformulatestringnoOverride reformulate prompt for this tool.
tools[].rag.payload_indexesdict[string, string]no{}Explicit Qdrant payload index declarations for this tool.
skillsdict[string, object]no{}Orchestrator-level cross-agent skill definitions.
skills[].descriptionstringno""Human-readable skill purpose.
skills[].stepslist[object]yesOrdered list of agent invocations forming this cross-agent skill.
skills[].steps[].agentstringyesAgent name to invoke in this step.
skills[].steps[].instructionstringno""Hint passed to the invoked agent.
supervisor.assistant_namestringnoAI assistantDisplay name for the orchestrating supervisor.
supervisor.fallback_modelstringnoFallback LLM for the supervisor (overrides defaults.llm.fallback_model).
supervisor.streaming_enabledbooleannotrueEnable server-sent events (SSE) streaming for responses.
supervisor.routing_system_promptstringnoCustom system prompt for the supervisor's routing phase.
supervisor.synthesis_system_promptstringnoCustom system prompt for the synthesis phase.
supervisor.sequential_advance_promptstringnoCustom handoff prompt for sequential multi-agent flows.
supervisor.history_max_turnsintno20Maximum conversation exchange pairs retained in context.
supervisor.history_max_charsintno1000Maximum characters per message before truncation.
supervisor.routing_modelstringnoCheaper model for routing and advance phases only.
supervisor.history_summary_enabledbooleannotrueEnable sliding-window summarization to compress older turns.
✓ Best practice:Enable for long-running chats with token-priced LLMs where context accumulates over many turns. Disable for short-form workflows where keeping the full verbatim history is cheaper than the summarization LLM call.
supervisor.history_summary_modelstringnoLLM model used for context summarization (None = supervisor model).
supervisor.history_summary_recent_turnsintno10Number of recent turns kept verbatim during summarization.
supervisor.skip_synthesis_when_single_agentbooleannotrueReturn a single agent's response directly without a synthesis LLM call.
✓ Best practice:Leave enabled (default) to save 5–15 s and one LLM call on every single-agent turn. Disable only if the supervisor must always rewrite or augment the agent's raw output regardless of routing.
supervisor.memory.strategy"none" | "running_summary" | "rag_augmented"nonone
supervisor.memory.summary_recent_turnsintno10
supervisor.memory.summary_modelstringno
supervisor.memory.summary_promptstringno
supervisor.memory.persist_summarybooleannotrue
supervisor.memory.structured_outputbooleannotrue
supervisor.memory.rag_namespacestringno__memory__
supervisor.memory.rag_kintno5
supervisor.memory.rag_similarity_thresholdfloatno0.5
supervisor.memory.store_turnsbooleannotrue
supervisor.memory.truncation_strategy"hard" | "middle" | "llm" | "semantic"nohard
supervisor.memory.truncation_max_charsintno1000
guardrails.inputlist[object]no[]Guardrail rules applied to user input before any agent processes it.
guardrails.input[].typestringyesGuardrail type name (e.g. 'content_safety', 'pii_detection', 'prompt_injection').
guardrails.input[].fail_action"block" | "warn" | "redact" | "log"noblockAction on guardrail failure: 'block', 'warn', 'redact', or 'log'.
guardrails.input[].configdict[string, any]no{}Keyword arguments passed to the guardrail constructor.
guardrails.outputlist[object]no[]Guardrail rules applied to agent responses before delivery.
guardrails.output[].typestringyesGuardrail type name.
guardrails.output[].fail_action"block" | "warn" | "redact" | "log"noblockAction on guardrail failure.
guardrails.output[].configdict[string, any]no{}Keyword arguments passed to the guardrail constructor.
mcp_gateway.toolsdict[string, object]no{}Tool title/description overrides keyed by MCP tool name.
mcp_gateway.tools[].titlestringnoOverride title for the MCP tool shown to host LLMs.
mcp_gateway.tools[].descriptionstringnoOverride description for the MCP tool shown to host LLMs.
mcp_gateway.promptslist[object]no[]Pre-canned MCP Prompt templates exposed by the gateway.
mcp_gateway.prompts[].namestringyesUnique prompt handle (must match ^[a-zA-Z_][a-zA-Z0-9_-]*$).
mcp_gateway.prompts[].titlestringnoDisplay title for the prompt.
mcp_gateway.prompts[].descriptionstringnoDescription of what this prompt does.
mcp_gateway.prompts[].argumentslist[object]no[]Arguments accepted by this prompt template.
mcp_gateway.prompts[].arguments[].namestringyesArgument name (must match ^[a-zA-Z_][a-zA-Z0-9_-]*$).
mcp_gateway.prompts[].arguments[].descriptionstringnoDescription of this argument.
mcp_gateway.prompts[].arguments[].requiredbooleannofalseWhether this argument must be provided.
mcp_gateway.prompts[].templatestringyesPrompt body with {{arg_name}} placeholders.
agentsdict[string, object]no{}Map of agent name → agent configuration. Every key becomes a routable agent.
agents[].namestringno""Agent name (set automatically from the YAML dict key).
agents[].descriptionstringyesHuman-readable purpose shown to the supervisor for routing.
agents[].promptstringyesSystem prompt injected into the agent's agentic loop.
agents[].classstringnoDotted import path to a custom OrchidAgent subclass.
agents[].rag.namespacestringno""Qdrant collection namespace for this agent.
agents[].rag.kintno5Number of chunks retrieved per RAG query for this agent.
agents[].rag.enabledbooleannotrueEnable RAG for this agent.
agents[].rag.rag_ttlintno0RAG cache TTL for this agent in seconds.
agents[].rag.max_context_charsintnoMaximum RAG context characters for this agent.
agents[].rag.ingestion.strategystringnoChunking strategy for this agent.
agents[].rag.ingestion.chunk_sizeintno1000Chunk size for this agent.
agents[].rag.ingestion.chunk_overlapintno200Chunk overlap for this agent.
agents[].rag.ingestion.parent_chunk_sizeintno0Parent chunk size for hierarchical chunking (0 = disabled).
agents[].rag.ingestion.parent_chunk_overlapintno200Overlap for parent chunks.
agents[].rag.ingestion.post_processorslist[string]no[]Post-processors applied after chunking.
agents[].rag.retrieval.strategystringnoRetrieval strategy for this agent.
✓ Best practice:Start with `simple` (cosine similarity). Switch to `multi_query` when single-query retrieval misses paraphrased or ambiguous questions. Use `hyde` for domains where hypothetical answers improve recall (dense technical knowledge). Use `hybrid` to combine sparse and dense rankings when exact keyword matches matter.
agents[].rag.retrieval.query_transformerslist[string]noQuery transformer chain for this agent.
agents[].rag.retrieval.metadata_filtersdict[string, any]no{}Metadata filter expressions for this agent's retrievals.
agents[].rag.retrieval.exclude_dynamicbooleannofalseExclude dynamically-injected tool output from retrieval.
agents[].rag.retrieval.hyde.n_hypotheticalintno1Number of hypothetical answers for HyDE queries.
agents[].rag.retrieval.hybrid.sparse_encoderstringnobm25Sparse encoder: 'bm25' or 'splade'.
agents[].rag.retrieval.hybrid.sparse_weightfloatno0.4Weight of sparse score in linear fusion.
agents[].rag.retrieval.hybrid.fusion"rrf" | "linear"norrfFusion strategy: 'rrf' or 'linear'.
agents[].rag.retrieval.hybrid.rrf_kintno60RRF constant k.
agents[].rag.retrieval.graph.enabledbooleannofalseEnable graph-based retrieval.
agents[].rag.retrieval.graph.max_hopsintno2Maximum BFS depth for graph traversal.
agents[].rag.retrieval.graph.fuse_with_vectorsbooleannotrueMerge graph context with vector hits.
agents[].rag.retrieval.graph.relation_filterlist[string]no[]Restrict graph traversal to these edge labels.
agents[].rag.retrieval.transformer_prompts.multi_querystringnoOverride prompt for the multi-query transformer for this agent.
agents[].rag.retrieval.transformer_prompts.hyde.singlestringnoHyDE single-answer prompt for this agent.
agents[].rag.retrieval.transformer_prompts.hyde.multistringnoHyDE multi-answer prompt for this agent.
agents[].rag.retrieval.transformer_prompts.decomposestringnoOverride prompt for the decompose transformer for this agent.
agents[].rag.retrieval.transformer_prompts.reformulatestringnoOverride prompt for the reformulate transformer for this agent.
agents[].rag.payload_indexesdict[string, string]no{}Explicit Qdrant payload index declarations (field → schema type).
agents[].mcp_serverslist[object]no[]MCP servers this agent can call tools on.
agents[].mcp_servers[].namestringyesUnique identifier for the MCP server.
agents[].mcp_servers[].type"local" | "remote"nolocalServer type: 'local' (same host) or 'remote'.
agents[].mcp_servers[].transport"streamable_http" | "sse"nostreamable_httpTransport protocol: 'streamable_http' or 'sse'.
agents[].mcp_servers[].urlstringyesMCP server URL. Supports ${ENV_VAR} interpolation.
agents[].mcp_servers[].auth.mode"none" | "passthrough" | "oauth"nononeAuth mode: 'none', 'passthrough', or 'oauth'.
✓ Best practice:Default to `none` for local MCP servers that need no credentials. Use `passthrough` when the MCP server shares the same identity provider as your API — it forwards the graph bearer token unchanged. Use `oauth` when each user must independently authorize the MCP server; Orchid handles RFC 9728 discovery and RFC 7591 dynamic client registration automatically.
agents[].mcp_servers[].toolslist[object]no[]MCP tools this agent is allowed to call on this server.
agents[].mcp_servers[].tools[].namestringyesMCP tool name to allow.
agents[].mcp_servers[].tools[].argumentsdict[string, any]no{}Default arguments passed to this tool.
agents[].mcp_servers[].tools[].inject_to_ragbooleannofalseStore this tool's results in the RAG context store.
agents[].mcp_servers[].tools[].rag_ttlintnoPer-tool RAG cache TTL (None = agent default).
agents[].mcp_servers[].tools[].requires_approvalbooleannofalseRequire human approval before this tool executes (HITL).
agents[].mcp_servers[].tools[].parallel_safebooleannoOverride parallel-safety for this tool.
agents[].mcp_servers[].tools[].rag.namespacestringno""Qdrant namespace for this tool's RAG data.
agents[].mcp_servers[].tools[].rag.kintno5Number of chunks retrieved for this tool.
agents[].mcp_servers[].tools[].rag.enabledbooleannotrueEnable RAG for this tool.
agents[].mcp_servers[].tools[].rag.rag_ttlintno0RAG cache TTL for this tool.
agents[].mcp_servers[].tools[].rag.max_context_charsintnoMax RAG context characters for this tool.
agents[].mcp_servers[].tools[].rag.ingestion.strategystringnoChunking strategy for this tool.
agents[].mcp_servers[].tools[].rag.ingestion.chunk_sizeintno1000Chunk size for this tool.
agents[].mcp_servers[].tools[].rag.ingestion.chunk_overlapintno200Chunk overlap for this tool.
agents[].mcp_servers[].tools[].rag.ingestion.parent_chunk_sizeintno0Parent chunk size for this tool.
agents[].mcp_servers[].tools[].rag.ingestion.parent_chunk_overlapintno200Parent chunk overlap for this tool.
agents[].mcp_servers[].tools[].rag.ingestion.post_processorslist[string]no[]Post-processors for this tool.
agents[].mcp_servers[].tools[].rag.retrieval.strategystringnoRetrieval strategy for this tool.
agents[].mcp_servers[].tools[].rag.retrieval.query_transformerslist[string]noQuery transformers for this tool.
agents[].mcp_servers[].tools[].rag.retrieval.metadata_filtersdict[string, any]no{}Metadata filters for this tool.
agents[].mcp_servers[].tools[].rag.retrieval.exclude_dynamicbooleannofalseExclude dynamic output from retrieval.
agents[].mcp_servers[].tools[].rag.retrieval.hyde.n_hypotheticalintno1HyDE hypothetical answer count.
agents[].mcp_servers[].tools[].rag.retrieval.hybrid.sparse_encoderstringnobm25Sparse encoder for hybrid retrieval.
agents[].mcp_servers[].tools[].rag.retrieval.hybrid.sparse_weightfloatno0.4Sparse weight for linear fusion.
agents[].mcp_servers[].tools[].rag.retrieval.hybrid.fusion"rrf" | "linear"norrfFusion method.
agents[].mcp_servers[].tools[].rag.retrieval.hybrid.rrf_kintno60RRF constant k.
agents[].mcp_servers[].tools[].rag.retrieval.graph.enabledbooleannofalseEnable graph retrieval.
agents[].mcp_servers[].tools[].rag.retrieval.graph.max_hopsintno2Graph traversal depth.
agents[].mcp_servers[].tools[].rag.retrieval.graph.fuse_with_vectorsbooleannotrueMerge graph with vector hits.
agents[].mcp_servers[].tools[].rag.retrieval.graph.relation_filterlist[string]no[]Edge label filter.
agents[].mcp_servers[].tools[].rag.retrieval.transformer_prompts.multi_querystringnoOverride multi-query prompt.
agents[].mcp_servers[].tools[].rag.retrieval.transformer_prompts.decomposestringnoOverride decompose prompt.
agents[].mcp_servers[].tools[].rag.retrieval.transformer_prompts.reformulatestringnoOverride reformulate prompt.
agents[].mcp_servers[].tools[].rag.payload_indexesdict[string, string]no{}Qdrant payload index declarations.
agents[].mcp_servers[].promptslist[string]no[]MCP prompt names to load ('*' = discover all).
agents[].mcp_servers[].resourceslist[string]no[]MCP resource URIs to load ('*' = discover all).
agents[].mcp_servers[].tool_call_strategystringnoallHow tools are dispatched: 'all', 'sequential', 'llm_decides'.
agents[].mcp_servers[].discover_all_toolsbooleannofalseDiscover all tools from the server at runtime.
agents[].mcp_servers[].discover_all_promptsbooleannofalseDiscover all prompts from the server at runtime.
agents[].mcp_servers[].discover_all_resourcesbooleannofalseDiscover all resources from the server at runtime.
agents[].llm.modelstringnogemini/gemini-2.5-flashPer-agent LLM model override.
agents[].llm.temperaturefloatno0.2Per-agent sampling temperature.
agents[].llm.fallback_modelstringnoPer-agent fallback model.
agents[].llm.retry_attemptsintno0Per-agent retry count on transient errors.
agents[].execution_hints.parallel_safebooleannotrueMark this agent safe to run in parallel with other agents.
agents[].toolslist[string]no[]Built-in tool names available to this agent (must match keys in top-level tools:).
agents[].skillsdict[string, object]no{}Per-agent skill definitions (multi-step workflows within this agent).
agents[].skills[].descriptionstringno""Human-readable skill description.
agents[].skills[].stepslist[object]yesOrdered steps: tool calls or agent invocations.
agents[].skills[].steps[].toolstringnoTool name (MCP tool or built-in) for this step.
agents[].skills[].steps[].sourcestringnoMCP server name, 'builtin', or None (= builtin).
agents[].skills[].steps[].argumentsdict[string, any]no{}Static arguments for this tool call.
agents[].skills[].steps[].agentstringnoAgent name to invoke directly (bypasses supervisor).
agents[].skills[].steps[].instructionstringno""Query/instruction sent to the invoked agent.
agents[].guardrails.inputlist[object]no[]Per-agent input guardrail rules.
agents[].guardrails.input[].typestringyesGuardrail type name.
agents[].guardrails.input[].fail_action"block" | "warn" | "redact" | "log"noblockAction on guardrail failure.
agents[].guardrails.input[].configdict[string, any]no{}Guardrail constructor kwargs.
agents[].guardrails.outputlist[object]no[]Per-agent output guardrail rules.
agents[].guardrails.output[].typestringyesGuardrail type name.
agents[].guardrails.output[].fail_action"block" | "warn" | "redact" | "log"noblockAction on guardrail failure.
agents[].guardrails.output[].configdict[string, any]no{}Guardrail constructor kwargs.
agents[].childrendict[string, object]noSub-agent configurations nested under this agent.
agents[].children[].namestringno""Agent name (set automatically from the YAML dict key).
agents[].children[].descriptionstringyesHuman-readable purpose shown to the supervisor for routing.
agents[].children[].promptstringyesSystem prompt injected into the agent's agentic loop.
agents[].children[].classstringnoDotted import path to a custom OrchidAgent subclass.
agents[].children[].rag.namespacestringno""Qdrant collection namespace for this agent.
agents[].children[].rag.kintno5Number of chunks retrieved per RAG query for this agent.
agents[].children[].rag.enabledbooleannotrueEnable RAG for this agent.
agents[].children[].rag.rag_ttlintno0RAG cache TTL for this agent in seconds.
agents[].children[].rag.max_context_charsintnoMaximum RAG context characters for this agent.
agents[].children[].rag.ingestion.strategystringnoChunking strategy for this agent.
agents[].children[].rag.ingestion.chunk_sizeintno1000Chunk size for this agent.
agents[].children[].rag.ingestion.chunk_overlapintno200Chunk overlap for this agent.
agents[].children[].rag.ingestion.parent_chunk_sizeintno0Parent chunk size for hierarchical chunking (0 = disabled).
agents[].children[].rag.ingestion.parent_chunk_overlapintno200Overlap for parent chunks.
agents[].children[].rag.ingestion.post_processorslist[string]no[]Post-processors applied after chunking.
agents[].children[].rag.retrieval.strategystringnoRetrieval strategy for this agent.
agents[].children[].rag.retrieval.query_transformerslist[string]noQuery transformer chain for this agent.
agents[].children[].rag.retrieval.metadata_filtersdict[string, any]no{}Metadata filter expressions for this agent's retrievals.
agents[].children[].rag.retrieval.exclude_dynamicbooleannofalseExclude dynamically-injected tool output from retrieval.
agents[].children[].rag.retrieval.hyde.n_hypotheticalintno1Number of hypothetical answers for HyDE queries.
agents[].children[].rag.retrieval.hybrid.sparse_encoderstringnobm25Sparse encoder: 'bm25' or 'splade'.
agents[].children[].rag.retrieval.hybrid.sparse_weightfloatno0.4Weight of sparse score in linear fusion.
agents[].children[].rag.retrieval.hybrid.fusion"rrf" | "linear"norrfFusion strategy: 'rrf' or 'linear'.
agents[].children[].rag.retrieval.hybrid.rrf_kintno60RRF constant k.
agents[].children[].rag.retrieval.graph.enabledbooleannofalseEnable graph-based retrieval.
agents[].children[].rag.retrieval.graph.max_hopsintno2Maximum BFS depth for graph traversal.
agents[].children[].rag.retrieval.graph.fuse_with_vectorsbooleannotrueMerge graph context with vector hits.
agents[].children[].rag.retrieval.graph.relation_filterlist[string]no[]Restrict graph traversal to these edge labels.
agents[].children[].rag.retrieval.transformer_prompts.multi_querystringnoOverride prompt for the multi-query transformer for this agent.
agents[].children[].rag.retrieval.transformer_prompts.hyde.singlestringnoHyDE single-answer prompt for this agent.
agents[].children[].rag.retrieval.transformer_prompts.hyde.multistringnoHyDE multi-answer prompt for this agent.
agents[].children[].rag.retrieval.transformer_prompts.decomposestringnoOverride prompt for the decompose transformer for this agent.
agents[].children[].rag.retrieval.transformer_prompts.reformulatestringnoOverride prompt for the reformulate transformer for this agent.
agents[].children[].rag.payload_indexesdict[string, string]no{}Explicit Qdrant payload index declarations (field → schema type).
agents[].children[].mcp_serverslist[object]no[]MCP servers this agent can call tools on.
agents[].children[].mcp_servers[].namestringyesUnique identifier for the MCP server.
agents[].children[].mcp_servers[].type"local" | "remote"nolocalServer type: 'local' (same host) or 'remote'.
agents[].children[].mcp_servers[].transport"streamable_http" | "sse"nostreamable_httpTransport protocol: 'streamable_http' or 'sse'.
agents[].children[].mcp_servers[].urlstringyesMCP server URL. Supports ${ENV_VAR} interpolation.
agents[].children[].mcp_servers[].auth.mode"none" | "passthrough" | "oauth"nononeAuth mode: 'none', 'passthrough', or 'oauth'.
agents[].children[].mcp_servers[].toolslist[object]no[]MCP tools this agent is allowed to call on this server.
agents[].children[].mcp_servers[].tools[].namestringyesMCP tool name to allow.
agents[].children[].mcp_servers[].tools[].argumentsdict[string, any]no{}Default arguments passed to this tool.
agents[].children[].mcp_servers[].tools[].inject_to_ragbooleannofalseStore this tool's results in the RAG context store.
agents[].children[].mcp_servers[].tools[].rag_ttlintnoPer-tool RAG cache TTL (None = agent default).
agents[].children[].mcp_servers[].tools[].requires_approvalbooleannofalseRequire human approval before this tool executes (HITL).
agents[].children[].mcp_servers[].tools[].parallel_safebooleannoOverride parallel-safety for this tool.
agents[].children[].mcp_servers[].tools[].rag.namespacestringno""Qdrant namespace for this tool's RAG data.
agents[].children[].mcp_servers[].tools[].rag.kintno5Number of chunks retrieved for this tool.
agents[].children[].mcp_servers[].tools[].rag.enabledbooleannotrueEnable RAG for this tool.
agents[].children[].mcp_servers[].tools[].rag.rag_ttlintno0RAG cache TTL for this tool.
agents[].children[].mcp_servers[].tools[].rag.max_context_charsintnoMax RAG context characters for this tool.
agents[].children[].mcp_servers[].tools[].rag.ingestion.strategystringnoChunking strategy for this tool.
agents[].children[].mcp_servers[].tools[].rag.ingestion.chunk_sizeintno1000Chunk size for this tool.
agents[].children[].mcp_servers[].tools[].rag.ingestion.chunk_overlapintno200Chunk overlap for this tool.
agents[].children[].mcp_servers[].tools[].rag.ingestion.parent_chunk_sizeintno0Parent chunk size for this tool.
agents[].children[].mcp_servers[].tools[].rag.ingestion.parent_chunk_overlapintno200Parent chunk overlap for this tool.
agents[].children[].mcp_servers[].tools[].rag.ingestion.post_processorslist[string]no[]Post-processors for this tool.
agents[].children[].mcp_servers[].tools[].rag.retrieval.strategystringnoRetrieval strategy for this tool.
agents[].children[].mcp_servers[].tools[].rag.retrieval.query_transformerslist[string]noQuery transformers for this tool.
agents[].children[].mcp_servers[].tools[].rag.retrieval.metadata_filtersdict[string, any]no{}Metadata filters for this tool.
agents[].children[].mcp_servers[].tools[].rag.retrieval.exclude_dynamicbooleannofalseExclude dynamic output from retrieval.
agents[].children[].mcp_servers[].tools[].rag.payload_indexesdict[string, string]no{}Qdrant payload index declarations.
agents[].children[].mcp_servers[].promptslist[string]no[]MCP prompt names to load ('*' = discover all).
agents[].children[].mcp_servers[].resourceslist[string]no[]MCP resource URIs to load ('*' = discover all).
agents[].children[].mcp_servers[].tool_call_strategystringnoallHow tools are dispatched: 'all', 'sequential', 'llm_decides'.
agents[].children[].mcp_servers[].discover_all_toolsbooleannofalseDiscover all tools from the server at runtime.
agents[].children[].mcp_servers[].discover_all_promptsbooleannofalseDiscover all prompts from the server at runtime.
agents[].children[].mcp_servers[].discover_all_resourcesbooleannofalseDiscover all resources from the server at runtime.
agents[].children[].llm.modelstringnogemini/gemini-2.5-flashPer-agent LLM model override.
agents[].children[].llm.temperaturefloatno0.2Per-agent sampling temperature.
agents[].children[].llm.fallback_modelstringnoPer-agent fallback model.
agents[].children[].llm.retry_attemptsintno0Per-agent retry count on transient errors.
agents[].children[].execution_hints.parallel_safebooleannotrueMark this agent safe to run in parallel with other agents.
agents[].children[].toolslist[string]no[]Built-in tool names available to this agent (must match keys in top-level tools:).
agents[].children[].skillsdict[string, object]no{}Per-agent skill definitions (multi-step workflows within this agent).
agents[].children[].skills[].descriptionstringno""Human-readable skill description.
agents[].children[].skills[].stepslist[object]yesOrdered steps: tool calls or agent invocations.
agents[].children[].skills[].steps[].toolstringnoTool name (MCP tool or built-in) for this step.
agents[].children[].skills[].steps[].sourcestringnoMCP server name, 'builtin', or None (= builtin).
agents[].children[].skills[].steps[].argumentsdict[string, any]no{}Static arguments for this tool call.
agents[].children[].skills[].steps[].agentstringnoAgent name to invoke directly (bypasses supervisor).
agents[].children[].skills[].steps[].instructionstringno""Query/instruction sent to the invoked agent.
agents[].children[].guardrails.inputlist[object]no[]Per-agent input guardrail rules.
agents[].children[].guardrails.input[].typestringyesGuardrail type name.
agents[].children[].guardrails.input[].fail_action"block" | "warn" | "redact" | "log"noblockAction on guardrail failure.
agents[].children[].guardrails.input[].configdict[string, any]no{}Guardrail constructor kwargs.
agents[].children[].guardrails.outputlist[object]no[]Per-agent output guardrail rules.
agents[].children[].guardrails.output[].typestringyesGuardrail type name.
agents[].children[].guardrails.output[].fail_action"block" | "warn" | "redact" | "log"noblockAction on guardrail failure.
agents[].children[].guardrails.output[].configdict[string, any]no{}Guardrail constructor kwargs.
agents[].children[].parallel_toolsbooleannofalseDispatch independent read-only tool calls in parallel within one turn.
agents[].children[].max_tool_roundsintno15
agents[].children[].max_consecutive_dupesintno2
agents[].children[].max_skill_depthintno3
agents[].children[].mini_agent.enabledbooleannofalseEnable the mini-agent (self-clone) decomposition pattern.
agents[].children[].mini_agent.max_countintno3Maximum number of parallel mini-agents (2–8).
agents[].children[].mini_agent.decomposer_modelstringnoLLM model for the mini-agent decomposer (None = agent model).
agents[].children[].mini_agent.timeout_secondsintno60Per-mini-agent timeout in seconds.
agents[].children[].mini_agent.tool_allowlist_mode"strict" | "parent_full" | "inferred"nostrictTool exposure mode: 'strict', 'parent_full', or 'inferred'.
agents[].children[].mini_agent.stream_inner_tokensbooleannofalseStream individual mini-agent tokens to the SSE endpoint.
agents[].children[].mini_agent.decomposer_promptstringnoCustom prompt for the decomposer step.
agents[].children[].mini_agent.aggregator_promptstringnoCustom prompt for the aggregator step.
agents[].children[].mini_agent.system_prompt_templatestringnoTemplate for each mini's system prompt ({parent_prompt}, {instruction}, {tool_list}).
agents[].children[].prompt_sections.prior_results_headerstringno --- Previous Tool Results (from prior turns) ---Header shown before the prior tool-results JSON block.
agents[].children[].prompt_sections.mcp_prompt_templatestringno --- MCP Prompt: {name} --- {text}Template for rendered MCP prompts.
agents[].children[].prompt_sections.skipped_prompt_templatestringno [Available prompt: {name}] {description} (requires: {required_args})Template for MCP prompts that require arguments (shown as available, not rendered).
agents[].children[].prompt_sections.resources_headerstringno --- Available Resources ---Header shown before the MCP resources block.
agents[].children[].prompt_sections.resource_templatestringno [{name}] {content}Template for each MCP resource body.
agents[].children[].prompt_sections.rag_headerstringno --- Background Knowledge (RAG) ---Header shown before the RAG context block.
agents[].children[].prompt_sections.prior_results_max_charsintno4000Character cap on the prior tool-results JSON block.
agents[].children[].prompt_sections.resource_max_charsintno2000Character cap per MCP resource body.
agents[].children[].prompt_sections.summarise_history_reminderstringno IMPORTANT: The conversation history below shows prior exchanges. Always focus on the user's LATEST message and its relationship to the most recent topic. Do NOT change topic or introduce unrelated content unless the user explicitly asks for something new.Reminder block appended to the summarise system prompt when conversation history is present.
agents[].children[].prompt_sections.summarise_prior_results_headerstringno --- Previous Tool Results (from prior turns) --- Header for prior-turn tool results in the summarise system prompt.
agents[].children[].prompt_sections.summarise_rag_section_headerstringnoBackground knowledge (from RAG): Header for the RAG block in the summarise user message.
agents[].children[].prompt_sections.summarise_user_templatestringnoUser query: {query} {rag_section}Live data (from API): {mcp_data}User-content template for the summarise call ({query}, {rag_section}, {mcp_data}).
agents[].children[].prompt_sections.summarise_prior_results_max_charsintno4000Max characters of prior-tool-results JSON in the summarise prompt.
agents[].children[].prompt_sections.summary_compression_system_promptstringnoYou are a conversation summarizer that produces structured summaries. Output ONLY valid JSON with this schema: { "topics": ["topic1", "topic2"], "entities": [ {"name": "entity_name", "type": "person|product|concept|other", "details": "key information"} ], "actions_taken": ["action1", "action2"], "decisions": ["decision1"], "open_questions": ["question1"], "user_preferences": ["preference1"], "narrative": "A brief prose summary of the conversation flow (2-3 sentences)", "covered_turns": 5 } Be factual and concise. Extract all entities, topics, and decisions mentioned.
agents[].children[].prompt_sections.summary_compression_user_promptstringnoSummarise the following conversation excerpt in structured JSON format. Focus on: (1) the key topics discussed, (2) any entities or names mentioned, (3) actions taken or decisions made, (4) any outstanding questions. Be factual and concise. {transcript}
agents[].children[].prompt_sections.summary_extension_system_promptstringnoYou are a conversation summarizer that produces structured summaries. You have an existing summary and new messages to incorporate. Update the summary to reflect new information, remove contradicted facts, and merge duplicate entities. Output ONLY valid JSON with this schema: { "topics": ["topic1", "topic2"], "entities": [ {"name": "entity_name", "type": "person|product|concept|other", "details": "key information"} ], "actions_taken": ["action1", "action2"], "decisions": ["decision1"], "open_questions": ["question1"], "user_preferences": ["preference1"], "narrative": "A brief prose summary of the conversation flow (2-3 sentences)", "covered_turns": 5 }
agents[].children[].prompt_sections.summary_extension_user_promptstringnoGiven the existing summary below and the new conversation messages, produce an updated summary that incorporates all new information. Existing summary: {existing_summary} New messages: {new_messages}
agents[].children[].prompt_sections.summary_narrative_fallback_promptstringnoSummarise the following conversation excerpt in 2-4 sentences. Focus on: (1) the key topics discussed, (2) any entities or names mentioned, (3) actions taken or decisions made, (4) any outstanding questions. Be factual and concise. {transcript}
agents[].parallel_toolsbooleannofalseDispatch independent read-only tool calls in parallel within one turn.
✓ Best practice:Enable when an agent consistently makes multiple independent read-only tool calls per turn (e.g. fetching several data sources in one round). Keep disabled for write operations or any tool chain where order guarantees matter — parallel dispatch removes sequencing.
agents[].max_tool_roundsintno15
agents[].max_consecutive_dupesintno2
agents[].max_skill_depthintno3
agents[].mini_agent.enabledbooleannofalseEnable the mini-agent (self-clone) decomposition pattern.
✓ Best practice:Enable when a single complex user request can be decomposed into independent sub-tasks that do not share state. The decomposer adds one extra LLM call per turn; only opt in when the parallelism speedup outweighs that cost. Nesting is not supported — only top-level agents can enable mini-agents.
agents[].mini_agent.max_countintno3Maximum number of parallel mini-agents (2–8).
agents[].mini_agent.decomposer_modelstringnoLLM model for the mini-agent decomposer (None = agent model).
agents[].mini_agent.timeout_secondsintno60Per-mini-agent timeout in seconds.
agents[].mini_agent.tool_allowlist_mode"strict" | "parent_full" | "inferred"nostrictTool exposure mode: 'strict', 'parent_full', or 'inferred'.
agents[].mini_agent.stream_inner_tokensbooleannofalseStream individual mini-agent tokens to the SSE endpoint.
agents[].mini_agent.decomposer_promptstringnoCustom prompt for the decomposer step.
agents[].mini_agent.aggregator_promptstringnoCustom prompt for the aggregator step.
agents[].mini_agent.system_prompt_templatestringnoTemplate for each mini's system prompt ({parent_prompt}, {instruction}, {tool_list}).
agents[].prompt_sections.prior_results_headerstringno --- Previous Tool Results (from prior turns) ---Header shown before the prior tool-results JSON block.
agents[].prompt_sections.mcp_prompt_templatestringno --- MCP Prompt: {name} --- {text}Template for rendered MCP prompts.
agents[].prompt_sections.skipped_prompt_templatestringno [Available prompt: {name}] {description} (requires: {required_args})Template for MCP prompts that require arguments (shown as available, not rendered).
agents[].prompt_sections.resources_headerstringno --- Available Resources ---Header shown before the MCP resources block.
agents[].prompt_sections.resource_templatestringno [{name}] {content}Template for each MCP resource body.
agents[].prompt_sections.rag_headerstringno --- Background Knowledge (RAG) ---Header shown before the RAG context block.
agents[].prompt_sections.prior_results_max_charsintno4000Character cap on the prior tool-results JSON block.
agents[].prompt_sections.resource_max_charsintno2000Character cap per MCP resource body.
agents[].prompt_sections.summarise_history_reminderstringno IMPORTANT: The conversation history below shows prior exchanges. Always focus on the user's LATEST message and its relationship to the most recent topic. Do NOT change topic or introduce unrelated content unless the user explicitly asks for something new.Reminder block appended to the summarise system prompt when conversation history is present.
agents[].prompt_sections.summarise_prior_results_headerstringno --- Previous Tool Results (from prior turns) --- Header for prior-turn tool results in the summarise system prompt.
agents[].prompt_sections.summarise_rag_section_headerstringnoBackground knowledge (from RAG): Header for the RAG block in the summarise user message.
agents[].prompt_sections.summarise_user_templatestringnoUser query: {query} {rag_section}Live data (from API): {mcp_data}User-content template for the summarise call ({query}, {rag_section}, {mcp_data}).
agents[].prompt_sections.summarise_prior_results_max_charsintno4000Max characters of prior-tool-results JSON in the summarise prompt.
agents[].prompt_sections.summary_compression_system_promptstringnoYou are a conversation summarizer that produces structured summaries. Output ONLY valid JSON with this schema: { "topics": ["topic1", "topic2"], "entities": [ {"name": "entity_name", "type": "person|product|concept|other", "details": "key information"} ], "actions_taken": ["action1", "action2"], "decisions": ["decision1"], "open_questions": ["question1"], "user_preferences": ["preference1"], "narrative": "A brief prose summary of the conversation flow (2-3 sentences)", "covered_turns": 5 } Be factual and concise. Extract all entities, topics, and decisions mentioned.
agents[].prompt_sections.summary_compression_user_promptstringnoSummarise the following conversation excerpt in structured JSON format. Focus on: (1) the key topics discussed, (2) any entities or names mentioned, (3) actions taken or decisions made, (4) any outstanding questions. Be factual and concise. {transcript}
agents[].prompt_sections.summary_extension_system_promptstringnoYou are a conversation summarizer that produces structured summaries. You have an existing summary and new messages to incorporate. Update the summary to reflect new information, remove contradicted facts, and merge duplicate entities. Output ONLY valid JSON with this schema: { "topics": ["topic1", "topic2"], "entities": [ {"name": "entity_name", "type": "person|product|concept|other", "details": "key information"} ], "actions_taken": ["action1", "action2"], "decisions": ["decision1"], "open_questions": ["question1"], "user_preferences": ["preference1"], "narrative": "A brief prose summary of the conversation flow (2-3 sentences)", "covered_turns": 5 }
agents[].prompt_sections.summary_extension_user_promptstringnoGiven the existing summary below and the new conversation messages, produce an updated summary that incorporates all new information. Existing summary: {existing_summary} New messages: {new_messages}
agents[].prompt_sections.summary_narrative_fallback_promptstringnoSummarise the following conversation excerpt in 2-4 sentences. Focus on: (1) the key topics discussed, (2) any entities or names mentioned, (3) actions taken or decisions made, (4) any outstanding questions. Be factual and concise. {transcript}
allowed_passthrough_hostslist[string]no[]
events.enabledbooleannofalseEnable the Pollen + Bloom event-driven activation layer.
events.store.classstringyesDotted import path for the event store backend.
events.store.extra_argsdictno{}Additional keyword arguments for the store constructor.
events.queue.classstringyesDotted import path for the queue backend.
events.queue.notify_enabledbooleannotrueEnable queue notifications.
events.queue.poll_interval_msintno200Queue poll interval in milliseconds (min 10).
events.queue.lease_secondsintno30Message lease duration in seconds (min 1).
events.queue.max_attemptsintno5Maximum processing attempts per message (min 1).
events.queue.dead_letter_tablestringnosignal_queue_dead_letterDatabase table name for dead-letter messages.
events.scheduler.classstringyesDotted import path for the scheduler backend.
events.scheduler.extra_argsdictno{}Additional keyword arguments for the scheduler constructor.
events.producerslist[object]no[]List of signal producer configurations.
events.producers[].classstringyesDotted import path for the producer.
events.producers[].extra_argsdictno{}Additional keyword arguments for the producer constructor.
events.processorslist[object]no[]List of signal processor / worker-pool configurations.
events.processors[].classstringyesDotted import path for the processor.
events.processors[].concurrencyintno4Number of concurrent worker tasks (min 1).
events.processors[].poll_interval_msintno200Processor poll interval in milliseconds (min 10).
events.processors[].lease_secondsintno30Message lease duration in seconds (min 1).
events.processors[].max_attemptsintno5Maximum processing attempts (min 1).
events.processors[].drain_timeout_secondsfloatno10Seconds to wait for in-flight messages during shutdown.
events.middlewarelist[object]no[]Processing middleware applied to signals.
events.middleware[].classstringyesDotted import path for the middleware.
events.middleware[].extra_argsdictno{}Additional keyword arguments for the middleware constructor.
events.ingestion.sourceslist[object]no[]Registered webhook sources.
events.ingestion.sources[].idstringyesUnique source identifier.
events.ingestion.sources[].validator.classstringyesDotted import path for the validator class (HMAC, bearer, mTLS, etc.).
events.ingestion.sources[].validator.secret_refstringnoSecret reference for the validator (e.g. HMAC key).
events.ingestion.sources[].validator.extra_argsdictno{}Additional keyword arguments for the validator.
events.ingestion.sources[].allowed_typeslist[string]no[]Signal types accepted from this source.
events.scheduleslist[object]no[]Cron/interval schedule definitions.
events.schedules[].idstringyesUnique schedule identifier.
events.schedules[].cronstringnoCron expression (e.g. '0 7 * * 1-5' for weekday 07:00 UTC). Mutually exclusive with interval_seconds.
events.schedules[].interval_secondsintnoInterval between runs in seconds. Mutually exclusive with cron.
events.schedules[].trigger_idstringyesID of the trigger this schedule fires (must reference a trigger with signal: cron).
events.schedules[].identityobject | object | objectyesIdentity claim for the scheduled run.
events.schedules[].enabledbooleannotrueWhether this schedule is active.
events.triggerslist[object]no[]Trigger definitions that map signals to agent activations.
events.triggers[].idstringyesUnique trigger identifier.
events.triggers[].on.signalstringyesSignal name to match ('cron' reserved for time-driven triggers).
events.triggers[].on.cronstringnoCron expression (required when signal='cron', rejected otherwise).
events.triggers[].on.whenstringnoJMESPath boolean expression for conditional matching.
events.triggers[].emits.agentstringyesAgent to activate when this trigger fires.
events.triggers[].emits.prompt_templatestringyesPrompt template sent to the agent at activation.
events.triggers[].emits.identityobject | object | objectyesIdentity claim for the triggered run.
events.triggers[].emits.respect_chat_bindingbooleannofalseRespect chat_binding from the signal envelope (requires non-service-account identity).
events.triggers[].emits.proactive_chatbooleannofalseCreate a new chat for the resolved user (requires non-service-account identity).
events.triggers[].emits.visibility"actor" | "addressed" | "tenant" | "admin"noVisibility override: 'actor', 'addressed', 'tenant', 'admin'.
events.triggers[].retry.maxintno0Maximum retry attempts (0 = no retry).
events.triggers[].retry.backoff"fixed" | "linear" | "exponential"noexponentialRetry backoff strategy: 'fixed', 'linear', or 'exponential'.
events.triggers[].retry.jitterbooleannotrueAdd jitter to backoff timing.
events.triggers[].retry.initial_delay_secondsfloatno1Initial delay before first retry (seconds).
events.triggers[].retry.max_delay_secondsfloatno300Maximum delay between retries (seconds).
events.triggers[].parallelism"per_user" | "per_tenant" | "unbounded"noper_userParallelism mode: 'per_user', 'per_tenant', or 'unbounded'.
config_storage.enabledbooleannofalseEnable database-backed agent configuration store (PostgreSQL CRUD for agent definitions).
config_storage.classstringno""Dotted import path to an OrchidConfigStorage subclass for agent config persistence.
config_storage.dsnstringno""Database connection string for agent config storage (PostgreSQL URL).

Load Modes

ModeRoot FileAgent ConfigsDetection
YAMLorchid.ymlagents.yaml.yml or .yaml extension
MDorchid.mdagents/*.md.md extension
Hybridorchid.ymlagents/*.mdAGENTS_CONFIG_PATH points to a directory

YAML Mode

ORCHID_CONFIG=orchid.yml uvicorn orchid_api.main:app

MD Mode

ORCHID_CONFIG=orchid.md uvicorn orchid_api.main:app

Hybrid Mode

Keep orchid.yml for infrastructure while using agents/*.md for agents:

ORCHID_CONFIG=orchid.yml AGENTS_CONFIG_PATH=agents/ uvicorn orchid_api.main:app

Hot-Reload (MD Only)

The on-demand config watcher detects file changes via SHA-256 hashing — no background threads, no fs-notify libraries.

  • The OrchidConfigWatcher tracks orchid.md + agents/*.md by their current hashes.
  • Orchid.reload_config() calls watcher.reload_if_changed() and rebuilds the LangGraph when a change is detected.
  • Graph rebuild is serialised via asyncio.Lock — existing requests complete with the old config.
  • The API middleware (ConfigReloadMiddleware) polls the watcher at most every ORCHID_RELOAD_INTERVAL seconds (default 30, set to 0 to disable).
# Enable hot-reload with 10-second polling:
ORCHID_RELOAD_INTERVAL=10

MD File Format

orchid.md — Root Config

Infrastructure keys (llm, auth, rag, storage) map to environment variables. Agent behavior keys (version, defaults, tools, skills, supervisor, guardrails, events) are validated against the Pydantic schema. The body after the closing --- is free-form documentation.

agents/<name>.md — Per-Agent Config

Each agent file has YAML frontmatter for structured fields and a Markdown body for the system prompt. The filename stem becomes the agent name.

Agent MD fieldYAML equivalentNotes
Frontmatter descriptionagents.<name>.descriptionShort, for supervisor routing
MD bodyagents.<name>.promptRich Markdown, stripped of leading/trailing whitespace
Frontmatter classagents.<name>.classAliased to class_path
Frontmatter rag, tools, etc.agents.<name>.rag, etc.1:1 mapping
Filename basketball.mdDict key basketballAgent name from filename stem

Equivalence

MD and YAML configs produce identical OrchidAgentsConfig output. Run the equivalence test:

cd orchid && .venv/bin/python examples/md-config/test_equivalence.py