# Sample user config — grows alongside the implementation phases. # # Loader (beaver_gateway/config_loader.py) execs this file with # ClaudeAgent, RaycastAgent, McpServer, ExposedMcp, Gateway already # bound — so importing them is optional. We import explicitly here so # IDEs and type-checkers see real symbols instead of free variables. from datetime import date from beaver_gateway.agents.claude import ClaudeAgent from beaver_gateway.agents.raycast import RaycastAgent, RemoteTool, UserPreferences from beaver_gateway.core.registry import Gateway from beaver_gateway.frontends.anthropic import AnthropicMessagesFrontend gateway = Gateway( agents=[ ClaudeAgent( name="stub", model="claude-sonnet-4-6", system_prompt="You are a stub agent used to validate the Phase 0 skeleton.", cwd="/tmp", ), # Phase 1.2 — a RaycastAgent the AnthropicMessagesFrontend will # route via RaycastBackend. Phase 1.5 added the per-agent knobs # (`temperature` / `additional_system_instructions` / etc.) — # only `model`, `system_prompt`, and at least one of the others # is mandatory. RaycastAgent( name="research", model="Gemini 3.1 Flash Lite", system_prompt=( "You are a research assistant. " "Reply in the user's language. Cite URLs when you use web search." ), temperature=0.5, available_native_tools=(RemoteTool.WEB_SEARCH, RemoteTool.READ_PAGE), # Lambda so today's date is rebuilt on every request while # locale/timezone stay pinned. ``True`` would give the same # fresh-date behaviour but would also auto-pick host locale # and timezone (``en-US`` / system tz), which isn't what we # want here. user_preferences=lambda: UserPreferences( locale="en-GB", timezone="Europe/Berlin", current_date=date.today().isoformat(), # noqa: DTZ011 — local date is intended ), ), ], mcps=[], frontends=[ # Phase 1.4 — expose the agents as `model=` on an # Anthropic-compatible Messages endpoint. Auth comes from # `BOOTSTRAP_TOKENS` in the env (`name1:value1,name2:value2`). AnthropicMessagesFrontend(host="0.0.0.0", port=8000), ], )