From 78f60deb9137d20077451f8b3a125d8d19020e1d Mon Sep 17 00:00:00 2001 From: suyao Date: Sat, 3 Jan 2026 05:27:42 +0800 Subject: [PATCH] refactor: reorganize @shared files --- packages/shared/ai-sdk-middlewares/index.ts | 15 ------ .../{provider => aiCore}/config/aihubmix.ts | 2 +- .../config/azure-anthropic.ts | 5 +- .../{provider => aiCore}/config/helper.ts | 3 +- .../{provider => aiCore}/config/index.ts | 0 .../{provider => aiCore}/config/newApi.ts | 11 +++-- .../{provider => aiCore}/config/types.ts | 2 +- .../config/vertex-anthropic.ts | 3 +- .../shared/{provider => aiCore}/constant.ts | 12 ----- .../shared/{provider => aiCore}/format.ts | 23 ++++----- packages/shared/aiCore/index.ts | 23 +++++++++ .../{provider => aiCore}/initialization.ts | 0 .../middlewares.ts | 0 .../providerConfig.ts} | 7 ++- .../{provider/mapping.ts => aiCore/utils.ts} | 49 ++++++++++++++++++- packages/shared/provider/index.ts | 49 ------------------- packages/shared/provider/resolve.ts | 43 ---------------- packages/shared/types/index.ts | 1 + .../{provider/types.ts => types/provider.ts} | 0 .../detection.ts => utils/provider.ts} | 11 ++++- .../shared/utils/{url/index.ts => url.ts} | 2 +- src/main/apiServer/routes/messages.ts | 4 +- .../apiServer/services/unified-messages.ts | 17 +++---- .../middleware/AiSdkMiddlewareBuilder.ts | 2 +- .../src/aiCore/provider/config/index.ts | 2 +- src/renderer/src/aiCore/provider/constants.ts | 3 +- src/renderer/src/aiCore/provider/factory.ts | 2 +- .../src/aiCore/provider/providerConfig.ts | 2 +- .../aiCore/provider/providerInitialization.ts | 2 +- src/renderer/src/config/models/tooluse.ts | 2 +- src/renderer/src/types/index.ts | 2 +- src/renderer/src/types/provider.ts | 17 ++++--- src/renderer/src/utils/provider.ts | 2 +- 33 files changed, 141 insertions(+), 177 deletions(-) delete mode 100644 packages/shared/ai-sdk-middlewares/index.ts rename packages/shared/{provider => aiCore}/config/aihubmix.ts (96%) rename packages/shared/{provider => aiCore}/config/azure-anthropic.ts (85%) rename packages/shared/{provider => aiCore}/config/helper.ts (92%) rename packages/shared/{provider => aiCore}/config/index.ts (100%) rename packages/shared/{provider => aiCore}/config/newApi.ts (80%) rename packages/shared/{provider => aiCore}/config/types.ts (77%) rename packages/shared/{provider => aiCore}/config/vertex-anthropic.ts (89%) rename packages/shared/{provider => aiCore}/constant.ts (53%) rename packages/shared/{provider => aiCore}/format.ts (97%) create mode 100644 packages/shared/aiCore/index.ts rename packages/shared/{provider => aiCore}/initialization.ts (100%) rename packages/shared/{ai-sdk-middlewares => aiCore}/middlewares.ts (100%) rename packages/shared/{provider/sdk-config.ts => aiCore/providerConfig.ts} (97%) rename packages/shared/{provider/mapping.ts => aiCore/utils.ts} (66%) delete mode 100644 packages/shared/provider/index.ts delete mode 100644 packages/shared/provider/resolve.ts create mode 100644 packages/shared/types/index.ts rename packages/shared/{provider/types.ts => types/provider.ts} (100%) rename packages/shared/{provider/detection.ts => utils/provider.ts} (85%) rename packages/shared/utils/{url/index.ts => url.ts} (99%) diff --git a/packages/shared/ai-sdk-middlewares/index.ts b/packages/shared/ai-sdk-middlewares/index.ts deleted file mode 100644 index a4db5ad2dd..0000000000 --- a/packages/shared/ai-sdk-middlewares/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Shared AI SDK Middlewares - * - * Environment-agnostic middlewares that can be used in both - * renderer process and main process (API server). - */ - -export { - buildSharedMiddlewares, - getReasoningTagName, - isGemini3ModelId, - openrouterReasoningMiddleware, - type SharedMiddlewareConfig, - skipGeminiThoughtSignatureMiddleware -} from './middlewares' diff --git a/packages/shared/provider/config/aihubmix.ts b/packages/shared/aiCore/config/aihubmix.ts similarity index 96% rename from packages/shared/provider/config/aihubmix.ts rename to packages/shared/aiCore/config/aihubmix.ts index 5214e8d06a..182e4fb194 100644 --- a/packages/shared/provider/config/aihubmix.ts +++ b/packages/shared/aiCore/config/aihubmix.ts @@ -1,9 +1,9 @@ /** * AiHubMix规则集 */ +import type { MinimalModel, MinimalProvider } from '@shared/types' import { getLowerBaseModelName } from '@shared/utils/naming' -import type { MinimalModel, MinimalProvider } from '../types' import { provider2Provider, startsWith } from './helper' import type { RuleSet } from './types' diff --git a/packages/shared/provider/config/azure-anthropic.ts b/packages/shared/aiCore/config/azure-anthropic.ts similarity index 85% rename from packages/shared/provider/config/azure-anthropic.ts rename to packages/shared/aiCore/config/azure-anthropic.ts index e176614df3..2b6c41c6d9 100644 --- a/packages/shared/provider/config/azure-anthropic.ts +++ b/packages/shared/aiCore/config/azure-anthropic.ts @@ -1,4 +1,5 @@ -import type { MinimalModel, MinimalProvider, ProviderType } from '../types' +import type { MinimalModel, MinimalProvider } from '@shared/types' + import { provider2Provider, startsWith } from './helper' import type { RuleSet } from './types' @@ -9,7 +10,7 @@ const AZURE_ANTHROPIC_RULES: RuleSet = { match: startsWith('claude'), provider: (provider: MinimalProvider) => ({ ...provider, - type: 'anthropic' as ProviderType, + type: 'anthropic', apiHost: provider.apiHost + 'anthropic/v1', id: 'azure-anthropic' }) diff --git a/packages/shared/provider/config/helper.ts b/packages/shared/aiCore/config/helper.ts similarity index 92% rename from packages/shared/provider/config/helper.ts rename to packages/shared/aiCore/config/helper.ts index 95f53f885a..e000dd70f5 100644 --- a/packages/shared/provider/config/helper.ts +++ b/packages/shared/aiCore/config/helper.ts @@ -1,4 +1,5 @@ -import type { MinimalModel, MinimalProvider } from '../types' +import type { MinimalModel, MinimalProvider } from '@shared/types' + import type { RuleSet } from './types' export const startsWith = diff --git a/packages/shared/provider/config/index.ts b/packages/shared/aiCore/config/index.ts similarity index 100% rename from packages/shared/provider/config/index.ts rename to packages/shared/aiCore/config/index.ts diff --git a/packages/shared/provider/config/newApi.ts b/packages/shared/aiCore/config/newApi.ts similarity index 80% rename from packages/shared/provider/config/newApi.ts rename to packages/shared/aiCore/config/newApi.ts index fd1b74085f..515568e23b 100644 --- a/packages/shared/provider/config/newApi.ts +++ b/packages/shared/aiCore/config/newApi.ts @@ -1,7 +1,8 @@ /** * NewAPI规则集 */ -import type { MinimalModel, MinimalProvider, ProviderType } from '../types' +import type { MinimalModel, MinimalProvider } from '@shared/types' + import { endpointIs, provider2Provider } from './helper' import type { RuleSet } from './types' @@ -12,7 +13,7 @@ const NEWAPI_RULES: RuleSet = { provider: (provider) => { return { ...provider, - type: 'anthropic' as ProviderType + type: 'anthropic' } } }, @@ -21,7 +22,7 @@ const NEWAPI_RULES: RuleSet = { provider: (provider) => { return { ...provider, - type: 'gemini' as ProviderType + type: 'gemini' } } }, @@ -30,7 +31,7 @@ const NEWAPI_RULES: RuleSet = { provider: (provider) => { return { ...provider, - type: 'openai-response' as ProviderType + type: 'openai-response' } } }, @@ -39,7 +40,7 @@ const NEWAPI_RULES: RuleSet = { provider: (provider) => { return { ...provider, - type: 'openai' as ProviderType + type: 'openai' } } } diff --git a/packages/shared/provider/config/types.ts b/packages/shared/aiCore/config/types.ts similarity index 77% rename from packages/shared/provider/config/types.ts rename to packages/shared/aiCore/config/types.ts index fdb1309869..0f431e7468 100644 --- a/packages/shared/provider/config/types.ts +++ b/packages/shared/aiCore/config/types.ts @@ -1,4 +1,4 @@ -import type { MinimalModel, MinimalProvider } from '../types' +import type { MinimalModel, MinimalProvider } from '@shared/types' export interface RuleSet { rules: Array<{ diff --git a/packages/shared/provider/config/vertex-anthropic.ts b/packages/shared/aiCore/config/vertex-anthropic.ts similarity index 89% rename from packages/shared/provider/config/vertex-anthropic.ts rename to packages/shared/aiCore/config/vertex-anthropic.ts index 242ba2a9f5..ca45902d48 100644 --- a/packages/shared/provider/config/vertex-anthropic.ts +++ b/packages/shared/aiCore/config/vertex-anthropic.ts @@ -1,4 +1,5 @@ -import type { MinimalModel, MinimalProvider } from '../types' +import type { MinimalModel, MinimalProvider } from '@shared/types' + import { provider2Provider, startsWith } from './helper' import type { RuleSet } from './types' diff --git a/packages/shared/provider/constant.ts b/packages/shared/aiCore/constant.ts similarity index 53% rename from packages/shared/provider/constant.ts rename to packages/shared/aiCore/constant.ts index c449c9f635..df553f5c50 100644 --- a/packages/shared/provider/constant.ts +++ b/packages/shared/aiCore/constant.ts @@ -1,7 +1,3 @@ -import { getLowerBaseModelName } from '@shared/utils/naming' - -import type { MinimalModel } from './types' - export const COPILOT_EDITOR_VERSION = 'vscode/1.104.1' export const COPILOT_PLUGIN_VERSION = 'copilot-chat/0.26.7' export const COPILOT_INTEGRATION_ID = 'vscode-chat' @@ -16,11 +12,3 @@ export const COPILOT_DEFAULT_HEADERS = { 'editor-plugin-version': COPILOT_PLUGIN_VERSION, 'copilot-vision-request': 'true' } as const - -// Models that require the OpenAI Responses endpoint when routed through GitHub Copilot (#10560) -const COPILOT_RESPONSES_MODEL_IDS = ['gpt-5-codex', 'gpt-5.1-codex', 'gpt-5.1-codex-mini'] - -export function isCopilotResponsesModel(model: M): boolean { - const normalizedId = getLowerBaseModelName(model.id) - return COPILOT_RESPONSES_MODEL_IDS.some((target) => normalizedId === target) -} diff --git a/packages/shared/provider/format.ts b/packages/shared/aiCore/format.ts similarity index 97% rename from packages/shared/provider/format.ts rename to packages/shared/aiCore/format.ts index 3a1fc637a7..0a44be5c06 100644 --- a/packages/shared/provider/format.ts +++ b/packages/shared/aiCore/format.ts @@ -6,6 +6,18 @@ * and how AI SDK expects them. */ +import type { MinimalProvider } from '@shared/types' +import { SystemProviderIds } from '@shared/types' +import { + isAnthropicProvider, + isAzureOpenAIProvider, + isCherryAIProvider, + isGeminiProvider, + isOllamaProvider, + isPerplexityProvider, + isVertexProvider +} from '@shared/utils/provider' + import { formatApiHost, formatAzureOpenAIApiHost, @@ -15,17 +27,6 @@ import { routeToEndpoint, withoutTrailingSlash } from '../utils/url' -import { - isAnthropicProvider, - isAzureOpenAIProvider, - isCherryAIProvider, - isGeminiProvider, - isOllamaProvider, - isPerplexityProvider, - isVertexProvider -} from './detection' -import type { MinimalProvider } from './types' -import { SystemProviderIds } from './types' /** * Interface for environment-specific implementations diff --git a/packages/shared/aiCore/index.ts b/packages/shared/aiCore/index.ts new file mode 100644 index 0000000000..5c2cda1312 --- /dev/null +++ b/packages/shared/aiCore/index.ts @@ -0,0 +1,23 @@ +/** + * Shared Provider Utilities + * + * This module exports utilities for working with AI providers + * that can be shared between main process and renderer process. + */ + +// API host formatting +export type { ApiKeyRotator, ProviderFormatContext } from './format' +export { + defaultFormatAzureOpenAIApiHost, + formatProviderApiHost, + getBaseUrlForAiSdk, + simpleKeyRotator +} from './format' + +// AI SDK configuration +export type { AiSdkConfig, AiSdkConfigContext } from './providerConfig' +export { providerToAiSdkConfig } from './providerConfig' + +// Provider initialization +export { initializeSharedProviders, SHARED_PROVIDER_CONFIGS } from './initialization' +export * from './utils' diff --git a/packages/shared/provider/initialization.ts b/packages/shared/aiCore/initialization.ts similarity index 100% rename from packages/shared/provider/initialization.ts rename to packages/shared/aiCore/initialization.ts diff --git a/packages/shared/ai-sdk-middlewares/middlewares.ts b/packages/shared/aiCore/middlewares.ts similarity index 100% rename from packages/shared/ai-sdk-middlewares/middlewares.ts rename to packages/shared/aiCore/middlewares.ts diff --git a/packages/shared/provider/sdk-config.ts b/packages/shared/aiCore/providerConfig.ts similarity index 97% rename from packages/shared/provider/sdk-config.ts rename to packages/shared/aiCore/providerConfig.ts index df4b52ca41..08668e352b 100644 --- a/packages/shared/provider/sdk-config.ts +++ b/packages/shared/aiCore/providerConfig.ts @@ -6,14 +6,13 @@ */ import { formatPrivateKey, hasProviderConfig, ProviderConfigFactory } from '@cherrystudio/ai-core/provider' +import { MinimalProvider, SystemProviderIds } from '@shared/types' import { defaultAppHeaders } from '@shared/utils' +import { isAzureOpenAIProvider, isOllamaProvider } from '@shared/utils/provider' import { isEmpty } from 'lodash' import { routeToEndpoint } from '../utils/url' -import { isAzureOpenAIProvider, isOllamaProvider } from './detection' -import { getAiSdkProviderId } from './mapping' -import type { MinimalProvider } from './types' -import { SystemProviderIds } from './types' +import { getAiSdkProviderId } from './utils' /** * AI SDK configuration result diff --git a/packages/shared/provider/mapping.ts b/packages/shared/aiCore/utils.ts similarity index 66% rename from packages/shared/provider/mapping.ts rename to packages/shared/aiCore/utils.ts index e45f420010..0e897e818f 100644 --- a/packages/shared/provider/mapping.ts +++ b/packages/shared/aiCore/utils.ts @@ -6,9 +6,15 @@ */ import { hasProviderConfigByAlias, type ProviderId, resolveProviderConfigId } from '@cherrystudio/ai-core/provider' +import { MinimalModel, MinimalProvider } from '@shared/types' +import { isAzureOpenAIProvider, isAzureResponsesEndpoint, isNewApiProvider } from '@shared/utils/provider' -import { isAzureOpenAIProvider, isAzureResponsesEndpoint } from './detection' -import type { MinimalProvider } from './types' +import { + aihubmixProviderCreator, + azureAnthropicProviderCreator, + newApiResolverCreator, + vertexAnthropicProviderCreator +} from './config' /** * Static mapping from Cherry Studio provider ID/type to AI SDK provider ID @@ -94,3 +100,42 @@ export function getAiSdkProviderId(provider: MinimalProvider): ProviderId { // 5. 最后的fallback(使用provider本身的id) return provider.id } + +export interface ResolveActualProviderOptions

{ + isSystemProvider?: (provider: P) => boolean +} + +const defaultIsSystemProvider =

(provider: P): boolean => { + if ('isSystem' in provider) { + return Boolean((provider as unknown as { isSystem?: boolean }).isSystem) + } + return false +} + +export function resolveActualProvider( + provider: P, + model: M, + options: ResolveActualProviderOptions

= {} +): P { + let resolvedProvider = provider + + if (isNewApiProvider(resolvedProvider)) { + resolvedProvider = newApiResolverCreator(model, resolvedProvider) + } + + const isSystemProvider = options.isSystemProvider?.(resolvedProvider) ?? defaultIsSystemProvider(resolvedProvider) + + if (isSystemProvider && resolvedProvider.id === 'aihubmix') { + resolvedProvider = aihubmixProviderCreator(model, resolvedProvider) + } + + if (isSystemProvider && resolvedProvider.id === 'vertexai') { + resolvedProvider = vertexAnthropicProviderCreator(model, resolvedProvider) + } + + if (isAzureOpenAIProvider(resolvedProvider)) { + resolvedProvider = azureAnthropicProviderCreator(model, resolvedProvider) + } + + return resolvedProvider +} diff --git a/packages/shared/provider/index.ts b/packages/shared/provider/index.ts deleted file mode 100644 index 53f132acf1..0000000000 --- a/packages/shared/provider/index.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Shared Provider Utilities - * - * This module exports utilities for working with AI providers - * that can be shared between main process and renderer process. - */ - -// Type definitions -export type { MinimalProvider, ProviderType, SystemProviderId } from './types' -export { SystemProviderIds } from './types' - -// Provider type detection -export { - isAIGatewayProvider, - isAnthropicProvider, - isAwsBedrockProvider, - isAzureOpenAIProvider, - isAzureResponsesEndpoint, - isCherryAIProvider, - isGeminiProvider, - isNewApiProvider, - isOllamaProvider, - isOpenAICompatibleProvider, - isOpenAIProvider, - isPerplexityProvider, - isVertexProvider -} from './detection' - -// API host formatting -export type { ApiKeyRotator, ProviderFormatContext } from './format' -export { - defaultFormatAzureOpenAIApiHost, - formatProviderApiHost, - getBaseUrlForAiSdk, - simpleKeyRotator -} from './format' - -// Provider ID mapping -export { getAiSdkProviderId, STATIC_PROVIDER_MAPPING, tryResolveProviderId } from './mapping' - -// AI SDK configuration -export type { AiSdkConfig, AiSdkConfigContext } from './sdk-config' -export { providerToAiSdkConfig } from './sdk-config' - -// Provider resolution -export { resolveActualProvider } from './resolve' - -// Provider initialization -export { initializeSharedProviders, SHARED_PROVIDER_CONFIGS } from './initialization' diff --git a/packages/shared/provider/resolve.ts b/packages/shared/provider/resolve.ts deleted file mode 100644 index 385da6a586..0000000000 --- a/packages/shared/provider/resolve.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { aihubmixProviderCreator, newApiResolverCreator, vertexAnthropicProviderCreator } from './config' -import { azureAnthropicProviderCreator } from './config/azure-anthropic' -import { isAzureOpenAIProvider, isNewApiProvider } from './detection' -import type { MinimalModel, MinimalProvider } from './types' - -export interface ResolveActualProviderOptions

{ - isSystemProvider?: (provider: P) => boolean -} - -const defaultIsSystemProvider =

(provider: P): boolean => { - if ('isSystem' in provider) { - return Boolean((provider as unknown as { isSystem?: boolean }).isSystem) - } - return false -} - -export function resolveActualProvider( - provider: P, - model: M, - options: ResolveActualProviderOptions

= {} -): P { - let resolvedProvider = provider - - if (isNewApiProvider(resolvedProvider)) { - resolvedProvider = newApiResolverCreator(model, resolvedProvider) - } - - const isSystemProvider = options.isSystemProvider?.(resolvedProvider) ?? defaultIsSystemProvider(resolvedProvider) - - if (isSystemProvider && resolvedProvider.id === 'aihubmix') { - resolvedProvider = aihubmixProviderCreator(model, resolvedProvider) - } - - if (isSystemProvider && resolvedProvider.id === 'vertexai') { - resolvedProvider = vertexAnthropicProviderCreator(model, resolvedProvider) - } - - if (isAzureOpenAIProvider(resolvedProvider)) { - resolvedProvider = azureAnthropicProviderCreator(model, resolvedProvider) - } - - return resolvedProvider -} diff --git a/packages/shared/types/index.ts b/packages/shared/types/index.ts new file mode 100644 index 0000000000..6f29423e24 --- /dev/null +++ b/packages/shared/types/index.ts @@ -0,0 +1 @@ +export * from './provider' diff --git a/packages/shared/provider/types.ts b/packages/shared/types/provider.ts similarity index 100% rename from packages/shared/provider/types.ts rename to packages/shared/types/provider.ts diff --git a/packages/shared/provider/detection.ts b/packages/shared/utils/provider.ts similarity index 85% rename from packages/shared/provider/detection.ts rename to packages/shared/utils/provider.ts index 8e76218fc8..53bfed260e 100644 --- a/packages/shared/provider/detection.ts +++ b/packages/shared/utils/provider.ts @@ -7,7 +7,8 @@ * NOTE: These functions should match the logic in @renderer/utils/provider.ts */ -import type { MinimalProvider } from './types' +import type { MinimalModel, MinimalProvider } from '../types' +import { getLowerBaseModelName } from './naming' /** * Check if provider is Anthropic type @@ -99,3 +100,11 @@ export function isNewApiProvider

(provider: P): boolea export function isOpenAICompatibleProvider

(provider: P): boolean { return ['openai', 'new-api', 'mistral'].includes(provider.type) } + +// Models that require the OpenAI Responses endpoint when routed through GitHub Copilot (#10560) +const COPILOT_RESPONSES_MODEL_IDS = ['gpt-5-codex', 'gpt-5.1-codex', 'gpt-5.1-codex-mini'] + +export function isCopilotResponsesModel(model: M): boolean { + const normalizedId = getLowerBaseModelName(model.id) + return COPILOT_RESPONSES_MODEL_IDS.some((target) => normalizedId === target) +} diff --git a/packages/shared/utils/url/index.ts b/packages/shared/utils/url.ts similarity index 99% rename from packages/shared/utils/url/index.ts rename to packages/shared/utils/url.ts index 82a0f551f5..693fbc5679 100644 --- a/packages/shared/utils/url/index.ts +++ b/packages/shared/utils/url.ts @@ -5,7 +5,7 @@ * Used by both main process (API Server) and renderer. */ -import type { MinimalProvider } from '@shared/provider' +import type { MinimalProvider } from '@shared/types' import { trim } from 'lodash' // Supported endpoints for routing diff --git a/src/main/apiServer/routes/messages.ts b/src/main/apiServer/routes/messages.ts index dbd6b676cc..efd8ae1ae1 100644 --- a/src/main/apiServer/routes/messages.ts +++ b/src/main/apiServer/routes/messages.ts @@ -1,7 +1,7 @@ import type { MessageCreateParams } from '@anthropic-ai/sdk/resources' import { loggerService } from '@logger' -import { buildSharedMiddlewares, type SharedMiddlewareConfig } from '@shared/ai-sdk-middlewares' -import { getAiSdkProviderId } from '@shared/provider' +import { buildSharedMiddlewares, type SharedMiddlewareConfig } from '@shared/aiCore/middlewares' +import { getAiSdkProviderId } from '@shared/aiCore/utils' import type { Provider } from '@types' import type { Request, Response } from 'express' import express from 'express' diff --git a/src/main/apiServer/services/unified-messages.ts b/src/main/apiServer/services/unified-messages.ts index b9c306b2f9..4307a76f91 100644 --- a/src/main/apiServer/services/unified-messages.ts +++ b/src/main/apiServer/services/unified-messages.ts @@ -18,24 +18,21 @@ import anthropicService from '@main/services/AnthropicService' import copilotService from '@main/services/CopilotService' import { reduxService } from '@main/services/ReduxService' import type { OpenRouterProviderOptions } from '@openrouter/ai-sdk-provider' -import { isGemini3ModelId } from '@shared/ai-sdk-middlewares' import { type AiSdkConfig, type AiSdkConfigContext, formatProviderApiHost, initializeSharedProviders, - isAnthropicProvider, - isGeminiProvider, - isOpenAIProvider, - type MinimalProvider, type ProviderFormatContext, providerToAiSdkConfig as sharedProviderToAiSdkConfig, - resolveActualProvider, - SystemProviderIds -} from '@shared/provider' -import { COPILOT_DEFAULT_HEADERS } from '@shared/provider/constant' + resolveActualProvider +} from '@shared/aiCore' +import { COPILOT_DEFAULT_HEADERS } from '@shared/aiCore/constant' +import { isGemini3ModelId } from '@shared/aiCore/middlewares' +import type { MinimalProvider } from '@shared/types' import { defaultAppHeaders } from '@shared/utils' -import type { Provider } from '@types' +import { isAnthropicProvider, isGeminiProvider, isOpenAIProvider } from '@shared/utils/provider' +import { Provider, SystemProviderIds } from '@types' import type { ImagePart, JSONValue, ModelMessage, Provider as AiSdkProvider, TextPart, Tool as AiSdkTool } from 'ai' import { simulateStreamingMiddleware, stepCountIs, tool, wrapLanguageModel, zodSchema } from 'ai' import { net } from 'electron' diff --git a/src/renderer/src/aiCore/middleware/AiSdkMiddlewareBuilder.ts b/src/renderer/src/aiCore/middleware/AiSdkMiddlewareBuilder.ts index b1e2c07732..1b4be0cd88 100644 --- a/src/renderer/src/aiCore/middleware/AiSdkMiddlewareBuilder.ts +++ b/src/renderer/src/aiCore/middleware/AiSdkMiddlewareBuilder.ts @@ -5,7 +5,7 @@ import type { MCPTool } from '@renderer/types' import { type Assistant, type Message, type Model, type Provider, SystemProviderIds } from '@renderer/types' import type { Chunk } from '@renderer/types/chunk' import { isOllamaProvider, isSupportEnableThinkingProvider } from '@renderer/utils/provider' -import { openrouterReasoningMiddleware, skipGeminiThoughtSignatureMiddleware } from '@shared/ai-sdk-middlewares' +import { openrouterReasoningMiddleware, skipGeminiThoughtSignatureMiddleware } from '@shared/aiCore/middlewares' import type { LanguageModelMiddleware } from 'ai' import { extractReasoningMiddleware, simulateStreamingMiddleware } from 'ai' diff --git a/src/renderer/src/aiCore/provider/config/index.ts b/src/renderer/src/aiCore/provider/config/index.ts index b1d57d5a1a..1e882e11a9 100644 --- a/src/renderer/src/aiCore/provider/config/index.ts +++ b/src/renderer/src/aiCore/provider/config/index.ts @@ -4,4 +4,4 @@ export { azureAnthropicProviderCreator, newApiResolverCreator, vertexAnthropicProviderCreator -} from '@shared/provider/config' +} from '@shared/aiCore/config' diff --git a/src/renderer/src/aiCore/provider/constants.ts b/src/renderer/src/aiCore/provider/constants.ts index 57dad9fbc0..afaf3fe7d3 100644 --- a/src/renderer/src/aiCore/provider/constants.ts +++ b/src/renderer/src/aiCore/provider/constants.ts @@ -1 +1,2 @@ -export { COPILOT_DEFAULT_HEADERS, COPILOT_EDITOR_VERSION, isCopilotResponsesModel } from '@shared/provider/constant' +export { COPILOT_DEFAULT_HEADERS, COPILOT_EDITOR_VERSION } from '@shared/aiCore/constant' +export { isCopilotResponsesModel } from '@shared/utils/provider' diff --git a/src/renderer/src/aiCore/provider/factory.ts b/src/renderer/src/aiCore/provider/factory.ts index 97ab29db81..96c1400127 100644 --- a/src/renderer/src/aiCore/provider/factory.ts +++ b/src/renderer/src/aiCore/provider/factory.ts @@ -1,7 +1,7 @@ import { createProvider as createProviderCore } from '@cherrystudio/ai-core/provider' import { loggerService } from '@logger' import type { Provider } from '@renderer/types' -import { getAiSdkProviderId as sharedGetAiSdkProviderId } from '@shared/provider' +import { getAiSdkProviderId as sharedGetAiSdkProviderId } from '@shared/aiCore' import type { Provider as AiSdkProvider } from 'ai' import type { AiSdkConfig } from '../types' diff --git a/src/renderer/src/aiCore/provider/providerConfig.ts b/src/renderer/src/aiCore/provider/providerConfig.ts index e4724997e9..47cd1a6fbf 100644 --- a/src/renderer/src/aiCore/provider/providerConfig.ts +++ b/src/renderer/src/aiCore/provider/providerConfig.ts @@ -18,7 +18,7 @@ import { type ProviderFormatContext, providerToAiSdkConfig as sharedProviderToAiSdkConfig, resolveActualProvider -} from '@shared/provider' +} from '@shared/aiCore' import { cloneDeep } from 'lodash' import type { AiSdkConfig } from '../types' diff --git a/src/renderer/src/aiCore/provider/providerInitialization.ts b/src/renderer/src/aiCore/provider/providerInitialization.ts index 5254e78851..3dc7ebf08c 100644 --- a/src/renderer/src/aiCore/provider/providerInitialization.ts +++ b/src/renderer/src/aiCore/provider/providerInitialization.ts @@ -1,5 +1,5 @@ import { loggerService } from '@logger' -import { initializeSharedProviders, SHARED_PROVIDER_CONFIGS } from '@shared/provider' +import { initializeSharedProviders, SHARED_PROVIDER_CONFIGS } from '@shared/aiCore' const logger = loggerService.withContext('ProviderConfigs') diff --git a/src/renderer/src/config/models/tooluse.ts b/src/renderer/src/config/models/tooluse.ts index e236853778..2235f79612 100644 --- a/src/renderer/src/config/models/tooluse.ts +++ b/src/renderer/src/config/models/tooluse.ts @@ -2,7 +2,7 @@ import { getProviderByModel } from '@renderer/services/AssistantService' import type { Model } from '@renderer/types' import { isSystemProviderId } from '@renderer/types' import { getLowerBaseModelName, isUserSelectedModelType } from '@renderer/utils' -import { isAzureOpenAIProvider } from '@shared/provider' +import { isAzureOpenAIProvider } from '@shared/utils/provider' import { isEmbeddingModel, isRerankModel } from './embedding' import { isDeepSeekHybridInferenceModel } from './reasoning' diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index b576e2a161..70b8999901 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -7,7 +7,7 @@ import type { CSSProperties } from 'react' export * from './file' export * from './note' -import type { MinimalModel } from '@shared/provider/types' +import type { MinimalModel } from '@shared/types' import * as z from 'zod' import type { StreamTextParams } from './aiCoreTypes' diff --git a/src/renderer/src/types/provider.ts b/src/renderer/src/types/provider.ts index 573e1e1007..bc71c6bb6e 100644 --- a/src/renderer/src/types/provider.ts +++ b/src/renderer/src/types/provider.ts @@ -1,15 +1,16 @@ import type OpenAI from '@cherrystudio/openai' -import type { MinimalProvider } from '@shared/provider' -import type { ProviderType, SystemProviderId, SystemProviderIdTypeMap } from '@shared/provider/types' -import { isSystemProviderId, SystemProviderIds } from '@shared/provider/types' +import { + isSystemProviderId, + MinimalProvider, + ProviderType, + SystemProviderId, + SystemProviderIds, + SystemProviderIdTypeMap +} from '@shared/types' import type { Model } from '@types' import type { OpenAIVerbosity } from './aiCoreTypes' -export type { ProviderType } from '@shared/provider' -export type { SystemProviderId, SystemProviderIdTypeMap } from '@shared/provider/types' -export { isSystemProviderId, ProviderTypeSchema, SystemProviderIds } from '@shared/provider/types' - // undefined is treated as supported, enabled by default export type ProviderApiOptions = { /** Whether message content of array type is not supported */ @@ -159,3 +160,5 @@ export type NotGroqProvider = Provider & { export const isGroqSystemProvider = (provider: Provider): provider is GroqSystemProvider => { return provider.id === SystemProviderIds.groq } + +export * from '@shared/types/provider' diff --git a/src/renderer/src/utils/provider.ts b/src/renderer/src/utils/provider.ts index b66d9098eb..d9755a7ca4 100644 --- a/src/renderer/src/utils/provider.ts +++ b/src/renderer/src/utils/provider.ts @@ -15,7 +15,7 @@ export { isOpenAIProvider, isPerplexityProvider, isVertexProvider -} from '@shared/provider' +} from '@shared/utils/provider' export const getClaudeSupportedProviders = (providers: Provider[]) => { return providers.filter(