diff --git a/MEMORY.md b/MEMORY.md index 3915409..9e83032 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -33,6 +33,7 @@ - Use local-first search by default: SearXNG first, then Brave-backed fallback when needed. - Brave free-plan search is rate-limited heavily; avoid parallel bursts. - In direct sessions with Will, cron jobs should use the `automation` agent by default unless Will explicitly says otherwise in that session. +- Council tiers should use local LiteLLM-backed models for usage monitoring: light = `litellm/gpt-5.3-codex` with low thinking, medium = `litellm/gpt-5.3-codex` with high thinking, heavy = `litellm/gpt-5.4` with high thinking. ## Infrastructure notes worth remembering - Full `~/.openclaw` backups upload to MinIO bucket `zap` and are scheduled via OS cron every 6 hours. diff --git a/skills/council/SKILL.md b/skills/council/SKILL.md index cecc781..2013921 100644 --- a/skills/council/SKILL.md +++ b/skills/council/SKILL.md @@ -204,7 +204,13 @@ Before orchestrating a council run, resolve the plan first, for example: - `python3 skills/council/scripts/council-plan.py --mode personality --tier light --pretty` - `python3 skills/council/scripts/council-plan.py --mode dp --tier heavy --pretty` -Then use the returned `agentId` values in `sessions_spawn`. If `modelOverride` is null, preserve the dedicated agent's configured model. If present, apply the override only for that run. +Then use the returned `agentId` values in `sessions_spawn`. +- Apply `modelOverride` for that run. +- Apply `thinkingOverride` for that run. +- Current council policy uses local LiteLLM-backed models for monitoring/usage visibility: + - `light` -> `litellm/gpt-5.3-codex` with `thinking=low` + - `medium` -> `litellm/gpt-5.3-codex` with `thinking=high` + - `heavy` -> `litellm/gpt-5.4` with `thinking=high` ## Configuration diff --git a/skills/council/references/roster.json b/skills/council/references/roster.json index 66babeb..e339f3a 100644 --- a/skills/council/references/roster.json +++ b/skills/council/references/roster.json @@ -56,19 +56,25 @@ }, "tierPolicy": { "light": { - "advisorModel": null, - "synthesisModel": null, - "notes": "Use dedicated council agents as configured. No overrides by default." + "advisorModel": "litellm/gpt-5.3-codex", + "synthesisModel": "litellm/gpt-5.3-codex", + "advisorThinking": "low", + "synthesisThinking": "low", + "notes": "Use local LiteLLM for all council roles. Light tier = gpt-5.3-codex with low thinking." }, "medium": { - "advisorModel": null, - "synthesisModel": null, - "notes": "Keep advisor agents cheap; rely on stronger dedicated synthesis agents." + "advisorModel": "litellm/gpt-5.3-codex", + "synthesisModel": "litellm/gpt-5.3-codex", + "advisorThinking": "high", + "synthesisThinking": "high", + "notes": "Use local LiteLLM for all council roles. Medium tier = gpt-5.3-codex with high thinking." }, "heavy": { - "advisorModel": null, - "synthesisModel": "openai-codex/gpt-5.4", - "notes": "Preserve dedicated role identities. Escalate synthesis first; only override advisors when task risk justifies it." + "advisorModel": "litellm/gpt-5.4", + "synthesisModel": "litellm/gpt-5.4", + "advisorThinking": "high", + "synthesisThinking": "high", + "notes": "Use local LiteLLM for all council roles. Heavy tier = gpt-5.4 with high thinking." } } } diff --git a/skills/council/scripts/council-plan.py b/skills/council/scripts/council-plan.py index 82e1923..0236d2b 100755 --- a/skills/council/scripts/council-plan.py +++ b/skills/council/scripts/council-plan.py @@ -29,12 +29,15 @@ def resolve_plan(mode: str, tier: str): for role, cfg in roles.items(): mission = cfg.get('mission', 'advisor') - override = tier_policy.get('synthesisModel') if mission == 'synthesis' else tier_policy.get('advisorModel') + is_synthesis = mission == 'synthesis' + override = tier_policy.get('synthesisModel') if is_synthesis else tier_policy.get('advisorModel') + thinking = tier_policy.get('synthesisThinking') if is_synthesis else tier_policy.get('advisorThinking') plan['roles'][role] = { 'agentId': cfg['agentId'], 'mission': mission, 'defaultModel': cfg.get('defaultModel'), 'modelOverride': override, + 'thinkingOverride': thinking, 'fallbacks': cfg.get('fallbacks', []) } return plan