61 lines
2.5 KiB
TypeScript
61 lines
2.5 KiB
TypeScript
// AI 플랫폼(LLM Provider) 설정(ADMIN) API — /api/admin/ai-config (ADMIN 전용).
|
|
// API 키 값은 응답에 절대 포함되지 않음(claudeKeySet 플래그만).
|
|
// PUT 은 provider/claudeModel(+선택 ollamaTextModel) 전송.
|
|
// test 는 저장된 설정 기준 선택 provider 짧은 ping.
|
|
// 레퍼런스: guardia-ocr frontend/src/api/adminAiConfig.ts (esn axios 패턴으로 미러).
|
|
import api from './client'
|
|
|
|
/** LLM 제공자: ollama(온프레미스)/claude(외부)/qwen3/deepseek/glm(온프레미스). */
|
|
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
|
|
}
|
|
|
|
/** GET /api/admin/ai-config — 현재 AI 설정(API 키 값 제외). */
|
|
export const getAiConfig = () =>
|
|
api.get('/api/admin/ai-config').then(r => r.data?.data as AiConfigDto)
|
|
|
|
/** PUT /api/admin/ai-config — provider/claudeModel 저장 → 반영분. */
|
|
export const updateAiConfig = (body: AiConfigUpdateRequest) =>
|
|
api.put('/api/admin/ai-config', body).then(r => r.data?.data as AiConfigDto)
|
|
|
|
/** POST /api/admin/ai-config/test — 저장된 설정 기준 선택 provider 짧은 ping. */
|
|
export const testAiConfig = () =>
|
|
api.post('/api/admin/ai-config/test', {}).then(r => r.data?.data as AiTestResult)
|
|
|
|
/** POST /api/ai/feedback — AI 답변 👍/👎(+교정) 피드백(로컬 DuckDB + 중앙 rag). */
|
|
export const sendAiFeedback = (body: {
|
|
feature: string
|
|
question?: string
|
|
answer?: string
|
|
verdict: 'UP' | 'DOWN'
|
|
correction?: string
|
|
}) => api.post('/api/ai/feedback', body).then(r => r.data?.data)
|