mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-06 21:35:52 +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 { GenericChunk } from '../../middleware/schemas'
|
||||||
import { RequestTransformer, ResponseChunkTransformer, ResponseChunkTransformerContext } from '../types'
|
import { RequestTransformer, ResponseChunkTransformer, ResponseChunkTransformerContext } from '../types'
|
||||||
import { OpenAIBaseClient } from './OpenAIBaseClient'
|
import { OpenAIBaseClient } from './OpenAIBaseClient'
|
||||||
|
import { isSupportDeveloperRoleProvider } from '@renderer/config/providers'
|
||||||
|
|
||||||
const logger = loggerService.withContext('OpenAIApiClient')
|
const logger = loggerService.withContext('OpenAIApiClient')
|
||||||
|
|
||||||
@ -491,7 +492,7 @@ export class OpenAIAPIClient extends OpenAIBaseClient<
|
|||||||
|
|
||||||
if (isSupportedReasoningEffortOpenAIModel(model)) {
|
if (isSupportedReasoningEffortOpenAIModel(model)) {
|
||||||
systemMessage = {
|
systemMessage = {
|
||||||
role: 'developer',
|
role: isSupportDeveloperRoleProvider(this.provider) ? 'developer' : 'system',
|
||||||
content: `Formatting re-enabled${systemMessage ? '\n' + systemMessage.content : ''}`
|
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 { RequestTransformer, ResponseChunkTransformer } from '../types'
|
||||||
import { OpenAIAPIClient } from './OpenAIApiClient'
|
import { OpenAIAPIClient } from './OpenAIApiClient'
|
||||||
import { OpenAIBaseClient } from './OpenAIBaseClient'
|
import { OpenAIBaseClient } from './OpenAIBaseClient'
|
||||||
|
import { isSupportDeveloperRoleProvider } from '@renderer/config/providers'
|
||||||
|
|
||||||
export class OpenAIResponseAPIClient extends OpenAIBaseClient<
|
export class OpenAIResponseAPIClient extends OpenAIBaseClient<
|
||||||
OpenAI,
|
OpenAI,
|
||||||
@ -369,7 +370,11 @@ export class OpenAIResponseAPIClient extends OpenAIBaseClient<
|
|||||||
type: 'input_text'
|
type: 'input_text'
|
||||||
}
|
}
|
||||||
if (isSupportedReasoningEffortOpenAIModel(model)) {
|
if (isSupportedReasoningEffortOpenAIModel(model)) {
|
||||||
systemMessage.role = 'developer'
|
if (isSupportDeveloperRoleProvider(this.provider)) {
|
||||||
|
systemMessage.role = 'developer'
|
||||||
|
} else {
|
||||||
|
systemMessage.role = 'system'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. 设置工具
|
// 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': [],
|
'new-api': [],
|
||||||
'aws-bedrock': []
|
'aws-bedrock': [],
|
||||||
|
poe: [
|
||||||
|
{
|
||||||
|
id: 'gpt-4o',
|
||||||
|
name: 'GPT-4o',
|
||||||
|
provider: 'poe',
|
||||||
|
group: 'poe'
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
export const TEXT_TO_IMAGES_MODELS = [
|
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 DmxapiProviderLogo from '@renderer/assets/images/providers/DMXAPI.png'
|
||||||
import FireworksProviderLogo from '@renderer/assets/images/providers/fireworks.png'
|
import FireworksProviderLogo from '@renderer/assets/images/providers/fireworks.png'
|
||||||
import GiteeAIProviderLogo from '@renderer/assets/images/providers/gitee-ai.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 GithubProviderLogo from '@renderer/assets/images/providers/github.png'
|
||||||
import GoogleProviderLogo from '@renderer/assets/images/providers/google.png'
|
import GoogleProviderLogo from '@renderer/assets/images/providers/google.png'
|
||||||
import GPUStackProviderLogo from '@renderer/assets/images/providers/gpustack.svg'
|
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 ZhipuProviderLogo from '@renderer/assets/images/providers/zhipu.png'
|
||||||
|
|
||||||
import { TOKENFLUX_HOST } from './constant'
|
import { TOKENFLUX_HOST } from './constant'
|
||||||
|
import { Provider } from '@renderer/types'
|
||||||
|
|
||||||
const PROVIDER_LOGO_MAP = {
|
const PROVIDER_LOGO_MAP = {
|
||||||
ph8: Ph8ProviderLogo,
|
ph8: Ph8ProviderLogo,
|
||||||
@ -108,7 +110,8 @@ const PROVIDER_LOGO_MAP = {
|
|||||||
lanyun: LanyunProviderLogo,
|
lanyun: LanyunProviderLogo,
|
||||||
vertexai: VertexAIProviderLogo,
|
vertexai: VertexAIProviderLogo,
|
||||||
'new-api': NewAPIProviderLogo,
|
'new-api': NewAPIProviderLogo,
|
||||||
'aws-bedrock': AwsProviderLogo
|
'aws-bedrock': AwsProviderLogo,
|
||||||
|
poe: PoeProviderLogo
|
||||||
} as const
|
} as const
|
||||||
|
|
||||||
export function getProviderLogo(providerId: string) {
|
export function getProviderLogo(providerId: string) {
|
||||||
@ -702,5 +705,20 @@ export const PROVIDER_CONFIG = {
|
|||||||
docs: 'https://docs.aws.amazon.com/bedrock/',
|
docs: 'https://docs.aws.amazon.com/bedrock/',
|
||||||
models: 'https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html'
|
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',
|
key: 'cherry-studio',
|
||||||
storage,
|
storage,
|
||||||
version: 126,
|
version: 127,
|
||||||
blacklist: ['runtime', 'messages', 'messageBlocks', 'tabs'],
|
blacklist: ['runtime', 'messages', 'messageBlocks', 'tabs'],
|
||||||
migrate
|
migrate
|
||||||
},
|
},
|
||||||
|
|||||||
@ -552,6 +552,16 @@ export const INITIAL_PROVIDERS: Provider[] = [
|
|||||||
models: SYSTEM_MODELS['aws-bedrock'],
|
models: SYSTEM_MODELS['aws-bedrock'],
|
||||||
isSystem: true,
|
isSystem: true,
|
||||||
enabled: false
|
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)
|
logger.error('migrate 126 error', error as Error)
|
||||||
return state
|
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