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.
- 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.

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 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

View File

@@ -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."
}
}
}

View File

@@ -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