mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-21 16:01:35 +08:00
feat: new middleware to add 'no_think' (#10675)
* new middleware to add 'no_think' Signed-off-by: Kejiang Ma <kj.ma@intel.com> * translate comments to English Signed-off-by: Kejiang Ma <kj.ma@intel.com> --------- Signed-off-by: Kejiang Ma <kj.ma@intel.com>
This commit is contained in:
parent
866e8e8734
commit
7cf57adceb
@ -4,6 +4,8 @@ import type { MCPTool, Message, Model, Provider } from '@renderer/types'
|
|||||||
import type { Chunk } from '@renderer/types/chunk'
|
import type { Chunk } from '@renderer/types/chunk'
|
||||||
import { extractReasoningMiddleware, LanguageModelMiddleware, simulateStreamingMiddleware } from 'ai'
|
import { extractReasoningMiddleware, LanguageModelMiddleware, simulateStreamingMiddleware } from 'ai'
|
||||||
|
|
||||||
|
import { noThinkMiddleware } from './noThinkMiddleware'
|
||||||
|
|
||||||
const logger = loggerService.withContext('AiSdkMiddlewareBuilder')
|
const logger = loggerService.withContext('AiSdkMiddlewareBuilder')
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -186,6 +188,14 @@ function addProviderSpecificMiddlewares(builder: AiSdkMiddlewareBuilder, config:
|
|||||||
// 其他provider的通用处理
|
// 其他provider的通用处理
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OVMS+MCP's specific middleware
|
||||||
|
if (config.provider.id === 'ovms' && config.mcpTools && config.mcpTools.length > 0) {
|
||||||
|
builder.add({
|
||||||
|
name: 'no-think',
|
||||||
|
middleware: noThinkMiddleware()
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
52
src/renderer/src/aiCore/middleware/noThinkMiddleware.ts
Normal file
52
src/renderer/src/aiCore/middleware/noThinkMiddleware.ts
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import { loggerService } from '@logger'
|
||||||
|
import { LanguageModelMiddleware } from 'ai'
|
||||||
|
|
||||||
|
const logger = loggerService.withContext('noThinkMiddleware')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* No Think Middleware
|
||||||
|
* Automatically appends ' /no_think' string to the end of user messages for the provider
|
||||||
|
* This prevents the model from generating unnecessary thinking process and returns results directly
|
||||||
|
* @returns LanguageModelMiddleware
|
||||||
|
*/
|
||||||
|
export function noThinkMiddleware(): LanguageModelMiddleware {
|
||||||
|
return {
|
||||||
|
middlewareVersion: 'v2',
|
||||||
|
|
||||||
|
transformParams: async ({ params }) => {
|
||||||
|
const transformedParams = { ...params }
|
||||||
|
// Process messages in prompt
|
||||||
|
if (transformedParams.prompt && Array.isArray(transformedParams.prompt)) {
|
||||||
|
transformedParams.prompt = transformedParams.prompt.map((message) => {
|
||||||
|
// Only process user messages
|
||||||
|
if (message.role === 'user') {
|
||||||
|
// Process content array
|
||||||
|
if (Array.isArray(message.content)) {
|
||||||
|
const lastContent = message.content[message.content.length - 1]
|
||||||
|
// If the last content is text type, append ' /no_think'
|
||||||
|
if (lastContent && lastContent.type === 'text' && typeof lastContent.text === 'string') {
|
||||||
|
// Avoid duplicate additions
|
||||||
|
if (!lastContent.text.endsWith('/no_think')) {
|
||||||
|
logger.debug('Adding /no_think to user message')
|
||||||
|
return {
|
||||||
|
...message,
|
||||||
|
content: [
|
||||||
|
...message.content.slice(0, -1),
|
||||||
|
{
|
||||||
|
...lastContent,
|
||||||
|
text: lastContent.text + ' /no_think'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return message
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return transformedParams
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user