import { useCallback, useEffect, useState } from 'react'; import * as api from '../api/client'; import { BotIcon, CheckIcon } from './icons'; /** * Agent 新任务默认预算(管理员)。 * * **这里配的是默认值,不是额度。** * * 额度(往返预算)属于具体任务 —— 在写信时给、在对话页里随时改。 * 这个面板只决定「派给某个 Agent 的新任务,如果没人显式指定,默认给几个来回」: * 跑测试的小工具与重构整个模块的 Agent,合理来回数差一个量级,所以分开设。 * * 累计发信数只是观测数据,不拦任何请求 —— 之前它是「终身额度」, * 但终身额度跑满要人工重置才能再干活,而 Agent 是长期在线的。 */ export default function QuotaPanel() { const [stats, setStats] = useState([]); const [error, setError] = useState(null); const [busy, setBusy] = useState(null); const [drafts, setDrafts] = useState>({}); const load = useCallback(async () => { try { const r = await api.adminListAgentStats(); setStats(r.quotas); setError(null); } catch (err) { setError(err instanceof Error ? err.message : String(err)); } }, []); useEffect(() => { load(); }, [load]); const apply = async (name: string, defaultRounds: number) => { setBusy(name); setError(null); try { await api.adminSetDefaultRounds(name, defaultRounds); await load(); setDrafts(d => { const next = { ...d }; delete next[name]; return next; }); } catch (err) { setError(err instanceof Error ? err.message : String(err)); } finally { setBusy(null); } }; return (

Agent 新任务默认预算

{stats.length}

派给某个 Agent 的新任务默认多少个来回(填 0 = 不限)。这只是默认值 —— 写信时可以单独指定,之后在对话页里还能随时调整。
插件自动转发的最终总结与权限询问不占用预算。

{error &&
{error}
} {stats.length === 0 ? (
暂无已注册的 Agent
) : (
{stats.map(s => { const draft = drafts[s.agent_name] ?? String(s.default_rounds); const dirty = draft !== String(s.default_rounds); const invalid = draft.trim() !== '' && !/^\d+$/.test(draft.trim()); return (
{s.agent_name}
{s.default_rounds === 0 ? '默认不限来回' : `默认 ${s.default_rounds} 个来回`} {' · '}进行中 {s.active_sessions} 个任务 · 累计发信 {s.sent_total}
setDrafts(d => ({ ...d, [s.agent_name]: e.target.value }))} inputMode="numeric" title="新任务默认往返数;0 = 不限" className={`w-16 text-xs border rounded px-1.5 py-1 shrink-0 focus:outline-none focus:ring-2 focus:ring-blue-100 ${ invalid ? 'border-red-300' : 'border-gray-300' }`} />
); })}
)}
); }