Agent Config CLI

This commit is contained in:
2026-08-18 14:37:25 -04:00
parent c6d4836793
commit b0fb23a8f5
19 changed files with 1981 additions and 551 deletions
+129 -1
View File
@@ -178,12 +178,140 @@ function bareAgentResolveBackend(config) {
if (b === 'qvac') return 'qvac'
const p = String(config?.provider || '').trim().toLowerCase()
if (p === 'qvac') return 'qvac'
if (p === 'groq' || p === 'xai') return 'rest'
if (p === 'groq' || p === 'xai' || p === 'openai' || p === 'custom') return 'rest'
// Default: qvac when key unset; rest when key present (legacy configs)
if (config?.rest_api_key && String(config.rest_api_key).trim()) return 'rest'
return 'qvac'
}
/** @type {readonly string[]} */
var BARE_AGENT_QVAC_ONLY_KEYS = Object.freeze([
'qvac_model',
'qvac_profile',
'qvac_ctx_size',
'qvac_device',
'qvac_main_gpu',
'qvac_gpu_layers'
])
/** @type {readonly string[]} */
var BARE_AGENT_REST_ONLY_KEYS = Object.freeze(['rest_base_url', 'rest_api_key'])
/**
* @typedef {{
* id: string,
* label: string,
* rest_base_url: string,
* default_model: string,
* models: string[]
* }} BareAgentRestProvider
*/
/** @type {Record<string, BareAgentRestProvider>} */
const BARE_AGENT_REST_PROVIDERS = {
groq: {
id: 'groq',
label: 'Groq',
rest_base_url: 'https://api.groq.com/openai/v1',
default_model: 'llama-3.3-70b-versatile',
models: [
'llama-3.3-70b-versatile',
'llama-3.1-8b-instant',
'openai/gpt-oss-120b'
]
},
xai: {
id: 'xai',
label: 'xAI (Grok)',
rest_base_url: 'https://api.x.ai/v1',
default_model: 'grok-4',
models: ['grok-4', 'grok-3', 'grok-3-mini']
},
openai: {
id: 'openai',
label: 'OpenAI',
rest_base_url: 'https://api.openai.com/v1',
default_model: 'gpt-4.1',
models: ['gpt-4.1', 'gpt-4.1-mini', 'o4-mini']
},
custom: {
id: 'custom',
label: 'Custom OpenAI-compatible',
rest_base_url: '',
default_model: '',
models: []
}
}
/** @returns {BareAgentRestProvider[]} */
function bareAgentRestProviderList() {
return [BARE_AGENT_REST_PROVIDERS.groq, BARE_AGENT_REST_PROVIDERS.xai, BARE_AGENT_REST_PROVIDERS.openai, BARE_AGENT_REST_PROVIDERS.custom]
}
/**
* @param {string} [id]
* @returns {BareAgentRestProvider}
*/
function bareAgentRestGetProvider(id) {
const key = String(id || '').trim().toLowerCase()
if (key === 'http' || key === 'rest') return BARE_AGENT_REST_PROVIDERS.custom
return BARE_AGENT_REST_PROVIDERS[key] || BARE_AGENT_REST_PROVIDERS.groq
}
/**
* @param {string} [model]
*/
function bareAgentIsQvacModelId(model) {
const m = String(model || '').trim()
if (!m) return false
return (
/^QWEN/i.test(m) ||
/^LLAMA_TOOL/i.test(m) ||
/QWEN3/i.test(m) ||
/LLAMA_TOOL_CALLING/i.test(m)
)
}
/**
* Drop keys that belong to the other backend so config.json matches the choice.
* @param {Record<string, unknown>} config
* @returns {Record<string, unknown>}
*/
function bareAgentSanitizeConfigForBackend(config) {
const out = { ...(config && typeof config === 'object' ? config : {}) }
const backend = bareAgentResolveBackend(out)
out.backend = backend
if (backend === 'rest') {
for (let i = 0; i < BARE_AGENT_QVAC_ONLY_KEYS.length; i++) {
delete out[BARE_AGENT_QVAC_ONLY_KEYS[i]]
}
const prov = String(out.provider || '')
.trim()
.toLowerCase()
if (!prov || prov === 'qvac') out.provider = 'groq'
if (bareAgentIsQvacModelId(String(out.model || ''))) {
const spec = bareAgentRestGetProvider(String(out.provider || 'groq'))
if (spec.default_model) out.model = spec.default_model
}
} else {
for (let i = 0; i < BARE_AGENT_REST_ONLY_KEYS.length; i++) {
delete out[BARE_AGENT_REST_ONLY_KEYS[i]]
}
out.provider = 'qvac'
}
return out
}
/**
* @param {string} [secret]
*/
function bareAgentMaskSecretPreview(secret) {
const t = String(secret || '')
if (!t.trim()) return '(not set)'
if (t.length <= 8) return '********'
return t.slice(0, 3) + '…' + t.slice(-4)
}
/**
* Resolve context window for QVAC load from the model card / profile.
* Legacy undersized `qvac_ctx_size` values (e.g. 4096/8192) are ignored so