Implements core pieces of 'Time Dilation in LLM Agent Systems'
(Dillenberg 2026) and adds OpenRouter as a second LLM provider.
ENGINE
- engine/time.py: AgentClock with cumulative proper time tau
(weighted by op type), EWMA pace (alpha=0.3, dt clamped 0.1-60s),
ClockRegistry singleton, gamma_{src->dst} frame transformation,
drift_report with per-pair divergence and threshold flag.
- engine/turn.py: ticks tau on reasoning/tool/memory/reactive;
broadcasts tau+pace+model in every WebSocket message.
- engine/db.py: schema adds turn_log.tau, turn_log.pace,
turn_log.model, agent_clocks table; dev-mode auto-migrate
drops+recreates if old schema detected.
- engine/llm.py: full refactor for two providers.
Ollama: native tool-calling via /api/chat
OpenRouter: OpenAI-compatible /api/v1/chat/completions
Auto mode picks OpenRouter if OPENROUTER_API_KEY is set.
Per-agent model via EMERGENCE_AGENT_<ID>_MODEL env var.
.env loader with empty-line guard.
decide_tool returns (name, args, meta) with cost_usd for OR.
FRONTEND
- web/: new 'Time Dilation · Eigenzeit tau' section with per-agent
tau bars, pace, op count. Drift warning when any pair exceeds
threshold. LLM provider info in header.
TESTS
- 14 new tests in tests/test_time.py (tau monotonic, EWMA convergence,
gamma asymmetry, drift detection).
- 4 new LLM tests: openrouter response parsing, per-agent override,
provider_info, is_available.
- All 99 tests green.
LIVE-VERIFIED
- 4 different OpenRouter models running in parallel:
- anchor: anthropic/claude-3.5-haiku
- flora: openai/gpt-4o-mini
- lovely: meta-llama/llama-3.3-70b-instruct
- spark: google/gemma-3-4b-it
- All 4 produce turns, all 4 have different tau values,
drift_report shows the Frame-Transformation gamma values.
- Observation: gamma ~ 1.00 because the explicit Round-Robin +
sleep(2) keeps frames coherent. This is itself a non-trivial
validation of the paper's claim: in non-synchronized systems,
dilation would emerge.
SECRETS
- .env added, OPENROUTER_API_KEY live. .env is git-ignored.
- .env.example documents the config without exposing any key.
- .gitignore now blocks .env, .env.local, *.key, *.pem.
README
- New 'Time Dilation' section explaining tau, pace, CDC, drift
- New 'Multi-LLM via OpenRouter' section with cost table
- Per-agent model config documented
24 lines
765 B
Text
24 lines
765 B
Text
# Emergence-Mini environment configuration
|
|
# COPY this file to .env and fill in your own values.
|
|
# .env is git-ignored; do not commit secrets.
|
|
|
|
# OpenRouter API key (https://openrouter.ai/keys)
|
|
# Required when EMERGENCE_LLM_PROVIDER=openrouter
|
|
OPENROUTER_API_KEY=
|
|
|
|
# Provider: "ollama" | "openrouter" | "auto" (default: auto)
|
|
# auto = use OpenRouter if OPENROUTER_API_KEY is set, else Ollama
|
|
EMERGENCE_LLM_PROVIDER=auto
|
|
|
|
# Default model when using OpenRouter (can be overridden per-agent)
|
|
EMERGENCE_OPENROUTER_MODEL=anthropic/claude-3.5-haiku
|
|
|
|
# Default model when using Ollama
|
|
EMERGENCE_OLLAMA_MODEL=llama3.2:3b
|
|
|
|
# Ollama server
|
|
EMERGENCE_LLM_URL=http://127.0.0.1:11434
|
|
|
|
# Master switch: 0 forces rule-based engine
|
|
EMERGENCE_LLM_ENABLED=1
|
|
EMERGENCE_LLM_TIMEOUT=30
|