aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/nodes/chatbot/chatboxcomponents/ChatBox.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/nodes/chatbot/chatboxcomponents/ChatBox.tsx')
-rw-r--r--src/client/views/nodes/chatbot/chatboxcomponents/ChatBox.tsx195
1 files changed, 184 insertions, 11 deletions
diff --git a/src/client/views/nodes/chatbot/chatboxcomponents/ChatBox.tsx b/src/client/views/nodes/chatbot/chatboxcomponents/ChatBox.tsx
index 44c231c87..4a39ee388 100644
--- a/src/client/views/nodes/chatbot/chatboxcomponents/ChatBox.tsx
+++ b/src/client/views/nodes/chatbot/chatboxcomponents/ChatBox.tsx
@@ -20,7 +20,7 @@ import { CsvCast, DocCast, PDFCast, RTFCast, StrCast } from '../../../../../fiel
import { Networking } from '../../../../Network';
import { DocUtils } from '../../../../documents/DocUtils';
import { DocumentType } from '../../../../documents/DocumentTypes';
-import { Docs } from '../../../../documents/Documents';
+import { Docs, DocumentOptions } from '../../../../documents/Documents';
import { DocumentManager } from '../../../../util/DocumentManager';
import { LinkManager } from '../../../../util/LinkManager';
import { ViewBoxAnnotatableComponent } from '../../../DocComponent';
@@ -33,6 +33,7 @@ import { Vectorstore } from '../vectorstore/Vectorstore';
import './ChatBox.scss';
import MessageComponentBox from './MessageComponent';
import { ProgressBar } from './ProgressBar';
+import { RichTextField } from '../../../../../fields/RichTextField';
dotenv.config();
@@ -89,7 +90,7 @@ export class ChatBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
this.vectorstore_id = StrCast(this.dataDoc.vectorstore_id);
}
this.vectorstore = new Vectorstore(this.vectorstore_id, this.retrieveDocIds);
- this.agent = new Agent(this.vectorstore, this.retrieveSummaries, this.retrieveFormattedHistory, this.retrieveCSVData, this.addLinkedUrlDoc, this.createCSVInDash);
+ this.agent = new Agent(this.vectorstore, this.retrieveSummaries, this.retrieveFormattedHistory, this.retrieveCSVData, this.addLinkedUrlDoc, this.createDocInDash, this.createCSVInDash);
this.messagesRef = React.createRef<HTMLDivElement>();
// Reaction to update dataDoc when chat history changes
@@ -411,6 +412,185 @@ export class ChatBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
};
/**
+ * Creates a text document in the dashboard and adds it for analysis.
+ * @param title The title of the doc.
+ * @param text_content The text of the document.
+ * @param options Other optional document options (e.g. color)
+ * @param id The unique ID for the document.
+ */
+
+ // @action
+ // createDocInDash = async (docs: string[]) => {
+ // console.log('DOCS HERE' + docs);
+ // docs.forEach(doc => {
+ // const parsedDoc = JSON.parse(doc);
+ // this.createIndivDocInDash(parsedDoc.doc_type, parsedDoc.data, parsedDoc.options, '');
+ // });
+ // };
+ @action
+ private createCollectionWithChildren = async (data: any): Promise<Doc[]> => {
+ console.log('Creating collection with nested documents');
+
+ // Create an array of promises for each document
+ const childDocPromises = data.map(async doc => {
+ const parsedDoc = doc;
+ console.log('Parse #3: ' + parsedDoc);
+ if (parsedDoc.doc_type !== 'collection') {
+ // Handle non-collection documents
+ return await this.whichDoc(parsedDoc.doc_type, parsedDoc.data, { backgroundColor: parsedDoc.backgroundColor, _width: parsedDoc.width, _height: parsedDoc.height }, parsedDoc.id);
+ } else {
+ // Recursively process collections
+ const nestedDocs = await this.createCollectionWithChildren(parsedDoc.data);
+ const collectionOptions: DocumentOptions = {
+ title: parsedDoc.title,
+ backgroundColor: parsedDoc.backgroundColor,
+ _width: parsedDoc.width,
+ _height: parsedDoc.height,
+ _layout_fitWidth: true,
+ _freeform_backgroundGrid: true,
+ };
+ const collectionDoc = DocCast(Docs.Create.FreeformDocument(nestedDocs, collectionOptions));
+ return collectionDoc; // Return th
+ }
+ });
+
+ // Await all child document creations concurrently
+ const nestedResults = await Promise.all(childDocPromises);
+ console.log('n' + nestedResults);
+ // Flatten any nested arrays from recursive collection calls
+ const childDocs = nestedResults.flat() as Doc[];
+ console.log('c' + childDocs);
+ childDocs.forEach(doc => {
+ console.log(DocCast(doc));
+ console.log(DocCast(doc)[DocData].data);
+ console.log(DocCast(doc)[DocData].data);
+ });
+ return childDocs;
+ };
+
+ @action
+ whichDoc = async (doc_type: string, data: string, options: DocumentOptions, id: string): Promise<Doc> => {
+ let doc;
+ switch (doc_type) {
+ case 'text':
+ doc = DocCast(Docs.Create.TextDocument(data, options));
+ break;
+ case 'flashcard':
+ doc = this.createFlashcard(data, options);
+ break;
+ case 'image':
+ doc = DocCast(Docs.Create.ImageDocument(data, options));
+ break;
+ case 'equation':
+ doc = DocCast(Docs.Create.EquationDocument('', options));
+ break;
+ case 'noteboard':
+ doc = DocCast(Docs.Create.NoteTakingDocument([], options));
+ break;
+ case 'simulation':
+ doc = DocCast(Docs.Create.SimulationDocument(options));
+ break;
+ case 'collection': {
+ // const par = JSON.parse(data);
+ // console.log('Parse #2: ' + par);
+ const arr = await this.createCollectionWithChildren(data);
+ options._layout_fitWidth = true;
+ options._freeform_backgroundGrid = true;
+
+ // const opts = { _width: 500, _height: 800, _layout_fitWidth: true, _freeform_backgroundGrid: true };
+ doc = DocCast(Docs.Create.FreeformDocument(arr, options));
+ break;
+ }
+ case 'web':
+ doc = DocCast(Docs.Create.WebDocument(data, options));
+ break;
+ case 'comparison':
+ doc = Docs.Create.ComparisonDocument('', options);
+ break;
+ case 'diagram':
+ doc = Docs.Create.DiagramDocument(options);
+ break;
+ case 'audio':
+ doc = Docs.Create.AudioDocument(data, options);
+ break;
+ case 'map':
+ doc = Docs.Create.MapDocument([], options);
+ break;
+ case 'screengrab':
+ doc = Docs.Create.ScreenshotDocument(options);
+ break;
+ case 'webcam':
+ doc = Docs.Create.WebCamDocument('', options);
+ break;
+ case 'button':
+ doc = Docs.Create.ButtonDocument(options);
+ break;
+ case 'script':
+ doc = Docs.Create.ScriptingDocument(null, options);
+ break;
+ case 'dataviz':
+ doc = Docs.Create.DataVizDocument('/users/rz/Downloads/addresses.csv', options);
+ break;
+ case 'chat':
+ doc = Docs.Create.ChatDocument(options);
+ break;
+ case 'trail':
+ doc = Docs.Create.PresDocument(options);
+ break;
+ case 'tab':
+ doc = Docs.Create.FreeformDocument([], options);
+ break;
+ case 'slide':
+ doc = Docs.Create.TreeDocument([], options);
+ break;
+ default:
+ doc = DocCast(Docs.Create.TextDocument(data, options));
+ }
+ return doc;
+ };
+
+ @action
+ createDocInDash = async (doc_type: string, data: string, options: DocumentOptions, id: string) => {
+ console.log('INDIV DOC' + doc_type);
+
+ const doc = await this.whichDoc(doc_type, data, options, id);
+
+ console.log('DOC' + doc_type);
+ const linkDoc = Docs.Create.LinkDocument(this.Document, doc);
+ LinkManager.Instance.addLink(linkDoc);
+
+ doc && this._props.addDocument?.(doc);
+ await DocumentManager.Instance.showDocument(doc, { willZoomCentered: true }, () => {});
+ };
+
+ // TODO: DELEGATE TO DIFFERENT CLASS
+ @action
+ createFlashcard = (data: string, options: DocumentOptions) => {
+ const flashcardDeck: Doc[] = [];
+ const parsedItems: { [key: string]: string } = JSON.parse(data);
+ Object.entries(parsedItems).forEach(([key, val]) => {
+ console.log('key' + key);
+ console.log('key' + val);
+
+ const side1 = Docs.Create.CenteredTextCreator('question', key, options);
+ const side2 = Docs.Create.CenteredTextCreator('answer', val, options);
+ const doc = DocCast(Docs.Create.FlashcardDocument(data, side1, side2, { _width: 300, _height: 300 }));
+ this._props.addDocument?.(doc);
+ flashcardDeck.push(doc);
+ });
+ const col = DocCast(
+ Docs.Create.CarouselDocument(flashcardDeck, {
+ title: options.title,
+ _width: 300,
+ _height: 300,
+ _layout_fitWidth: false,
+ _layout_autoHeight: true,
+ })
+ );
+ return col;
+ };
+
+ /**
* Event handler to manage citations click in the message components.
* @param citation The citation object clicked by the user.
*/
@@ -709,17 +889,10 @@ export class ChatBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
</div>
<div className="chat-messages" ref={this.messagesRef}>
{this.history.map((message, index) => (
- <MessageComponentBox key={index} message={message} index={index} onFollowUpClick={this.handleFollowUpClick} onCitationClick={this.handleCitationClick} updateMessageCitations={this.updateMessageCitations} />
+ <MessageComponentBox key={index} message={message} onFollowUpClick={this.handleFollowUpClick} onCitationClick={this.handleCitationClick} updateMessageCitations={this.updateMessageCitations} />
))}
{this.current_message && (
- <MessageComponentBox
- key={this.history.length}
- message={this.current_message}
- index={this.history.length}
- onFollowUpClick={this.handleFollowUpClick}
- onCitationClick={this.handleCitationClick}
- updateMessageCitations={this.updateMessageCitations}
- />
+ <MessageComponentBox key={this.history.length} message={this.current_message} onFollowUpClick={this.handleFollowUpClick} onCitationClick={this.handleCitationClick} updateMessageCitations={this.updateMessageCitations} />
)}
</div>
<form onSubmit={this.askGPT} className="chat-input">