- 为agent.json添加apiUrl、apiKey、apiModel字段支持 - 更新API接口类型定义,支持传递自定义API配置 - 优化AgentRepoList组件UI样式和交互效果 - 增强JSON文件上传校验逻辑,支持API配置验证 - 改进任务结果页面布局和视觉呈现 - 添加任务过程查看抽屉功能 - 实现执行按钮动态样式和悬停效果 - 优化节点连接线渲染逻辑和性能
192 lines
4.7 KiB
TypeScript
192 lines
4.7 KiB
TypeScript
import { ref, watch } from 'vue'
|
||
import { defineStore } from 'pinia'
|
||
import { v4 as uuidv4 } from 'uuid'
|
||
|
||
import { store } from '../index'
|
||
import { useStorage } from '@vueuse/core'
|
||
import type { IExecuteRawResponse } from '@/api'
|
||
import { useConfigStore } from '@/stores/modules/config.ts'
|
||
|
||
export interface Agent {
|
||
Name: string
|
||
Profile: string
|
||
Icon: string
|
||
Classification: string
|
||
apiUrl?: string
|
||
apiKey?: string
|
||
apiModel?: string
|
||
}
|
||
|
||
type HslColorVector = [number, number, number]
|
||
|
||
export interface IRichText {
|
||
template: string
|
||
data: Record<
|
||
string,
|
||
{
|
||
text: string
|
||
style?: Record<string, string>
|
||
color?: HslColorVector
|
||
}
|
||
>
|
||
}
|
||
|
||
export interface TaskProcess {
|
||
ActionType: string
|
||
AgentName: string
|
||
Description: string
|
||
ID: string
|
||
ImportantInput: string[]
|
||
}
|
||
|
||
export interface IRawStepTask {
|
||
Id?: string
|
||
StepName?: string
|
||
TaskContent?: string
|
||
InputObject_List?: string[]
|
||
OutputObject?: string
|
||
AgentSelection?: string[]
|
||
Collaboration_Brief_FrontEnd: IRichText
|
||
TaskProcess: TaskProcess[]
|
||
}
|
||
|
||
export interface IRawPlanResponse {
|
||
'Initial Input Object'?: string[] | string
|
||
'General Goal'?: string
|
||
'Collaboration Process'?: IRawStepTask[]
|
||
}
|
||
|
||
const storageKey = '$agents' as const
|
||
|
||
// 清除所有以 storageKey 开头的 localStorage
|
||
function clearStorageByVersion() {
|
||
Object.keys(localStorage)
|
||
.filter((key) => key.startsWith(storageKey))
|
||
.forEach((key) => localStorage.removeItem(key))
|
||
}
|
||
|
||
export const useAgentsStore = defineStore('agents', () => {
|
||
const configStore = useConfigStore()
|
||
const agents = useStorage<Agent[]>(`${storageKey}-repository`, [])
|
||
function setAgents(agent: Agent[]) {
|
||
agents.value = agent
|
||
}
|
||
|
||
// 任务搜索的内容
|
||
const searchValue = useStorage<string>(`${storageKey}-search-value`, '')
|
||
function setSearchValue(value: string) {
|
||
searchValue.value = value
|
||
}
|
||
|
||
const storageVersionIdentifier = useStorage<string>(
|
||
`${storageKey}-storage-version-identifier`,
|
||
'',
|
||
)
|
||
// 监听 configStore.config.agentRepository.storageVersionIdentifier 改变
|
||
watch(
|
||
() => configStore.config.agentRepository.storageVersionIdentifier,
|
||
(value) => {
|
||
// value与storageVersionIdentifier不一致清除所有storageKey开头的localStorage
|
||
if (value !== storageVersionIdentifier.value) {
|
||
clearStorageByVersion()
|
||
storageVersionIdentifier.value = value
|
||
}
|
||
},
|
||
{
|
||
immediate: true,
|
||
},
|
||
)
|
||
|
||
// 当前的展示的任务流程
|
||
const currentTask = ref<IRawStepTask>()
|
||
function setCurrentTask(task: IRawStepTask) {
|
||
currentTask.value = task
|
||
}
|
||
|
||
const agentRawPlan = ref<{ data?: IRawPlanResponse; loading?: boolean }>({ loading: false })
|
||
|
||
function setAgentRawPlan(plan: { data?: IRawPlanResponse; loading?: boolean }) {
|
||
if (plan.data) {
|
||
plan.data['Collaboration Process'] = plan.data['Collaboration Process']?.map((item) => ({
|
||
...item,
|
||
Id: uuidv4(),
|
||
}))
|
||
}
|
||
agentRawPlan.value = {
|
||
...agentRawPlan.value,
|
||
...plan,
|
||
}
|
||
}
|
||
|
||
// 执行完任务的结果
|
||
const executePlan = ref<IExecuteRawResponse[]>([])
|
||
function setExecutePlan(plan: IExecuteRawResponse[]) {
|
||
executePlan.value = plan
|
||
}
|
||
|
||
function resetAgent() {
|
||
agentRawPlan.value = {
|
||
loading: false,
|
||
}
|
||
currentTask.value = undefined
|
||
executePlan.value = []
|
||
}
|
||
|
||
// 额外的产物列表
|
||
const additionalOutputs = ref<string[]>([])
|
||
|
||
// 添加新产物
|
||
function addNewOutput(outputObject: string) {
|
||
if (!outputObject.trim()) return false
|
||
|
||
const trimmedOutput = outputObject.trim()
|
||
if (!additionalOutputs.value.includes(trimmedOutput)) {
|
||
additionalOutputs.value.push(trimmedOutput)
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
|
||
// 删除额外产物
|
||
function removeAdditionalOutput(outputObject: string) {
|
||
const index = additionalOutputs.value.indexOf(outputObject)
|
||
if (index > -1) {
|
||
additionalOutputs.value.splice(index, 1)
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
|
||
// 清除额外产物
|
||
function clearAdditionalOutputs() {
|
||
additionalOutputs.value = []
|
||
}
|
||
|
||
return {
|
||
agents,
|
||
setAgents,
|
||
searchValue,
|
||
setSearchValue,
|
||
currentTask,
|
||
setCurrentTask,
|
||
agentRawPlan,
|
||
setAgentRawPlan,
|
||
executePlan,
|
||
setExecutePlan,
|
||
resetAgent,
|
||
additionalOutputs,
|
||
addNewOutput,
|
||
removeAdditionalOutput,
|
||
clearAdditionalOutputs,
|
||
}
|
||
})
|
||
|
||
/**
|
||
* 用于在组件外部(如在Pinia Store 中)使用 Pinia 提供的 store 实例。
|
||
* 官方文档解释了如何在组件外部使用 Pinia Store:
|
||
* https://pinia.vuejs.org/core-concepts/outside-component-usage.html#using-a-store-outside-of-a-component
|
||
*/
|
||
export function useAgentsStoreHook() {
|
||
return useAgentsStore(store)
|
||
}
|