Files
Genarrative/src/services/visual-novel-creation/visualNovelCreationClient.ts

106 lines
3.1 KiB
TypeScript

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<VisualNovelCompileResponse>(
`${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,
};