regischen
2024-05-20 01:38:18 +00:00
parent 03104cd8b1
commit 01eff4ff20
10 changed files with 190 additions and 129 deletions

View File

@@ -133,11 +133,13 @@ export class CopilotClient {
signal,
}: {
sessionId: string;
messageId: string;
messageId?: string;
signal?: AbortSignal;
}) {
const url = new URL(`${this.backendUrl}/api/copilot/chat/${sessionId}`);
url.searchParams.set('messageId', messageId);
if (messageId) {
url.searchParams.set('messageId', messageId);
}
const response = await fetch(url.toString(), { signal });
return response.text();
}
@@ -148,21 +150,23 @@ export class CopilotClient {
messageId,
}: {
sessionId: string;
messageId: string;
messageId?: string;
}) {
const url = new URL(
`${this.backendUrl}/api/copilot/chat/${sessionId}/stream`
);
url.searchParams.set('messageId', messageId);
if (messageId) url.searchParams.set('messageId', messageId);
return new EventSource(url.toString());
}
// Text or image to images
imagesStream(messageId: string, sessionId: string, seed?: string) {
imagesStream(sessionId: string, messageId?: string, seed?: string) {
const url = new URL(
`${this.backendUrl}/api/copilot/chat/${sessionId}/images`
);
url.searchParams.set('messageId', messageId);
if (messageId) {
url.searchParams.set('messageId', messageId);
}
if (seed) {
url.searchParams.set('seed', seed);
}

View File

@@ -1,3 +1,5 @@
import { assertExists } from '@blocksuite/global/utils';
import { AIProvider } from '@blocksuite/presets';
import { partition } from 'lodash-es';
import { CopilotClient } from './copilot-client';
@@ -19,6 +21,7 @@ export type TextToTextOptions = {
timeout?: number;
stream?: boolean;
signal?: AbortSignal;
retry?: boolean;
};
export type ToImageOptions = TextToTextOptions & {
@@ -47,6 +50,7 @@ async function createSessionMessage({
sessionId: providedSessionId,
attachments,
params,
retry = false,
}: TextToTextOptions) {
if (!promptName && !providedSessionId) {
throw new Error('promptName or sessionId is required');
@@ -83,6 +87,11 @@ async function createSessionMessage({
})
);
}
if (retry)
return {
sessionId,
};
const messageId = await client.createMessage(options);
return {
messageId,
@@ -101,23 +110,41 @@ export function textToText({
stream,
signal,
timeout = TIMEOUT,
retry = false,
}: TextToTextOptions) {
let _sessionId: string;
let _messageId: string | undefined;
if (stream) {
return {
[Symbol.asyncIterator]: async function* () {
const message = await createSessionMessage({
docId,
workspaceId,
promptName,
content,
attachments,
params,
sessionId,
});
if (retry) {
const retrySessionId =
(await sessionId) ?? AIProvider.LAST_ACTION_SESSIONID;
assertExists(retrySessionId, 'retry sessionId is required');
_sessionId = retrySessionId;
_messageId = undefined;
} else {
const message = await createSessionMessage({
docId,
workspaceId,
promptName,
content,
attachments,
params,
sessionId,
retry,
});
_sessionId = message.sessionId;
_messageId = message.messageId;
}
const eventSource = client.chatTextStream({
sessionId: message.sessionId,
messageId: message.messageId,
sessionId: _sessionId,
messageId: _messageId,
});
AIProvider.LAST_ACTION_SESSIONID = _sessionId;
if (signal) {
if (signal.aborted) {
eventSource.close();
@@ -144,20 +171,33 @@ export function textToText({
throw new Error('Timeout');
})
: null,
createSessionMessage({
docId,
workspaceId,
promptName,
content,
attachments,
params,
sessionId,
}).then(message => {
(async function () {
if (retry) {
const retrySessionId =
(await sessionId) ?? AIProvider.LAST_ACTION_SESSIONID;
assertExists(retrySessionId, 'retry sessionId is required');
_sessionId = retrySessionId;
_messageId = undefined;
} else {
const message = await createSessionMessage({
docId,
workspaceId,
promptName,
content,
attachments,
params,
sessionId,
});
_sessionId = message.sessionId;
_messageId = message.messageId;
}
AIProvider.LAST_ACTION_SESSIONID = _sessionId;
return client.chatText({
sessionId: message.sessionId,
messageId: message.messageId,
sessionId: _sessionId,
messageId: _messageId,
});
}),
})(),
]);
}
}
@@ -173,21 +213,37 @@ export function toImage({
attachments,
params,
seed,
sessionId,
signal,
timeout = TIMEOUT,
retry = false,
}: ToImageOptions) {
let _sessionId: string;
let _messageId: string | undefined;
return {
[Symbol.asyncIterator]: async function* () {
const { messageId, sessionId } = await createSessionMessage({
docId,
workspaceId,
promptName,
content,
attachments,
params,
});
if (retry) {
const retrySessionId =
(await sessionId) ?? AIProvider.LAST_ACTION_SESSIONID;
assertExists(retrySessionId, 'retry sessionId is required');
_sessionId = retrySessionId;
_messageId = undefined;
} else {
const { messageId, sessionId } = await createSessionMessage({
docId,
workspaceId,
promptName,
content,
attachments,
params,
});
_sessionId = sessionId;
_messageId = messageId;
}
const eventSource = client.imagesStream(_sessionId, _messageId, seed);
AIProvider.LAST_ACTION_SESSIONID = _sessionId;
const eventSource = client.imagesStream(messageId, sessionId, seed);
for await (const event of toTextStream(eventSource, {
timeout,
signal,

View File

@@ -219,6 +219,7 @@ function setupAIProvider() {
});
AIProvider.provide('expandMindmap', options => {
assertExists(options.input, 'expandMindmap action requires input');
return textToText({
...options,
params: {