import fs from 'fs'; import { ToolCall, ChatOptions, ChatMsg } from './api-defs.js'; export type Call = ToolCall; let toolsList = JSON.parse( fs.readFileSync( "../data/modeltools.json", "utf8" ) ); export function getPromptStr( options: ChatOptions ) { let toolsArr: any[] = []; for( let tool of toolsList ) { for( let [capability, val] of Object.entries( options.model.capabilities ) ) { if( val && capability.toString().toLowerCase() == tool.function.name.toLowerCase() ) toolsArr.push( tool ); } } return JSON.stringify( toolsArr ); } export function isToolStr( buf: string ) { let trimmed = buf.replace( /\s+/g, '' ).toLowerCase(); for( let tool of toolsList ) { let name = tool.function.name.toLowerCase(); let str = `{"name":"${name}"`; let notMatched = false; for( let i = 0; i < Math.min( trimmed.length, str.length ); ++i ) { if( trimmed[i] != str[i] ) { notMatched = true; break; } } if( !notMatched ) return true; } return false; } export function getCall( msg: ChatMsg ) : Call | null { let firstBracket = msg.content.indexOf( "{" ); let lastBracket = msg.content.lastIndexOf( "}" ); if( firstBracket == -1 || lastBracket == -1 ) return null; let toolCall = msg.content.substring( firstBracket, lastBracket + 1 ); let json: Call; try { json = JSON.parse( toolCall ); } catch( e ) { return null; } for( let tool of toolsList ) { if( tool.function.name.toLowerCase() == json.name.toLowerCase() ) { return json; } } return null; }