mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-27 12:51:26 +08:00
feat(llm): add provider Poe (#8758)
* feat(llm): 添加Poe作为新的LLM提供商 - 在SYSTEM_MODELS中添加Poe的GPT-4o模型 - 在INITIAL_PROVIDERS中新增Poe提供商配置 - 添加Poe提供商logo资源文件 - 更新migrate.ts处理版本127的迁移逻辑 - 增加Poe提供商的相关文档链接配置 * feat(provider): 添加对开发者角色支持提供商的检查功能 在OpenAI客户端中根据提供商支持情况动态设置角色
This commit is contained in:
parent
12119c4faf
commit
c52bb47fef
@ -62,6 +62,7 @@ import { ChatCompletionContentPart, ChatCompletionContentPartRefusal, ChatComple
|
||||
import { GenericChunk } from '../../middleware/schemas'
|
||||
import { RequestTransformer, ResponseChunkTransformer, ResponseChunkTransformerContext } from '../types'
|
||||
import { OpenAIBaseClient } from './OpenAIBaseClient'
|
||||
import { isSupportDeveloperRoleProvider } from '@renderer/config/providers'
|
||||
|
||||
const logger = loggerService.withContext('OpenAIApiClient')
|
||||
|
||||
@ -491,7 +492,7 @@ export class OpenAIAPIClient extends OpenAIBaseClient<
|
||||
|
||||
if (isSupportedReasoningEffortOpenAIModel(model)) {
|
||||
systemMessage = {
|
||||
role: 'developer',
|
||||
role: isSupportDeveloperRoleProvider(this.provider) ? 'developer' : 'system',
|
||||
content: `Formatting re-enabled${systemMessage ? '\n' + systemMessage.content : ''}`
|
||||
}
|
||||
}
|
||||
|
||||
@ -44,6 +44,7 @@ import { ResponseInput } from 'openai/resources/responses/responses'
|
||||
import { RequestTransformer, ResponseChunkTransformer } from '../types'
|
||||
import { OpenAIAPIClient } from './OpenAIApiClient'
|
||||
import { OpenAIBaseClient } from './OpenAIBaseClient'
|
||||
import { isSupportDeveloperRoleProvider } from '@renderer/config/providers'
|
||||
|
||||
export class OpenAIResponseAPIClient extends OpenAIBaseClient<
|
||||
OpenAI,
|
||||
@ -369,7 +370,11 @@ export class OpenAIResponseAPIClient extends OpenAIBaseClient<
|
||||
type: 'input_text'
|
||||
}
|
||||
if (isSupportedReasoningEffortOpenAIModel(model)) {
|
||||
systemMessage.role = 'developer'
|
||||
if (isSupportDeveloperRoleProvider(this.provider)) {
|
||||
systemMessage.role = 'developer'
|
||||
} else {
|
||||
systemMessage.role = 'system'
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 设置工具
|
||||
|
||||
1
src/renderer/src/assets/images/providers/poe.svg
Normal file
1
src/renderer/src/assets/images/providers/poe.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Poe</title><path d="M20.708 6.876a1.412 1.412 0 00-1.029-.415h-.006a2.019 2.019 0 01-2.02-2.023A1.415 1.415 0 0016.254 3H4.871A1.412 1.412 0 003.47 4.434a2.026 2.026 0 01-2.025 2.025v.002A1.414 1.414 0 000 7.883v3.642a1.414 1.414 0 001.444 1.42 2.025 2.025 0 012.025 2.02v3.693a.5.5 0 00.89.313l2.051-2.567h9.843a1.412 1.412 0 001.4-1.434v-.002c0-1.12.904-2.025 2.026-2.025a1.412 1.412 0 001.446-1.42V7.88c0-.363-.14-.727-.417-1.005zm-2.42 4.687a2.025 2.025 0 01-2.025 2.005H4.861a2.025 2.025 0 01-2.025-2.005v-3.72A2.026 2.026 0 014.86 5.838h11.4a2.026 2.026 0 012.026 2.005v3.72h.002z"></path><path d="M7.413 7.57A1.422 1.422 0 005.99 8.99v1.422a1.422 1.422 0 102.844 0V8.99c0-.784-.636-1.422-1.422-1.422zm6.297 0a1.422 1.422 0 00-1.422 1.421v1.422a1.422 1.422 0 102.844 0V8.99c0-.784-.636-1.422-1.422-1.422z"></path><path d="M7.292 22.643l1.993-2.492h9.844a1.413 1.413 0 001.4-1.434 2.025 2.025 0 012.017-2.027h.01A1.409 1.409 0 0024 15.27v-3.594c0-.344-.113-.68-.324-.951l-.397-.519v4.127a1.415 1.415 0 01-1.444 1.42h-.007a2.026 2.026 0 00-2.018 2.025 1.415 1.415 0 01-1.402 1.436H8.565l-2.169 2.712a.574.574 0 00.896.715v.002z" fill="url(#lobe-icons-poe-fill-0)"></path><path d="M5.004 19.992l2.12-2.65h9.844a1.414 1.414 0 001.402-1.437c0-1.116.9-2.021 2.014-2.025h.012a1.413 1.413 0 001.443-1.422v-4.13l.52.68c.21.273.324.607.324.95v3.594a1.416 1.416 0 01-1.443 1.42h-.01a2.026 2.026 0 00-2.016 2.026 1.414 1.414 0 01-1.402 1.435H7.97l-1.916 2.4a.671.671 0 01-1.049-.839v-.002z" fill="url(#lobe-icons-poe-fill-1)"></path><defs><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-poe-fill-0" x1="34.01" x2="1.086" y1="7.303" y2="27.715"><stop stop-color="#46A6F7"></stop><stop offset="1" stop-color="#8364FF"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-poe-fill-1" x1="4.915" x2="24.34" y1="23.511" y2="9.464"><stop stop-color="#FF44D3"></stop><stop offset="1" stop-color="#CF4BFF"></stop></linearGradient></defs></svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
@ -2346,7 +2346,15 @@ export const SYSTEM_MODELS: Record<string, Model[]> = {
|
||||
}
|
||||
],
|
||||
'new-api': [],
|
||||
'aws-bedrock': []
|
||||
'aws-bedrock': [],
|
||||
poe: [
|
||||
{
|
||||
id: 'gpt-4o',
|
||||
name: 'GPT-4o',
|
||||
provider: 'poe',
|
||||
group: 'poe'
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
export const TEXT_TO_IMAGES_MODELS = [
|
||||
|
||||
@ -15,6 +15,7 @@ import DeepSeekProviderLogo from '@renderer/assets/images/providers/deepseek.png
|
||||
import DmxapiProviderLogo from '@renderer/assets/images/providers/DMXAPI.png'
|
||||
import FireworksProviderLogo from '@renderer/assets/images/providers/fireworks.png'
|
||||
import GiteeAIProviderLogo from '@renderer/assets/images/providers/gitee-ai.png'
|
||||
import PoeProviderLogo from '@renderer/assets/images/providers/poe.svg'
|
||||
import GithubProviderLogo from '@renderer/assets/images/providers/github.png'
|
||||
import GoogleProviderLogo from '@renderer/assets/images/providers/google.png'
|
||||
import GPUStackProviderLogo from '@renderer/assets/images/providers/gpustack.svg'
|
||||
@ -53,6 +54,7 @@ import ZeroOneProviderLogo from '@renderer/assets/images/providers/zero-one.png'
|
||||
import ZhipuProviderLogo from '@renderer/assets/images/providers/zhipu.png'
|
||||
|
||||
import { TOKENFLUX_HOST } from './constant'
|
||||
import { Provider } from '@renderer/types'
|
||||
|
||||
const PROVIDER_LOGO_MAP = {
|
||||
ph8: Ph8ProviderLogo,
|
||||
@ -108,7 +110,8 @@ const PROVIDER_LOGO_MAP = {
|
||||
lanyun: LanyunProviderLogo,
|
||||
vertexai: VertexAIProviderLogo,
|
||||
'new-api': NewAPIProviderLogo,
|
||||
'aws-bedrock': AwsProviderLogo
|
||||
'aws-bedrock': AwsProviderLogo,
|
||||
poe: PoeProviderLogo
|
||||
} as const
|
||||
|
||||
export function getProviderLogo(providerId: string) {
|
||||
@ -702,5 +705,20 @@ export const PROVIDER_CONFIG = {
|
||||
docs: 'https://docs.aws.amazon.com/bedrock/',
|
||||
models: 'https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html'
|
||||
}
|
||||
},
|
||||
poe: {
|
||||
api: {
|
||||
url: 'https://api.poe.com/v1'
|
||||
},
|
||||
websites: {
|
||||
official: 'https://poe.com/',
|
||||
apiKey: 'https://poe.com/api_key',
|
||||
docs: 'https://creator.poe.com/docs/external-applications/openai-compatible-api',
|
||||
models: 'https://poe.com/'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const isSupportDeveloperRoleProvider = (provider: Provider) => {
|
||||
return provider.id !== 'poe'
|
||||
}
|
||||
|
||||
@ -60,7 +60,7 @@ const persistedReducer = persistReducer(
|
||||
{
|
||||
key: 'cherry-studio',
|
||||
storage,
|
||||
version: 126,
|
||||
version: 127,
|
||||
blacklist: ['runtime', 'messages', 'messageBlocks', 'tabs'],
|
||||
migrate
|
||||
},
|
||||
|
||||
@ -552,6 +552,16 @@ export const INITIAL_PROVIDERS: Provider[] = [
|
||||
models: SYSTEM_MODELS['aws-bedrock'],
|
||||
isSystem: true,
|
||||
enabled: false
|
||||
},
|
||||
{
|
||||
id: 'poe',
|
||||
name: 'Poe',
|
||||
type: 'openai',
|
||||
apiKey: '',
|
||||
apiHost: 'https://api.poe.com/v1/',
|
||||
models: SYSTEM_MODELS['poe'],
|
||||
isSystem: true,
|
||||
enabled: false
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
@ -1958,6 +1958,15 @@ const migrateConfig = {
|
||||
logger.error('migrate 126 error', error as Error)
|
||||
return state
|
||||
}
|
||||
},
|
||||
'127': (state: RootState) => {
|
||||
try {
|
||||
addProvider(state, 'poe')
|
||||
return state
|
||||
} catch (error) {
|
||||
logger.error('migrate 127 error', error as Error)
|
||||
return state
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user