agent-Specialization/static/src/stores/subAgent.ts

85 lines
2.5 KiB
TypeScript

import { defineStore } from 'pinia';
import { useUiStore } from './ui';
interface SubAgent {
task_id: string;
agent_id?: string | number;
status?: string;
summary?: string;
last_tool?: string;
conversation_id?: string;
}
interface SubAgentState {
subAgents: SubAgent[];
pollTimer: ReturnType<typeof setInterval> | null;
}
export const useSubAgentStore = defineStore('subAgent', {
state: (): SubAgentState => ({
subAgents: [],
pollTimer: null
}),
actions: {
async fetchSubAgents() {
try {
const resp = await fetch('/api/sub_agents');
if (!resp.ok) {
throw new Error(await resp.text());
}
const data = await resp.json();
if (data.success) {
this.subAgents = Array.isArray(data.data) ? data.data : [];
}
} catch (error) {
console.error('获取子智能体列表失败:', error);
}
},
startPolling() {
if (this.pollTimer) {
return;
}
const uiStore = useUiStore();
this.pollTimer = setInterval(() => {
if (uiStore.panelMode === 'subAgents') {
this.fetchSubAgents();
}
}, 5000);
},
stopPolling() {
if (this.pollTimer) {
clearInterval(this.pollTimer);
this.pollTimer = null;
}
},
openSubAgent(agent: SubAgent) {
if (!agent || !agent.task_id) {
return;
}
const base = this.getBaseUrl();
const parentConv = agent.conversation_id || '';
const convSegment = this.stripConversationPrefix(parentConv);
const agentLabel = agent.agent_id ? `sub_agent${agent.agent_id}` : agent.task_id;
const pathSuffix = convSegment ? `/${convSegment}+${agentLabel}` : `/sub_agent/${agent.task_id}`;
const url = `${base}${pathSuffix}`;
window.open(url, '_blank');
},
stripConversationPrefix(conversationId: string) {
if (!conversationId) return '';
return conversationId.startsWith('conv_') ? conversationId.slice(5) : conversationId;
},
getBaseUrl() {
const override = (window as any).SUB_AGENT_BASE_URL || (window as any).__SUB_AGENT_BASE_URL__;
if (override && typeof override === 'string') {
return override.replace(/\/$/, '');
}
const { protocol, hostname } = window.location;
if (hostname && hostname.includes('agent.')) {
const mappedHost = hostname.replace('agent.', 'subagent.');
return `${protocol}//${mappedHost}`;
}
return `${protocol}//${hostname}:8092`;
}
}
});