@chatluna/v1-shared-adapter 1.0.29 → 1.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.cjs +55 -37
- package/lib/index.mjs +54 -36
- package/lib/utils.d.ts +3 -3
- package/package.json +2 -2
package/lib/index.cjs
CHANGED
|
@@ -42,7 +42,7 @@ __export(index_exports, {
|
|
|
42
42
|
normalizeOpenAIModelName: () => normalizeOpenAIModelName,
|
|
43
43
|
openAIUsageToUsageMetadata: () => openAIUsageToUsageMetadata,
|
|
44
44
|
parseOpenAIModelNameWithReasoningEffort: () => parseOpenAIModelNameWithReasoningEffort,
|
|
45
|
-
|
|
45
|
+
processInterleavedThinkMessages: () => processInterleavedThinkMessages,
|
|
46
46
|
processResponse: () => processResponse,
|
|
47
47
|
processStreamResponse: () => processStreamResponse,
|
|
48
48
|
reasoningEffortModelSuffixes: () => reasoningEffortModelSuffixes,
|
|
@@ -228,7 +228,6 @@ __name(openAIUsageToUsageMetadata, "openAIUsageToUsageMetadata");
|
|
|
228
228
|
async function langchainMessageToOpenAIMessage(messages, plugin, model, supportImageInputType, removeSystemMessage) {
|
|
229
229
|
const result = [];
|
|
230
230
|
const normalizedModel = model ? normalizeOpenAIModelName(model) : model;
|
|
231
|
-
const isDeepseekThinkModel = normalizedModel?.includes("deepseek-reasoner");
|
|
232
231
|
for (const rawMessage of messages) {
|
|
233
232
|
const role = messageTypeToOpenAIRole(rawMessage.getType());
|
|
234
233
|
const msg = {
|
|
@@ -343,13 +342,10 @@ async function langchainMessageToOpenAIMessage(messages, plugin, model, supportI
|
|
|
343
342
|
if (removeSystemMessage) {
|
|
344
343
|
return transformSystemMessages(result);
|
|
345
344
|
}
|
|
346
|
-
|
|
347
|
-
return processDeepSeekThinkMessages(result, messages);
|
|
348
|
-
}
|
|
349
|
-
return result;
|
|
345
|
+
return processInterleavedThinkMessages(result, messages);
|
|
350
346
|
}
|
|
351
347
|
__name(langchainMessageToOpenAIMessage, "langchainMessageToOpenAIMessage");
|
|
352
|
-
function
|
|
348
|
+
function processInterleavedThinkMessages(convertedMessages, originalMessages) {
|
|
353
349
|
if (originalMessages.length === 0) {
|
|
354
350
|
return convertedMessages;
|
|
355
351
|
}
|
|
@@ -378,7 +374,7 @@ function processDeepSeekThinkMessages(convertedMessages, originalMessages) {
|
|
|
378
374
|
return message;
|
|
379
375
|
});
|
|
380
376
|
}
|
|
381
|
-
__name(
|
|
377
|
+
__name(processInterleavedThinkMessages, "processInterleavedThinkMessages");
|
|
382
378
|
function transformSystemMessages(messages) {
|
|
383
379
|
const mappedMessage = [];
|
|
384
380
|
for (let i = 0; i < messages.length; i++) {
|
|
@@ -721,9 +717,8 @@ async function* processStreamResponse(requestContext, iterator) {
|
|
|
721
717
|
let errorCount = 0;
|
|
722
718
|
const reasoningState = {
|
|
723
719
|
content: "",
|
|
724
|
-
startedAt:
|
|
725
|
-
|
|
726
|
-
done: false
|
|
720
|
+
startedAt: Date.now(),
|
|
721
|
+
endedAt: void 0
|
|
727
722
|
};
|
|
728
723
|
for await (const event of iterator) {
|
|
729
724
|
const chunk = event.data;
|
|
@@ -752,23 +747,48 @@ async function* processStreamResponse(requestContext, iterator) {
|
|
|
752
747
|
});
|
|
753
748
|
}
|
|
754
749
|
if (!choice) continue;
|
|
755
|
-
const
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
750
|
+
const delta = choice.delta;
|
|
751
|
+
if (delta == null) {
|
|
752
|
+
const messageChunk2 = convertMessageToMessageChunk(
|
|
753
|
+
reasoningState.content.length > 0 && (choice.message.reasoning_content?.length ?? 0) < 1 ? {
|
|
754
|
+
...choice.message,
|
|
755
|
+
reasoning_content: reasoningState.content
|
|
756
|
+
} : choice.message
|
|
757
|
+
);
|
|
758
|
+
reasoningState.content = "";
|
|
759
|
+
if (reasoningState.endedAt == null) {
|
|
760
|
+
reasoningState.endedAt = Date.now();
|
|
761
761
|
}
|
|
762
|
+
defaultRole = (choice.message.role?.length ?? 0) > 0 ? choice.message.role : defaultRole;
|
|
763
|
+
yield new import_outputs.ChatGenerationChunk({
|
|
764
|
+
message: messageChunk2,
|
|
765
|
+
text: (0, import_string2.getMessageContent)(messageChunk2.content)
|
|
766
|
+
});
|
|
767
|
+
continue;
|
|
768
|
+
}
|
|
769
|
+
const hasResult = (delta.content?.length ?? 0) > 0 || (delta.tool_calls?.length ?? 0) > 0 || delta.function_call != null;
|
|
770
|
+
if (reasoningState.endedAt == null && hasResult) {
|
|
771
|
+
reasoningState.endedAt = Date.now();
|
|
762
772
|
}
|
|
763
|
-
if (
|
|
764
|
-
reasoningState.
|
|
765
|
-
|
|
766
|
-
|
|
773
|
+
if (reasoningState.endedAt == null && !hasResult && delta.reasoning_content) {
|
|
774
|
+
reasoningState.content += delta.reasoning_content;
|
|
775
|
+
}
|
|
776
|
+
const messageChunk = convertDeltaToMessageChunk(
|
|
777
|
+
{
|
|
778
|
+
...delta,
|
|
779
|
+
reasoning_content: void 0
|
|
780
|
+
},
|
|
781
|
+
defaultRole
|
|
782
|
+
);
|
|
783
|
+
const hasMessageChunk = (typeof messageChunk.content === "string" ? messageChunk.content.length > 0 : Array.isArray(messageChunk.content) && messageChunk.content.length > 0) || messageChunk instanceof import_messages2.AIMessageChunk && (messageChunk.tool_call_chunks?.length ?? 0) > 0 || messageChunk.additional_kwargs.function_call != null;
|
|
784
|
+
if (!hasMessageChunk) {
|
|
785
|
+
defaultRole = (delta.role?.length ?? 0) > 0 ? delta.role : defaultRole;
|
|
786
|
+
continue;
|
|
767
787
|
}
|
|
768
788
|
defaultRole = (delta.role?.length ?? 0) > 0 ? delta.role : defaultRole;
|
|
769
789
|
yield new import_outputs.ChatGenerationChunk({
|
|
770
790
|
message: messageChunk,
|
|
771
|
-
text: messageChunk.content
|
|
791
|
+
text: (0, import_string2.getMessageContent)(messageChunk.content)
|
|
772
792
|
});
|
|
773
793
|
} catch (e) {
|
|
774
794
|
if (chunk.includes("tool_calls") || chunk.includes("function_call") || chunk.includes("tool_call_id")) {
|
|
@@ -789,21 +809,19 @@ async function* processStreamResponse(requestContext, iterator) {
|
|
|
789
809
|
}
|
|
790
810
|
}
|
|
791
811
|
if (reasoningState.content.length > 0) {
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
});
|
|
804
|
-
}
|
|
812
|
+
const reasoningTime = (reasoningState.endedAt ?? Date.now()) - reasoningState.startedAt;
|
|
813
|
+
yield new import_outputs.ChatGenerationChunk({
|
|
814
|
+
message: new import_messages2.AIMessageChunk({
|
|
815
|
+
content: "",
|
|
816
|
+
additional_kwargs: {
|
|
817
|
+
reasoning_content: reasoningState.content,
|
|
818
|
+
...reasoningTime != null ? { reasoning_time: reasoningTime } : {}
|
|
819
|
+
}
|
|
820
|
+
}),
|
|
821
|
+
text: ""
|
|
822
|
+
});
|
|
805
823
|
requestContext.modelRequester.logger.debug(
|
|
806
|
-
`
|
|
824
|
+
`Reasoning Content: ${reasoningState.content}. Thought for: ${(reasoningTime ?? 0) / 1e3}s`
|
|
807
825
|
);
|
|
808
826
|
}
|
|
809
827
|
}
|
|
@@ -1029,7 +1047,7 @@ __name(createRequestContext, "createRequestContext");
|
|
|
1029
1047
|
normalizeOpenAIModelName,
|
|
1030
1048
|
openAIUsageToUsageMetadata,
|
|
1031
1049
|
parseOpenAIModelNameWithReasoningEffort,
|
|
1032
|
-
|
|
1050
|
+
processInterleavedThinkMessages,
|
|
1033
1051
|
processResponse,
|
|
1034
1052
|
processStreamResponse,
|
|
1035
1053
|
reasoningEffortModelSuffixes,
|
package/lib/index.mjs
CHANGED
|
@@ -191,7 +191,6 @@ __name(openAIUsageToUsageMetadata, "openAIUsageToUsageMetadata");
|
|
|
191
191
|
async function langchainMessageToOpenAIMessage(messages, plugin, model, supportImageInputType, removeSystemMessage) {
|
|
192
192
|
const result = [];
|
|
193
193
|
const normalizedModel = model ? normalizeOpenAIModelName(model) : model;
|
|
194
|
-
const isDeepseekThinkModel = normalizedModel?.includes("deepseek-reasoner");
|
|
195
194
|
for (const rawMessage of messages) {
|
|
196
195
|
const role = messageTypeToOpenAIRole(rawMessage.getType());
|
|
197
196
|
const msg = {
|
|
@@ -306,13 +305,10 @@ async function langchainMessageToOpenAIMessage(messages, plugin, model, supportI
|
|
|
306
305
|
if (removeSystemMessage) {
|
|
307
306
|
return transformSystemMessages(result);
|
|
308
307
|
}
|
|
309
|
-
|
|
310
|
-
return processDeepSeekThinkMessages(result, messages);
|
|
311
|
-
}
|
|
312
|
-
return result;
|
|
308
|
+
return processInterleavedThinkMessages(result, messages);
|
|
313
309
|
}
|
|
314
310
|
__name(langchainMessageToOpenAIMessage, "langchainMessageToOpenAIMessage");
|
|
315
|
-
function
|
|
311
|
+
function processInterleavedThinkMessages(convertedMessages, originalMessages) {
|
|
316
312
|
if (originalMessages.length === 0) {
|
|
317
313
|
return convertedMessages;
|
|
318
314
|
}
|
|
@@ -341,7 +337,7 @@ function processDeepSeekThinkMessages(convertedMessages, originalMessages) {
|
|
|
341
337
|
return message;
|
|
342
338
|
});
|
|
343
339
|
}
|
|
344
|
-
__name(
|
|
340
|
+
__name(processInterleavedThinkMessages, "processInterleavedThinkMessages");
|
|
345
341
|
function transformSystemMessages(messages) {
|
|
346
342
|
const mappedMessage = [];
|
|
347
343
|
for (let i = 0; i < messages.length; i++) {
|
|
@@ -684,9 +680,8 @@ async function* processStreamResponse(requestContext, iterator) {
|
|
|
684
680
|
let errorCount = 0;
|
|
685
681
|
const reasoningState = {
|
|
686
682
|
content: "",
|
|
687
|
-
startedAt:
|
|
688
|
-
|
|
689
|
-
done: false
|
|
683
|
+
startedAt: Date.now(),
|
|
684
|
+
endedAt: void 0
|
|
690
685
|
};
|
|
691
686
|
for await (const event of iterator) {
|
|
692
687
|
const chunk = event.data;
|
|
@@ -715,23 +710,48 @@ async function* processStreamResponse(requestContext, iterator) {
|
|
|
715
710
|
});
|
|
716
711
|
}
|
|
717
712
|
if (!choice) continue;
|
|
718
|
-
const
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
713
|
+
const delta = choice.delta;
|
|
714
|
+
if (delta == null) {
|
|
715
|
+
const messageChunk2 = convertMessageToMessageChunk(
|
|
716
|
+
reasoningState.content.length > 0 && (choice.message.reasoning_content?.length ?? 0) < 1 ? {
|
|
717
|
+
...choice.message,
|
|
718
|
+
reasoning_content: reasoningState.content
|
|
719
|
+
} : choice.message
|
|
720
|
+
);
|
|
721
|
+
reasoningState.content = "";
|
|
722
|
+
if (reasoningState.endedAt == null) {
|
|
723
|
+
reasoningState.endedAt = Date.now();
|
|
724
724
|
}
|
|
725
|
+
defaultRole = (choice.message.role?.length ?? 0) > 0 ? choice.message.role : defaultRole;
|
|
726
|
+
yield new ChatGenerationChunk({
|
|
727
|
+
message: messageChunk2,
|
|
728
|
+
text: getMessageContent(messageChunk2.content)
|
|
729
|
+
});
|
|
730
|
+
continue;
|
|
731
|
+
}
|
|
732
|
+
const hasResult = (delta.content?.length ?? 0) > 0 || (delta.tool_calls?.length ?? 0) > 0 || delta.function_call != null;
|
|
733
|
+
if (reasoningState.endedAt == null && hasResult) {
|
|
734
|
+
reasoningState.endedAt = Date.now();
|
|
725
735
|
}
|
|
726
|
-
if (
|
|
727
|
-
reasoningState.
|
|
728
|
-
|
|
729
|
-
|
|
736
|
+
if (reasoningState.endedAt == null && !hasResult && delta.reasoning_content) {
|
|
737
|
+
reasoningState.content += delta.reasoning_content;
|
|
738
|
+
}
|
|
739
|
+
const messageChunk = convertDeltaToMessageChunk(
|
|
740
|
+
{
|
|
741
|
+
...delta,
|
|
742
|
+
reasoning_content: void 0
|
|
743
|
+
},
|
|
744
|
+
defaultRole
|
|
745
|
+
);
|
|
746
|
+
const hasMessageChunk = (typeof messageChunk.content === "string" ? messageChunk.content.length > 0 : Array.isArray(messageChunk.content) && messageChunk.content.length > 0) || messageChunk instanceof AIMessageChunk2 && (messageChunk.tool_call_chunks?.length ?? 0) > 0 || messageChunk.additional_kwargs.function_call != null;
|
|
747
|
+
if (!hasMessageChunk) {
|
|
748
|
+
defaultRole = (delta.role?.length ?? 0) > 0 ? delta.role : defaultRole;
|
|
749
|
+
continue;
|
|
730
750
|
}
|
|
731
751
|
defaultRole = (delta.role?.length ?? 0) > 0 ? delta.role : defaultRole;
|
|
732
752
|
yield new ChatGenerationChunk({
|
|
733
753
|
message: messageChunk,
|
|
734
|
-
text: messageChunk.content
|
|
754
|
+
text: getMessageContent(messageChunk.content)
|
|
735
755
|
});
|
|
736
756
|
} catch (e) {
|
|
737
757
|
if (chunk.includes("tool_calls") || chunk.includes("function_call") || chunk.includes("tool_call_id")) {
|
|
@@ -752,21 +772,19 @@ async function* processStreamResponse(requestContext, iterator) {
|
|
|
752
772
|
}
|
|
753
773
|
}
|
|
754
774
|
if (reasoningState.content.length > 0) {
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
});
|
|
767
|
-
}
|
|
775
|
+
const reasoningTime = (reasoningState.endedAt ?? Date.now()) - reasoningState.startedAt;
|
|
776
|
+
yield new ChatGenerationChunk({
|
|
777
|
+
message: new AIMessageChunk2({
|
|
778
|
+
content: "",
|
|
779
|
+
additional_kwargs: {
|
|
780
|
+
reasoning_content: reasoningState.content,
|
|
781
|
+
...reasoningTime != null ? { reasoning_time: reasoningTime } : {}
|
|
782
|
+
}
|
|
783
|
+
}),
|
|
784
|
+
text: ""
|
|
785
|
+
});
|
|
768
786
|
requestContext.modelRequester.logger.debug(
|
|
769
|
-
`
|
|
787
|
+
`Reasoning Content: ${reasoningState.content}. Thought for: ${(reasoningTime ?? 0) / 1e3}s`
|
|
770
788
|
);
|
|
771
789
|
}
|
|
772
790
|
}
|
|
@@ -991,7 +1009,7 @@ export {
|
|
|
991
1009
|
normalizeOpenAIModelName,
|
|
992
1010
|
openAIUsageToUsageMetadata,
|
|
993
1011
|
parseOpenAIModelNameWithReasoningEffort,
|
|
994
|
-
|
|
1012
|
+
processInterleavedThinkMessages,
|
|
995
1013
|
processResponse,
|
|
996
1014
|
processStreamResponse,
|
|
997
1015
|
reasoningEffortModelSuffixes,
|
package/lib/utils.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AIMessageChunk, BaseMessage, ChatMessageChunk, FunctionMessageChunk, HumanMessageChunk, MessageContentComplex, MessageContentImageUrl, MessageType, SystemMessageChunk, type UsageMetadata
|
|
1
|
+
import { AIMessageChunk, BaseMessage, ChatMessageChunk, FunctionMessageChunk, HumanMessageChunk, MessageContentComplex, MessageContentImageUrl, MessageType, SystemMessageChunk, ToolMessageChunk, type UsageMetadata } from '@langchain/core/messages';
|
|
2
2
|
import { StructuredTool } from '@langchain/core/tools';
|
|
3
3
|
import { JsonSchema7Type } from 'zod-to-json-schema';
|
|
4
|
-
import {
|
|
4
|
+
import { ChatCompletionResponseMessage, ChatCompletionResponseMessageRoleEnum, ChatCompletionTool, ChatCompletionUsage } from './types';
|
|
5
5
|
import { ChatLunaPlugin } from 'koishi-plugin-chatluna/services/chat';
|
|
6
6
|
export declare function createUsageMetadata(data: {
|
|
7
7
|
inputTokens: number;
|
|
@@ -15,7 +15,7 @@ export declare function createUsageMetadata(data: {
|
|
|
15
15
|
}): UsageMetadata;
|
|
16
16
|
export declare function openAIUsageToUsageMetadata(usage: ChatCompletionUsage): UsageMetadata;
|
|
17
17
|
export declare function langchainMessageToOpenAIMessage(messages: BaseMessage[], plugin: ChatLunaPlugin, model?: string, supportImageInputType?: boolean, removeSystemMessage?: boolean): Promise<ChatCompletionResponseMessage[]>;
|
|
18
|
-
export declare function
|
|
18
|
+
export declare function processInterleavedThinkMessages(convertedMessages: ChatCompletionResponseMessage[], originalMessages: BaseMessage[]): ChatCompletionResponseMessage[];
|
|
19
19
|
export declare function transformSystemMessages(messages: ChatCompletionResponseMessage[]): ChatCompletionResponseMessage[];
|
|
20
20
|
export declare function fetchImageUrl(plugin: ChatLunaPlugin, content: MessageContentImageUrl): Promise<string>;
|
|
21
21
|
type MessageContentFileLike = MessageContentComplex & ({
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chatluna/v1-shared-adapter",
|
|
3
3
|
"description": "chatluna shared adapter",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.31",
|
|
5
5
|
"main": "lib/index.cjs",
|
|
6
6
|
"module": "lib/index.mjs",
|
|
7
7
|
"typings": "lib/index.d.ts",
|
|
@@ -70,6 +70,6 @@
|
|
|
70
70
|
},
|
|
71
71
|
"peerDependencies": {
|
|
72
72
|
"koishi": "^4.18.9",
|
|
73
|
-
"koishi-plugin-chatluna": "^1.3.
|
|
73
|
+
"koishi-plugin-chatluna": "^1.3.34"
|
|
74
74
|
}
|
|
75
75
|
}
|