import type { CompileVisualNovelWorkProfileRequest, CreateVisualNovelSessionRequest, ExecuteVisualNovelAgentActionRequest, SendVisualNovelMessageRequest, VisualNovelAgentSessionSnapshot, VisualNovelCompileResponse, VisualNovelSessionResponse, } from '../../../packages/shared/src/contracts/visualNovel'; import type { TextStreamOptions } from '../aiTypes'; import { type ApiRetryOptions, requestJson } from '../apiClient'; import { createCreationAgentClient, normalizeVisualNovelAgentStreamEvent, } from '../creation-agent'; const VISUAL_NOVEL_AGENT_API_BASE = '/api/creation/visual-novel/sessions'; const VISUAL_NOVEL_CREATION_WRITE_RETRY: ApiRetryOptions = { maxRetries: 1, baseDelayMs: 240, maxDelayMs: 640, retryUnsafeMethods: true, }; const visualNovelAgentHttpClient = createCreationAgentClient< CreateVisualNovelSessionRequest, VisualNovelSessionResponse, VisualNovelSessionResponse, VisualNovelAgentSessionSnapshot, SendVisualNovelMessageRequest, VisualNovelSessionResponse, ExecuteVisualNovelAgentActionRequest, VisualNovelSessionResponse >({ apiBase: VISUAL_NOVEL_AGENT_API_BASE, messages: { createSession: '创建视觉小说共创会话失败', getSession: '读取视觉小说共创会话失败', sendMessage: '发送视觉小说共创消息失败', streamIncomplete: '视觉小说共创消息流式结果不完整', executeAction: '执行视觉小说创作操作失败', }, }); export function createVisualNovelSession( payload: CreateVisualNovelSessionRequest, ) { return visualNovelAgentHttpClient.createSession(payload); } export function getVisualNovelSession(sessionId: string) { return visualNovelAgentHttpClient.getSession(sessionId); } export function sendVisualNovelMessage( sessionId: string, payload: SendVisualNovelMessageRequest, ) { return visualNovelAgentHttpClient.sendMessage(sessionId, payload); } export function streamVisualNovelMessage( sessionId: string, payload: SendVisualNovelMessageRequest, options: TextStreamOptions = {}, ) { return visualNovelAgentHttpClient.streamMessage(sessionId, payload, { ...options, normalizeEvent: normalizeVisualNovelAgentStreamEvent, }); } export function executeVisualNovelAction( sessionId: string, payload: ExecuteVisualNovelAgentActionRequest, ) { return visualNovelAgentHttpClient.executeAction(sessionId, payload); } export function compileVisualNovelWorkProfile( sessionId: string, payload: CompileVisualNovelWorkProfileRequest, ) { return requestJson( `${VISUAL_NOVEL_AGENT_API_BASE}/${encodeURIComponent(sessionId)}/compile`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload), }, '编译视觉小说作品草稿失败', { retry: VISUAL_NOVEL_CREATION_WRITE_RETRY, }, ); } export const visualNovelCreationClient = { compileWorkProfile: compileVisualNovelWorkProfile, createSession: createVisualNovelSession, executeAction: executeVisualNovelAction, getSession: getVisualNovelSession, sendMessage: sendVisualNovelMessage, streamMessage: streamVisualNovelMessage, };