feat(council): define litellm-backed tier policy
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user