diff options
| author | bobzel <zzzman@gmail.com> | 2024-11-19 10:36:59 -0500 |
|---|---|---|
| committer | bobzel <zzzman@gmail.com> | 2024-11-19 10:36:59 -0500 |
| commit | 7b38bbc4d845fa524e8310a0ec05b0e776b47c82 (patch) | |
| tree | 958609fc079523803345a74e33b16c164c226fd8 /src/client/views/nodes/chatbot/tools/CreateAnyDocTool.ts | |
| parent | 196b92cb84095780d2b36244831cac03e9b66d8e (diff) | |
| parent | 9e447814b551c352709296ae562f1f50480320f5 (diff) | |
Merge remote-tracking branch 'origin/ajs-finalagent'
Diffstat (limited to 'src/client/views/nodes/chatbot/tools/CreateAnyDocTool.ts')
| -rw-r--r-- | src/client/views/nodes/chatbot/tools/CreateAnyDocTool.ts | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/src/client/views/nodes/chatbot/tools/CreateAnyDocTool.ts b/src/client/views/nodes/chatbot/tools/CreateAnyDocTool.ts new file mode 100644 index 000000000..6f61b77d4 --- /dev/null +++ b/src/client/views/nodes/chatbot/tools/CreateAnyDocTool.ts @@ -0,0 +1,153 @@ +import { v4 as uuidv4 } from 'uuid'; +import { BaseTool } from './BaseTool'; +import { Observation } from '../types/types'; +import { ParametersType, Parameter } from '../types/tool_types'; +import { DocumentOptions, Docs } from '../../../../documents/Documents'; + +/** + * List of supported document types that can be created via text LLM. + */ +type supportedDocumentTypesType = 'text' | 'html' | 'equation' | 'functionPlot' | 'dataviz' | 'noteTaking' | 'rtf' | 'message'; +const supportedDocumentTypes: supportedDocumentTypesType[] = ['text', 'html', 'equation', 'functionPlot', 'dataviz', 'noteTaking', 'rtf', 'message']; + +/** + * Description of document options and data field for each type. + */ +const documentTypesInfo = { + text: { + options: ['title', 'backgroundColor', 'fontColor', 'text_align', 'layout'], + dataDescription: 'The text content of the document.', + }, + html: { + options: ['title', 'backgroundColor', 'layout'], + dataDescription: 'The HTML-formatted text content of the document.', + }, + equation: { + options: ['title', 'backgroundColor', 'fontColor', 'layout'], + dataDescription: 'The equation content as a string.', + }, + functionPlot: { + options: ['title', 'backgroundColor', 'layout', 'function_definition'], + dataDescription: 'The function definition(s) for plotting. Provide as a string or array of function definitions.', + }, + dataviz: { + options: ['title', 'backgroundColor', 'layout', 'chartType'], + dataDescription: 'A string of comma-separated values representing the CSV data.', + }, + noteTaking: { + options: ['title', 'backgroundColor', 'layout'], + dataDescription: 'The initial content or structure for note-taking.', + }, + rtf: { + options: ['title', 'backgroundColor', 'layout'], + dataDescription: 'The rich text content in RTF format.', + }, + message: { + options: ['title', 'backgroundColor', 'layout'], + dataDescription: 'The message content of the document.', + }, +}; + +const createAnyDocumentToolParams = [ + { + name: 'document_type', + type: 'string', + description: `The type of the document to create. Supported types are: ${supportedDocumentTypes.join(', ')}`, + required: true, + }, + { + name: 'data', + type: 'string', + description: 'The content or data of the document. The exact format depends on the document type.', + required: true, + }, + { + name: 'options', + type: 'string', + description: `A JSON string representing the document options. Available options depend on the document type. For example: +${supportedDocumentTypes + .map( + docType => ` +- For '${docType}' documents, options include: ${documentTypesInfo[docType].options.join(', ')}` + ) + .join('\n')}`, + required: false, + }, +] as const; + +type CreateAnyDocumentToolParamsType = typeof createAnyDocumentToolParams; + +export class CreateAnyDocumentTool extends BaseTool<CreateAnyDocumentToolParamsType> { + private _addLinkedDoc: (doc_type: string, data: string | undefined, options: DocumentOptions, id: string) => void; + + constructor(addLinkedDoc: (doc_type: string, data: string | undefined, options: DocumentOptions, id: string) => void) { + super( + 'createAnyDocument', + `Creates any type of document with the provided options and data. Supported document types are: ${supportedDocumentTypes.join(', ')}. dataviz is a csv table tool, so for CSVs, use dataviz. Here are the options for each type: + <supported_document_types> + ${supportedDocumentTypes + .map( + docType => ` + <document_type name="${docType}"> + <data_description>${documentTypesInfo[docType].dataDescription}</data_description> + <options> + ${documentTypesInfo[docType].options.map(option => `<option>${option}</option>`).join('\n')} + </options> + </document_type> + ` + ) + .join('\n')} + </supported_document_types>`, + createAnyDocumentToolParams, + 'Provide the document type, data, and options for the document. Options should be a valid JSON string containing the document options specific to the document type.', + `Creates any type of document with the provided options and data. Supported document types are: ${supportedDocumentTypes.join(', ')}.` + ); + this._addLinkedDoc = addLinkedDoc; + } + + async execute(args: ParametersType<CreateAnyDocumentToolParamsType>): Promise<Observation[]> { + try { + const documentType: supportedDocumentTypesType = args.document_type.toLowerCase() as supportedDocumentTypesType; + let options: DocumentOptions = {}; + + if (!supportedDocumentTypes.includes(documentType)) { + throw new Error(`Unsupported document type: ${documentType}. Supported types are: ${supportedDocumentTypes.join(', ')}.`); + } + + if (!args.data) { + throw new Error(`Data is required for ${documentType} documents. ${documentTypesInfo[documentType].dataDescription}`); + } + + if (args.options) { + try { + options = JSON.parse(args.options as string) as DocumentOptions; + } catch (e) { + throw new Error('Options must be a valid JSON string.'); + } + } + + const data = args.data as string; + const id = uuidv4(); + + // Set default options if not provided + options.title = options.title || `New ${documentType.charAt(0).toUpperCase() + documentType.slice(1)} Document`; + + // Call the function to add the linked document + this._addLinkedDoc(documentType, data, options, id); + + return [ + { + type: 'text', + text: `Created ${documentType} document with ID ${id}.`, + }, + ]; + } catch (error) { + return [ + { + type: 'text', + text: 'Error creating document: ' + (error as Error).message, + }, + ]; + } + } +} |
