Skip to content

Commit 9fd9fd6

Browse files
committed
fix: address CodeRabbit review comments
- Fix runCalls: invoke callables before Promise.allSettled - Add parseIntSafe: validate CLI options are positive integers - Update SKILL.md with --max-tokens, --timeout, --max-retries, --sequential Addresses CodeRabbit comments on PR #95.
1 parent b041511 commit 9fd9fd6

2 files changed

Lines changed: 22 additions & 4 deletions

File tree

skills/llm-council/SKILL.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,20 @@ Default model rosters per provider live in `scripts/council.js` and can be overr
4343

4444
```
4545
node $SKILL_ROOT/scripts/council.js run "<query>" [--models id1,id2,id3] [--chairman id] [--provider <name>] [--wiki <slug>]
46+
[--max-tokens N] [--timeout ms] [--max-retries N] [--sequential]
4647
node $SKILL_ROOT/scripts/council.js providers
4748
node $SKILL_ROOT/scripts/council.js show <session-id>
4849
```
4950

51+
### Runtime options
52+
53+
| Flag | Default | Description |
54+
|------|---------|-------------|
55+
| `--max-tokens` | 4000 | Max output tokens per model call. Bump to 16000+ for reasoning models. |
56+
| `--timeout` | 120000 | HTTP request timeout in ms. Bump to 300000+ for slow endpoints (NVIDIA NIM). |
57+
| `--max-retries` | 1 | Retry count on 429/5xx and connection errors. Exponential backoff (2s, 4s, 8s...). |
58+
| `--sequential` | false | Run model calls one at a time instead of in parallel. Use when free endpoints reject concurrent requests. |
59+
5060
`--wiki <slug>` writes the full transcript to `<wiki>/derived/council/<session-id>.md` and registers it via `wiki-cli.js page` so it shows in FTS5 search.
5161

5262
## Output

skills/llm-council/scripts/council.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,15 +209,23 @@ async function cmdRun(args) {
209209
const provider = PROVIDERS[providerName];
210210
if (!provider.baseUrl) { console.error(`provider ${providerName} requires LLM_COUNCIL_BASE_URL`); process.exit(2); }
211211

212-
if (args['max-tokens']) RUN_OPTS.max_tokens = parseInt(args['max-tokens'], 10);
213-
if (args.timeout) RUN_OPTS.timeout_ms = parseInt(args.timeout, 10);
214-
if (args['max-retries']) RUN_OPTS.max_retries = parseInt(args['max-retries'], 10);
212+
function parseIntSafe(val, name) {
213+
const n = parseInt(val, 10);
214+
if (isNaN(n) || n <= 0 || n !== Math.floor(n)) {
215+
console.error(`Invalid --${name}: ${val} (must be a positive integer)`);
216+
process.exit(2);
217+
}
218+
return n;
219+
}
220+
if (args['max-tokens']) RUN_OPTS.max_tokens = parseIntSafe(args['max-tokens'], 'max-tokens');
221+
if (args.timeout) RUN_OPTS.timeout_ms = parseIntSafe(args.timeout, 'timeout');
222+
if (args['max-retries']) RUN_OPTS.max_retries = parseIntSafe(args['max-retries'], 'max-retries');
215223
if (args.sequential) RUN_OPTS.sequential = true;
216224

217225
// Run a list of async callables either in parallel (default) or sequentially.
218226
// Sequential mode avoids concurrent-request limits on free NIM/OpenRouter endpoints.
219227
async function runCalls(callables) {
220-
if (!RUN_OPTS.sequential) return Promise.allSettled(callables);
228+
if (!RUN_OPTS.sequential) return Promise.allSettled(callables.map(fn => fn()));
221229
const results = [];
222230
for (const fn of callables) {
223231
try { results.push({ status: 'fulfilled', value: await fn() }); }

0 commit comments

Comments
 (0)