import { BaseTool } from './BaseTool'; import { Observation } from '../types/types'; import { ParametersType, ToolInfo } from '../types/tool_types'; import { AgentDocumentManager } from '../utils/AgentDocumentManager'; import { gptAPICall, GPTCallType } from '../../../../apis/gpt/GPT'; import { ChatSortField } from '../../../collections/CollectionSubView'; import { v4 as uuidv4 } from 'uuid'; const parameterRules = [ { name: 'sortCriteria', type: 'string', description: 'Criteria provided by the user to sort the documents.', required: true, }, ] as const; const toolInfo: ToolInfo = { name: 'sortDocs', description: 'Sorts documents within the current Dash environment based on user-specified criteria. Provide clear sorting criteria, such as by date, title, relevance, or custom metadata fields.', parameterRules, citationRules: 'No citation needed for sorting operations.', }; export class SortDocsTool extends BaseTool { private _docManager: AgentDocumentManager; constructor(docManager: AgentDocumentManager) { super(toolInfo); this._docManager = docManager; this._docManager.initializeFindDocsFreeform(); } async execute(args: ParametersType): Promise { const chunkId = uuidv4(); try { const docs = this._docManager.docIds.map((id) => this._docManager.extractDocumentMetadata(id)); const descriptions = docs .filter((doc): doc is NonNullable => doc !== null) .map( (doc) => `${doc.id}: ${doc.title} - ${doc.fields.layout.summary || ''}` ) .join('\n'); const sortedIdsResponse = await gptAPICall(args.sortCriteria, GPTCallType.SORTDOCS, descriptions); const sortedIds = sortedIdsResponse.trim().split('\n'); console.log(sortedIdsResponse); console.log(sortedIds); sortedIds.forEach((id, index) => { this._docManager.editDocumentField(id, ChatSortField, index); }); return [{ type: 'text', text: `Successfully sorted ${sortedIds.length} documents based on "${args.sortCriteria}".`, }]; } catch (error) { return [{ type: 'text', text: `Sorting failed: ${error instanceof Error ? error.message : String(error)}`, }]; } } }