From da6bbca0c900da9c3c71d22d58328c6e061b7aae Mon Sep 17 00:00:00 2001 From: sxjeru Date: Mon, 23 Sep 2024 12:52:45 +0800 Subject: [PATCH 01/11] Update index.ts --- src/libs/agent-runtime/minimax/index.ts | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/libs/agent-runtime/minimax/index.ts b/src/libs/agent-runtime/minimax/index.ts index c3da21886430..ee9413af6076 100644 --- a/src/libs/agent-runtime/minimax/index.ts +++ b/src/libs/agent-runtime/minimax/index.ts @@ -127,9 +127,14 @@ export class LobeMinimaxAI implements LobeRuntimeAI { // https://www.minimaxi.com/document/guides/chat-model/V2 private getMaxTokens(model: string): number | undefined { switch (model) { - case 'abab6.5-chat': + case 'abab6.5t-chat': + case 'abab6.5g-chat': + case 'abab5.5s-chat': + case 'abab5.5-chat':{ + return 4096; + } case 'abab6.5s-chat': { - return 2048; + return 8192; } } } @@ -139,12 +144,16 @@ export class LobeMinimaxAI implements LobeRuntimeAI { return { ...params, - max_tokens: this.getMaxTokens(payload.model), + frequency_penalty: undefined, + max_tokens: + payload.max_tokens !== undefined + ? payload.max_tokens + : this.getMaxTokens(payload.model), stream: true, temperature: - temperature === undefined || temperature <= 0 - ? undefined - : temperature / 2, + temperature === undefined || temperature <= 0 + ? undefined + : temperature / 2, tools: params.tools?.map((tool) => ({ function: { From 8afc41c58f973b8b32cf30d76caea64dd7aa08d8 Mon Sep 17 00:00:00 2001 From: sxjeru Date: Mon, 23 Sep 2024 13:12:07 +0800 Subject: [PATCH 02/11] Update index.test.ts --- src/libs/agent-runtime/minimax/index.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libs/agent-runtime/minimax/index.test.ts b/src/libs/agent-runtime/minimax/index.test.ts index 4b1591de59b0..01146687f94f 100644 --- a/src/libs/agent-runtime/minimax/index.test.ts +++ b/src/libs/agent-runtime/minimax/index.test.ts @@ -253,10 +253,10 @@ describe('LobeMinimaxAI', () => { }); }); - it('should include max tokens when model is abab6.5-chat', () => { + it('should include max tokens when model is abab6.5t-chat', () => { const payload: ChatStreamPayload = { messages: [{ content: 'Hello', role: 'user' }], - model: 'abab6.5-chat', + model: 'abab6.5t-chat', temperature: 0, top_p: 0, }; @@ -265,9 +265,9 @@ describe('LobeMinimaxAI', () => { expect(result).toEqual({ messages: [{ content: 'Hello', role: 'user' }], - model: 'abab6.5-chat', + model: 'abab6.5t-chat', stream: true, - max_tokens: 2048, + max_tokens: 4096, }); }); }); From 096ba5c22c0d184a6ea0cc023a7de04affc14fd7 Mon Sep 17 00:00:00 2001 From: sxjeru Date: Mon, 23 Sep 2024 16:04:26 +0800 Subject: [PATCH 03/11] Update index.ts --- src/libs/agent-runtime/minimax/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/agent-runtime/minimax/index.ts b/src/libs/agent-runtime/minimax/index.ts index ee9413af6076..07b0ff5435cb 100644 --- a/src/libs/agent-runtime/minimax/index.ts +++ b/src/libs/agent-runtime/minimax/index.ts @@ -149,6 +149,7 @@ export class LobeMinimaxAI implements LobeRuntimeAI { payload.max_tokens !== undefined ? payload.max_tokens : this.getMaxTokens(payload.model), + presence_penalty: undefined, stream: true, temperature: temperature === undefined || temperature <= 0 From 0dee41b29f4ccd030186f3c9ff1325e618fddf21 Mon Sep 17 00:00:00 2001 From: sxjeru Date: Mon, 23 Sep 2024 20:31:45 +0800 Subject: [PATCH 04/11] Update minimax.ts --- src/libs/agent-runtime/utils/streams/minimax.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/libs/agent-runtime/utils/streams/minimax.ts b/src/libs/agent-runtime/utils/streams/minimax.ts index 05629bafdc01..5d8e5c42a471 100644 --- a/src/libs/agent-runtime/utils/streams/minimax.ts +++ b/src/libs/agent-runtime/utils/streams/minimax.ts @@ -12,6 +12,15 @@ const unit8ArrayToJSONChunk = (unit8Array: Uint8Array): OpenAI.ChatCompletionChu // chunkValue example: // data: {"id":"028a65377137d57aaceeffddf48ae99f","choices":[{"finish_reason":"tool_calls","index":0,"delta":{"role":"assistant","tool_calls":[{"id":"call_function_7371372822","type":"function","function":{"name":"realtime-weather____fetchCurrentWeather","arguments":"{\"city\": [\"杭州\", \"北京\"]}"}}]}}],"created":155511,"model":"abab6.5s-chat","object":"chat.completion.chunk"} + const dataIdPattern = /data: \{"id":"/g; + const matchCount = (chunkValue.match(dataIdPattern) || []).length; + if (matchCount === 2) { + const secondDataIdIndex = chunkValue.indexOf('data: {"id":', chunkValue.indexOf('data: {"id":') + 1); + if (secondDataIdIndex !== -1) { + chunkValue = chunkValue.slice(0, secondDataIdIndex).trim(); + } + } + // so we need to remove `data:` prefix and then parse it as JSON if (chunkValue.startsWith('data:')) { chunkValue = chunkValue.slice(5).trim(); From ede0404527894c9d54107987ecf3a6c41a228dee Mon Sep 17 00:00:00 2001 From: sxjeru Date: Mon, 23 Sep 2024 20:43:29 +0800 Subject: [PATCH 05/11] Update minimax.ts --- src/libs/agent-runtime/utils/streams/minimax.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/agent-runtime/utils/streams/minimax.ts b/src/libs/agent-runtime/utils/streams/minimax.ts index 5d8e5c42a471..1b97e3212ce6 100644 --- a/src/libs/agent-runtime/utils/streams/minimax.ts +++ b/src/libs/agent-runtime/utils/streams/minimax.ts @@ -12,7 +12,7 @@ const unit8ArrayToJSONChunk = (unit8Array: Uint8Array): OpenAI.ChatCompletionChu // chunkValue example: // data: {"id":"028a65377137d57aaceeffddf48ae99f","choices":[{"finish_reason":"tool_calls","index":0,"delta":{"role":"assistant","tool_calls":[{"id":"call_function_7371372822","type":"function","function":{"name":"realtime-weather____fetchCurrentWeather","arguments":"{\"city\": [\"杭州\", \"北京\"]}"}}]}}],"created":155511,"model":"abab6.5s-chat","object":"chat.completion.chunk"} - const dataIdPattern = /data: \{"id":"/g; + const dataIdPattern = /data: {"id":"/g; const matchCount = (chunkValue.match(dataIdPattern) || []).length; if (matchCount === 2) { const secondDataIdIndex = chunkValue.indexOf('data: {"id":', chunkValue.indexOf('data: {"id":') + 1); From 5b2f749cec03efcb280ba08c07e5f19ca9947e04 Mon Sep 17 00:00:00 2001 From: sxjeru Date: Mon, 23 Sep 2024 14:29:28 +0000 Subject: [PATCH 06/11] fix --- src/libs/agent-runtime/utils/streams/minimax.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/libs/agent-runtime/utils/streams/minimax.ts b/src/libs/agent-runtime/utils/streams/minimax.ts index 1b97e3212ce6..3a97d62847d0 100644 --- a/src/libs/agent-runtime/utils/streams/minimax.ts +++ b/src/libs/agent-runtime/utils/streams/minimax.ts @@ -12,15 +12,18 @@ const unit8ArrayToJSONChunk = (unit8Array: Uint8Array): OpenAI.ChatCompletionChu // chunkValue example: // data: {"id":"028a65377137d57aaceeffddf48ae99f","choices":[{"finish_reason":"tool_calls","index":0,"delta":{"role":"assistant","tool_calls":[{"id":"call_function_7371372822","type":"function","function":{"name":"realtime-weather____fetchCurrentWeather","arguments":"{\"city\": [\"杭州\", \"北京\"]}"}}]}}],"created":155511,"model":"abab6.5s-chat","object":"chat.completion.chunk"} - const dataIdPattern = /data: {"id":"/g; + const dataIdPattern = /data: {"id":/g; const matchCount = (chunkValue.match(dataIdPattern) || []).length; if (matchCount === 2) { - const secondDataIdIndex = chunkValue.indexOf('data: {"id":', chunkValue.indexOf('data: {"id":') + 1); + const secondDataIdIndex = chunkValue.indexOf( + 'data: {"id":', + chunkValue.indexOf('data: {"id":') + 1, + ); if (secondDataIdIndex !== -1) { chunkValue = chunkValue.slice(0, secondDataIdIndex).trim(); } } - + // so we need to remove `data:` prefix and then parse it as JSON if (chunkValue.startsWith('data:')) { chunkValue = chunkValue.slice(5).trim(); From f78e53e032b87ab2454206230b72e1600c754ead Mon Sep 17 00:00:00 2001 From: sxjeru Date: Tue, 24 Sep 2024 09:47:57 +0800 Subject: [PATCH 07/11] Update minimax.ts --- .../agent-runtime/utils/streams/minimax.ts | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/libs/agent-runtime/utils/streams/minimax.ts b/src/libs/agent-runtime/utils/streams/minimax.ts index 3a97d62847d0..d61bc2443d88 100644 --- a/src/libs/agent-runtime/utils/streams/minimax.ts +++ b/src/libs/agent-runtime/utils/streams/minimax.ts @@ -4,6 +4,18 @@ import { ChatStreamCallbacks } from '../../types'; import { transformOpenAIStream } from './openai'; import { createCallbacksTransformer, createSSEProtocolTransformer } from './protocol'; +export const processDoubleData = (chunkValue: string): string => { + const dataPattern = /data: \{"id":"/g; + const matchCount = (chunkValue.match(dataPattern) || []).length; + if (matchCount === 2) { + const secondDataIdIndex = chunkValue.indexOf('data: {"id":', chunkValue.indexOf('data: {"id":') + 1); + if (secondDataIdIndex !== -1) { + chunkValue = chunkValue.slice(0, secondDataIdIndex).trim(); + } + } + return chunkValue; +}; + const unit8ArrayToJSONChunk = (unit8Array: Uint8Array): OpenAI.ChatCompletionChunk => { const decoder = new TextDecoder(); @@ -12,17 +24,7 @@ const unit8ArrayToJSONChunk = (unit8Array: Uint8Array): OpenAI.ChatCompletionChu // chunkValue example: // data: {"id":"028a65377137d57aaceeffddf48ae99f","choices":[{"finish_reason":"tool_calls","index":0,"delta":{"role":"assistant","tool_calls":[{"id":"call_function_7371372822","type":"function","function":{"name":"realtime-weather____fetchCurrentWeather","arguments":"{\"city\": [\"杭州\", \"北京\"]}"}}]}}],"created":155511,"model":"abab6.5s-chat","object":"chat.completion.chunk"} - const dataIdPattern = /data: {"id":/g; - const matchCount = (chunkValue.match(dataIdPattern) || []).length; - if (matchCount === 2) { - const secondDataIdIndex = chunkValue.indexOf( - 'data: {"id":', - chunkValue.indexOf('data: {"id":') + 1, - ); - if (secondDataIdIndex !== -1) { - chunkValue = chunkValue.slice(0, secondDataIdIndex).trim(); - } - } + chunkValue = processDoubleData(chunkValue); // so we need to remove `data:` prefix and then parse it as JSON if (chunkValue.startsWith('data:')) { From 0dcb95e1b9bde47fe7862530875d617a4d2d590e Mon Sep 17 00:00:00 2001 From: sxjeru Date: Tue, 24 Sep 2024 09:48:35 +0800 Subject: [PATCH 08/11] Create minimax.test.ts --- .../utils/streams/minimax.test.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/libs/agent-runtime/utils/streams/minimax.test.ts diff --git a/src/libs/agent-runtime/utils/streams/minimax.test.ts b/src/libs/agent-runtime/utils/streams/minimax.test.ts new file mode 100644 index 000000000000..307aa126745b --- /dev/null +++ b/src/libs/agent-runtime/utils/streams/minimax.test.ts @@ -0,0 +1,24 @@ +import { describe, it, expect } from 'vitest'; +import { processDoubleData } from './minimax'; // 假设文件名为 minimax.ts + +describe('processDoubleData', () => { + it('should remove the second "data: {"id": and everything after it when matchCount is 2', () => { + const chunkValue = `data: {"id":"first"} some other text + + data: {"id":"second"} more text`; + const result = processDoubleData(chunkValue); + expect(result).toBe('data: {"id":"first"} some other text'); + }); + + it('should not modify chunkValue when matchCount is not 2', () => { + const chunkValue = `data: {"id":"first"} some other text`; + const result = processDoubleData(chunkValue); + expect(result).toBe(chunkValue); + }); + + it('should not modify chunkValue when matchCount is more than 2', () => { + const chunkValue = `data: {"id":"first"} some other text data: {"id":"second"} more text data: {"id":"third"} even more text`; + const result = processDoubleData(chunkValue); + expect(result).toBe(chunkValue); + }); +}); From 5c1357719d29155bd2ea54fda636a0d9c3856c02 Mon Sep 17 00:00:00 2001 From: sxjeru Date: Tue, 24 Sep 2024 09:54:16 +0800 Subject: [PATCH 09/11] Update minimax.ts --- src/libs/agent-runtime/utils/streams/minimax.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libs/agent-runtime/utils/streams/minimax.ts b/src/libs/agent-runtime/utils/streams/minimax.ts index d61bc2443d88..53c87e7b4bda 100644 --- a/src/libs/agent-runtime/utils/streams/minimax.ts +++ b/src/libs/agent-runtime/utils/streams/minimax.ts @@ -7,10 +7,11 @@ import { createCallbacksTransformer, createSSEProtocolTransformer } from './prot export const processDoubleData = (chunkValue: string): string => { const dataPattern = /data: \{"id":"/g; const matchCount = (chunkValue.match(dataPattern) || []).length; + let modifiedChunkValue = chunkValue; if (matchCount === 2) { const secondDataIdIndex = chunkValue.indexOf('data: {"id":', chunkValue.indexOf('data: {"id":') + 1); if (secondDataIdIndex !== -1) { - chunkValue = chunkValue.slice(0, secondDataIdIndex).trim(); + modifiedChunkValue = chunkValue.slice(0, secondDataIdIndex).trim(); } } return chunkValue; From 83264d0a5f14d8c5b892ee119ffabf779614d99f Mon Sep 17 00:00:00 2001 From: sxjeru Date: Wed, 25 Sep 2024 08:00:29 +0800 Subject: [PATCH 10/11] Update minimax.ts --- src/libs/agent-runtime/utils/streams/minimax.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/agent-runtime/utils/streams/minimax.ts b/src/libs/agent-runtime/utils/streams/minimax.ts index 53c87e7b4bda..430e320a9bc9 100644 --- a/src/libs/agent-runtime/utils/streams/minimax.ts +++ b/src/libs/agent-runtime/utils/streams/minimax.ts @@ -14,7 +14,7 @@ export const processDoubleData = (chunkValue: string): string => { modifiedChunkValue = chunkValue.slice(0, secondDataIdIndex).trim(); } } - return chunkValue; + return modifiedChunkValue; }; const unit8ArrayToJSONChunk = (unit8Array: Uint8Array): OpenAI.ChatCompletionChunk => { From dd07c2f054238e7895e69f8b3b92ea32c21c87d2 Mon Sep 17 00:00:00 2001 From: sxjeru Date: Wed, 25 Sep 2024 22:46:42 +0800 Subject: [PATCH 11/11] Update minimax.ts --- src/libs/agent-runtime/utils/streams/minimax.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/agent-runtime/utils/streams/minimax.ts b/src/libs/agent-runtime/utils/streams/minimax.ts index 430e320a9bc9..e71ce6c5c3cc 100644 --- a/src/libs/agent-runtime/utils/streams/minimax.ts +++ b/src/libs/agent-runtime/utils/streams/minimax.ts @@ -5,7 +5,7 @@ import { transformOpenAIStream } from './openai'; import { createCallbacksTransformer, createSSEProtocolTransformer } from './protocol'; export const processDoubleData = (chunkValue: string): string => { - const dataPattern = /data: \{"id":"/g; + const dataPattern = /data: {"id":"/g; const matchCount = (chunkValue.match(dataPattern) || []).length; let modifiedChunkValue = chunkValue; if (matchCount === 2) {