feat(council): define litellm-backed tier policy

This commit is contained in:
zap
2026-03-11 20:46:48 +00:00
parent 165e987dbc
commit 680daf9964
4 changed files with 27 additions and 11 deletions

View File

@@ -33,6 +33,7 @@
- Use local-first search by default: SearXNG first, then Brave-backed fallback when needed. - 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. - 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. - 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 ## Infrastructure notes worth remembering
- Full `~/.openclaw` backups upload to MinIO bucket `zap` and are scheduled via OS cron every 6 hours. - Full `~/.openclaw` backups upload to MinIO bucket `zap` and are scheduled via OS cron every 6 hours.

View File

@@ -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 personality --tier light --pretty`
- `python3 skills/council/scripts/council-plan.py --mode dp --tier heavy --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 ## Configuration

View File

@@ -56,19 +56,25 @@
}, },
"tierPolicy": { "tierPolicy": {
"light": { "light": {
"advisorModel": null, "advisorModel": "litellm/gpt-5.3-codex",
"synthesisModel": null, "synthesisModel": "litellm/gpt-5.3-codex",
"notes": "Use dedicated council agents as configured. No overrides by default." "advisorThinking": "low",
"synthesisThinking": "low",
"notes": "Use local LiteLLM for all council roles. Light tier = gpt-5.3-codex with low thinking."
}, },
"medium": { "medium": {
"advisorModel": null, "advisorModel": "litellm/gpt-5.3-codex",
"synthesisModel": null, "synthesisModel": "litellm/gpt-5.3-codex",
"notes": "Keep advisor agents cheap; rely on stronger dedicated synthesis agents." "advisorThinking": "high",
"synthesisThinking": "high",
"notes": "Use local LiteLLM for all council roles. Medium tier = gpt-5.3-codex with high thinking."
}, },
"heavy": { "heavy": {
"advisorModel": null, "advisorModel": "litellm/gpt-5.4",
"synthesisModel": "openai-codex/gpt-5.4", "synthesisModel": "litellm/gpt-5.4",
"notes": "Preserve dedicated role identities. Escalate synthesis first; only override advisors when task risk justifies it." "advisorThinking": "high",
"synthesisThinking": "high",
"notes": "Use local LiteLLM for all council roles. Heavy tier = gpt-5.4 with high thinking."
} }
} }
} }

View File

@@ -29,12 +29,15 @@ def resolve_plan(mode: str, tier: str):
for role, cfg in roles.items(): for role, cfg in roles.items():
mission = cfg.get('mission', 'advisor') 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] = { plan['roles'][role] = {
'agentId': cfg['agentId'], 'agentId': cfg['agentId'],
'mission': mission, 'mission': mission,
'defaultModel': cfg.get('defaultModel'), 'defaultModel': cfg.get('defaultModel'),
'modelOverride': override, 'modelOverride': override,
'thinkingOverride': thinking,
'fallbacks': cfg.get('fallbacks', []) 'fallbacks': cfg.get('fallbacks', [])
} }
return plan return plan