Explorar el Código

Implement extructPageDataFromMessageEvent()

Shun Miyazawa hace 1 año
padre
commit
178b98ba8f

+ 7 - 1
apps/app/src/features/openai/server/routes/message.ts

@@ -14,6 +14,7 @@ import loggerFactory from '~/utils/logger';
 
 import { MessageErrorCode, type StreamErrorCode } from '../../interfaces/message-error';
 import { openaiClient } from '../services';
+import { extructPageDataFromMessageEvent } from '../services/extract-page-data-from-message-event';
 import { getStreamErrorCode } from '../services/getStreamErrorCode';
 
 import { certifyAiService } from './middlewares/certify-ai-service';
@@ -85,7 +86,12 @@ export const postMessageHandlersFactory: PostMessageHandlersFactory = (crowi) =>
         res.write(`error: ${JSON.stringify({ code, message })}\n\n`);
       };
 
-      stream.on('event', (delta) => {
+      stream.on('messageDone', async(event) => {
+        const pageData = await extructPageDataFromMessageEvent(event);
+        // res.write();
+      });
+
+      stream.on('event', async(delta) => {
         if (delta.event === 'thread.run.failed') {
           const errorMessage = delta.data.last_error?.message;
           if (errorMessage == null) {

+ 27 - 0
apps/app/src/features/openai/server/services/extract-page-data-from-message-event.ts

@@ -0,0 +1,27 @@
+import type { Message } from 'openai/resources/beta/threads/messages.mjs';
+
+import VectorStoreFileRelationModel from '~/features/openai/server/models/vector-store-file-relation';
+
+interface Page {
+  path: string;
+  id: string;
+}
+
+export const extructPageDataFromMessageEvent = async(message: Message): Promise<Page[]> => {
+  const fileIds: string[] = [];
+  for (const content of message.content) {
+    if (content.type === 'text') {
+      for (const annotation of content.text.annotations) {
+        if (annotation.type === 'file_citation') {
+          fileIds.push(annotation.file_citation.file_id);
+        }
+      }
+    }
+  }
+
+  const pageData: Page[] = await VectorStoreFileRelationModel
+    .find({ fileIds: { $in: fileIds } })
+    .populate('pageId', 'path');
+
+  return pageData;
+};