/* ┌──────────────────────────────────────────────────────────────────────────────┐ │ @author: Davidson Gomes │ │ @file: /services/agentService.ts │ │ Developed by: Davidson Gomes │ │ Creation date: May 13, 2025 │ │ Contact: contato@evolution-api.com │ ├──────────────────────────────────────────────────────────────────────────────┤ │ @copyright © Evolution API 2025. All rights reserved. │ │ Licensed under the Apache License, Version 2.0 │ │ │ │ You may not use this file except in compliance with the License. │ │ You may obtain a copy of the License at │ │ │ │ http://www.apache.org/licenses/LICENSE-2.0 │ │ │ │ Unless required by applicable law or agreed to in writing, software │ │ distributed under the License is distributed on an "AS IS" BASIS, │ │ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. │ │ See the License for the specific language governing permissions and │ │ limitations under the License. │ ├──────────────────────────────────────────────────────────────────────────────┤ │ @important │ │ For any future changes to the code in this file, it is recommended to │ │ include, together with the modification, the information of the developer │ │ who changed it and the date of modification. │ └──────────────────────────────────────────────────────────────────────────────┘ */ import api from "./api"; import { Agent, AgentCreate } from "../types/agent"; import { escapePromptBraces, sanitizeAgentName } from "@/lib/utils"; const processAgentData = (data: AgentCreate | Partial): AgentCreate | Partial => { const updatedData = {...data}; if (updatedData.instruction) { updatedData.instruction = escapePromptBraces(updatedData.instruction); } if (updatedData.name) { updatedData.name = sanitizeAgentName(updatedData.name); } return updatedData; }; export const createAgent = (data: AgentCreate) => api.post("/api/v1/agents/", processAgentData(data)); export const listAgents = ( clientId: string, skip = 0, limit = 100, folderId?: string ) => { const queryParams = new URLSearchParams({ skip: skip.toString(), limit: limit.toString(), }); if (folderId) { queryParams.append("folder_id", folderId); } return api.get(`/api/v1/agents/?${queryParams.toString()}`, { headers: { "x-client-id": clientId }, }); }; export const getAgent = (agentId: string, clientId: string) => api.get(`/api/v1/agents/${agentId}`, { headers: { "x-client-id": clientId }, }); export const getSharedAgent = (agentId: string) => api.get(`/api/v1/agents/${agentId}/shared`); export const updateAgent = (agentId: string, data: Partial) => api.put(`/api/v1/agents/${agentId}`, processAgentData(data)); export const deleteAgent = (agentId: string) => api.delete(`/api/v1/agents/${agentId}`); // New functions for the folder system export interface Folder { id: string; name: string; description: string; client_id: string; created_at: string; updated_at: string; } export interface FolderCreate { name: string; description: string; client_id: string; } export interface FolderUpdate { name?: string; description?: string; } export const createFolder = (data: FolderCreate) => api.post("/api/v1/agents/folders", data); export const listFolders = (clientId: string, skip = 0, limit = 100) => api.get(`/api/v1/agents/folders?skip=${skip}&limit=${limit}`, { headers: { "x-client-id": clientId }, }); export const getFolder = (folderId: string, clientId: string) => api.get(`/api/v1/agents/folders/${folderId}`, { headers: { "x-client-id": clientId }, }); export const updateFolder = ( folderId: string, data: FolderUpdate, clientId: string ) => api.put(`/api/v1/agents/folders/${folderId}`, data, { headers: { "x-client-id": clientId }, }); export const deleteFolder = (folderId: string, clientId: string) => api.delete(`/api/v1/agents/folders/${folderId}`, { headers: { "x-client-id": clientId }, }); export const listAgentsInFolder = ( folderId: string, clientId: string, skip = 0, limit = 100 ) => api.get( `/api/v1/agents/folders/${folderId}/agents?skip=${skip}&limit=${limit}`, { headers: { "x-client-id": clientId }, } ); export const assignAgentToFolder = ( agentId: string, folderId: string | null, clientId: string ) => { const url = folderId ? `/api/v1/agents/${agentId}/folder?folder_id=${folderId}` : `/api/v1/agents/${agentId}/folder`; return api.put( url, {}, { headers: { "x-client-id": clientId }, } ); }; export const shareAgent = (agentId: string, clientId: string) => api.post<{ api_key: string }>(`/api/v1/agents/${agentId}/share`, {}, { headers: { "x-client-id": clientId }, }); // API Key Interfaces and Services export interface ApiKey { id: string; name: string; provider: string; client_id: string; created_at: string; updated_at: string; is_active: boolean; } export interface ApiKeyCreate { name: string; provider: string; client_id: string; key_value: string; } export interface ApiKeyUpdate { name?: string; provider?: string; key_value?: string; is_active?: boolean; } export const createApiKey = (data: ApiKeyCreate) => api.post("/api/v1/agents/apikeys", data); export const listApiKeys = (clientId: string, skip = 0, limit = 100) => api.get(`/api/v1/agents/apikeys?skip=${skip}&limit=${limit}`, { headers: { "x-client-id": clientId }, }); export const getApiKey = (keyId: string, clientId: string) => api.get(`/api/v1/agents/apikeys/${keyId}`, { headers: { "x-client-id": clientId }, }); export const updateApiKey = ( keyId: string, data: ApiKeyUpdate, clientId: string ) => api.put(`/api/v1/agents/apikeys/${keyId}`, data, { headers: { "x-client-id": clientId }, }); export const deleteApiKey = (keyId: string, clientId: string) => api.delete(`/api/v1/agents/apikeys/${keyId}`, { headers: { "x-client-id": clientId }, }); // Import agent from JSON file export const importAgentFromJson = (file: File, clientId: string, folderId?: string | null) => { const formData = new FormData(); formData.append('file', file); // Add folder_id to formData if it exists if (folderId) { formData.append('folder_id', folderId); } return api.post('/api/v1/agents/import', formData, { headers: { 'Content-Type': 'multipart/form-data', 'x-client-id': clientId } }); };