diff --git a/client/src/constants/model.ts b/client/src/constants/model.ts
index 3fd55b1e3..303696d25 100644
--- a/client/src/constants/model.ts
+++ b/client/src/constants/model.ts
@@ -83,6 +83,7 @@ export const defaultModel: ModelSchema = {
searchEmptyText: '',
systemPrompt: '',
temperature: 0,
+ maxToken: 4000,
chatModel: OpenAiChatEnum.GPT35
},
share: {
diff --git a/client/src/pages/api/openapi/v1/chat/completions.ts b/client/src/pages/api/openapi/v1/chat/completions.ts
index c47fd202f..11d4a2db1 100644
--- a/client/src/pages/api/openapi/v1/chat/completions.ts
+++ b/client/src/pages/api/openapi/v1/chat/completions.ts
@@ -180,6 +180,7 @@ export default withNextCors(async function handler(req: NextApiRequest, res: Nex
await modelServiceToolMap[model.chat.chatModel].chatCompletion({
apiKey: userOpenAiKey || apiKey,
temperature: +temperature,
+ maxToken: model.chat.maxToken,
messages: completePrompts,
stream,
res
diff --git a/client/src/pages/model/components/detail/components/Settings.tsx b/client/src/pages/model/components/detail/components/Settings.tsx
index 7ffce006c..c9e03acc9 100644
--- a/client/src/pages/model/components/detail/components/Settings.tsx
+++ b/client/src/pages/model/components/detail/components/Settings.tsx
@@ -36,11 +36,6 @@ const Settings = ({ modelId }: { modelId: string }) => {
const [btnLoading, setBtnLoading] = useState(false);
const [refresh, setRefresh] = useState(false);
- const isOwner = useMemo(
- () => modelDetail.userId === userInfo?._id,
- [modelDetail.userId, userInfo?._id]
- );
-
const {
register,
setValue,
@@ -52,6 +47,20 @@ const Settings = ({ modelId }: { modelId: string }) => {
defaultValues: modelDetail
});
+ const isOwner = useMemo(
+ () => modelDetail.userId === userInfo?._id,
+ [modelDetail.userId, userInfo?._id]
+ );
+ const tokenLimit = useMemo(() => {
+ const max = ChatModelMap[getValues('chat.chatModel')]?.contextMaxToken || 4000;
+
+ if (max < getValues('chat.maxToken')) {
+ setValue('chat.maxToken', max);
+ }
+
+ return max;
+ }, [getValues, setValue, refresh]);
+
// 提交保存模型修改
const saveSubmitSuccess = useCallback(
async (data: ModelSchema) => {
@@ -256,6 +265,27 @@ const Settings = ({ modelId }: { modelId: string }) => {
/>
+
+
+ 最大长度
+
+
+ {
+ setValue('chat.maxToken', val);
+ setRefresh(!refresh);
+ }}
+ />
+
+
提示词
diff --git a/client/src/service/models/model.ts b/client/src/service/models/model.ts
index c87fdd5ce..1b537b9ca 100644
--- a/client/src/service/models/model.ts
+++ b/client/src/service/models/model.ts
@@ -47,6 +47,11 @@ const ModelSchema = new Schema({
type: String,
default: ''
},
+ maxToken: {
+ type: Number,
+ default: 4000,
+ min: 100
+ },
temperature: {
type: Number,
min: 0,
diff --git a/client/src/service/utils/chat/index.ts b/client/src/service/utils/chat/index.ts
index b96518844..0daf56465 100644
--- a/client/src/service/utils/chat/index.ts
+++ b/client/src/service/utils/chat/index.ts
@@ -12,6 +12,7 @@ import { textAdaptGptResponse } from '@/utils/adapt';
export type ChatCompletionType = {
apiKey: string;
temperature: number;
+ maxToken?: number;
messages: ChatItemType[];
chatId?: string;
[key: string]: any;
diff --git a/client/src/service/utils/chat/openai.ts b/client/src/service/utils/chat/openai.ts
index 484fe75c6..ecfe8105e 100644
--- a/client/src/service/utils/chat/openai.ts
+++ b/client/src/service/utils/chat/openai.ts
@@ -19,22 +19,31 @@ export const chatResponse = async ({
model,
apiKey,
temperature,
+ maxToken = 4000,
messages,
stream
}: ChatCompletionType & { model: `${OpenAiChatEnum}` }) => {
+ const modelTokenLimit = ChatModelMap[model]?.contextMaxToken || 4000;
const filterMessages = ChatContextFilter({
model,
prompts: messages,
- maxTokens: Math.ceil(ChatModelMap[model].contextMaxToken * 0.85)
+ maxTokens: Math.ceil(modelTokenLimit - 300) // filter token. not response maxToken
});
const adaptMessages = adaptChatItem_openAI({ messages: filterMessages, reserveId: false });
const chatAPI = getOpenAIApi();
+ const promptsToken = modelToolMap[model].countTokens({
+ messages: filterMessages
+ });
+
+ maxToken = maxToken + promptsToken > modelTokenLimit ? modelTokenLimit - promptsToken : maxToken;
+
const response = await chatAPI.createChatCompletion(
{
model,
temperature: Number(temperature || 0),
+ max_tokens: maxToken,
messages: adaptMessages,
frequency_penalty: 0.5, // 越大,重复内容越少
presence_penalty: -0.5, // 越大,越容易出现新内容
diff --git a/client/src/types/mongoSchema.d.ts b/client/src/types/mongoSchema.d.ts
index 497776933..b0338b065 100644
--- a/client/src/types/mongoSchema.d.ts
+++ b/client/src/types/mongoSchema.d.ts
@@ -44,6 +44,7 @@ export interface ModelSchema {
searchEmptyText: string;
systemPrompt: string;
temperature: number;
+ maxToken: number;
chatModel: ChatModelType; // 聊天时用的模型,训练后就是训练的模型
};
share: {