mirror of
https://gitee.com/mateos/mateclaw.git
synced 2026-09-15 11:58:34 +08:00
fix(channel): expose execution trace switch for WeChat channels (#613)
This commit is contained in:
parent
14df331ce6
commit
709218e2ac
@ -472,6 +472,7 @@ import {
|
|||||||
extractChannelFields,
|
extractChannelFields,
|
||||||
extractRenderConfig,
|
extractRenderConfig,
|
||||||
parseConfigJson,
|
parseConfigJson,
|
||||||
|
supportsChannelMessageFilter,
|
||||||
type AccessControlValue,
|
type AccessControlValue,
|
||||||
type RenderConfigValue,
|
type RenderConfigValue,
|
||||||
} from '@/utils/channelConfigJson'
|
} from '@/utils/channelConfigJson'
|
||||||
@ -633,13 +634,8 @@ const needsWebhookUrl = computed(() => {
|
|||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
|
|
||||||
// Browser-rendered channels stream structured message parts over SSE and let
|
|
||||||
// the client decide what to draw (thinking panel, tool cards). They never go
|
|
||||||
// through the adapter's outbound text render path, which is the only place the
|
|
||||||
// message-filter config is read — so the controls would be inert there.
|
|
||||||
const BROWSER_RENDERED_TYPES = ['web', 'webchat']
|
|
||||||
const supportsMessageFilter = computed(
|
const supportsMessageFilter = computed(
|
||||||
() => !BROWSER_RENDERED_TYPES.includes(form.value.channelType || ''),
|
() => supportsChannelMessageFilter(form.value.channelType),
|
||||||
)
|
)
|
||||||
|
|
||||||
const isLocalhost = computed(() => {
|
const isLocalhost = computed(() => {
|
||||||
|
|||||||
@ -673,6 +673,7 @@ export const CHANNEL_FIELD_DEFS: Record<string, ChannelFieldDef[]> = {
|
|||||||
{ key: 'bot_id', label: '机器人 ID', placeholder: 'bot_xxxxxxxxxx', required: true, type: 'text', tooltip: '企业微信智能机器人的 Bot ID(在企业微信后台创建智能机器人后获取)' },
|
{ key: 'bot_id', label: '机器人 ID', placeholder: 'bot_xxxxxxxxxx', required: true, type: 'text', tooltip: '企业微信智能机器人的 Bot ID(在企业微信后台创建智能机器人后获取)' },
|
||||||
{ key: 'secret', label: 'Secret', placeholder: 'xxxxxxxxxxxxxxxx', required: true, sensitive: true, type: 'password', tooltip: '企业微信智能机器人的 Secret' },
|
{ key: 'secret', label: 'Secret', placeholder: 'xxxxxxxxxxxxxxxx', required: true, sensitive: true, type: 'password', tooltip: '企业微信智能机器人的 Secret' },
|
||||||
{ key: 'welcome_text', label: '欢迎消息', placeholder: '你好!我是你的 AI 助手', type: 'text', tooltip: '用户首次进入对话时自动发送的欢迎消息(留空则不发送)' },
|
{ key: 'welcome_text', label: '欢迎消息', placeholder: '你好!我是你的 AI 助手', type: 'text', tooltip: '用户首次进入对话时自动发送的欢迎消息(留空则不发送)' },
|
||||||
|
{ key: 'stream_progress', label: '执行轨迹', placeholder: '', type: 'switch', defaultValue: true, tooltip: '展示处理期间的实时进度与阶段旁白;关闭后仅发送最终答复。原始思考和工具名称仍受下方过滤开关控制' },
|
||||||
{ key: 'media_download_enabled', label: '媒体下载', placeholder: '', type: 'switch', defaultValue: false, tooltip: '下载消息中的图片和文件到本地并解密(需要本地磁盘空间)' },
|
{ key: 'media_download_enabled', label: '媒体下载', placeholder: '', type: 'switch', defaultValue: false, tooltip: '下载消息中的图片和文件到本地并解密(需要本地磁盘空间)' },
|
||||||
{ key: 'media_dir', label: '媒体目录', placeholder: 'data/media', type: 'text', tooltip: '媒体文件保存目录(默认 data/media)' },
|
{ key: 'media_dir', label: '媒体目录', placeholder: 'data/media', type: 'text', tooltip: '媒体文件保存目录(默认 data/media)' },
|
||||||
{ key: 'max_reconnect_attempts', label: '最大重连次数', placeholder: '-1 表示无限重连', type: 'number', defaultValue: -1, tooltip: 'WebSocket 断线后最大重连次数,-1 为无限重连' },
|
{ key: 'max_reconnect_attempts', label: '最大重连次数', placeholder: '-1 表示无限重连', type: 'number', defaultValue: -1, tooltip: 'WebSocket 断线后最大重连次数,-1 为无限重连' },
|
||||||
@ -680,6 +681,7 @@ export const CHANNEL_FIELD_DEFS: Record<string, ChannelFieldDef[]> = {
|
|||||||
weixin: [
|
weixin: [
|
||||||
{ key: 'bot_token', label: 'Bot Token', placeholder: '扫码登录后自动获取', required: true, sensitive: true, type: 'password', tooltip: '微信 iLink Bot Token,通过扫描二维码登录获取' },
|
{ key: 'bot_token', label: 'Bot Token', placeholder: '扫码登录后自动获取', required: true, sensitive: true, type: 'password', tooltip: '微信 iLink Bot Token,通过扫描二维码登录获取' },
|
||||||
{ key: 'base_url', label: 'API 地址', placeholder: 'https://ilinkai.weixin.qq.com', type: 'text', defaultValue: 'https://ilinkai.weixin.qq.com', tooltip: 'iLink Bot API 基础地址(通常无需修改)' },
|
{ key: 'base_url', label: 'API 地址', placeholder: 'https://ilinkai.weixin.qq.com', type: 'text', defaultValue: 'https://ilinkai.weixin.qq.com', tooltip: 'iLink Bot API 基础地址(通常无需修改)' },
|
||||||
|
{ key: 'stream_progress', label: '执行轨迹', placeholder: '', type: 'switch', defaultValue: true, tooltip: '展示处理期间的实时进度与阶段旁白;关闭后仅发送最终答复。原始思考和工具名称仍受下方过滤开关控制' },
|
||||||
{ key: 'media_download_enabled', label: '媒体下载', placeholder: '', type: 'switch', defaultValue: false, tooltip: '下载消息中的图片、文件、视频到本地并解密' },
|
{ key: 'media_download_enabled', label: '媒体下载', placeholder: '', type: 'switch', defaultValue: false, tooltip: '下载消息中的图片、文件、视频到本地并解密' },
|
||||||
{ key: 'media_dir', label: '媒体目录', placeholder: 'data/media', type: 'text', tooltip: '媒体文件保存目录(默认 data/media)' },
|
{ key: 'media_dir', label: '媒体目录', placeholder: 'data/media', type: 'text', tooltip: '媒体文件保存目录(默认 data/media)' },
|
||||||
],
|
],
|
||||||
|
|||||||
20
mateclaw-ui/src/utils/__tests__/channelMessageFilter.test.ts
Normal file
20
mateclaw-ui/src/utils/__tests__/channelMessageFilter.test.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import { describe, expect, it } from 'vitest'
|
||||||
|
import { supportsChannelMessageFilter } from '../channelConfigJson'
|
||||||
|
import { CHANNEL_FIELD_DEFS } from '../../types'
|
||||||
|
|
||||||
|
describe('supportsChannelMessageFilter', () => {
|
||||||
|
it('exposes message filter controls for WeCom and Weixin channels', () => {
|
||||||
|
expect(supportsChannelMessageFilter('wecom')).toBe(true)
|
||||||
|
expect(supportsChannelMessageFilter('weixin')).toBe(true)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('hides message filter controls for browser-rendered channels', () => {
|
||||||
|
expect(supportsChannelMessageFilter('web')).toBe(false)
|
||||||
|
expect(supportsChannelMessageFilter('webchat')).toBe(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('exposes execution trace controls for WeCom and Weixin channels', () => {
|
||||||
|
expect(CHANNEL_FIELD_DEFS.wecom.map(field => field.key)).toContain('stream_progress')
|
||||||
|
expect(CHANNEL_FIELD_DEFS.weixin.map(field => field.key)).toContain('stream_progress')
|
||||||
|
})
|
||||||
|
})
|
||||||
@ -29,6 +29,15 @@ export const defaultRenderConfig = (): RenderConfigValue => ({
|
|||||||
message_format: 'auto',
|
message_format: 'auto',
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Browser-rendered channels stream structured message parts over SSE and let
|
||||||
|
// the client decide what to draw. They never go through the adapter's outbound
|
||||||
|
// text render path, where message-filter config is read.
|
||||||
|
const BROWSER_RENDERED_TYPES = new Set(['web', 'webchat'])
|
||||||
|
|
||||||
|
export function supportsChannelMessageFilter(channelType?: string | null): boolean {
|
||||||
|
return !BROWSER_RENDERED_TYPES.has(channelType || '')
|
||||||
|
}
|
||||||
|
|
||||||
export function parseConfigJson(json?: string): Record<string, any> {
|
export function parseConfigJson(json?: string): Record<string, any> {
|
||||||
if (!json) return {}
|
if (!json) return {}
|
||||||
try { return JSON.parse(json) } catch { return {} }
|
try { return JSON.parse(json) } catch { return {} }
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user