690618:1444 237 #02
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
// File: frontend/lib/services/admin-ai-prompt.service.ts
|
||||
// Change Log
|
||||
// - 2026-06-17: Created adminAiPromptService for prompt management UI (Feature 238)
|
||||
|
||||
import client from '../api/client';
|
||||
|
||||
export interface AiPromptVersion {
|
||||
publicId: string;
|
||||
promptType: string;
|
||||
versionNumber: number;
|
||||
version: number;
|
||||
template: string;
|
||||
contextConfig?: Record<string, unknown>;
|
||||
isActive: boolean;
|
||||
manualNote?: string | null;
|
||||
activatedAt?: string | null;
|
||||
createdAt: string;
|
||||
createdBy?: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Service สำหรับจัดการ AI Prompt Versions ใน Admin Console
|
||||
*/
|
||||
export const adminAiPromptService = {
|
||||
/**
|
||||
* ดึงรายการ prompt versions ทั้งหมดสำหรับ prompt_type ที่กำหนด
|
||||
*/
|
||||
async getPrompts(promptType: string): Promise<AiPromptVersion[]> {
|
||||
const response = await client.get<{ data: AiPromptVersion[] }>(
|
||||
`/ai/prompts/${promptType}`
|
||||
);
|
||||
return response.data.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* สร้าง prompt version ใหม่
|
||||
*/
|
||||
async createPrompt(
|
||||
promptType: string,
|
||||
template: string,
|
||||
contextConfig?: Record<string, unknown>
|
||||
): Promise<AiPromptVersion> {
|
||||
const idempotencyKey = crypto.randomUUID();
|
||||
const response = await client.post<{ data: AiPromptVersion }>(
|
||||
`/ai/prompts/${promptType}`,
|
||||
{ template, contextConfig },
|
||||
{
|
||||
headers: {
|
||||
'Idempotency-Key': idempotencyKey,
|
||||
},
|
||||
}
|
||||
);
|
||||
return response.data.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* เปิดใช้งาน prompt version ที่กำหนด
|
||||
*/
|
||||
async activatePrompt(
|
||||
promptType: string,
|
||||
versionNumber: number,
|
||||
expectedVersion?: number
|
||||
): Promise<AiPromptVersion> {
|
||||
const idempotencyKey = crypto.randomUUID();
|
||||
const response = await client.post<{ data: AiPromptVersion }>(
|
||||
`/ai/prompts/${promptType}/${versionNumber}/activate`,
|
||||
expectedVersion !== undefined ? { expectedVersion } : {},
|
||||
{
|
||||
headers: {
|
||||
'Idempotency-Key': idempotencyKey,
|
||||
},
|
||||
}
|
||||
);
|
||||
return response.data.data;
|
||||
},
|
||||
|
||||
/**
|
||||
* ลบ prompt version (ห้ามลบ active version)
|
||||
*/
|
||||
async deletePrompt(promptType: string, versionNumber: number): Promise<void> {
|
||||
await client.delete(
|
||||
`/ai/prompts/${promptType}/${versionNumber}`
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* อัปเดต manual note
|
||||
*/
|
||||
async updatePromptNote(
|
||||
promptType: string,
|
||||
versionNumber: number,
|
||||
manualNote: string | null
|
||||
): Promise<AiPromptVersion> {
|
||||
const response = await client.patch<{ data: AiPromptVersion }>(
|
||||
`/ai/prompts/${promptType}/${versionNumber}/note`,
|
||||
{ manualNote }
|
||||
);
|
||||
return response.data.data;
|
||||
},
|
||||
};
|
||||
@@ -88,6 +88,8 @@ export interface AiSandboxJobResult {
|
||||
usedFallbackModel?: boolean;
|
||||
errorMessage?: string;
|
||||
completedAt?: string;
|
||||
ragChunks?: Array<{ text: string; summary: string }>;
|
||||
ragVectors?: number[][];
|
||||
}
|
||||
|
||||
export interface LoadedModelInfo {
|
||||
@@ -431,10 +433,11 @@ export const adminAiService = {
|
||||
await api.delete(`/ai/prompts/${type}/${versionNumber}`);
|
||||
},
|
||||
|
||||
activatePrompt: async (type: PromptType, versionNumber: number): Promise<PromptVersion> => {
|
||||
activatePrompt: async (type: PromptType, versionNumber: number, expectedVersion?: number): Promise<PromptVersion> => {
|
||||
const body = expectedVersion === undefined ? {} : { expectedVersion };
|
||||
const { data } = await api.post(
|
||||
`/ai/prompts/${type}/${versionNumber}/activate`,
|
||||
{},
|
||||
body,
|
||||
{ headers: { 'Idempotency-Key': createIdempotencyKey() } }
|
||||
);
|
||||
return extractData<PromptVersion>(data);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// Change Log:
|
||||
// - 2026-06-14: Created frontend types for AI prompt management (conforming to task T010)
|
||||
|
||||
export type PromptType = 'ocr_extraction' | 'rag_query_prompt' | 'rag_prep_prompt' | 'classification_prompt';
|
||||
export type PromptType = 'ocr_system' | 'ocr_extraction' | 'rag_query_prompt' | 'rag_prep_prompt' | 'classification_prompt';
|
||||
|
||||
export interface ContextConfig {
|
||||
filter: {
|
||||
@@ -18,6 +18,7 @@ export interface PromptVersion {
|
||||
publicId: string;
|
||||
promptType: PromptType;
|
||||
versionNumber: number;
|
||||
version: number;
|
||||
template: string;
|
||||
contextConfig: ContextConfig | null;
|
||||
isActive: boolean;
|
||||
|
||||
Reference in New Issue
Block a user