sovereign-engine-v2 / docs /CONFIGURATION.md
SNAPKITTYWEST's picture
push from SNAPKITTYWEST/sovereign-engine-v2
9abace2 verified
|
Raw
History Blame Contribute Delete
10.3 kB
# Configuration Reference
Complete guide to all Sovereign Engine configuration options.
## EngineConfig Dataclass
The `EngineConfig` controls all engine behavior. Pass it to `SovereignEngine()`:
```python
from pathlib import Path
from src.sovereign import EngineConfig, SovereignEngine
config = EngineConfig(
allowed_roots=[Path("/safe/paths")],
ledger_path=Path("./sovereign.worm"),
continuity_dir=Path.home() / ".sovereign" / "continuity",
max_steps=15,
enable_shadow=True,
enable_ipc=True,
agent_id="sovereign_main"
)
engine = SovereignEngine(config)
```
### Configuration Options
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `allowed_roots` | `list[Path]` | `[Path.cwd()]` | Filesystem roots the engine can access. PathJail blocks all others. |
| `ledger_path` | `Path` | `./sovereign.worm` | Binary WORM ledger file for cryptographic audit trail. |
| `continuity_dir` | `Path` | `~/.sovereign/continuity` | Directory for all four continuity backends. Auto-created. |
| `max_steps` | `int` | `15` | Max reasoning steps in ReActAgent loop before timeout. |
| `enable_shadow` | `bool` | `True` | Enable ShadowAgent for non-blocking observation. |
| `enable_ipc` | `bool` | `True` | Enable native IPC multiplexer (O(1) tool dispatch). |
| `agent_id` | `str` | `"sovereign_main"` | Unique agent identifier (for multi-agent coordination). |
## Environment Variables
Override config via environment variables (prefixed with `SOVEREIGN_`):
```bash
export SOVEREIGN_ALLOWED_ROOTS="/home/user/projects:/tmp"
export SOVEREIGN_MAX_STEPS=25
export SOVEREIGN_ENABLE_SHADOW=false
export SOVEREIGN_AGENT_ID="batch_processor_1"
python your_script.py
```
Supported environment variables:
| Variable | Type | Maps To |
|----------|------|---------|
| `SOVEREIGN_ALLOWED_ROOTS` | CSV paths | `allowed_roots` (split on `:` or `;`) |
| `SOVEREIGN_LEDGER_PATH` | path | `ledger_path` |
| `SOVEREIGN_CONTINUITY_DIR` | path | `continuity_dir` |
| `SOVEREIGN_MAX_STEPS` | int | `max_steps` |
| `SOVEREIGN_ENABLE_SHADOW` | bool | `enable_shadow` (true/false/1/0) |
| `SOVEREIGN_ENABLE_IPC` | bool | `enable_ipc` |
| `SOVEREIGN_AGENT_ID` | str | `agent_id` |
Example:
```python
import os
from src.sovereign import SovereignEngine
# Environment variables take precedence
if "SOVEREIGN_MAX_STEPS" in os.environ:
max_steps = int(os.environ["SOVEREIGN_MAX_STEPS"])
else:
max_steps = 15
```
## ReActAgent Config
The ReAct reasoning agent has its own config:
```python
from src.agents.react import ReActConfig, ReActAgent
react_config = ReActConfig(
max_steps=20,
timeout_ms=60000,
model_provider="bedrock", # bedrock, openrouter, ollama, anthropic
temperature=0.7,
top_p=0.9,
)
agent = ReActAgent(
agent_id="code_agent",
config=react_config,
registry=tool_registry,
ledger=worm_ledger,
)
```
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `max_steps` | `int` | `15` | Max thinking/action loops. |
| `timeout_ms` | `int` | `30000` | Total execution timeout. |
| `model_provider` | `str` | `"bedrock"` | LLM backend: bedrock, openrouter, ollama, anthropic. |
| `temperature` | `float` | `0.7` | Sampling temperature (0.0-1.0). |
| `top_p` | `float` | `0.9` | Nucleus sampling parameter. |
## Continuity Directory Structure
The engine uses 4 paradigms for state recovery. Structure:
```
~/.sovereign/continuity/
├── env_state.bin # Paradigm 1: Env bitmask (for hot-restart)
├── seed.bin # Paradigm 2: Seed for deterministic replay
├── agent_id_seed.bin # Paradigm 2 per-agent seed
├── inode/
│ ├── flags.db # Paradigm 3: File handles mapped to boolean gates
│ ├── agent_id.lock
│ └── agent_id.state
├── shm/
│ └── block_0.bin # Paradigm 4: Shared memory block (4KB)
└── checkpoints/
├── checkpoint_001.ckpt # Full state snapshot with signature
├── checkpoint_002.ckpt
└── manifest.json
```
**Paradigm 1: Env State** — 64-bit bitmask in `os.environ["SOVEREIGN_STATE"]`:
- Fastest (RAM)
- Lost on process exit
- Use for: hot-restart via `os.execv()`
**Paradigm 2: Seed Chain** — Blake2b seed derivation:
- Deterministic replay
- Store operation log in binary
- Use for: replay testing, timeline forking
**Paradigm 3: Inode State** — Zero-byte files as gates:
- Kernel-durable
- Fast stat() reads
- Use for: boolean flags, pause/resume
**Paradigm 4: Shared Memory** — ctypes mmap block:
- Cross-process coordination
- 4KB block
- Use for: multi-agent sync, realtime state
## PathJail Configuration
Restrict filesystem access to approved roots:
```python
from src.core.path_jail import PathJail
from pathlib import Path
jail = PathJail(roots=[
Path("/home/user/projects"),
Path("/tmp/scratch"),
Path.home() / "Downloads"
])
# This is OK
jail.check("/home/user/projects/code.py") # ✓
# This is BLOCKED
jail.check("/etc/passwd") # ✗ PathJailError
jail.check("/root/.ssh/id_rsa") # ✗ PathJailError
```
Pass to engine:
```python
config = EngineConfig(
allowed_roots=[
Path("/home/user/projects"),
Path("/tmp/scratch"),
]
)
engine = SovereignEngine(config)
```
## Model Provider Configuration
Choose which LLM backend to use. Defaults to **AWS Bedrock** (all models via unified API).
### Bedrock (Recommended)
```python
from src.sovereign import EngineConfig
from src.runtime.providers.bedrock import BedrockProvider
config = EngineConfig()
provider = BedrockProvider(
region="us-west-2",
model="anthropic.claude-3-opus-20240229-v1:0",
)
# Engine automatically uses it
engine = SovereignEngine(config)
```
Requires `~/.aws/credentials`:
```
[default]
aws_access_key_id = YOUR_KEY
aws_secret_access_key = YOUR_SECRET
region = us-west-2
```
### OpenRouter (Open-source + proprietary models)
```python
from src.runtime.providers.openrouter import OpenRouterProvider
provider = OpenRouterProvider(api_key="sk-or-...")
# Uses OpenRouter API for Mistral, Llama, Qwen, etc.
```
Requires `OPENROUTER_API_KEY` environment variable.
### Ollama (Local models)
```python
from src.runtime.providers.ollama import OllamaProvider
provider = OllamaProvider(base_url="http://localhost:11434")
# Connect to local Ollama instance (ollama serve)
```
Run locally first:
```bash
ollama run mistral
# or
ollama run llama2
```
### Anthropic API (Direct)
```python
from src.runtime.providers.anthropic import AnthropicProvider
provider = AnthropicProvider(api_key="sk-ant-...")
```
## Example Configurations
### Development Mode
Minimal logging, fast iteration:
```python
from src.sovereign import EngineConfig
from pathlib import Path
import logging
logging.basicConfig(level=logging.DEBUG)
config = EngineConfig(
allowed_roots=[Path.cwd()],
ledger_path=Path("/tmp/dev.worm"),
continuity_dir=Path("/tmp/continuity"),
max_steps=10, # Fast iteration
enable_shadow=False,
)
```
### Production Mode
Full logging, durability, multi-agent:
```python
config = EngineConfig(
allowed_roots=[
Path("/var/app/data"),
Path("/var/app/cache"),
],
ledger_path=Path("/var/lib/sovereign/ledger.worm"),
continuity_dir=Path("/var/lib/sovereign/continuity"),
max_steps=25, # More thinking
enable_shadow=True, # Async observation
enable_ipc=True, # Native IPC
agent_id="prod_reactor_1",
)
```
With Bedrock:
```python
from src.runtime.providers.bedrock import BedrockProvider
provider = BedrockProvider(
region="us-east-1",
model="anthropic.claude-3-sonnet-20240229-v1:0",
timeout_ms=120000,
)
```
### CI Testing Mode
Fast, deterministic, no external calls:
```python
config = EngineConfig(
allowed_roots=[Path("/tmp/ci_test")],
ledger_path=Path("/tmp/ci.worm"),
continuity_dir=Path("/tmp/ci_continuity"),
max_steps=5,
enable_shadow=False,
enable_ipc=False, # Use pure Python
agent_id=f"ci_test_{os.getenv('CI_BUILD_ID')}",
)
```
Use mock provider for testing:
```python
from src.runtime.providers.multi import MultiProvider
# Fallback chain: try each in order
provider = MultiProvider([
MockProvider(), # Return fixed responses
OllamaProvider(), # Fall back to local if available
])
```
## Logging Configuration
Control verbosity via Python logging:
```python
import logging
# Engine logs
logging.getLogger("sovereign.engine").setLevel(logging.INFO)
# Routing pipeline
logging.getLogger("sovereign.routing").setLevel(logging.DEBUG)
# Tool registry
logging.getLogger("sovereign.tools").setLevel(logging.WARNING)
# Everything
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
```
## Dynamic Configuration Updates
Update config without restarting:
```python
engine = SovereignEngine(config)
# Update max_steps
engine.config.max_steps = 25
# Restart agent with new config
from src.agents.react import ReActConfig
engine.agent.config.max_steps = 25
# Add a new allowed root
engine.config.allowed_roots.append(Path("/new/path"))
engine.path_jail = PathJail(roots=engine.config.allowed_roots)
```
## Configuration Validation
Validate config before starting engine:
```python
from src.sovereign import EngineConfig
from pathlib import Path
config = EngineConfig(
allowed_roots=[Path("/tmp/test")],
)
# Check roots exist
for root in config.allowed_roots:
if not root.exists():
root.mkdir(parents=True, exist_ok=True)
# Check continuity dir writable
try:
config.continuity_dir.mkdir(parents=True, exist_ok=True)
(config.continuity_dir / ".test").touch()
(config.continuity_dir / ".test").unlink()
except PermissionError:
raise RuntimeError(f"Cannot write to {config.continuity_dir}")
```