import type { PuzzleAgentActionRequest, PuzzleAgentActionResponse, } from '../../../packages/shared/src/contracts/puzzleAgentActions'; import type { CreatePuzzleAgentSessionRequest, CreatePuzzleAgentSessionResponse, PuzzleAgentSessionSnapshot, SendPuzzleAgentMessageRequest, } from '../../../packages/shared/src/contracts/puzzleAgentSession'; import type { TextStreamOptions } from '../aiTypes'; import { createCreationAgentClient } from '../creation-agent'; const PUZZLE_AGENT_API_BASE = '/api/runtime/puzzle/agent/sessions'; // 拼图草稿生成会串起多段图片生成,请求层保持 30 分钟等待窗口。 const PUZZLE_DRAFT_ACTION_TIMEOUT_MS = 30 * 60 * 1000; const puzzleAgentHttpClient = createCreationAgentClient< CreatePuzzleAgentSessionRequest, CreatePuzzleAgentSessionResponse, CreatePuzzleAgentSessionResponse, PuzzleAgentSessionSnapshot, SendPuzzleAgentMessageRequest, { session: PuzzleAgentSessionSnapshot }, PuzzleAgentActionRequest, PuzzleAgentActionResponse >({ apiBase: PUZZLE_AGENT_API_BASE, messages: { createSession: '创建拼图共创会话失败', getSession: '读取拼图共创会话失败', sendMessage: '发送拼图共创消息失败', streamIncomplete: '拼图共创消息流式结果不完整', executeAction: '执行拼图共创操作失败', }, executeActionTimeoutMs: PUZZLE_DRAFT_ACTION_TIMEOUT_MS, }); /** * 创建拼图 Agent 共创会话。 * 首版继续走 Axum facade,前端不直连 SpacetimeDB。 */ export async function createPuzzleAgentSession( payload: CreatePuzzleAgentSessionRequest = {}, ) { return puzzleAgentHttpClient.createSession(payload); } /** * 读取拼图 Agent 会话快照。 */ export async function getPuzzleAgentSession(sessionId: string) { return puzzleAgentHttpClient.getSession(sessionId); } /** * 非流式发送拼图 Agent 消息。 * 当前 UI 主链使用 SSE,但保留普通接口便于后续降级。 */ export async function sendPuzzleAgentMessage( sessionId: string, payload: SendPuzzleAgentMessageRequest, ) { return puzzleAgentHttpClient.sendMessage(sessionId, payload); } /** * 流式发送拼图 Agent 消息。 * 后端当前会先回传一段 assistant 文本,再附上最新 session 快照。 */ export async function streamPuzzleAgentMessage( sessionId: string, payload: SendPuzzleAgentMessageRequest, options: TextStreamOptions = {}, ) { return puzzleAgentHttpClient.streamMessage(sessionId, payload, options); } /** * 执行拼图结果页相关操作。 * 后端会返回 operation 记录,前端再按需刷新 session 或 works/gallery。 */ export async function executePuzzleAgentAction( sessionId: string, payload: PuzzleAgentActionRequest, ) { return puzzleAgentHttpClient.executeAction(sessionId, payload); } export const puzzleAgentClient = { createSession: createPuzzleAgentSession, getSession: getPuzzleAgentSession, sendMessage: sendPuzzleAgentMessage, streamMessage: streamPuzzleAgentMessage, executeAction: executePuzzleAgentAction, };