-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconfig.yaml
More file actions
executable file
·356 lines (332 loc) · 16.8 KB
/
Copy pathconfig.yaml
File metadata and controls
executable file
·356 lines (332 loc) · 16.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
# Argus — multi-model code review skill
# Registry of reviewers, named profiles, and host-CLI adaptation rules.
#
# Routes:
# aichat — invoke via `aichat -m CLIENT:MODEL -S` with prompt piped to stdin.
# CLIENT must match an entry under `aichat_clients:` below and a
# corresponding client in ~/.config/aichat/config.yaml (generated by
# scripts/install_aichat.py).
# gemini-cli — invoke the Gemini CLI (uses your paid sub)
# codex-cli — invoke the Codex CLI (uses your paid sub)
# claude-cli — invoke the Claude CLI (auto-added when host != claude)
# opencode-cli — invoke the OpenCode CLI (uses your Go sub)
#
# Every reviewer: primary route + optional fallback.
# Fallbacks are attempted only when primary returns non-zero or times out.
version: 1
defaults:
profile: standard
# ───────────────────────────────────────────────────────────────────
# Route preference — which provider a reviewer tries FIRST when it has
# BOTH a direct-API route and an OpenRouter route (currently glm-5.2,
# minimax-m3, deepseek-v4-pro).
# openrouter → OpenRouter first, direct API as fallback (PUBLIC DEFAULT:
# one OPENROUTER_API_KEY covers most reviewers)
# direct → each provider's own API first, OpenRouter as fallback
# (cheaper / your own subs; what you'd use if your OR
# balance is depleted)
# CLI reviewers (codex/claude/opencode/gemini) are NEVER reordered — their
# CLI sub stays primary and OpenRouter stays a true fallback.
# Override per-run with --prefer-direct / --prefer-openrouter / --route-pref,
# or the ARGUS_ROUTE_PREF environment variable. Precedence:
# CLI flag > ARGUS_ROUTE_PREF > this config value.
route_preference: openrouter
privacy_mode: true # exclude reviewers with privacy: LOGS
allow_free: false # require --allow-free to include free-tier routes
allow_logging: false # require --allow-logging to include privacy: LOGS
confidence_threshold: 80 # drop findings with effective confidence < this
corroboration_boost: 15 # confidence bonus when 2+ reviewers agree on same file:line
merge_line_tolerance: 3 # cluster findings within +/- this many lines (merge.py)
ctx_safety_ratio: 0.70 # skip reviewer if prompt_tokens > ctx * this
reviewer_timeout_sec: 360 # bumped from 180 on 2026-05-06 after a 4-doc
# ~80K-token bundle had 5/7 reviewers timeout.
# 360s handles bundles up to ~150K tokens; for
# larger bundles, callers should split or
# raise per-call via --timeout in dispatch.py.
max_parallel: 4 # cap on concurrent reviewers within a single
# dispatch.py invocation; also the recommended
# cap on parallel subagents when the calling
# agent fans out subagent-per-reviewer.
review_cost_warn_usd: 0.50
review_cost_block_usd: 2.00
benchmark_cost_warn_usd: 10.00
benchmark_cost_block_usd: 30.00
daily_soft_cap_usd: 10.00
default_output_tokens_est: 800
prompt_overhead_tokens: 500
# OR balance pre-flight: require available ≥ estimate × this factor.
or_balance_safety_factor: 2.0
# ─────────────────────────────────────────────────────────────────────
# Reviewers
# ─────────────────────────────────────────────────────────────────────
reviewers:
glm-5.2:
display: "GLM-5.2 (Zhipu / z.ai — direct + OpenRouter dual route)"
role: [security, logic, code]
ctx: 131072
tier: paid
privacy: ok
cost_per_m: { input: 0.60, output: 2.20 }
# Dual route. Declared order is direct-first; `defaults.route_preference`
# (or --prefer-*) decides which is actually tried first at dispatch time.
# The OpenRouter reasoning-only trap (content=null on large prompts via
# Io Net) is mitigated by aichat_clients.openrouter.patch below.
primary: { route: aichat, client: zai, model: "glm-5.2" }
fallback: { route: aichat, client: openrouter, model: "z-ai/glm-5.2" }
minimax-m3:
display: "MiniMax M3 (MiniMax — direct + OpenRouter dual route)"
role: [style, correctness, agent]
ctx: 204800
tier: paid
privacy: ok
cost_per_m: { input: 0.30, output: 1.20 }
primary: { route: aichat, client: minimax, model: "MiniMax-M3" }
fallback: { route: aichat, client: openrouter, model: "minimax/minimax-m3" }
opencode-minimax-m3:
display: "MiniMax M3 via OpenCode (minimax coding plan)"
role: [correctness, code, agent]
ctx: 200000
tier: paid
privacy: ok
custom_only: true
cost_per_m: null # opencode sub
primary: { route: opencode-cli, model: "minimax-coding-plan/MiniMax-M3" }
opencode-glm-5.2:
display: "GLM-5.2 via OpenCode (Ollama Cloud)"
role: [security, logic, code]
ctx: 131072
tier: paid
privacy: ok
custom_only: true
cost_per_m: null # opencode sub
primary: { route: opencode-cli, model: "ollama-cloud/glm-5.2" }
kimi-k2.6:
display: "Kimi K2 (OR; k2.5 GA — k2.6 preview not yet on OR)"
role: [long-context, agent, code]
ctx: 262144
tier: paid
privacy: ok
cost_per_m: { input: 0.60, output: 2.50 }
# KIMI_API_KEY is for chat.kimi.com (consumer), not Moonshot Platform. Use OR.
primary: { route: aichat, client: openrouter, model: "moonshotai/kimi-k2.5" }
fallback: { route: aichat, client: openrouter, model: "moonshotai/kimi-k2-thinking" }
mimo-v2-pro:
display: "Xiaomi MiMo-V2-Pro"
role: [long-context, code]
ctx: 1048576
tier: paid
privacy: ok
cost_per_m: { input: 1.00, output: 3.00 }
primary: { route: aichat, client: openrouter, model: "xiaomi/mimo-v2-pro" }
qwen-3.6-plus:
display: "Qwen3.6 Plus (Alibaba)"
role: [style, agent, code]
ctx: 1048576
tier: paid
privacy: ok
cost_per_m: { input: 0.50, output: 2.00 }
primary: { route: aichat, client: openrouter, model: "qwen/qwen3.6-plus" }
grok-4.20:
display: "Grok 4.20 (xAI)"
role: [long-context, reasoning]
ctx: 2000000
tier: paid
privacy: ok
cost_per_m: { input: 3.00, output: 15.00 }
primary: { route: aichat, client: openrouter, model: "x-ai/grok-4.20" }
# Superseded by deepseek-v4-pro (kept for benchmark-history continuity).
# No longer in any default profile; name it via --custom/--models to use it.
deepseek-v3.2:
display: "DeepSeek V3.2 (superseded by deepseek-v4-pro)"
role: [reasoning, security, code]
ctx: 131072
tier: paid
privacy: ok
custom_only: true
cost_per_m: { input: 0.27, output: 1.10 }
primary: { route: aichat, client: openrouter, model: "deepseek/deepseek-v3.2" }
deepseek-v4-pro:
display: "DeepSeek V4 Pro (1.6T MoE, 49B active, 1M ctx — direct + OpenRouter dual route)"
role: [reasoning, security, code, long-context]
ctx: 1048576
tier: paid
privacy: ok
cost_per_m: { input: 0.435, output: 0.87 }
# Dual route: DeepSeek's own platform (api.deepseek.com) + OpenRouter.
# `route_preference` / --prefer-* selects which is tried first.
primary: { route: aichat, client: deepseek, model: "deepseek-v4-pro" }
fallback: { route: aichat, client: openrouter, model: "deepseek/deepseek-v4-pro" }
# Custom-only — not included in any default profile. Available via --custom or --models.
hermes-4.3:
display: "Nous Hermes 4.3 36B"
role: [style, reasoning]
ctx: 131072
tier: paid
privacy: ok
custom_only: true
cost_per_m: { input: 1.50, output: 4.50 }
# Nous Portal model ID — only used when NOUSRESEARCH_API_KEY is set
# (it isn't in this env, so fallback via OR is what actually runs).
# Verified OR slug; direct slug unconfirmed — update on first successful call.
primary: { route: aichat, client: nous, model: "Hermes-4.3-36B" }
fallback: { route: aichat, client: openrouter, model: "nousresearch/hermes-4-405b" }
# Paid-CLI reviewers — no cost attached (use host subscription)
gemini:
display: "Gemini (Google CLI — ON HOLD — Windows .cmd shim doesn't tree-kill, hangs)"
role: [frontier, long-context]
ctx: 2000000
tier: paid
privacy: ok
disabled: true # on hold — run_subprocess now tree-kills on timeout; re-test on Windows before re-enabling (use gemini-or meanwhile)
cost_per_m: null
primary: { route: gemini-cli }
fallback: { route: aichat, client: openrouter, model: "google/gemini-3.1-pro-preview" }
gemini-or:
display: "Gemini 2.5 Flash via OpenRouter (pro variant needed more OR credits than available)"
role: [frontier, long-context]
ctx: 1048576
tier: paid
privacy: ok
cost_per_m: { input: 0.30, output: 2.50 }
primary: { route: aichat, client: openrouter, model: "google/gemini-2.5-flash" }
codex:
display: "GPT-5.4 via Codex CLI"
role: [frontier, reasoning, code]
ctx: 400000
tier: paid
privacy: ok
cost_per_m: null
primary: { route: codex-cli }
fallback: { route: aichat, client: openrouter, model: "openai/gpt-5.4" }
claude:
display: "Claude via claude CLI"
role: [frontier, reasoning]
ctx: 200000
tier: paid
privacy: ok
cost_per_m: null
primary: { route: claude-cli }
opencode:
display: "OpenCode (your Go sub)"
role: [agent, code]
ctx: 200000
tier: paid
privacy: ok
cost_per_m: null
primary: { route: opencode-cli }
# ELIMINATED: Copilot CLI's agent harness returns prose instead of our JSON
# schema, yielding F1=0 across all non-clean fixtures. Not a retry issue —
# fundamental prompt/harness mismatch. Left here as a reference entry only.
copilot-gpt5:
display: "GitHub Copilot CLI (GPT-5.2) — ELIMINATED (harness returns prose not JSON)"
role: [frontier, code]
ctx: 128000
tier: paid
privacy: ok
custom_only: true
disabled: true
cost_per_m: null
primary: { route: copilot-cli, model: "gpt-5.2" }
# ─────────────────────────────────────────────────────────────────────
# Named profiles
# ─────────────────────────────────────────────────────────────────────
profiles:
quick:
description: "2-reviewer smoke test"
members: [glm-5.2, gemini-or]
standard:
description: "Balanced everyday review — your favorites + paid CLIs + fast Gemini"
members: [glm-5.2, minimax-m3, gemini-or, codex]
panel:
description: "Maximum coverage (host CLI auto-skipped; copilot, gemini-direct, grok disabled from default)"
members: [glm-5.2, minimax-m3, kimi-k2.6, mimo-v2-pro, qwen-3.6-plus, deepseek-v4-pro, gemini-or, codex, claude, opencode]
security:
description: "Auth / crypto / input-handling changes"
members: [glm-5.2, deepseek-v4-pro, codex, claude]
prompt_overlay: security
deep:
description: "Long-context, large diffs, cross-file correctness (grok excluded — use --custom if 2M ctx needed)"
members: [mimo-v2-pro, gemini-or, kimi-k2.6, deepseek-v4-pro, codex]
prompt_overlay: deep
favorites:
description: "Your picks (GLM-5.2 + MiniMax M3 direct subs)"
members: [glm-5.2, minimax-m3]
direct:
description: "Direct-API subs only, no Gemini — pair with route_preference=direct (or --prefer-direct) when your OpenRouter balance is depleted"
members: [glm-5.2, minimax-m3, deepseek-v4-pro, codex, claude, opencode]
leaderboard-top5:
description: "Post-bench top-5 by F1 (opencode, qwen3.6+, glm-5.2, gemini-or, minimax)"
members: [opencode, qwen-3.6-plus, glm-5.2, gemini-or, minimax-m3]
# ─────────────────────────────────────────────────────────────────────
# Host-CLI adaptation
# When Argus detects it's running inside one of these CLIs, the matching
# reviewer is removed from the roster and (optionally) another is added.
# ─────────────────────────────────────────────────────────────────────
host_rules:
claude: { skip: [claude], add: [] }
codex: { skip: [codex], add: [claude] }
gemini: { skip: [gemini], add: [claude] }
opencode: { skip: [opencode], add: [claude] }
unknown: { skip: [], add: [] }
# ─────────────────────────────────────────────────────────────────────
# aichat client definitions — materialized into ~/.config/aichat/config.yaml
# by scripts/install_aichat.py. API keys NEVER written to disk; passed via
# subprocess env as AICHAT_<CLIENT>_API_KEY from the source env vars listed.
# ─────────────────────────────────────────────────────────────────────
aichat_clients:
openrouter:
type: openai-compatible
api_base: https://openrouter.ai/api/v1
api_key_env: OPENROUTER_API_KEY
# Suppress reasoning field (we just want content) and route away from
# providers that return reasoning-only with content: null on large prompts.
# Confirmed: aichat 0.30 honors `patch.chat_completions` body merges.
patch:
chat_completions:
".*":
body:
# Exclude the reasoning field from responses entirely.
reasoning:
exclude: true
# Cap the provider's internal reasoning budget. Without this,
# reasoning models (z-ai/glm-5.2, minimax/minimax-m3) can
# spend 3+ minutes thinking on a 30K-token diff even when we
# don't want to see the thoughts. 2000 tokens ≈ 30-60s budget.
max_tokens: 2000
# Route away from known reasoning-only providers that return
# content=null when reasoning is trimmed or budget-capped.
provider:
ignore: ["io.net", "together.ai"]
zai:
type: openai-compatible
api_base: https://api.z.ai/api/coding/paas/v4 # Coding Plan endpoint (your sub); standard /paas/v4 requires separate billing
api_key_env: ZAI_API_KEY
minimax:
type: openai-compatible
api_base: https://api.minimaxi.chat/v1
api_key_env: MINIMAX_API_KEY
deepseek:
type: openai-compatible
api_base: https://api.deepseek.com/v1
api_key_env: DEEPSEEK_API_KEY
moonshot:
type: openai-compatible
api_base: https://api.moonshot.ai/v1
api_key_env: KIMI_API_KEY # also accepts MOONSHOT_API_KEY
nous:
type: openai-compatible
api_base: https://inference-api.nousresearch.com/v1
api_key_env: NOUSRESEARCH_API_KEY
# ─────────────────────────────────────────────────────────────────────
# CLI invocation templates
# {client} and {model} are substituted for aichat; others take prompt on stdin.
# ─────────────────────────────────────────────────────────────────────
cli_commands:
aichat: ["aichat", "-m", "{client}:{model}", "-S"] # prompt via stdin
gemini-cli: ["gemini", "--yolo", "-p", ""] # prompt via STDIN (empty -p forces non-interactive; Windows ARG_MAX broke {prompt} for >32KB diffs, fixed 2026-05-06)
codex-cli: ["codex", "exec", "--skip-git-repo-check", "-"] # stdin input; skip git-repo trust check
claude-cli: ["claude", "-p", "--output-format", "text", "--bare"] # stdin
opencode-cli: ["opencode", "run", "-"] # stdin input
copilot-cli: ["copilot", "-p", "Follow the review instructions provided on stdin.",
"--model", "{model}", "--allow-all-tools", "--no-color",
"--output-format", "text"] # prompt via STDIN (Windows ARG_MAX; same fix as gemini-cli)