// AI 플랫폼(LLM Provider) 설정(ADMIN) API — /api/hrm/admin/ai-config (SUPERADMIN 전용). // API 키 값은 응답에 절대 포함되지 않음(claudeKeySet 플래그만). // PUT 은 provider/claudeModel(+선택 ollamaTextModel) 전송. // test 는 저장된 설정 기준 선택 provider 짧은 ping. // feedback 은 인증 사용자 전체 — 로컬 DuckDB + 중앙 rag 전달(PII 마스킹). // 레퍼런스: guardia-ocr/guardia-bi frontend/src/api/adminAiConfig.ts (HRM axios 패턴으로 미러). // client baseURL 이 /api/hrm 이므로 상대경로 /admin/ai-config · /ai/feedback 로 호출. import api from './client' const unwrap = (p: Promise) => p.then(r => r.data?.data) /** LLM 제공자: ollama/qwen3/deepseek/glm(온프레미스)·claude(외부). */ export type AiProvider = 'ollama' | 'claude' | 'qwen3' | 'deepseek' | 'glm' /** 화이트리스트 Claude 모델 ID. */ export type ClaudeModel = 'claude-sonnet-4-6' | 'claude-haiku-4-5' | 'claude-opus-4-8' /** AI 설정 조회 DTO — API 키 값 미반환(claudeKeySet 으로 설정 여부만). */ export interface AiConfigDto { provider: AiProvider /** Ollama 텍스트 모델(provider 별 해석 결과, 읽기 전용 표시). */ ollamaTextModel: string /** 선택된 Claude 모델 ID(미설정 시 서버 기본 claude-sonnet-4-6). */ claudeModel: string /** 서버 환경변수 ANTHROPIC_API_KEY 존재 여부(값·길이·마스킹 일절 미포함). */ claudeKeySet: boolean /** 전역 AI 사용 여부(off 시 규칙 기반 degraded). */ aiEnabled: boolean } /** 저장 요청 — provider 필수, claudeModel/ollamaTextModel 선택. */ export interface AiConfigUpdateRequest { provider: AiProvider claudeModel?: ClaudeModel ollamaTextModel?: string } /** 연결 테스트 결과. */ export interface AiTestResult { ok: boolean degraded: boolean message: string } /** 피드백 요청 — feature/question/answer/correction 은 서버에서 PII 마스킹 후 적재. */ export interface AiFeedbackRequest { feature?: string question?: string answer?: string verdict: 'up' | 'down' correction?: string } /** GET /api/hrm/admin/ai-config — 현재 AI 설정(API 키 값 제외). */ export const getAiConfig = () => unwrap(api.get('/admin/ai-config')) as Promise /** PUT /api/hrm/admin/ai-config — provider/claudeModel 저장 → 반영분. */ export const updateAiConfig = (body: AiConfigUpdateRequest) => unwrap(api.put('/admin/ai-config', body)) as Promise /** POST /api/hrm/admin/ai-config/test — 저장된 설정 기준 선택 provider 짧은 ping. */ export const testAiConfig = () => unwrap(api.post('/admin/ai-config/test', {})) as Promise /** POST /api/hrm/ai/feedback — AI 답변 피드백(로컬 DuckDB + 중앙 rag). */ export const sendAiFeedback = (body: AiFeedbackRequest) => unwrap(api.post('/ai/feedback', body)) as Promise<{ storedLocal: boolean; verdict: string }>