From a651378f228d796ff16d3108d7712dbe2e50d00a Mon Sep 17 00:00:00 2001 From: ProcyonNAN <3189960265@qq.com> Date: Wed, 27 May 2026 18:21:16 +0800 Subject: [PATCH 1/3] [Fix] filter tool call capability for non-LLM models --- packages/core/src/llm-core/platform/client.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/core/src/llm-core/platform/client.ts b/packages/core/src/llm-core/platform/client.ts index 00996b959..1c8c6b703 100644 --- a/packages/core/src/llm-core/platform/client.ts +++ b/packages/core/src/llm-core/platform/client.ts @@ -13,6 +13,7 @@ import { FileHandlingConfig, ModelCapabilities, ModelInfo, + ModelType, PlatformClientNames } from 'koishi-plugin-chatluna/llm-core/platform/types' import { ObjectLock } from 'koishi-plugin-chatluna/utils/lock' @@ -142,6 +143,15 @@ export abstract class BasePlatformClient< this._modelInfos = {} for (const model of models) { + if ( + model.type === ModelType.embeddings || + model.type === ModelType.reranker + ) { + model.capabilities = model.capabilities.filter( + (cap) => cap !== ModelCapabilities.ToolCall + ) + } + model.capabilities = model.capabilities.includes( ModelCapabilities.ImageGeneration ) From 7c4c1eabdbb0d339829ae65e73365da2566cf81f Mon Sep 17 00:00:00 2001 From: ProcyonNAN <3189960265@qq.com> Date: Wed, 27 May 2026 19:27:01 +0800 Subject: [PATCH 2/3] =?UTF-8?q?[fix]:=20=E4=BF=AE=E6=AD=A3=E9=9D=9E=20LLM?= =?UTF-8?q?=20=E6=A8=A1=E5=9E=8B=E5=B7=A5=E5=85=B7=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E8=83=BD=E5=8A=9B=E5=A3=B0=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更改内容: - 撤销 core 层改动 - 调整 OpenAI、OpenAI-like、Hunyuan、DeepSeek、Doubao、Qwen 适配器,先确定模型类型,再声明 ToolCall 能力 - 对 additional models 中的非 LLM 模型过滤 ToolCall,避免 embedding/reranker 暴露错误能力 --- packages/adapter-deepseek/src/client.ts | 13 +++-- packages/adapter-doubao/src/client.ts | 9 ++- packages/adapter-hunyuan/src/client.ts | 11 ++-- packages/adapter-openai-like/src/client.ts | 56 +++++++++++-------- packages/adapter-openai/src/client.ts | 12 ++-- packages/adapter-qwen/src/client.ts | 49 +++++++++------- packages/core/src/llm-core/platform/client.ts | 10 ---- 7 files changed, 94 insertions(+), 66 deletions(-) diff --git a/packages/adapter-deepseek/src/client.ts b/packages/adapter-deepseek/src/client.ts index e3af9e395..92ff0f555 100644 --- a/packages/adapter-deepseek/src/client.ts +++ b/packages/adapter-deepseek/src/client.ts @@ -73,12 +73,17 @@ export class DeepseekClient extends PlatformModelAndEmbeddingsClient { + const type = model.includes('deepseek') + ? ModelType.llm + : ModelType.embeddings + return { name: model, - type: model.includes('deepseek') - ? ModelType.llm - : ModelType.embeddings, - capabilities: [ModelCapabilities.ToolCall] + type, + capabilities: + type === ModelType.llm + ? [ModelCapabilities.ToolCall] + : [] } as ModelInfo }) } catch (e) { diff --git a/packages/adapter-doubao/src/client.ts b/packages/adapter-doubao/src/client.ts index 85aac5e6d..2e8a5d1fd 100644 --- a/packages/adapter-doubao/src/client.ts +++ b/packages/adapter-doubao/src/client.ts @@ -110,13 +110,16 @@ export class DouBaoClient extends PlatformModelAndEmbeddingsClient }) return expandedModels.map(([model, token]) => { + const type = model.includes('embedding') + ? ModelType.embeddings + : ModelType.llm + return { name: model, - type: model.includes('embedding') - ? ModelType.embeddings - : ModelType.llm, + type, maxTokens: token, capabilities: [ + type !== ModelType.llm || unsupportedFunctionCallModels.includes(model) ? undefined : ModelCapabilities.ToolCall, diff --git a/packages/adapter-hunyuan/src/client.ts b/packages/adapter-hunyuan/src/client.ts index a9de5cad1..476c930dd 100644 --- a/packages/adapter-hunyuan/src/client.ts +++ b/packages/adapter-hunyuan/src/client.ts @@ -61,13 +61,16 @@ export class HunyuanClient extends PlatformModelAndEmbeddingsClient { + const type = model.includes('embedding') + ? ModelType.embeddings + : ModelType.llm + return { name: model, - type: model.includes('embedding') - ? ModelType.embeddings - : ModelType.llm, + type, maxTokens: token, - capabilities: [ModelCapabilities.ToolCall] + capabilities: + type === ModelType.llm ? [ModelCapabilities.ToolCall] : [] } as ModelInfo }) } diff --git a/packages/adapter-openai-like/src/client.ts b/packages/adapter-openai-like/src/client.ts index 8435f1776..da2c2675f 100644 --- a/packages/adapter-openai-like/src/client.ts +++ b/packages/adapter-openai-like/src/client.ts @@ -59,18 +59,27 @@ export class OpenAIClient extends PlatformModelEmbeddingsAndRerankerClient { : [] const additionalModels = this._config.additionalModels.map( - ({ model, modelType, contextSize, modelCapabilities }) => - ({ + ({ model, modelType, contextSize, modelCapabilities }) => { + const type = + modelType === 'Embeddings 嵌入模型' + ? ModelType.embeddings + : modelType === 'Reranker 重排序模型' + ? ModelType.reranker + : ModelType.llm + + return { name: model, - type: - modelType === 'Embeddings 嵌入模型' - ? ModelType.embeddings - : modelType === 'Reranker 重排序模型' - ? ModelType.reranker - : ModelType.llm, - capabilities: modelCapabilities, + type, + capabilities: + type === ModelType.llm + ? modelCapabilities + : modelCapabilities.filter( + (cap) => + cap !== ModelCapabilities.ToolCall + ), maxTokens: contextSize ?? 4096 - }) as ModelInfo + } as ModelInfo + } ) const filteredModels = rawModels.filter( @@ -109,18 +118,21 @@ export class OpenAIClient extends PlatformModelEmbeddingsAndRerankerClient { const id = model.toLowerCase() return !blacklist.some((keyword) => id.includes(keyword)) }) - .map( - (model) => - ({ - name: model, - type: isRerankerModel(model) - ? ModelType.reranker - : isEmbeddingModel(model) - ? ModelType.embeddings - : ModelType.llm, - ...supportToolCalling(model) - }) as ModelInfo - ) + .map((model) => { + const type = isRerankerModel(model) + ? ModelType.reranker + : isEmbeddingModel(model) + ? ModelType.embeddings + : ModelType.llm + + return { + name: model, + type, + ...(type === ModelType.llm + ? supportToolCalling(model) + : { capabilities: [] }) + } as ModelInfo + }) return additionalModels.concat( formattedModels.filter( diff --git a/packages/adapter-openai/src/client.ts b/packages/adapter-openai/src/client.ts index c73f9102a..8aba2542a 100644 --- a/packages/adapter-openai/src/client.ts +++ b/packages/adapter-openai/src/client.ts @@ -77,13 +77,17 @@ export class OpenAIClient extends PlatformModelAndEmbeddingsClient ) ) .map((model) => { + const type = model.includes('embedding') + ? ModelType.embeddings + : ModelType.llm + return { name: model, - type: model.includes('embedding') - ? ModelType.embeddings - : ModelType.llm, + type, capabilities: [ - ModelCapabilities.ToolCall, + type === ModelType.llm + ? ModelCapabilities.ToolCall + : undefined, supportImageInput(model) ? ModelCapabilities.ImageInput : undefined, diff --git a/packages/adapter-qwen/src/client.ts b/packages/adapter-qwen/src/client.ts index 4af9c3f24..2c7f8a780 100644 --- a/packages/adapter-qwen/src/client.ts +++ b/packages/adapter-qwen/src/client.ts @@ -141,35 +141,46 @@ export class QWenClient extends PlatformModelAndEmbeddingsClient { }) const additionalModels = this._config.additionalModels.map( - ({ model, modelType, contextSize, modelCapabilities }) => - ({ + ({ model, modelType, contextSize, modelCapabilities }) => { + const type = + modelType === 'Embeddings 嵌入模型' + ? ModelType.embeddings + : ModelType.llm + + return { name: model, - type: - modelType === 'Embeddings 嵌入模型' - ? ModelType.embeddings - : ModelType.llm, - capabilities: modelCapabilities, + type, + capabilities: + type === ModelType.llm + ? modelCapabilities + : modelCapabilities.filter( + (cap) => cap !== ModelCapabilities.ToolCall + ), maxTokens: contextSize ?? 4096 - }) as ModelInfo + } as ModelInfo + } ) return expandedModels .map(([model, token]) => { + const type = model.includes('embedding') + ? ModelType.embeddings + : ModelType.llm + return { name: model, - type: model.includes('embedding') - ? ModelType.embeddings - : ModelType.llm, + type, maxTokens: token, capabilities: [ - (model.includes('qwen-plus') || - model.includes('qwen-max') || - model.includes('qwen-turbo') || - model.includes('qwen3') || - model.includes('qwen2.5') || - model.includes('omni') || - model.includes('Kimi-K2') || - model.includes('deepseek')) && + type === ModelType.llm && + (model.includes('qwen-plus') || + model.includes('qwen-max') || + model.includes('qwen-turbo') || + model.includes('qwen3') || + model.includes('qwen2.5') || + model.includes('omni') || + model.includes('Kimi-K2') || + model.includes('deepseek')) && ModelCapabilities.ToolCall, imageInputSupportModels.some((pattern) => model.includes(pattern) diff --git a/packages/core/src/llm-core/platform/client.ts b/packages/core/src/llm-core/platform/client.ts index 1c8c6b703..00996b959 100644 --- a/packages/core/src/llm-core/platform/client.ts +++ b/packages/core/src/llm-core/platform/client.ts @@ -13,7 +13,6 @@ import { FileHandlingConfig, ModelCapabilities, ModelInfo, - ModelType, PlatformClientNames } from 'koishi-plugin-chatluna/llm-core/platform/types' import { ObjectLock } from 'koishi-plugin-chatluna/utils/lock' @@ -143,15 +142,6 @@ export abstract class BasePlatformClient< this._modelInfos = {} for (const model of models) { - if ( - model.type === ModelType.embeddings || - model.type === ModelType.reranker - ) { - model.capabilities = model.capabilities.filter( - (cap) => cap !== ModelCapabilities.ToolCall - ) - } - model.capabilities = model.capabilities.includes( ModelCapabilities.ImageGeneration ) From dba67c0aeb9746759798f3fd5105683c57d7147c Mon Sep 17 00:00:00 2001 From: dingyi Date: Thu, 28 May 2026 14:00:15 +0800 Subject: [PATCH 3/3] [refactor]: simplify capability condition expressions --- packages/adapter-doubao/src/client.ts | 7 +++---- packages/adapter-openai/src/client.ts | 15 ++++++--------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/packages/adapter-doubao/src/client.ts b/packages/adapter-doubao/src/client.ts index 2e8a5d1fd..a024c257e 100644 --- a/packages/adapter-doubao/src/client.ts +++ b/packages/adapter-doubao/src/client.ts @@ -119,10 +119,9 @@ export class DouBaoClient extends PlatformModelAndEmbeddingsClient type, maxTokens: token, capabilities: [ - type !== ModelType.llm || - unsupportedFunctionCallModels.includes(model) - ? undefined - : ModelCapabilities.ToolCall, + type === ModelType.llm && + !unsupportedFunctionCallModels.includes(model) && + ModelCapabilities.ToolCall, imageInputSupportModels.some((pattern) => model.match(pattern) ) diff --git a/packages/adapter-openai/src/client.ts b/packages/adapter-openai/src/client.ts index 8aba2542a..43911ae4d 100644 --- a/packages/adapter-openai/src/client.ts +++ b/packages/adapter-openai/src/client.ts @@ -85,15 +85,12 @@ export class OpenAIClient extends PlatformModelAndEmbeddingsClient name: model, type, capabilities: [ - type === ModelType.llm - ? ModelCapabilities.ToolCall - : undefined, - supportImageInput(model) - ? ModelCapabilities.ImageInput - : undefined, - supportAudioInput(model) - ? ModelCapabilities.AudioInput - : undefined + type === ModelType.llm && + ModelCapabilities.ToolCall, + supportImageInput(model) && + ModelCapabilities.ImageInput, + supportAudioInput(model) && + ModelCapabilities.AudioInput ].filter(Boolean) } as ModelInfo })