106 lines
3.1 KiB
TypeScript
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,
|
|
};
|