feat: add Cherry Studio transformation and settings plugins

- Introduced cherryStudioTransformPlugin for converting Cherry Studio messages to AI SDK format, enhancing compatibility.
- Added cherryStudioSettingsPlugin to manage Assistant settings like temperature and TopP.
- Implemented createCherryStudioContext function for preparing context metadata for Cherry Studio calls.
This commit is contained in:
MyPrototypeWhat 2025-06-20 16:40:40 +08:00
parent e70174817e
commit 1af8be8768

View File

@ -0,0 +1,110 @@
/**
* Cherry Studio
* Cherry Studio Assistant
*/
import { definePlugin } from '@cherrystudio/ai-core'
import type { Assistant, MCPTool, Message, Model } from '@renderer/types'
import {
buildStreamTextParams,
convertMessagesToSdkMessages,
getCustomParameters,
getTemperature,
getTopP
} from '../transformParameters'
/**
* Cherry Studio
* Cherry Studio AI SDK
*/
export const cherryStudioTransformPlugin = definePlugin({
name: 'cherry-studio-transform',
/**
*
* Cherry Studio Assistant + Messages AI SDK
*/
transformParams: async (params: any, context) => {
// 检查是否有 Cherry Studio 特有的数据结构
const cherryData = context.metadata?.cherryStudio
if (!cherryData) {
return params // 不是 Cherry Studio 调用,直接返回
}
const { assistant, messages, mcpTools, enableTools } = cherryData
try {
// 1. 转换 Cherry Studio 消息为 AI SDK 消息
const sdkMessages = await convertMessagesToSdkMessages(messages as Message[], assistant.model as Model)
// 2. 构建完整的 AI SDK 参数
const { params: transformedParams } = await buildStreamTextParams(sdkMessages, assistant as Assistant, {
mcpTools: mcpTools as MCPTool[],
enableTools,
requestOptions: {
signal: params.abortSignal,
headers: params.headers
}
})
// 3. 合并原始参数和转换后的参数
return {
...params,
...transformedParams,
// 保留原始的一些关键参数
abortSignal: params.abortSignal,
headers: params.headers
}
} catch (error) {
console.error('Cherry Studio 参数转换失败:', error)
return params // 转换失败时返回原始参数
}
}
})
/**
* Cherry Studio Assistant
* Assistant TopP
*/
export const cherryStudioSettingsPlugin = definePlugin({
name: 'cherry-studio-settings',
transformParams: async (params: any, context) => {
const cherryData = context.metadata?.cherryStudio
if (!cherryData?.assistant) {
return params
}
const { assistant } = cherryData
const model = assistant.model as Model
return {
...params,
temperature: getTemperature(assistant as Assistant, model),
topP: getTopP(assistant as Assistant, model),
...getCustomParameters(assistant as Assistant)
}
}
})
/**
* 便 Cherry Studio
*/
export function createCherryStudioContext(
assistant: Assistant,
messages: Message[],
options: {
mcpTools?: MCPTool[]
enableTools?: boolean
} = {}
) {
return {
cherryStudio: {
assistant,
messages,
mcpTools: options.mcpTools,
enableTools: options.enableTools
}
}
}