import { get, post, put, del } from './request.js' import { getApiBaseUrl, getAuthHeader } from './request.js' export const createScriptWithDialogue = async (payload) => { return post('/epicScript/createWithDialogue', payload) } export const streamScriptChat = async ({ operationType, conversationId, messageId, userMessageId, content, scriptId, onDelta, onDone, onError }) => { const requestTask = uni.request({ url: `${getApiBaseUrl()}/chat/stream`, method: 'POST', data: { operationType, conversationId, messageId, userMessageId, content, scriptId }, header: { 'Content-Type': 'application/json', ...getAuthHeader() }, enableChunked: true, timeout: 300000, success: (res) => { if (res.statusCode >= 400) { onError?.(res.data?.message || '流式请求失败') return } if (typeof res.data === 'string' && res.data) { consumeSseText(res.data, onDelta, onDone, onError) } }, fail: (error) => { onError?.(error.errMsg || '流式请求失败') } }) requestTask?.onChunkReceived?.((res) => { try { const text = decodeChunk(res.data) consumeSseText(text, onDelta, onDone, onError) } catch (error) { onError?.(error.message || '流式解析失败') } }) } export const listMessagesByConversation = async ({ conversationId, includeVersions = false }) => { return get('/message/listByConversation', { conversationId, includeVersions }) } export const listMessageVersions = async (messageId) => { return get('/message/versions', { messageId }) } export const switchVersion = async ({ scriptId, messageId }) => { return put('/epicScript/switchVersion', { scriptId, messageId }) } export const deleteVersion = async (messageId) => { return del('/message/deleteVersion', { id: messageId }) } function decodeChunk(chunk) { if (typeof chunk === 'string') return chunk const decoder = new TextDecoder('utf-8') return decoder.decode(new Uint8Array(chunk)) } function consumeSseText(text, onDelta, onDone, onError) { const lines = text.split(/\r?\n/) let eventName = '' let dataBuffer = '' lines.forEach((line) => { if (line.startsWith('event:')) { eventName = line.slice(6).trim() } else if (line.startsWith('data:')) { dataBuffer += line.slice(5).trim() } else if (line === '' && dataBuffer) { try { if (eventName === 'delta') { onDelta?.(dataBuffer) } else if (eventName === 'metadata') { onDone?.({ type: 'metadata', data: JSON.parse(dataBuffer) }) } else if (eventName === 'done') { onDone?.({ type: 'done', data: JSON.parse(dataBuffer) }) } else if (eventName === 'error') { onError?.(dataBuffer) } } catch (e) { onError?.(e.message) } eventName = '' dataBuffer = '' } }) }