diff --git a/src/renderer/src/aiCore/clients/openai/OpenAIApiClient.ts b/src/renderer/src/aiCore/clients/openai/OpenAIApiClient.ts
index b5d1954bc9..d4ad386a4a 100644
--- a/src/renderer/src/aiCore/clients/openai/OpenAIApiClient.ts
+++ b/src/renderer/src/aiCore/clients/openai/OpenAIApiClient.ts
@@ -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 : ''}`
}
}
diff --git a/src/renderer/src/aiCore/clients/openai/OpenAIResponseAPIClient.ts b/src/renderer/src/aiCore/clients/openai/OpenAIResponseAPIClient.ts
index 2cc34ddb97..cc9dba7095 100644
--- a/src/renderer/src/aiCore/clients/openai/OpenAIResponseAPIClient.ts
+++ b/src/renderer/src/aiCore/clients/openai/OpenAIResponseAPIClient.ts
@@ -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. 设置工具
diff --git a/src/renderer/src/assets/images/providers/poe.svg b/src/renderer/src/assets/images/providers/poe.svg
new file mode 100644
index 0000000000..1083effc31
--- /dev/null
+++ b/src/renderer/src/assets/images/providers/poe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/config/models.ts b/src/renderer/src/config/models.ts
index a93b6b1b18..45100719dc 100644
--- a/src/renderer/src/config/models.ts
+++ b/src/renderer/src/config/models.ts
@@ -2346,7 +2346,15 @@ export const SYSTEM_MODELS: Record = {
}
],
'new-api': [],
- 'aws-bedrock': []
+ 'aws-bedrock': [],
+ poe: [
+ {
+ id: 'gpt-4o',
+ name: 'GPT-4o',
+ provider: 'poe',
+ group: 'poe'
+ }
+ ]
}
export const TEXT_TO_IMAGES_MODELS = [
diff --git a/src/renderer/src/config/providers.ts b/src/renderer/src/config/providers.ts
index 693f7a3988..85e53bef56 100644
--- a/src/renderer/src/config/providers.ts
+++ b/src/renderer/src/config/providers.ts
@@ -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'
+}
diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts
index f0912b24a3..88df884f74 100644
--- a/src/renderer/src/store/index.ts
+++ b/src/renderer/src/store/index.ts
@@ -60,7 +60,7 @@ const persistedReducer = persistReducer(
{
key: 'cherry-studio',
storage,
- version: 126,
+ version: 127,
blacklist: ['runtime', 'messages', 'messageBlocks', 'tabs'],
migrate
},
diff --git a/src/renderer/src/store/llm.ts b/src/renderer/src/store/llm.ts
index b54c8c67d7..2534b6cdae 100644
--- a/src/renderer/src/store/llm.ts
+++ b/src/renderer/src/store/llm.ts
@@ -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
}
]
diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts
index 1a3313cbed..44ba1bcd01 100644
--- a/src/renderer/src/store/migrate.ts
+++ b/src/renderer/src/store/migrate.ts
@@ -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
+ }
}
}