Configuration¶
CognitiaStack -- Unified Assembly Point¶
CognitiaStack.create() assembles all library components into a single object. Each capability is an independent toggle -- pass a provider to enable it, or None to disable.
from cognitia.bootstrap.stack import CognitiaStack
from cognitia.runtime.types import RuntimeConfig
from cognitia.policy.tool_selector import ToolBudgetConfig
stack = CognitiaStack.create(
# === Required ===
prompts_dir=Path("prompts"),
skills_dir=Path("skills"),
project_root=Path("."),
# === Runtime ===
runtime_config=RuntimeConfig(runtime_name="thin", model="claude-sonnet-4-20250514"),
# === Capability toggles ===
sandbox_provider=sandbox, # SandboxProvider | None
web_provider=web, # WebProvider | None
todo_provider=todo, # TodoProvider | None
memory_bank_provider=memory, # MemoryBankProvider | None
memory_bank_prompt=None, # str | None (None = built-in default)
plan_manager=plan_mgr, # PlanManager | None
plan_user_id="user-42", # str (namespace for plans)
plan_topic_id="project-7", # str (namespace for plans)
thinking_enabled=True, # bool
# === Security ===
allowed_system_tools={"bash", "read", "write"}, # whitelist
tool_budget_config=ToolBudgetConfig(max_tools=25),
# === Routing ===
escalate_roles={"strategy_planner"},
local_tool_resolver=my_resolver,
)
What You Get¶
stack.capability_specs # dict[str, ToolSpec] -- all capability tool specs
stack.capability_executors # dict[str, Callable] -- executors for capability tools
stack.tool_policy # DefaultToolPolicy with whitelist
stack.context_builder # DefaultContextBuilder with P_MEMORY support
stack.runtime_factory # RuntimeFactory
stack.skill_registry # SkillRegistry (MCP skills)
stack.role_router # KeywordRoleRouter
stack.model_policy # ModelPolicy (role-based model escalation)
stack.runtime_config # RuntimeConfig
AgentConfig¶
AgentConfig is the frozen configuration for the Agent facade. The only required parameter is system_prompt.
from cognitia.agent.config import AgentConfig
config = AgentConfig(
system_prompt="You are a helpful assistant.",
model="sonnet", # alias or full model name
runtime="claude_sdk", # claude_sdk | thin | deepagents
tools=(), # tuple of @tool-decorated ToolDefinitions
middleware=(), # middleware chain (applied in order)
mcp_servers={}, # remote MCP server configs
max_turns=None, # turn limit per conversation
max_budget_usd=None, # USD budget limit
output_format=None, # JSON Schema for structured output
cwd=None, # working directory
env={}, # environment variables
# Runtime convergence
feature_mode="portable", # portable | native
allow_native_features=False,
)
RuntimeConfig¶
RuntimeConfig controls which runtime executes the agent loop and its operational limits.
from cognitia.runtime.types import RuntimeConfig
config = RuntimeConfig(
runtime_name="thin", # claude_sdk | thin | deepagents
model="claude-sonnet-4-20250514", # or alias: "sonnet", "opus", "haiku"
base_url=None, # for compatible APIs (OpenRouter, Groq, Together)
max_iterations=6, # ReAct iteration limit (thin runtime)
max_tool_calls=8, # tool call limit per turn (thin runtime)
max_model_retries=2, # retry limit on model errors (thin runtime)
output_format=None, # JSON Schema for structured output
output_type=None, # Pydantic model for auto-validated output
)
Models and Aliases¶
Model names are resolved via the ModelRegistry, configured in runtime/models.yaml. Resolution priority: exact alias match > exact full name > prefix match > default model.
| Alias | Model | Provider |
|---|---|---|
sonnet | claude-sonnet-4-20250514 | Anthropic |
opus | claude-opus-4-20250514 | Anthropic |
haiku | claude-haiku-3-20250307 | Anthropic |
4o | gpt-4o | OpenAI |
4o-mini | gpt-4o-mini | OpenAI |
o3 | o3 | OpenAI |
gemini | gemini-2.5-pro | |
gemini-flash | gemini-2.5-flash | |
deepseek | deepseek-chat | DeepSeek |
r1 | deepseek-reasoner | DeepSeek |
You can also use prefix matching: "claude-sonnet" resolves to "claude-sonnet-4-20250514".
ToolPolicy -- Access Control¶
DefaultToolPolicy implements a default-deny approach to tool access.
from cognitia.policy import DefaultToolPolicy
policy = DefaultToolPolicy(
allowed_system_tools={"bash", "read", "write"}, # whitelist
extra_denied={"dangerous_tool"}, # additional deny entries
)
Evaluation Logic¶
- Tool is in
ALWAYS_DENIED_TOOLSand not inallowed_system_tools-- deny - Tool is in
allowed_local_tools(includingmcp__app_tools__*) -- allow - Tool name starts with
mcp__and the MCP server is active -- allow - Otherwise -- deny
ALWAYS_DENIED_TOOLS¶
Both PascalCase (Claude SDK naming) and snake_case (builtin naming) variants are covered:
Bash/bash, Read/read, Write/write, Edit/edit, MultiEdit/multi_edit,
Glob/glob, Grep/grep, LS/ls, TodoRead/todo_read, TodoWrite/todo_write,
WebFetch/web_fetch, WebSearch/web_search
These tools are denied by default. Add them to allowed_system_tools to whitelist specific ones.
ToolBudgetConfig -- Tool Budget¶
Controls how many tools are exposed to the model and in what priority order.
from cognitia.policy.tool_selector import ToolBudgetConfig, ToolGroup
config = ToolBudgetConfig(
max_tools=30, # total tool limit (default: 30)
group_priority=[ # fill order (highest priority first)
ToolGroup.ALWAYS, # thinking, todo
ToolGroup.MCP, # business tools via MCP
ToolGroup.MEMORY, # memory bank tools
ToolGroup.PLANNING, # plan_create / plan_status / plan_execute
ToolGroup.SANDBOX, # bash, read, write, ...
ToolGroup.WEB, # web_fetch, web_search
],
group_limits={ # per-group limits (optional)
ToolGroup.MCP: 12,
ToolGroup.SANDBOX: 4,
},
)
MemoryBankConfig¶
from cognitia.memory_bank.types import MemoryBankConfig
config = MemoryBankConfig(
enabled=True,
backend="filesystem", # filesystem | database
root_path=Path("/data/memory"),
max_file_size_bytes=100 * 1024, # 100 KB per file
max_total_size_bytes=1024 * 1024, # 1 MB total
max_entries=200, # max number of files
max_depth=2, # root/subfolder/file
auto_load_on_turn=True, # load MEMORY.md into system prompt
auto_load_max_lines=200,
default_folders=["plans", "reports", "notes"],
prompt_path=None, # None = built-in default prompt
)
TodoConfig¶
from cognitia.todo.types import TodoConfig
config = TodoConfig(
enabled=True,
backend="memory", # memory | filesystem | database
root_path=Path("/data/todos"), # for filesystem backend
max_todos=100,
auto_cleanup_completed=False,
)
SandboxConfig¶
from cognitia.tools.types import SandboxConfig
config = SandboxConfig(
root_path="/data/sandbox",
user_id="user-42",
topic_id="project-7",
max_file_size_bytes=10 * 1024 * 1024, # 10 MB
timeout_seconds=30,
allowed_extensions=frozenset({".py", ".txt", ".md", ".json"}),
denied_commands=frozenset({"rm", "sudo", "kill", "chmod"}),
)
Each agent gets an isolated workspace at {root_path}/{user_id}/{topic_id}/workspace/.
Environment Variables¶
| Variable | Description | Default |
|---|---|---|
ANTHROPIC_API_KEY | Anthropic API key | -- |
OPENAI_API_KEY | API key for OpenAI-compatible providers (OpenAI, OpenRouter, Groq, Together, etc.) | -- |
OPENAI_BASE_URL | Endpoint override for OpenAI-compatible clients / provider bridges | -- |
GOOGLE_API_KEY | Google GenAI API key | -- |
OPENROUTER_API_KEY | Convenience variable for OpenRouter (mapped to OpenAI-compatible path) | -- |
ANTHROPIC_MODEL | Anthropic model (alias or full name) | claude-sonnet-4-20250514 |
COGNITIA_RUNTIME | Runtime selection (claude_sdk, thin, deepagents, cli) | claude_sdk |
E2B_API_KEY | E2B API key (cloud sandbox) | -- |
DATABASE_URL | PostgreSQL connection string | -- |
For a detailed matrix of runtime > provider > env vars > params, see Credentials & Provider Setup.