| | const { |
| | Capabilities, |
| | EModelEndpoint, |
| | isAgentsEndpoint, |
| | isAssistantsEndpoint, |
| | defaultRetrievalModels, |
| | defaultAssistantsVersion, |
| | defaultAgentCapabilities, |
| | } = require('librechat-data-provider'); |
| | const { sendEvent } = require('@librechat/api'); |
| | const partialRight = require('lodash/partialRight'); |
| |
|
| | const addSpaceIfNeeded = (text) => (text.length > 0 && !text.endsWith(' ') ? text + ' ' : text); |
| |
|
| | const base = { message: true, initial: true }; |
| | const createOnProgress = ( |
| | { generation = '', onProgress: _onProgress } = { |
| | generation: '', |
| | onProgress: null, |
| | }, |
| | ) => { |
| | let i = 0; |
| | let tokens = addSpaceIfNeeded(generation); |
| |
|
| | const basePayload = Object.assign({}, base, { text: tokens || '' }); |
| |
|
| | const progressCallback = (chunk, { res, ...rest }) => { |
| | basePayload.text = basePayload.text + chunk; |
| |
|
| | const payload = Object.assign({}, basePayload, rest); |
| | sendEvent(res, payload); |
| | if (_onProgress) { |
| | _onProgress(payload); |
| | } |
| | if (i === 0) { |
| | basePayload.initial = false; |
| | } |
| | i++; |
| | }; |
| |
|
| | const sendIntermediateMessage = (res, payload, extraTokens = '') => { |
| | basePayload.text = basePayload.text + extraTokens; |
| | const message = Object.assign({}, basePayload, payload); |
| | sendEvent(res, message); |
| | if (i === 0) { |
| | basePayload.initial = false; |
| | } |
| | i++; |
| | }; |
| |
|
| | const onProgress = (opts) => { |
| | return partialRight(progressCallback, opts); |
| | }; |
| |
|
| | const getPartialText = () => { |
| | return basePayload.text; |
| | }; |
| |
|
| | return { onProgress, getPartialText, sendIntermediateMessage }; |
| | }; |
| |
|
| | const handleText = async (response) => { |
| | let { text } = response; |
| | response.text = text; |
| | return text; |
| | }; |
| |
|
| | const isObject = (item) => item && typeof item === 'object' && !Array.isArray(item); |
| | const getString = (input) => (isObject(input) ? JSON.stringify(input) : input); |
| |
|
| | function formatSteps(steps) { |
| | let output = ''; |
| |
|
| | for (let i = 0; i < steps.length; i++) { |
| | const step = steps[i]; |
| | const actionInput = getString(step.action.toolInput); |
| | const observation = step.observation; |
| |
|
| | if (actionInput === 'N/A' || observation?.trim()?.length === 0) { |
| | continue; |
| | } |
| |
|
| | output += `Input: ${actionInput}\nOutput: ${getString(observation)}`; |
| |
|
| | if (steps.length > 1 && i !== steps.length - 1) { |
| | output += '\n---\n'; |
| | } |
| | } |
| |
|
| | return output; |
| | } |
| |
|
| | function formatAction(action) { |
| | const formattedAction = { |
| | plugin: action.tool, |
| | input: getString(action.toolInput), |
| | thought: action.log.includes('Thought: ') |
| | ? action.log.split('\n')[0].replace('Thought: ', '') |
| | : action.log.split('\n')[0], |
| | }; |
| |
|
| | formattedAction.thought = getString(formattedAction.thought); |
| |
|
| | if (action.tool.toLowerCase() === 'self-reflection' || formattedAction.plugin === 'N/A') { |
| | formattedAction.inputStr = `{\n\tthought: ${formattedAction.input}${ |
| | !formattedAction.thought.includes(formattedAction.input) |
| | ? ' - ' + formattedAction.thought |
| | : '' |
| | }\n}`; |
| | formattedAction.inputStr = formattedAction.inputStr.replace('N/A - ', ''); |
| | } else { |
| | const hasThought = formattedAction.thought.length > 0; |
| | const thought = hasThought ? `\n\tthought: ${formattedAction.thought}` : ''; |
| | formattedAction.inputStr = `{\n\tplugin: ${formattedAction.plugin}\n\tinput: ${formattedAction.input}\n${thought}}`; |
| | } |
| |
|
| | return formattedAction; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | const isUserProvided = (value) => value === 'user_provided'; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | function generateConfig(key, baseURL, endpoint) { |
| | if (!key) { |
| | return false; |
| | } |
| |
|
| | |
| | const config = { userProvide: isUserProvided(key) }; |
| |
|
| | if (baseURL) { |
| | config.userProvideURL = isUserProvided(baseURL); |
| | } |
| |
|
| | const assistants = isAssistantsEndpoint(endpoint); |
| | const agents = isAgentsEndpoint(endpoint); |
| | if (assistants) { |
| | config.retrievalModels = defaultRetrievalModels; |
| | config.capabilities = [ |
| | Capabilities.code_interpreter, |
| | Capabilities.image_vision, |
| | Capabilities.retrieval, |
| | Capabilities.actions, |
| | Capabilities.tools, |
| | ]; |
| | } |
| |
|
| | if (agents) { |
| | config.capabilities = defaultAgentCapabilities; |
| | } |
| |
|
| | if (assistants && endpoint === EModelEndpoint.azureAssistants) { |
| | config.version = defaultAssistantsVersion.azureAssistants; |
| | } else if (assistants) { |
| | config.version = defaultAssistantsVersion.assistants; |
| | } |
| |
|
| | return config; |
| | } |
| |
|
| | module.exports = { |
| | handleText, |
| | formatSteps, |
| | formatAction, |
| | isUserProvided, |
| | generateConfig, |
| | addSpaceIfNeeded, |
| | createOnProgress, |
| | }; |
| |
|