229b09b895
Build & Deploy to K8s / build-and-deploy (push) Failing after 7m14s
Epic A: ai-assistant 디렉토리/Spring 프록시/프론트엔드 메뉴 완전 제거 Epic B: Flyway 도입 + 13 신규 테이블 마이그레이션 Epic C: 9 서비스 + 7 컨트롤러 + LlmClient 추상화 (Java 21/Spring/MyBatis) Epic D: ApiKey 인증 필터 (sk-pipe-* 키 SHA-256 검증) Epic E: OpenClaw 외부 엔진 docker-compose 통합 Epic F: Next.js 7 페이지 + lib/api/aiAgent.ts 이식 Epic G: 화면 그룹/메뉴 등록 마이그레이션 (V014) Epic H: 통합 빌드 검증 - DB: invyone PostgreSQL에 ai_agents/ai_agent_groups/... 13 테이블 + Quartz - 멀티테넌시: 모든 테이블에 company_code 강제 필터 - LLM: Anthropic/OpenAI/Google/Ollama 직접 클라이언트 (Spring AI 미도입) - 스케줄러: Quartz JDBC JobStore (cron 기반) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
82 lines
3.6 KiB
TypeScript
82 lines
3.6 KiB
TypeScript
import { apiClient } from "./client";
|
|
|
|
const BASE = "/ai-agents";
|
|
|
|
export const aiAgentApi = {
|
|
// 에이전트 CRUD
|
|
list: (params?: { status?: string; search?: string }) =>
|
|
apiClient.get(BASE, { params }).then((r) => r.data),
|
|
getById: (id: number) =>
|
|
apiClient.get(`${BASE}/${id}`).then((r) => r.data),
|
|
create: (data: any) =>
|
|
apiClient.post(BASE, data).then((r) => r.data),
|
|
update: (id: number, data: any) =>
|
|
apiClient.put(`${BASE}/${id}`, data).then((r) => r.data),
|
|
delete: (id: number) =>
|
|
apiClient.delete(`${BASE}/${id}`).then((r) => r.data),
|
|
|
|
// API 키 관리
|
|
listKeys: () =>
|
|
apiClient.get(`${BASE}/keys/list`).then((r) => r.data),
|
|
createKey: (data: { name: string; agent_id?: number; rate_limit?: number }) =>
|
|
apiClient.post(`${BASE}/keys`, data).then((r) => r.data),
|
|
revokeKey: (id: number) =>
|
|
apiClient.delete(`${BASE}/keys/${id}`).then((r) => r.data),
|
|
|
|
// LLM 프로바이더
|
|
listProviders: () =>
|
|
apiClient.get(`${BASE}/providers/list`).then((r) => r.data),
|
|
createProvider: (data: any) =>
|
|
apiClient.post(`${BASE}/providers`, data).then((r) => r.data),
|
|
updateProvider: (id: number, data: any) =>
|
|
apiClient.put(`${BASE}/providers/${id}`, data).then((r) => r.data),
|
|
deleteProvider: (id: number) =>
|
|
apiClient.delete(`${BASE}/providers/${id}`).then((r) => r.data),
|
|
|
|
// 대화 모니터링
|
|
listConversations: (params?: { page?: number; limit?: number; agent_id?: number }) =>
|
|
apiClient.get(`${BASE}/conversations/list`, { params }).then((r) => r.data),
|
|
getConversation: (id: number) =>
|
|
apiClient.get(`${BASE}/conversations/${id}`).then((r) => r.data),
|
|
|
|
// 사용량
|
|
usageSummary: () =>
|
|
apiClient.get(`${BASE}/usage/summary`).then((r) => r.data),
|
|
usageLogs: (params?: { page?: number; limit?: number }) =>
|
|
apiClient.get(`${BASE}/usage/logs`, { params }).then((r) => r.data),
|
|
usageDaily: (days?: number) =>
|
|
apiClient.get(`${BASE}/usage/daily`, { params: { days } }).then((r) => r.data),
|
|
|
|
// 멀티 에이전트 그룹
|
|
listGroups: () =>
|
|
apiClient.get("/ai-agent-groups").then((r) => r.data),
|
|
getGroup: (id: number) =>
|
|
apiClient.get(`/ai-agent-groups/${id}`).then((r) => r.data),
|
|
createGroup: (data: { name: string; description?: string }) =>
|
|
apiClient.post("/ai-agent-groups", data).then((r) => r.data),
|
|
updateGroup: (id: number, data: any) =>
|
|
apiClient.put(`/ai-agent-groups/${id}`, data).then((r) => r.data),
|
|
deleteGroup: (id: number) =>
|
|
apiClient.delete(`/ai-agent-groups/${id}`).then((r) => r.data),
|
|
addGroupMember: (groupId: number, data: any) =>
|
|
apiClient.post(`/ai-agent-groups/${groupId}/members`, data).then((r) => r.data),
|
|
updateGroupMember: (memberId: number, data: any) =>
|
|
apiClient.put(`/ai-agent-groups/members/${memberId}`, data).then((r) => r.data),
|
|
removeGroupMember: (memberId: number) =>
|
|
apiClient.delete(`/ai-agent-groups/members/${memberId}`).then((r) => r.data),
|
|
getAvailableConnectors: () =>
|
|
apiClient.get("/ai-agent-groups/connectors").then((r) => r.data),
|
|
|
|
// 지식 파일 라이브러리
|
|
listKnowledge: (params?: { category?: string; search?: string }) =>
|
|
apiClient.get("/ai-knowledge", { params }).then((r) => r.data),
|
|
getKnowledge: (id: number) =>
|
|
apiClient.get(`/ai-knowledge/${id}`).then((r) => r.data),
|
|
createKnowledge: (data: { name: string; file_name: string; category: string; description?: string; content: string }) =>
|
|
apiClient.post("/ai-knowledge", data).then((r) => r.data),
|
|
updateKnowledge: (id: number, data: any) =>
|
|
apiClient.put(`/ai-knowledge/${id}`, data).then((r) => r.data),
|
|
deleteKnowledge: (id: number) =>
|
|
apiClient.delete(`/ai-knowledge/${id}`).then((r) => r.data),
|
|
};
|