设置面板新增子代理默认模型选择器
- 向量记忆引擎下方新增「子代理默认模型」下拉框 - 留空则跟随当前模型,选择后所有 spawn_task 默认使用该模型 - spawn_task 工具仍支持单次指定 model 参数覆盖默认值
This commit is contained in:
@@ -257,6 +257,7 @@ export function openSettingsModal(): void {
|
|||||||
updateConnectionInfo();
|
updateConnectionInfo();
|
||||||
updateRunningModels();
|
updateRunningModels();
|
||||||
populateMemoryEmbedModels();
|
populateMemoryEmbedModels();
|
||||||
|
populateSubAgentModels();
|
||||||
updateMemoryVectorStatus();
|
updateMemoryVectorStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -365,6 +366,47 @@ async function populateMemoryEmbedModels(): Promise<void> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function populateSubAgentModels(): Promise<void> {
|
||||||
|
const select = document.querySelector('#selectSubAgentModel') as HTMLSelectElement;
|
||||||
|
if (!select) return;
|
||||||
|
const api = state.get<OllamaAPI>(KEYS.API);
|
||||||
|
if (!api) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const data = await api.listModels();
|
||||||
|
if (!data.models?.length) return;
|
||||||
|
|
||||||
|
// 保留第一个 "跟随当前模型" 选项,追加所有模型
|
||||||
|
while (select.options.length > 1) select.remove(1);
|
||||||
|
data.models
|
||||||
|
.sort((a, b) => (a.name < b.name ? -1 : 1))
|
||||||
|
.forEach(m => {
|
||||||
|
const opt = document.createElement('option');
|
||||||
|
opt.value = m.name;
|
||||||
|
opt.textContent = m.name;
|
||||||
|
select.appendChild(opt);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 恢复已保存的选择
|
||||||
|
const db = state.get<ChatDB | null>(KEYS.DB);
|
||||||
|
if (db) {
|
||||||
|
const saved = await db.getSetting('subAgentModel', '');
|
||||||
|
if (saved) select.value = saved;
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
logWarn('加载子代理模型列表失败', (err as Error).message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 子代理模型设置保存
|
||||||
|
document.querySelector('#selectSubAgentModel')?.addEventListener('change', async () => {
|
||||||
|
const db = state.get<ChatDB | null>(KEYS.DB);
|
||||||
|
if (!db) return;
|
||||||
|
const val = (document.querySelector('#selectSubAgentModel') as HTMLSelectElement).value;
|
||||||
|
await db.saveSetting('subAgentModel', val);
|
||||||
|
logSetting('子代理默认模型', val || '跟随当前模型');
|
||||||
|
});
|
||||||
|
|
||||||
function updateMemoryVectorStatus(): void {
|
function updateMemoryVectorStatus(): void {
|
||||||
const statusEl = document.querySelector('#memoryVectorStatus');
|
const statusEl = document.querySelector('#memoryVectorStatus');
|
||||||
if (!statusEl) return;
|
if (!statusEl) return;
|
||||||
|
|||||||
@@ -324,6 +324,13 @@
|
|||||||
</select>
|
</select>
|
||||||
<div id="memoryVectorStatus" class="text-muted" style="font-size:11px;margin-top:4px;"></div>
|
<div id="memoryVectorStatus" class="text-muted" style="font-size:11px;margin-top:4px;"></div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="setting-group">
|
||||||
|
<label class="setting-label">🤖 子代理默认模型</label>
|
||||||
|
<p class="text-muted" style="font-size:11px;margin-bottom:8px;">子代理(spawn_task)使用的默认模型。留空则使用当前选中的模型。可为简单任务选择更快的模型。</p>
|
||||||
|
<select class="setting-input" id="selectSubAgentModel">
|
||||||
|
<option value="">跟随当前模型</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
<div class="setting-group">
|
<div class="setting-group">
|
||||||
<label class="setting-label">显存管理</label>
|
<label class="setting-label">显存管理</label>
|
||||||
<button class="btn btn-danger" id="btnReleaseVRAM">释放显存(卸载模型)</button>
|
<button class="btn btn-danger" id="btnReleaseVRAM">释放显存(卸载模型)</button>
|
||||||
|
|||||||
@@ -768,7 +768,7 @@ export async function executeTool(toolName: string, args: Record<string, unknown
|
|||||||
const { executeSubAgent } = await import('./sub-agent.js');
|
const { executeSubAgent } = await import('./sub-agent.js');
|
||||||
const task = args.task as string;
|
const task = args.task as string;
|
||||||
const context = args.context as string | undefined;
|
const context = args.context as string | undefined;
|
||||||
const model = args.model as string | undefined;
|
const model = (args.model as string) || state.get<string>('subAgentModel', '') || undefined;
|
||||||
if (!task) return { success: false, error: '缺少 task 参数' };
|
if (!task) return { success: false, error: '缺少 task 参数' };
|
||||||
logInfo(`子代理委派: ${task.slice(0, 80)}${model ? ` (模型: ${model})` : ''}`);
|
logInfo(`子代理委派: ${task.slice(0, 80)}${model ? ` (模型: ${model})` : ''}`);
|
||||||
const result = await executeSubAgent(task, context, model ? { model } : {});
|
const result = await executeSubAgent(task, context, model ? { model } : {});
|
||||||
|
|||||||
Reference in New Issue
Block a user