aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/nodes/chatbot/tools/CreateAnyDocTool.ts
diff options
context:
space:
mode:
authorbobzel <zzzman@gmail.com>2025-01-21 18:13:39 -0500
committerbobzel <zzzman@gmail.com>2025-01-21 18:13:39 -0500
commitd72977ad8b67f2575cad8aea988fcfa7c04f794a (patch)
tree2b87cab8eade12394cb19f7168e0a9c5e5ff07f3 /src/client/views/nodes/chatbot/tools/CreateAnyDocTool.ts
parentec0ab50aad9fbb55477476998c6932488b149f45 (diff)
more attempts to cleanup typing, etc in chat box
Diffstat (limited to 'src/client/views/nodes/chatbot/tools/CreateAnyDocTool.ts')
-rw-r--r--src/client/views/nodes/chatbot/tools/CreateAnyDocTool.ts145
1 files changed, 65 insertions, 80 deletions
diff --git a/src/client/views/nodes/chatbot/tools/CreateAnyDocTool.ts b/src/client/views/nodes/chatbot/tools/CreateAnyDocTool.ts
index 6f61b77d4..0049612fd 100644
--- a/src/client/views/nodes/chatbot/tools/CreateAnyDocTool.ts
+++ b/src/client/views/nodes/chatbot/tools/CreateAnyDocTool.ts
@@ -1,49 +1,61 @@
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';
+import { ParametersType } from '../types/tool_types';
+import { DocumentOptions } from '../../../../documents/Documents';
+import { toLower } from 'lodash';
-/**
- * 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'];
+export enum supportedDocumentTypes {
+ flashcard = 'flashcard',
+ text = 'text',
+ html = 'html',
+ equation = 'equation',
+ functionplot = 'functionplot',
+ dataviz = 'dataviz',
+ notetaking = 'notetaking',
+ rtf = 'rtf',
+ message = 'message',
+}
+const standardOptions = ['title', 'backgroundColor', 'layout'];
/**
* Description of document options and data field for each type.
*/
-const documentTypesInfo = {
- text: {
- options: ['title', 'backgroundColor', 'fontColor', 'text_align', 'layout'],
+const documentTypesInfo: { [key in supportedDocumentTypes]: { options: string[]; dataDescription: string } } = {
+ [supportedDocumentTypes.flashcard]: {
+ options: [...standardOptions, 'fontColor', 'text_align'],
+ dataDescription: 'an array of two strings. the first string contains a question, and the second string contains an answer',
+ },
+ [supportedDocumentTypes.text]: {
+ options: [...standardOptions, 'fontColor', 'text_align'],
dataDescription: 'The text content of the document.',
},
- html: {
- options: ['title', 'backgroundColor', 'layout'],
+ [supportedDocumentTypes.html]: {
+ options: [],
dataDescription: 'The HTML-formatted text content of the document.',
},
- equation: {
- options: ['title', 'backgroundColor', 'fontColor', 'layout'],
+ [supportedDocumentTypes.equation]: {
+ options: [...standardOptions, 'fontColor'],
dataDescription: 'The equation content as a string.',
},
- functionPlot: {
- options: ['title', 'backgroundColor', 'layout', 'function_definition'],
+ [supportedDocumentTypes.functionplot]: {
+ options: [...standardOptions, 'function_definition'],
dataDescription: 'The function definition(s) for plotting. Provide as a string or array of function definitions.',
},
- dataviz: {
- options: ['title', 'backgroundColor', 'layout', 'chartType'],
+ [supportedDocumentTypes.dataviz]: {
+ options: [...standardOptions, 'chartType'],
dataDescription: 'A string of comma-separated values representing the CSV data.',
},
- noteTaking: {
- options: ['title', 'backgroundColor', 'layout'],
+ [supportedDocumentTypes.notetaking]: {
+ options: standardOptions,
dataDescription: 'The initial content or structure for note-taking.',
},
- rtf: {
- options: ['title', 'backgroundColor', 'layout'],
+ [supportedDocumentTypes.rtf]: {
+ options: standardOptions,
dataDescription: 'The rich text content in RTF format.',
},
- message: {
- options: ['title', 'backgroundColor', 'layout'],
+ [supportedDocumentTypes.message]: {
+ options: standardOptions,
dataDescription: 'The message content of the document.',
},
};
@@ -52,7 +64,7 @@ const createAnyDocumentToolParams = [
{
name: 'document_type',
type: 'string',
- description: `The type of the document to create. Supported types are: ${supportedDocumentTypes.join(', ')}`,
+ description: `The type of the document to create. Supported types are: ${Object.values(supportedDocumentTypes).join(', ')}`,
required: true,
},
{
@@ -64,90 +76,63 @@ const createAnyDocumentToolParams = [
{
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,
+ description: `A JSON string representing the document options. Available options depend on the document type. For example:
+ ${Object.entries(documentTypesInfo).map( ([doc_type, info]) => `
+- For '${doc_type}' documents, options include: ${info.options.join(', ')}`)
+ .join('\n')}`, // prettier-ignore
},
] 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;
+ private _addLinkedDoc: (doc_type: supportedDocumentTypes, data: unknown, options: DocumentOptions, id: string) => void;
- constructor(addLinkedDoc: (doc_type: string, data: string | undefined, options: DocumentOptions, id: string) => void) {
+ constructor(addLinkedDoc: (doc_type: supportedDocumentTypes, data: unknown, options: DocumentOptions, id: string) => void) {
+ // prettier-ignore
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:
+ `Creates any type of document with the provided options and data. Supported document types are: ${Object.values(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>`,
+ ${Object.entries(documentTypesInfo).map(([doc_type, info]) => `
+ <document_type name="${doc_type}">
+ <data_description>${info.dataDescription}</data_description>
+ <options>
+ ${info.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(', ')}.`
+ `Creates any type of document with the provided options and data. Supported document types are: ${Object.values(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 = {};
+ const documentType = toLower(args.document_type) as unknown as supportedDocumentTypes;
+ const info = documentTypesInfo[documentType];
- if (!supportedDocumentTypes.includes(documentType)) {
- throw new Error(`Unsupported document type: ${documentType}. Supported types are: ${supportedDocumentTypes.join(', ')}.`);
+ if (info === undefined) {
+ throw new Error(`Unsupported document type: ${documentType}. Supported types are: ${Object.values(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.');
- }
+ throw new Error(`Data is required for ${documentType} documents. ${info.dataDescription}`);
}
- const data = args.data as string;
const id = uuidv4();
+ const options: DocumentOptions = !args.options ? {} : JSON.parse(args.options);
- // 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);
+ // Call the function to add the linked document (add default title that can be overriden if set in options)
+ this._addLinkedDoc(documentType, args.data, { title: `New ${documentType.charAt(0).toUpperCase() + documentType.slice(1)} Document`, ...options }, id);
- return [
- {
- type: 'text',
- text: `Created ${documentType} document with ID ${id}.`,
- },
- ];
+ return [{ type: 'text', text: `Created ${documentType} document with ID ${id}.` }];
} catch (error) {
- return [
- {
- type: 'text',
- text: 'Error creating document: ' + (error as Error).message,
- },
- ];
+ return [{ type: 'text', text: 'Error creating document: ' + (error as Error).message }];
}
}
}