diff --git a/packages/adapter-azure-openai/package.json b/packages/adapter-azure-openai/package.json index 4d9a59278..048e08d4d 100644 --- a/packages/adapter-azure-openai/package.json +++ b/packages/adapter-azure-openai/package.json @@ -57,7 +57,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "resolutions": { "@langchain/core": "0.3.62", diff --git a/packages/adapter-claude/package.json b/packages/adapter-claude/package.json index 790206e85..9a45c73c3 100644 --- a/packages/adapter-claude/package.json +++ b/packages/adapter-claude/package.json @@ -59,7 +59,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "resolutions": { "@langchain/core": "0.3.62", diff --git a/packages/adapter-deepseek/package.json b/packages/adapter-deepseek/package.json index cd6b95480..a5fd333a0 100644 --- a/packages/adapter-deepseek/package.json +++ b/packages/adapter-deepseek/package.json @@ -71,7 +71,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "koishi": { "category": "ai", diff --git a/packages/adapter-dify/package.json b/packages/adapter-dify/package.json index db8091977..937a00d04 100644 --- a/packages/adapter-dify/package.json +++ b/packages/adapter-dify/package.json @@ -70,7 +70,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "koishi": { "description": { diff --git a/packages/adapter-doubao/package.json b/packages/adapter-doubao/package.json index 1f9b89f44..1ba5df43d 100644 --- a/packages/adapter-doubao/package.json +++ b/packages/adapter-doubao/package.json @@ -71,7 +71,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "koishi": { "description": { diff --git a/packages/adapter-gemini/package.json b/packages/adapter-gemini/package.json index aa9e70b9f..8c0693039 100644 --- a/packages/adapter-gemini/package.json +++ b/packages/adapter-gemini/package.json @@ -73,7 +73,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53", + "koishi-plugin-chatluna": "^1.3.0-alpha.54", "koishi-plugin-chatluna-storage-service": "^0.0.9" }, "peerDependenciesMeta": { diff --git a/packages/adapter-hunyuan/package.json b/packages/adapter-hunyuan/package.json index bfc0d1e98..119e49d82 100644 --- a/packages/adapter-hunyuan/package.json +++ b/packages/adapter-hunyuan/package.json @@ -71,7 +71,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "koishi": { "description": { diff --git a/packages/adapter-ollama/package.json b/packages/adapter-ollama/package.json index 0dc0ae66e..c27cec69c 100644 --- a/packages/adapter-ollama/package.json +++ b/packages/adapter-ollama/package.json @@ -55,7 +55,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "resolutions": { "@langchain/core": "0.3.62", diff --git a/packages/adapter-openai-like/package.json b/packages/adapter-openai-like/package.json index 490564e74..cea79aa5a 100644 --- a/packages/adapter-openai-like/package.json +++ b/packages/adapter-openai-like/package.json @@ -71,7 +71,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "koishi": { "description": { diff --git a/packages/adapter-openai/package.json b/packages/adapter-openai/package.json index d5ccce62e..f51050c59 100644 --- a/packages/adapter-openai/package.json +++ b/packages/adapter-openai/package.json @@ -71,7 +71,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "koishi": { "description": { diff --git a/packages/adapter-qwen/package.json b/packages/adapter-qwen/package.json index c990aa0e7..225b8ceba 100644 --- a/packages/adapter-qwen/package.json +++ b/packages/adapter-qwen/package.json @@ -71,7 +71,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "koishi": { "description": { diff --git a/packages/adapter-rwkv/package.json b/packages/adapter-rwkv/package.json index 55a153a78..bc3a43d81 100644 --- a/packages/adapter-rwkv/package.json +++ b/packages/adapter-rwkv/package.json @@ -70,7 +70,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "koishi": { "description": { diff --git a/packages/adapter-spark/package.json b/packages/adapter-spark/package.json index b2bca5b8f..bd8fc0b35 100644 --- a/packages/adapter-spark/package.json +++ b/packages/adapter-spark/package.json @@ -72,7 +72,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "koishi": { "description": { diff --git a/packages/adapter-wenxin/package.json b/packages/adapter-wenxin/package.json index 4a7d4ec36..9813b808f 100644 --- a/packages/adapter-wenxin/package.json +++ b/packages/adapter-wenxin/package.json @@ -71,7 +71,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "koishi": { "description": { diff --git a/packages/adapter-zhipu/package.json b/packages/adapter-zhipu/package.json index bcbecf551..2cfed5e6f 100644 --- a/packages/adapter-zhipu/package.json +++ b/packages/adapter-zhipu/package.json @@ -73,7 +73,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "koishi": { "description": { diff --git a/packages/core/package.json b/packages/core/package.json index b07d8a75c..5813e8d69 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,7 +1,7 @@ { "name": "koishi-plugin-chatluna", "description": "chatluna for koishi", - "version": "1.3.0-alpha.53", + "version": "1.3.0-alpha.54", "main": "lib/index.cjs", "module": "lib/index.mjs", "typings": "lib/index.d.ts", diff --git a/packages/core/src/chains/chain.ts b/packages/core/src/chains/chain.ts index 384ea3c2f..71caaba07 100644 --- a/packages/core/src/chains/chain.ts +++ b/packages/core/src/chains/chain.ts @@ -720,7 +720,11 @@ class DefaultChatChainSender { ): Promise { if (!messages?.length) return - if (this.config.isForwardMsg) { + if ( + this.config.isForwardMsg && + this.getMessageText(messages).length > + this.config.forwardMsgMinLength + ) { await this.sendAsForward(session, messages) return } @@ -821,6 +825,20 @@ class DefaultChatChainSender { } return [message] } + + private getMessageText(message: (h[] | h | string)[]) { + return message + .map((element) => { + if (typeof element === 'string') { + return element + } + if (Array.isArray(element)) { + return h.select(element, 'text').toString() + } + return element.toString() + }) + .join(' ') + } } export interface ChainMiddlewareContext { diff --git a/packages/core/src/config.ts b/packages/core/src/config.ts index 2a407bc00..5de4e3e7b 100644 --- a/packages/core/src/config.ts +++ b/packages/core/src/config.ts @@ -6,6 +6,7 @@ export interface Config { isNickNameWithContent: boolean allowPrivate: boolean isForwardMsg: boolean + forwardMsgMinLength: number allowChatWithRoomName: boolean msgCooldown: number randomReplyFrequency: Computed> @@ -65,6 +66,7 @@ export const Config: Schema = Schema.intersect([ allowQuoteReply: Schema.boolean().default(false), isReplyWithAt: Schema.boolean().default(false), isForwardMsg: Schema.boolean().default(false), + forwardMsgMinLength: Schema.number().min(0).max(400).step(1).default(0), privateChatWithoutCommand: Schema.boolean().default(true), allowChatWithRoomName: Schema.boolean().default(false), includeQuoteReply: Schema.boolean().default(true), diff --git a/packages/core/src/locales/en-US.schema.yml b/packages/core/src/locales/en-US.schema.yml index c2a398b7f..caf6be308 100644 --- a/packages/core/src/locales/en-US.schema.yml +++ b/packages/core/src/locales/en-US.schema.yml @@ -14,6 +14,7 @@ $inner: privateChatWithoutCommand: Enable direct conversation in private chats without commands. allowChatWithRoomName: 'Enable room name prefix triggering. Note: May impact performance significantly. Recommended for use with filters in specific groups only.' randomReplyFrequency: Set random reply frequency (0-100, where 0 means never and 100 means always). + forwardMsgMinLength: Set minimum length of forwarded messages (characters). includeQuoteReply: Include quoted message content in replies. - $desc: Response Options diff --git a/packages/core/src/locales/zh-CN.schema.yml b/packages/core/src/locales/zh-CN.schema.yml index 7f4ced3ee..0b1de1f84 100644 --- a/packages/core/src/locales/zh-CN.schema.yml +++ b/packages/core/src/locales/zh-CN.schema.yml @@ -9,7 +9,8 @@ $inner: allowAtReply: 是否允许通过 @ bot 来触发对话。 allowQuoteReply: 是否允许通过引用 bot 的消息来触发对话。 isReplyWithAt: 当 bot 回复时,是否引用原消息。 - isForwardMsg: 是否以转发消息的形式发送 bot 的回复。 + isForwardMsg: 是否以合并消息的形式发送 bot 的回复。 + forwardMsgMinLength: 合并消息的最小应用长度。为 0 则总是应用。设置大于 0 时,只有发送的文本大于此长度才会转为合并消息。 privateChatWithoutCommand: 在私聊中是否允许无需命令直接与 bot 对话。 allowChatWithRoomName: 是否允许使用房间名前缀触发对话。注意:启用此选项可能会显著影响 ChatLuna 的性能,建议配合过滤器仅在特定群组中启用。 randomReplyFrequency: 设置随机回复的频率。 diff --git a/packages/extension-long-memory/package.json b/packages/extension-long-memory/package.json index 870bf35ce..93d6b9c75 100644 --- a/packages/extension-long-memory/package.json +++ b/packages/extension-long-memory/package.json @@ -64,7 +64,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "resolutions": { "@langchain/core": "0.3.62", diff --git a/packages/extension-mcp/package.json b/packages/extension-mcp/package.json index e42aa532c..2091c4537 100644 --- a/packages/extension-mcp/package.json +++ b/packages/extension-mcp/package.json @@ -1,7 +1,7 @@ { "name": "koishi-plugin-chatluna-mcp-client", "description": "MCP Client for ChatLuna", - "version": "1.3.0-alpha.5", + "version": "1.3.0-alpha.6", "main": "lib/index.cjs", "module": "lib/index.mjs", "typings": "lib/index.d.ts", @@ -49,8 +49,7 @@ ], "dependencies": { "@langchain/core": "0.3.62", - "@modelcontextprotocol/sdk": "^1.18.2", - "json-schema-to-zod": "^2.6.1", + "@modelcontextprotocol/sdk": "^1.19.1", "zod": "3.25.76" }, "devDependencies": { @@ -60,7 +59,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53", + "koishi-plugin-chatluna": "^1.3.0-alpha.54", "koishi-plugin-chatluna-storage-service": "^0.0.9" }, "peerDependenciesMeta": { diff --git a/packages/extension-mcp/src/index.ts b/packages/extension-mcp/src/index.ts index ac9a1acca..19100d6b7 100644 --- a/packages/extension-mcp/src/index.ts +++ b/packages/extension-mcp/src/index.ts @@ -3,8 +3,10 @@ import { Context, Logger, Schema } from 'koishi' import { createLogger } from 'koishi-plugin-chatluna/utils/logger' import { ChatLunaMCPClientService } from './service' import * as command from './command' +import { ChatLunaPlugin } from 'koishi-plugin-chatluna/services/chat' export let logger: Logger +export let plugin: ChatLunaPlugin export function apply(ctx: Context, config: Config) { logger = createLogger(ctx, 'chatluna-mcp-client') @@ -14,6 +16,13 @@ export function apply(ctx: Context, config: Config) { // eslint-disable-next-line @typescript-eslint/no-var-requires ctx.i18n.define('en-US', require('./locales/en-US')) + plugin = new ChatLunaPlugin( + ctx, + config as unknown as ChatLunaPlugin.Config, + 'mcp-client', + false + ) + ctx.plugin(ChatLunaMCPClientService, config) ctx.plugin(command, config) diff --git a/packages/extension-mcp/src/service.ts b/packages/extension-mcp/src/service.ts index 823e98d72..90df6b5c5 100644 --- a/packages/extension-mcp/src/service.ts +++ b/packages/extension-mcp/src/service.ts @@ -3,19 +3,17 @@ import { Context, Service } from 'koishi' import { Client } from '@modelcontextprotocol/sdk/client/index.js' import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js' import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js' -import { Config, logger } from '.' +import { Config, logger, plugin } from '.' import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js' import { tool } from '@langchain/core/tools' import { ChatLunaPlugin } from 'koishi-plugin-chatluna/services/chat' import { getMessageContent } from 'koishi-plugin-chatluna/utils/string' import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js' -import { JsonSchema7Type } from 'zod-to-json-schema' import { callTool } from './utils' export class ChatLunaMCPClientService extends Service { private _client: Client - private _plugin: ChatLunaPlugin private _globalTools: Record< string, { @@ -25,6 +23,8 @@ export class ChatLunaMCPClientService extends Service { } > = {} + private _plugin: ChatLunaPlugin + constructor( ctx: Context, public config: Config @@ -33,29 +33,30 @@ export class ChatLunaMCPClientService extends Service { this._client = new Client({ name: 'ChatLuna', - version: '1.0.0' + version: '1.0.0', + title: 'ChatLuna ModelContext Protocol Client', + description: 'A client for the ChatLuna ModelContext Protocol' }) - this._plugin = new ChatLunaPlugin( - ctx, - config as unknown as ChatLunaPlugin.Config, - 'mcp-client', - false - ) + this._plugin = plugin ctx.on('ready', async () => { - logger.info('Preparing MCP client...') + logger.info('Initializing MCP client service') const prepared = await this.prepareClient() if (!prepared) { - logger.warn('MCP client not prepared, skipping registration') + logger.warn( + 'Failed to initialize MCP client, skipping tool integration' + ) return } await this.registerClientToolsToSchema() const toolLength = await this.registerClientTools() - logger.info(`MCP client found ${toolLength} tools`) + logger.info( + `MCP client initialized successfully with ${toolLength} tool(s) available` + ) }) } @@ -87,6 +88,7 @@ export class ChatLunaMCPClientService extends Service { return false } + let availableServers = 0 for (const serverConfig of serverConfigs) { const { command, args, env, cwd, url, type, headers } = serverConfig @@ -133,6 +135,7 @@ export class ChatLunaMCPClientService extends Service { try { await this._client.connect(transport) logger.debug('MCP client connected at', serverConfig) + availableServers++ } catch (error) { logger.error( `Failed to connect to server at ${JSON.stringify( @@ -143,7 +146,7 @@ export class ChatLunaMCPClientService extends Service { } } - return true + return availableServers > 0 } async registerClientToolsToSchema() { @@ -208,7 +211,9 @@ export class ChatLunaMCPClientService extends Service { name: mcpTool.name, description: mcpTool.description, responseFormat: 'content_and_artifact', - schema: mcpTool.inputSchema as JsonSchema7Type + schema: mcpTool.inputSchema as Parameters< + typeof tool + >[1]['schema'] } ) diff --git a/packages/extension-tools/package.json b/packages/extension-tools/package.json index f927c3c31..877ba6e9c 100644 --- a/packages/extension-tools/package.json +++ b/packages/extension-tools/package.json @@ -1,7 +1,7 @@ { "name": "koishi-plugin-chatluna-plugin-common", "description": "plugin service for agent mode of chatluna", - "version": "1.3.0-alpha.15", + "version": "1.3.0-alpha.16", "main": "lib/index.cjs", "module": "lib/index.mjs", "typings": "lib/index.d.ts", @@ -71,7 +71,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53", + "koishi-plugin-chatluna": "^1.3.0-alpha.54", "koishi-plugin-chatluna-knowledge-chat": "^1.0.23", "koishi-plugin-chatluna-storage-service": "^0.0.9" }, diff --git a/packages/extension-tools/src/config.ts b/packages/extension-tools/src/config.ts index 538365e9a..aaa0bdfa1 100644 --- a/packages/extension-tools/src/config.ts +++ b/packages/extension-tools/src/config.ts @@ -5,6 +5,10 @@ export interface Config extends ChatLunaPlugin.Config { request: boolean requestMaxOutputLength: number requestSelector: string[] + requestHeaders: { + matcher: string + headers: Record + }[] fs: boolean fsScopePath: string fsSelector: string[] @@ -81,7 +85,6 @@ export const Config: Schema = Schema.intersect([ .max(3860000) .default(58600), requestSelector: Schema.array(Schema.string()) - .role('table') .default([ '请求', 'request', @@ -92,6 +95,18 @@ export const Config: Schema = Schema.intersect([ 'api', 'http' ]) + .role('table'), + requestHeaders: Schema.array( + Schema.object({ + matcher: Schema.string().description( + 'Domain matcher pattern (e.g., *.example.com, api.github.com)' + ), + headers: Schema.dict(String) + .default({}) + .role('table') + .description('Headers to apply for this domain') + }) + ).default([]) }), Schema.object({}) ]), diff --git a/packages/extension-tools/src/locales/en-US.schema.yml b/packages/extension-tools/src/locales/en-US.schema.yml index 9dc128fbb..1c82226a6 100644 --- a/packages/extension-tools/src/locales/en-US.schema.yml +++ b/packages/extension-tools/src/locales/en-US.schema.yml @@ -23,6 +23,11 @@ $inner: - - $desc: 'Request Plugin Configuration' requestMaxOutputLength: 'Max output length for request plugin' requestSelector: 'Keywords to trigger request tool. Always selected when empty.' + requestHeaders: + $desc: 'Configure request headers based on domain matching.' + $inner: + matcher: 'Domain matcher pattern (supports wildcards, e.g., *.example.com, api.github.com).' + headers: 'Request headers to apply when this domain matches.' - - $desc: 'File Plugin Configuration' fsScopePath: 'Scope path for file plugin. Empty for system-wide access' diff --git a/packages/extension-tools/src/locales/zh-CN.schema.yml b/packages/extension-tools/src/locales/zh-CN.schema.yml index 57f9a99d2..03c01e99d 100644 --- a/packages/extension-tools/src/locales/zh-CN.schema.yml +++ b/packages/extension-tools/src/locales/zh-CN.schema.yml @@ -22,6 +22,11 @@ $inner: - - $desc: request 插件配置 requestMaxOutputLength: request 插件最大输出长度。 requestSelector: 触发 request 工具的关键词。为空时始终选中。 + requestHeaders: + $desc: 根据域名匹配设置请求头。 + $inner: + matcher: 域名匹配模式(支持通配符,如 *.example.com, api.github.com)。 + headers: 该域名匹配时应用的请求头。 - - $desc: fs 插件配置 fsScopePath: fs 插件作用域路径。留空则为系统任意路径。 diff --git a/packages/extension-tools/src/plugins/cron.ts b/packages/extension-tools/src/plugins/cron.ts index fbe33f1e1..2451637c9 100644 --- a/packages/extension-tools/src/plugins/cron.ts +++ b/packages/extension-tools/src/plugins/cron.ts @@ -174,9 +174,8 @@ export async function apply( plugin.registerTool('cron', { selector(history) { - return fuzzyQuery( - getMessageContent(history[history.length - 1].content), - [ + return history.some((message) => + fuzzyQuery(getMessageContent(message.content), [ '定时', '任务', '醒', @@ -193,7 +192,7 @@ export async function apply( 'schedule', 'remind', 'notification' - ] + ]) ) }, diff --git a/packages/extension-tools/src/plugins/fs.ts b/packages/extension-tools/src/plugins/fs.ts index fd465ab88..260cb4f16 100644 --- a/packages/extension-tools/src/plugins/fs.ts +++ b/packages/extension-tools/src/plugins/fs.ts @@ -10,6 +10,7 @@ import path from 'path' import { Config } from '..' import micromatch from 'micromatch' import z from 'zod' +import { ChatLunaTool } from 'koishi-plugin-chatluna/llm-core/platform/types' export async function apply( ctx: Context, @@ -61,7 +62,7 @@ export async function apply( store }) - const fsSelector = (history) => { + const fsSelector: ChatLunaTool['selector'] = (history) => { if (config.fsSelector.length === 0) { return true } @@ -88,31 +89,26 @@ export async function apply( plugin.registerTool(listFileTool.name, { selector: fsSelector, - createTool: () => listFileTool }) plugin.registerTool(grepTool.name, { selector: fsSelector, - createTool: () => grepTool }) plugin.registerTool(globTool.name, { selector: fsSelector, - createTool: () => globTool }) plugin.registerTool(renameTool.name, { selector: fsSelector, - createTool: () => renameTool }) plugin.registerTool(multiRenameTool.name, { selector: fsSelector, - createTool: () => multiRenameTool }) diff --git a/packages/extension-tools/src/plugins/request.ts b/packages/extension-tools/src/plugins/request.ts index ef0186902..4e1785afb 100644 --- a/packages/extension-tools/src/plugins/request.ts +++ b/packages/extension-tools/src/plugins/request.ts @@ -9,6 +9,26 @@ import { import { Config } from '..' import z from 'zod' import { BaseMessage } from '@langchain/core/messages' +import micromatch from 'micromatch' + +function getHeadersForUrl( + url: string, + headerConfigs: { matcher: string; headers: Record }[] +): Record { + try { + const urlObj = new URL(url) + const hostname = urlObj.hostname + + for (const config of headerConfigs) { + if (micromatch.isMatch(hostname, config.matcher, { dot: true })) { + return config.headers + } + } + } catch (error) { + // Invalid URL, return empty headers + } + return {} +} export async function apply( ctx: Context, @@ -25,7 +45,8 @@ export async function apply( 'User-Agent': randomUA() }, { - maxOutputLength: config.requestMaxOutputLength + maxOutputLength: config.requestMaxOutputLength, + headerConfigs: config.requestHeaders ?? [] } ) @@ -35,12 +56,13 @@ export async function apply( 'User-Agent': randomUA() }, { - maxOutputLength: config.requestMaxOutputLength + maxOutputLength: config.requestMaxOutputLength, + headerConfigs: config.requestHeaders ?? [] } ) const requestSelector = (history: BaseMessage[]) => { - if (config.requestSelector.length === 0) { + if ((config.requestSelector?.length ?? 0) === 0) { return true } return history.some( @@ -48,7 +70,7 @@ export async function apply( message.content != null && fuzzyQuery( getMessageContent(message.content), - config.requestSelector + config?.requestSelector || [] ) ) } @@ -71,6 +93,7 @@ export interface Headers { export interface RequestTool extends ToolParams { headers: Headers maxOutputLength: number + headerConfigs: { matcher: string; headers: Record }[] } export class RequestsGetTool extends StructuredTool implements RequestTool { @@ -88,24 +111,34 @@ export class RequestsGetTool extends StructuredTool implements RequestTool { }) maxOutputLength = 30000 + headerConfigs: { matcher: string; headers: Record }[] = [] constructor( private _plugin: ChatLunaPlugin, public headers: Headers = {}, { maxOutputLength, + headerConfigs, ...rest - }: { maxOutputLength?: number } & ToolParams = {} + }: { + maxOutputLength?: number + headerConfigs?: { + matcher: string + headers: Record + }[] + } & ToolParams = {} ) { super(rest) this.maxOutputLength = maxOutputLength ?? this.maxOutputLength + this.headerConfigs = headerConfigs ?? [] } async _call(input: z.infer) { const { url } = input try { + const matchedHeaders = getHeadersForUrl(url, this.headerConfigs) const res = await this._plugin.fetch(url, { - headers: this.headers + headers: { ...this.headers, ...matchedHeaders } }) const text = await res.text() return text.slice(0, this.maxOutputLength) @@ -116,7 +149,7 @@ export class RequestsGetTool extends StructuredTool implements RequestTool { } export class RequestsPostTool extends StructuredTool implements RequestTool { - name = 'web_post' + name = 'web_poster' description = `Web POST request tool. Use this to send data to websites. Sends a POST request with JSON data to the specified URL and returns the response text.` @@ -135,27 +168,38 @@ export class RequestsPostTool extends StructuredTool implements RequestTool { }) maxOutputLength = Infinity + headerConfigs: { matcher: string; headers: Record }[] = [] constructor( private _plugin: ChatLunaPlugin, public headers: Headers = {}, { maxOutputLength, + headerConfigs, ...rest - }: { maxOutputLength?: number } & ToolParams = {} + }: { + maxOutputLength?: number + headerConfigs?: { + matcher: string + headers: Record + }[] + } & ToolParams = {} ) { super(rest) this.maxOutputLength = maxOutputLength ?? this.maxOutputLength + this.headerConfigs = headerConfigs ?? [] } async _call(input: z.infer) { const { url, data } = input try { + const matchedHeaders = getHeadersForUrl(url, this.headerConfigs) const res = await this._plugin.fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', - ...this.headers + ...this.headers, + ...matchedHeaders }, body: JSON.stringify(data) }) diff --git a/packages/extension-variable/package.json b/packages/extension-variable/package.json index ca4a4f357..85c6783d1 100644 --- a/packages/extension-variable/package.json +++ b/packages/extension-variable/package.json @@ -59,7 +59,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "resolutions": { "@langchain/core": "0.3.62", diff --git a/packages/renderer-image/package.json b/packages/renderer-image/package.json index de57b5360..89c3e717a 100644 --- a/packages/renderer-image/package.json +++ b/packages/renderer-image/package.json @@ -64,7 +64,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "koishi": { "description": { diff --git a/packages/service-embeddings/package.json b/packages/service-embeddings/package.json index dc3ea71e4..7e4b413e7 100644 --- a/packages/service-embeddings/package.json +++ b/packages/service-embeddings/package.json @@ -64,7 +64,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "koishi": { "description": { diff --git a/packages/service-image/package.json b/packages/service-image/package.json index cf0efb46d..df3ccc39d 100644 --- a/packages/service-image/package.json +++ b/packages/service-image/package.json @@ -60,7 +60,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "resolutions": { "@langchain/core": "0.3.62", diff --git a/packages/service-search/package.json b/packages/service-search/package.json index 249bcf0b5..9d652f494 100644 --- a/packages/service-search/package.json +++ b/packages/service-search/package.json @@ -76,7 +76,7 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "koishi": { "description": { diff --git a/packages/service-vector-store/package.json b/packages/service-vector-store/package.json index 534f888a8..853d88365 100644 --- a/packages/service-vector-store/package.json +++ b/packages/service-vector-store/package.json @@ -59,7 +59,7 @@ "@zilliz/milvus2-sdk-node": "^2.6.0", "faiss-node": "^0.5.1", "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" }, "peerDependenciesMeta": { "@zilliz/milvus2-sdk-node": { diff --git a/packages/shared-adapter/package.json b/packages/shared-adapter/package.json index 62058a36e..fbb131f70 100644 --- a/packages/shared-adapter/package.json +++ b/packages/shared-adapter/package.json @@ -70,6 +70,6 @@ }, "peerDependencies": { "koishi": "^4.18.9", - "koishi-plugin-chatluna": "^1.3.0-alpha.53" + "koishi-plugin-chatluna": "^1.3.0-alpha.54" } }