@chatluna/v1-shared-adapter 1.0.18 → 1.0.19

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 CHANGED
@@ -36,11 +36,13 @@ __export(index_exports, {
36
36
  isNonLLMModel: () => isNonLLMModel,
37
37
  langchainMessageToOpenAIMessage: () => langchainMessageToOpenAIMessage,
38
38
  messageTypeToOpenAIRole: () => messageTypeToOpenAIRole,
39
+ processDeepSeekThinkMessages: () => processDeepSeekThinkMessages,
39
40
  processReasoningContent: () => processReasoningContent,
40
41
  processResponse: () => processResponse,
41
42
  processStreamResponse: () => processStreamResponse,
42
43
  removeAdditionalProperties: () => removeAdditionalProperties,
43
- supportImageInput: () => supportImageInput
44
+ supportImageInput: () => supportImageInput,
45
+ transformSystemMessages: () => transformSystemMessages
44
46
  });
45
47
  module.exports = __toCommonJS(index_exports);
46
48
 
@@ -143,6 +145,7 @@ var import_string = require("koishi-plugin-chatluna/utils/string");
143
145
  var import_types = require("@langchain/core/utils/types");
144
146
  async function langchainMessageToOpenAIMessage(messages, plugin, model, supportImageInput2, removeSystemMessage) {
145
147
  const result = [];
148
+ const isDeepseekThinkModel = model?.includes("deepseek-reasoner");
146
149
  for (const rawMessage of messages) {
147
150
  const role = messageTypeToOpenAIRole(rawMessage.getType());
148
151
  const msg = {
@@ -211,48 +214,72 @@ async function langchainMessageToOpenAIMessage(messages, plugin, model, supportI
211
214
  result.push(msg);
212
215
  }
213
216
  if (removeSystemMessage) {
214
- const mappedMessage = [];
215
- for (let i = 0; i < mappedMessage.length; i++) {
216
- const message = mappedMessage[i];
217
- if (message.role !== "system") {
218
- mappedMessage.push(message);
219
- continue;
220
- }
221
- if (removeSystemMessage) {
222
- continue;
223
- }
224
- mappedMessage.push({
225
- role: "user",
226
- content: message.content
227
- });
228
- mappedMessage.push({
229
- role: "assistant",
230
- content: "Okay, what do I need to do?"
231
- });
232
- if (mappedMessage?.[i + 1]?.role === "assistant") {
233
- mappedMessage.push({
234
- role: "user",
235
- content: "Continue what I said to you last message. Follow these instructions."
236
- });
217
+ return transformSystemMessages(result);
218
+ }
219
+ if (isDeepseekThinkModel) {
220
+ return processDeepSeekThinkMessages(result, messages);
221
+ }
222
+ return result;
223
+ }
224
+ __name(langchainMessageToOpenAIMessage, "langchainMessageToOpenAIMessage");
225
+ function processDeepSeekThinkMessages(convertedMessages, originalMessages) {
226
+ if (originalMessages.length === 0) {
227
+ return convertedMessages;
228
+ }
229
+ let lastTurnStartIndex = -1;
230
+ for (let i = originalMessages.length - 1; i >= 0; i--) {
231
+ const message = originalMessages[i];
232
+ if (message.getType() === "ai") {
233
+ const aiMessage = message;
234
+ if (!aiMessage.tool_calls || aiMessage.tool_calls.length === 0) {
235
+ lastTurnStartIndex = i;
236
+ break;
237
237
  }
238
238
  }
239
- if (mappedMessage[mappedMessage.length - 1].role === "assistant") {
240
- mappedMessage.push({
241
- role: "user",
242
- content: "Continue what I said to you last message. Follow these instructions."
243
- });
239
+ }
240
+ if (lastTurnStartIndex === -1) {
241
+ return convertedMessages;
242
+ }
243
+ return convertedMessages.map((message, index) => {
244
+ if (index >= lastTurnStartIndex) {
245
+ const originalMessage = originalMessages[index];
246
+ const reasoningContent = originalMessage?.additional_kwargs?.reasoning_content;
247
+ if (reasoningContent) {
248
+ return {
249
+ ...message,
250
+ reasoning_content: reasoningContent
251
+ };
252
+ }
244
253
  }
245
- if (mappedMessage[0].role === "assistant") {
246
- mappedMessage.unshift({
247
- role: "user",
248
- content: "Continue what I said to you last time. Follow these instructions."
249
- });
254
+ return message;
255
+ });
256
+ }
257
+ __name(processDeepSeekThinkMessages, "processDeepSeekThinkMessages");
258
+ function transformSystemMessages(messages) {
259
+ const mappedMessage = [];
260
+ for (let i = 0; i < messages.length; i++) {
261
+ const message = messages[i];
262
+ if (message.role !== "system") {
263
+ mappedMessage.push(message);
264
+ continue;
250
265
  }
251
- return mappedMessage;
266
+ continue;
252
267
  }
253
- return result;
268
+ if (mappedMessage[mappedMessage.length - 1]?.role === "assistant") {
269
+ mappedMessage.push({
270
+ role: "user",
271
+ content: "Continue what I said to you last message. Follow these instructions."
272
+ });
273
+ }
274
+ if (mappedMessage[0]?.role === "assistant") {
275
+ mappedMessage.unshift({
276
+ role: "user",
277
+ content: "Continue what I said to you last time. Follow these instructions."
278
+ });
279
+ }
280
+ return mappedMessage;
254
281
  }
255
- __name(langchainMessageToOpenAIMessage, "langchainMessageToOpenAIMessage");
282
+ __name(transformSystemMessages, "transformSystemMessages");
256
283
  async function fetchImageUrl(plugin, content) {
257
284
  const url = typeof content.image_url === "string" ? content.image_url : content.image_url.url;
258
285
  if (url.includes("data:image") && url.includes("base64")) {
@@ -744,9 +771,11 @@ __name(createRequestContext, "createRequestContext");
744
771
  isNonLLMModel,
745
772
  langchainMessageToOpenAIMessage,
746
773
  messageTypeToOpenAIRole,
774
+ processDeepSeekThinkMessages,
747
775
  processReasoningContent,
748
776
  processResponse,
749
777
  processStreamResponse,
750
778
  removeAdditionalProperties,
751
- supportImageInput
779
+ supportImageInput,
780
+ transformSystemMessages
752
781
  });
package/lib/index.mjs CHANGED
@@ -113,6 +113,7 @@ import {
113
113
  import { isZodSchemaV3 } from "@langchain/core/utils/types";
114
114
  async function langchainMessageToOpenAIMessage(messages, plugin, model, supportImageInput2, removeSystemMessage) {
115
115
  const result = [];
116
+ const isDeepseekThinkModel = model?.includes("deepseek-reasoner");
116
117
  for (const rawMessage of messages) {
117
118
  const role = messageTypeToOpenAIRole(rawMessage.getType());
118
119
  const msg = {
@@ -181,48 +182,72 @@ async function langchainMessageToOpenAIMessage(messages, plugin, model, supportI
181
182
  result.push(msg);
182
183
  }
183
184
  if (removeSystemMessage) {
184
- const mappedMessage = [];
185
- for (let i = 0; i < mappedMessage.length; i++) {
186
- const message = mappedMessage[i];
187
- if (message.role !== "system") {
188
- mappedMessage.push(message);
189
- continue;
190
- }
191
- if (removeSystemMessage) {
192
- continue;
193
- }
194
- mappedMessage.push({
195
- role: "user",
196
- content: message.content
197
- });
198
- mappedMessage.push({
199
- role: "assistant",
200
- content: "Okay, what do I need to do?"
201
- });
202
- if (mappedMessage?.[i + 1]?.role === "assistant") {
203
- mappedMessage.push({
204
- role: "user",
205
- content: "Continue what I said to you last message. Follow these instructions."
206
- });
185
+ return transformSystemMessages(result);
186
+ }
187
+ if (isDeepseekThinkModel) {
188
+ return processDeepSeekThinkMessages(result, messages);
189
+ }
190
+ return result;
191
+ }
192
+ __name(langchainMessageToOpenAIMessage, "langchainMessageToOpenAIMessage");
193
+ function processDeepSeekThinkMessages(convertedMessages, originalMessages) {
194
+ if (originalMessages.length === 0) {
195
+ return convertedMessages;
196
+ }
197
+ let lastTurnStartIndex = -1;
198
+ for (let i = originalMessages.length - 1; i >= 0; i--) {
199
+ const message = originalMessages[i];
200
+ if (message.getType() === "ai") {
201
+ const aiMessage = message;
202
+ if (!aiMessage.tool_calls || aiMessage.tool_calls.length === 0) {
203
+ lastTurnStartIndex = i;
204
+ break;
207
205
  }
208
206
  }
209
- if (mappedMessage[mappedMessage.length - 1].role === "assistant") {
210
- mappedMessage.push({
211
- role: "user",
212
- content: "Continue what I said to you last message. Follow these instructions."
213
- });
207
+ }
208
+ if (lastTurnStartIndex === -1) {
209
+ return convertedMessages;
210
+ }
211
+ return convertedMessages.map((message, index) => {
212
+ if (index >= lastTurnStartIndex) {
213
+ const originalMessage = originalMessages[index];
214
+ const reasoningContent = originalMessage?.additional_kwargs?.reasoning_content;
215
+ if (reasoningContent) {
216
+ return {
217
+ ...message,
218
+ reasoning_content: reasoningContent
219
+ };
220
+ }
214
221
  }
215
- if (mappedMessage[0].role === "assistant") {
216
- mappedMessage.unshift({
217
- role: "user",
218
- content: "Continue what I said to you last time. Follow these instructions."
219
- });
222
+ return message;
223
+ });
224
+ }
225
+ __name(processDeepSeekThinkMessages, "processDeepSeekThinkMessages");
226
+ function transformSystemMessages(messages) {
227
+ const mappedMessage = [];
228
+ for (let i = 0; i < messages.length; i++) {
229
+ const message = messages[i];
230
+ if (message.role !== "system") {
231
+ mappedMessage.push(message);
232
+ continue;
220
233
  }
221
- return mappedMessage;
234
+ continue;
222
235
  }
223
- return result;
236
+ if (mappedMessage[mappedMessage.length - 1]?.role === "assistant") {
237
+ mappedMessage.push({
238
+ role: "user",
239
+ content: "Continue what I said to you last message. Follow these instructions."
240
+ });
241
+ }
242
+ if (mappedMessage[0]?.role === "assistant") {
243
+ mappedMessage.unshift({
244
+ role: "user",
245
+ content: "Continue what I said to you last time. Follow these instructions."
246
+ });
247
+ }
248
+ return mappedMessage;
224
249
  }
225
- __name(langchainMessageToOpenAIMessage, "langchainMessageToOpenAIMessage");
250
+ __name(transformSystemMessages, "transformSystemMessages");
226
251
  async function fetchImageUrl(plugin, content) {
227
252
  const url = typeof content.image_url === "string" ? content.image_url : content.image_url.url;
228
253
  if (url.includes("data:image") && url.includes("base64")) {
@@ -713,9 +738,11 @@ export {
713
738
  isNonLLMModel,
714
739
  langchainMessageToOpenAIMessage,
715
740
  messageTypeToOpenAIRole,
741
+ processDeepSeekThinkMessages,
716
742
  processReasoningContent,
717
743
  processResponse,
718
744
  processStreamResponse,
719
745
  removeAdditionalProperties,
720
- supportImageInput
746
+ supportImageInput,
747
+ transformSystemMessages
721
748
  };
package/lib/utils.d.ts CHANGED
@@ -4,6 +4,8 @@ import { JsonSchema7Type } from 'zod-to-json-schema';
4
4
  import { ChatCompletionResponseMessage, ChatCompletionResponseMessageRoleEnum, ChatCompletionTool } from './types';
5
5
  import { ChatLunaPlugin } from 'koishi-plugin-chatluna/services/chat';
6
6
  export declare function langchainMessageToOpenAIMessage(messages: BaseMessage[], plugin: ChatLunaPlugin, model?: string, supportImageInput?: boolean, removeSystemMessage?: boolean): Promise<ChatCompletionResponseMessage[]>;
7
+ export declare function processDeepSeekThinkMessages(convertedMessages: ChatCompletionResponseMessage[], originalMessages: BaseMessage[]): ChatCompletionResponseMessage[];
8
+ export declare function transformSystemMessages(messages: ChatCompletionResponseMessage[]): ChatCompletionResponseMessage[];
7
9
  export declare function fetchImageUrl(plugin: ChatLunaPlugin, content: MessageContentImageUrl): Promise<string>;
8
10
  export declare function messageTypeToOpenAIRole(type: MessageType): ChatCompletionResponseMessageRoleEnum;
9
11
  export declare function formatToolsToOpenAITools(tools: StructuredTool[], includeGoogleSearch: boolean): ChatCompletionTool[];
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.18",
4
+ "version": "1.0.19",
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.2"
73
+ "koishi-plugin-chatluna": "^1.3.3"
74
74
  }
75
75
  }