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:
Phantom 2025-08-02 14:45:09 +08:00 committed by GitHub
parent 12119c4faf
commit c52bb47fef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 57 additions and 5 deletions

View File

@ -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 : ''}`
}
}

View File

@ -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. 设置工具

View 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

View File

@ -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 = [

View File

@ -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'
}

View File

@ -60,7 +60,7 @@ const persistedReducer = persistReducer(
{
key: 'cherry-studio',
storage,
version: 126,
version: 127,
blacklist: ['runtime', 'messages', 'messageBlocks', 'tabs'],
migrate
},

View File

@ -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
}
]

View File

@ -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
}
}
}