Files
FastGPT/packages/service/core/ai/llm/promptToolCall.ts
Archer 830eb19055 feature: V4.12.2 (#5525)
* feat: favorite apps & quick apps with their own configuration (#5515)

* chore: extract chat history and drawer; fix model selector

* feat: display favourite apps and make it configurable

* feat: favorite apps & quick apps with their own configuration

* fix: fix tab title and add loading state for searching

* fix: cascade delete favorite app and quick app while deleting relative app

* chore: make improvements

* fix: favourite apps ui

* fix: add permission for quick apps

* chore: fix permission & clear redundant code

* perf: chat home page code

* chatbox ui

* fix: 4.12.2-dev (#5520)

* fix: add empty placeholder; fix app quick status; fix tag and layout

* chore: add tab query for the setting tabs

* chore: use `useConfirm` hook instead of `MyModal`

* remove log

* fix: fix modal padding (#5521)

* perf: manage app

* feat: enhance model provider handling and update icon references (#5493)

* perf: model provider

* sdk package

* refactor: create llm response (#5499)

* feat: add LLM response processing functions, including the creation of stream-based and complete responses

* feat: add volta configuration for node and pnpm versions

* refactor: update LLM response handling and event structure in tool choice logic

* feat: update LLM response structure and integrate with tool choice logic

* refactor: clean up imports and remove unused streamResponse function in chat and toolChoice modules

* refactor: rename answer variable to answerBuffer for clarity in LLM response handling

* feat: enhance LLM response handling with tool options and integrate tools into chat and tool choice logic

* refactor: remove volta configuration from package.json

* refactor: reorganize LLM response types and ensure default values for token counts

* refactor: streamline LLM response handling by consolidating response structure and removing redundant checks

* refactor: enhance LLM response handling by consolidating tool options and streamlining event callbacks

* fix: build error

* refactor: update tool type definitions for consistency in tool handling

* feat: llm request function

* fix: ts

* fix: ts

* fix: ahook ts

* fix: variable name

* update lock

* ts version

* doc

* remove log

* fix: translation type

* perf: workflow status check

* fix: ts

* fix: prompt tool call

* fix: fix missing plugin interact window & make tag draggable (#5527)

* fix: incorrect select quick apps state; filter apps type (#5528)

* fix: usesafe translation

* perf: add quickapp modal

---------

Co-authored-by: 伍闲犬 <whoeverimf5@gmail.com>
Co-authored-by: Ctrlz <143257420+ctrlz526@users.noreply.github.com>
Co-authored-by: francis <zhichengfan18@gmail.com>
2025-08-25 19:19:43 +08:00

119 lines
3.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { getNanoid, sliceJsonStr } from '@fastgpt/global/common/string/tools';
import json5 from 'json5';
import type {
ChatCompletionMessageParam,
ChatCompletionMessageToolCall,
ChatCompletionSystemMessageParam,
ChatCompletionTool
} from '@fastgpt/global/core/ai/type';
import { getPromptToolCallPrompt } from './prompt';
import { cloneDeep } from 'lodash';
export const promptToolCallMessageRewrite = (
messages: ChatCompletionMessageParam[],
tools: ChatCompletionTool[]
) => {
const cloneMessages = cloneDeep(messages);
// Add system prompt too messages
let systemMessage = cloneMessages.find(
(item) => item.role === 'system'
) as ChatCompletionSystemMessageParam;
if (!systemMessage) {
systemMessage = {
role: 'system',
content: ''
};
cloneMessages.unshift(systemMessage);
}
if (typeof systemMessage?.content === 'string') {
systemMessage.content =
`${systemMessage.content}\n\n${getPromptToolCallPrompt(tools.map((tool) => tool.function))}`.trim();
} else if (Array.isArray(systemMessage.content)) {
systemMessage.content.push({
type: 'text',
text: getPromptToolCallPrompt(tools.map((tool) => tool.function))
});
} else {
throw new Error('Prompt call invalid input');
}
/*
Format tool messages, rewrite assistant/tool message
1. Assistant, not tool_calls: skip
2. Assistant, tool_calls: rewrite to assistant text
3. Tool: rewrite to user text
*/
for (let i = 0; i < cloneMessages.length; i++) {
const message = cloneMessages[i];
if (message.role === 'assistant') {
if (message.content && typeof message.content === 'string') {
message.content = `0: ${message.content}`;
} else if (message.tool_calls?.length) {
message.content = `1: ${JSON.stringify(message.tool_calls[0].function)}`;
delete message.tool_calls;
}
} else if (message.role === 'tool') {
cloneMessages.splice(i, 1, {
role: 'user',
content: `<ToolResponse>\n${message.content}\n</ToolResponse>`
});
}
}
return cloneMessages;
};
const ERROR_TEXT = 'Tool run error';
export const parsePromptToolCall = (
str: string
): {
answer: string;
toolCalls?: ChatCompletionMessageToolCall[];
} => {
str = str.trim();
// 首先使用正则表达式提取TOOL_ID和TOOL_ARGUMENTS
const prefixReg = /1(:|)/;
if (prefixReg.test(str)) {
const toolString = sliceJsonStr(str);
try {
const toolCall = json5.parse(toolString) as { name: string; arguments: Object };
return {
answer: '',
toolCalls: [
{
id: getNanoid(),
type: 'function' as const,
function: {
name: toolCall.name,
arguments: JSON.stringify(toolCall.arguments)
}
}
]
};
} catch (error) {
if (prefixReg.test(str)) {
return {
answer: ERROR_TEXT
};
} else {
return {
answer: str
};
}
}
} else {
const firstIndex = str.indexOf('0:') !== -1 ? str.indexOf('0:') : str.indexOf('0');
if (firstIndex > -1 && firstIndex < 6) {
str = str.substring(firstIndex + 2).trim();
}
return { answer: str };
}
};