import apiClient from "@/services/api-client"; import type { AICompletion, AICompletionListResponse, AICostSummary, AIHealthResponse, AIProviderInfo, AIPrompt, KnowledgeCollection, KnowledgeSearchItem, TenantAIConfig, } from "@/types/ai"; const unwrap = (response: any): T => { if (response?.data?.data !== undefined) return response.data.data as T; if (response?.data !== undefined) return response.data as T; return response as T; }; class AIService { async getProviders(): Promise { const response = await apiClient.get("/ai/providers"); return unwrap(response); } async getProviderHealth(provider: string): Promise { const response = await apiClient.get(`/ai/providers/${encodeURIComponent(provider)}/health`); return unwrap(response); } async getGatewayHealth(): Promise { const response = await apiClient.get("/ai/health"); return unwrap(response); } async getModels(): Promise> { const response = await apiClient.get("/ai/models"); return unwrap>(response); } async createCompletion(payload: { messages: Array<{ role: "system" | "user" | "assistant"; content: string }>; provider?: string; model?: string; temperature?: number; max_tokens?: number; }): Promise { const response = await apiClient.post("/ai/completions", payload); return unwrap(response); } async getCompletion(id: string): Promise { const response = await apiClient.get(`/ai/completions/${encodeURIComponent(id)}`); return unwrap(response); } async listCompletions(params: { page?: number; limit?: number; provider?: string; model?: string; status?: string; user_id?: string; module_id?: string; start_date?: string; end_date?: string; }): Promise { const response = await apiClient.get("/ai/completions", { params }); if (response?.data?.data && response?.data?.pagination) { return { data: response.data.data, pagination: response.data.pagination }; } return unwrap(response); } async playground(payload: { messages: Array<{ role: "system" | "user" | "assistant"; content: string }>; provider?: string; model?: string; temperature?: number; max_tokens?: number; }): Promise { const response = await apiClient.post("/ai/playground", payload); return unwrap(response); } async getCostSummary(params: { group_by?: "day" | "week" | "month"; start_date?: string; end_date?: string; } = {}): Promise { const response = await apiClient.get("/ai/costs", { params }); return unwrap(response); } async upsertConfig(payload: { provider: string; config_type: "azure" | "direct"; api_key: string; display_name?: string; endpoint?: string; deployment?: string; api_version?: string; custom_models?: string[]; default_model?: string; is_active?: boolean; }): Promise { const response = await apiClient.post("/ai/config", payload); return unwrap(response); } async listConfigs(): Promise { const response = await apiClient.get("/ai/config"); return unwrap(response); } async testConfig(provider: string): Promise { const response = await apiClient.post(`/ai/config/${encodeURIComponent(provider)}/test`, {}); return unwrap(response); } async deleteConfig(provider: string): Promise { await apiClient.delete(`/ai/config/${encodeURIComponent(provider)}`); } async createPrompt(payload: { name: string; description?: string; use_case: string; system_message?: string; user_template: string; provider?: string; model?: string; temperature?: number; max_tokens?: number; variables?: Array<{ name: string; type?: "string" | "number" | "boolean" | "array"; required?: boolean }>; tags?: string[]; is_default?: boolean; }): Promise { const response = await apiClient.post("/ai/prompts", payload); return unwrap(response); } async getPrompt(id: string): Promise { const response = await apiClient.get(`/ai/prompts/${id}`); return unwrap(response); } async updatePrompt(id: string, payload: { name: string; description?: string; use_case: string; system_message?: string; user_template: string; provider?: string; model?: string; temperature?: number; max_tokens?: number; variables?: Array<{ name: string; type?: "string" | "number" | "boolean" | "array"; required?: boolean }>; tags?: string[]; is_default?: boolean; change_notes?: string; }): Promise { const response = await apiClient.put(`/ai/prompts/${id}`, payload); return unwrap(response); } async clonePrompt(id: string): Promise { const response = await apiClient.post(`/ai/prompts/${id}/clone`); return unwrap(response); } async listPrompts(params: { page?: number; limit?: number; status?: string; search?: string } = {}): Promise<{ data: AIPrompt[]; pagination?: { page: number; limit: number; total: number; totalPages: number }; }> { const response = await apiClient.get("/ai/prompts", { params }); if (response?.data?.data && response?.data?.pagination) { return { data: response.data.data, pagination: response.data.pagination }; } return unwrap(response); } async updatePromptStatus(id: string, status: "draft" | "active" | "archived" | "deprecated"): Promise { const response = await apiClient.patch(`/ai/prompts/${id}/status`, { status }); return unwrap(response); } async deletePrompt(id: string): Promise { await apiClient.delete(`/ai/prompts/${id}`); } async getVersions(id: string): Promise { const response = await apiClient.get(`/ai/prompts/${id}/versions`); return unwrap(response); } async getVersion(id: string, version: number): Promise { const response = await apiClient.get(`/ai/prompts/${id}/versions/${version}`); return unwrap(response); } async rollback(id: string, version: number): Promise { const response = await apiClient.post(`/ai/prompts/${id}/rollback`, { version }); return unwrap(response); } async executePrompt( id: string, payload: { variables?: Record; provider?: string; model?: string; temperature?: number; max_tokens?: number }, ): Promise { const response = await apiClient.post(`/ai/prompts/${id}/execute`, payload); return unwrap(response); } async testPrompt( id: string, payload: { variables?: Record; provider?: string; model?: string; temperature?: number; max_tokens?: number }, ): Promise { const response = await apiClient.post(`/ai/prompts/${id}/test`, payload); return unwrap(response); } async listCollections(params: { page?: number; limit?: number; status?: string } = {}): Promise<{ data: KnowledgeCollection[]; pagination?: { page: number; limit: number; total: number; totalPages: number }; }> { const response = await apiClient.get("/ai/knowledge/collections", { params }); if (response?.data?.data && response?.data?.pagination) { return { data: response.data.data, pagination: response.data.pagination }; } return unwrap(response); } async createCollection(payload: { name: string; description?: string; metadata?: Record }): Promise { const response = await apiClient.post("/ai/knowledge/collections", payload); return unwrap(response); } async uploadKnowledgeDocument(payload: { collectionId: string; file: File; provider?: string }): Promise { const formData = new FormData(); formData.append("collectionId", payload.collectionId); formData.append("file", payload.file); if (payload.provider) { formData.append("provider", payload.provider); } const response = await apiClient.post("/ai/knowledge/documents", formData); return unwrap(response); } async searchKnowledge(payload: { query: string; collectionId?: string; provider?: string; topK?: number; minScore?: number; }): Promise { const response = await apiClient.post("/ai/knowledge/search", payload); return unwrap(response); } async searchKnowledgeWithContext(payload: { query: string; collectionId?: string; provider?: string; topK?: number; minScore?: number; }): Promise<{ context?: string; matches?: KnowledgeSearchItem[] }> { const response = await apiClient.post("/ai/knowledge/search/context", payload); return unwrap<{ context?: string; matches?: KnowledgeSearchItem[] }>(response); } } export const aiService = new AIService();