agentaudit 3.9.20 → 3.9.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/cli.mjs +37 -9
  2. package/package.json +1 -1
package/cli.mjs CHANGED
@@ -58,6 +58,7 @@ function resolveProvider(flagOverride, keys) {
58
58
  // ── Global flags (set in main before command routing) ────
59
59
  let jsonMode = false;
60
60
  let quietMode = false;
61
+ let modelOverride = null; // --model flag or AGENTAUDIT_MODEL env or config
61
62
 
62
63
  // ── ANSI Colors (respects NO_COLOR and --no-color) ───────
63
64
 
@@ -1486,7 +1487,7 @@ async function auditRepo(url) {
1486
1487
  'content-type': 'application/json',
1487
1488
  },
1488
1489
  body: JSON.stringify({
1489
- model: 'claude-sonnet-4-20250514',
1490
+ model: modelOverride || 'claude-sonnet-4-20250514',
1490
1491
  max_tokens: 8192,
1491
1492
  system: systemPrompt,
1492
1493
  messages: [{ role: 'user', content: userMessage }],
@@ -1509,22 +1510,22 @@ async function auditRepo(url) {
1509
1510
  switch (resolvedProvider.id) {
1510
1511
  case 'openrouter':
1511
1512
  apiUrl = 'https://openrouter.ai/api/v1/chat/completions';
1512
- modelName = process.env.OPENROUTER_MODEL || 'anthropic/claude-sonnet-4';
1513
+ modelName = modelOverride || process.env.OPENROUTER_MODEL || 'anthropic/claude-sonnet-4';
1513
1514
  authHeaders = { 'Authorization': `Bearer ${resolvedProvider.key}`, 'HTTP-Referer': 'https://agentaudit.dev', 'X-Title': 'AgentAudit' };
1514
1515
  break;
1515
1516
  case 'ollama':
1516
1517
  apiUrl = `${resolvedProvider.host}/v1/chat/completions`;
1517
- modelName = resolvedProvider.model;
1518
+ modelName = modelOverride || resolvedProvider.model;
1518
1519
  authHeaders = {};
1519
1520
  break;
1520
1521
  case 'custom':
1521
1522
  apiUrl = resolvedProvider.url.endsWith('/chat/completions') ? resolvedProvider.url : `${resolvedProvider.url.replace(/\/$/, '')}/chat/completions`;
1522
- modelName = resolvedProvider.model;
1523
+ modelName = modelOverride || resolvedProvider.model;
1523
1524
  authHeaders = resolvedProvider.key ? { 'Authorization': `Bearer ${resolvedProvider.key}` } : {};
1524
1525
  break;
1525
1526
  default: // openai
1526
1527
  apiUrl = 'https://api.openai.com/v1/chat/completions';
1527
- modelName = 'gpt-4o';
1528
+ modelName = modelOverride || 'gpt-4o';
1528
1529
  authHeaders = { 'Authorization': `Bearer ${resolvedProvider.key}` };
1529
1530
  }
1530
1531
 
@@ -1731,9 +1732,25 @@ async function main() {
1731
1732
  quietMode = rawArgs.includes('--quiet') || rawArgs.includes('-q');
1732
1733
  // --no-color already handled at top level for `c` object
1733
1734
 
1735
+ // --model flag: --model=<name> or --model <name>
1736
+ const modelFlagIdx = rawArgs.findIndex(a => a === '--model');
1737
+ const modelFlagEq = rawArgs.find(a => a.startsWith('--model='));
1738
+ modelOverride = modelFlagEq?.split('=')[1]
1739
+ || (modelFlagIdx >= 0 ? rawArgs[modelFlagIdx + 1] : null)
1740
+ || process.env.AGENTAUDIT_MODEL
1741
+ || loadConfig()?.preferred_model
1742
+ || null;
1743
+
1734
1744
  // Strip global flags from args
1735
1745
  const globalFlags = new Set(['--json', '--quiet', '-q', '--no-color']);
1736
- const args = rawArgs.filter(a => !globalFlags.has(a));
1746
+ let args = rawArgs.filter(a => !globalFlags.has(a));
1747
+ // Strip --model and its value
1748
+ args = args.filter((a, i, arr) => {
1749
+ if (a.startsWith('--model=')) return false;
1750
+ if (a === '--model') { arr[i + 1] = '__skip__'; return false; }
1751
+ if (a === '__skip__') return false;
1752
+ return true;
1753
+ });
1737
1754
 
1738
1755
  if (args[0] === '-v' || args[0] === '--version') {
1739
1756
  console.log(`agentaudit ${getVersion()}`);
@@ -1764,6 +1781,7 @@ async function main() {
1764
1781
  console.log(` ${c.dim}--quiet Suppress banner${c.reset}`);
1765
1782
  console.log(` ${c.dim}--no-color Disable colors ${c.reset}${c.dim}(also: NO_COLOR=1)${c.reset}`);
1766
1783
  console.log(` ${c.dim}--provider <p> Force provider ${c.reset}${c.dim}(anthropic|openai|openrouter|ollama|custom)${c.reset}`);
1784
+ console.log(` ${c.dim}--model <m> Override model ${c.reset}${c.dim}(e.g. gpt-4o-mini, claude-3.5-sonnet)${c.reset}`);
1767
1785
  console.log(` ${c.dim}--export Export audit payload to markdown${c.reset}`);
1768
1786
  console.log(` ${c.dim}--debug Show raw LLM response on errors${c.reset}`);
1769
1787
  console.log();
@@ -1775,7 +1793,9 @@ async function main() {
1775
1793
  console.log();
1776
1794
  console.log(` ${c.bold}PROVIDERS${c.reset} ${c.dim}(set any one for deep audits)${c.reset}`);
1777
1795
  console.log(` ${c.dim}ANTHROPIC_API_KEY · OPENAI_API_KEY · OPENROUTER_API_KEY · OLLAMA_MODEL · LLM_API_URL${c.reset}`);
1778
- console.log(` ${c.dim}Set default: AGENTAUDIT_PROVIDER=openai or agentaudit config set provider openai${c.reset}`);
1796
+ console.log(` ${c.dim}Set default: AGENTAUDIT_PROVIDER=openai AGENTAUDIT_MODEL=gpt-4o-mini${c.reset}`);
1797
+ console.log(` ${c.dim}Or persist: agentaudit config set provider openai${c.reset}`);
1798
+ console.log(` ${c.dim} agentaudit config set model gpt-4o-mini${c.reset}`);
1779
1799
  console.log(` ${c.dim}Run ${c.cyan}agentaudit status${c.dim} to check configuration.${c.reset}`);
1780
1800
  console.log();
1781
1801
  process.exitCode = 0; return;
@@ -1858,9 +1878,11 @@ async function main() {
1858
1878
  const resolved = resolveProvider(null, keys);
1859
1879
  console.log();
1860
1880
  if (resolved) {
1861
- console.log(` ${c.bold}Active:${c.reset} ${c.green}${resolved.label}${c.reset}`);
1862
- console.log(` ${c.dim}Override: --provider=<name> or AGENTAUDIT_PROVIDER=<name>${c.reset}`);
1881
+ const activeModel = modelOverride || process.env.AGENTAUDIT_MODEL || loadConfig()?.preferred_model;
1882
+ console.log(` ${c.bold}Active:${c.reset} ${c.green}${resolved.label}${c.reset}${activeModel ? ` ${c.dim}model: ${activeModel}${c.reset}` : ''}`);
1883
+ console.log(` ${c.dim}Override: --provider=<name> --model=<name>${c.reset}`);
1863
1884
  console.log(` ${c.dim}Set default: agentaudit config set provider <name>${c.reset}`);
1885
+ console.log(` ${c.dim} agentaudit config set model <name>${c.reset}`);
1864
1886
  } else {
1865
1887
  console.log(` ${c.yellow}⚠ No working LLM provider.${c.reset} Deep audits require one.`);
1866
1888
  console.log(` ${c.dim}Set a key: export ANTHROPIC_API_KEY=sk-ant-...${c.reset}`);
@@ -1902,6 +1924,12 @@ async function main() {
1902
1924
  console.log(` ${c.green}✔${c.reset} Default provider set to: ${c.bold}${val}${c.reset}`);
1903
1925
  console.log(` ${c.dim}Override per-command: --provider=<name>${c.reset}`);
1904
1926
  console.log(` ${c.dim}Or env: AGENTAUDIT_PROVIDER=<name>${c.reset}`);
1927
+ } else if (subCmd === 'set' && targets[1] === 'model' && targets[2]) {
1928
+ const val = targets[2];
1929
+ saveConfig({ preferred_model: val });
1930
+ console.log(` ${c.green}✔${c.reset} Default model set to: ${c.bold}${val}${c.reset}`);
1931
+ console.log(` ${c.dim}Override per-command: --model=<name>${c.reset}`);
1932
+ console.log(` ${c.dim}Or env: AGENTAUDIT_MODEL=<name>${c.reset}`);
1905
1933
  } else if (subCmd === 'get' || !subCmd) {
1906
1934
  const cfg = loadConfig();
1907
1935
  console.log(` ${c.bold}Config:${c.reset} ${USER_CONFIG_FILE}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentaudit",
3
- "version": "3.9.20",
3
+ "version": "3.9.21",
4
4
  "description": "Security scanner for AI packages — MCP server + CLI",
5
5
  "type": "module",
6
6
  "bin": {