Agent Config CLI
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user