From d33df659f89105d90f52112554c0623463d7c9f3 Mon Sep 17 00:00:00 2001 From: DarkSky <25152247+darkskygit@users.noreply.github.com> Date: Thu, 6 Nov 2025 20:55:32 +0800 Subject: [PATCH] feat: check server type in chat (#13875) --- .../core/src/blocksuite/ai/chat-panel/ai-title.ts | 5 +++++ .../core/src/blocksuite/ai/chat-panel/index.ts | 10 +++++++++- .../ai-chat-composer/ai-chat-composer.ts | 9 ++++++++- .../components/ai-chat-content/ai-chat-content.ts | 9 ++++++++- .../ai/components/ai-chat-input/ai-chat-input.ts | 9 ++++++++- .../components/ai-chat-input/preference-popup.ts | 14 ++++++++++++-- .../blocksuite/ai/components/playground/chat.ts | 5 +++++ .../blocksuite/ai/components/playground/content.ts | 5 +++++ .../ai/peek-view/chat-block-peek-view.ts | 11 ++++++++++- .../pages/workspace/detail-page/tabs/chat.tsx | 3 ++- .../view/ai-chat-block-peek-view/index.tsx | 5 ++++- 11 files changed, 76 insertions(+), 9 deletions(-) diff --git a/packages/frontend/core/src/blocksuite/ai/chat-panel/ai-title.ts b/packages/frontend/core/src/blocksuite/ai/chat-panel/ai-title.ts index cc9e23822..94555259f 100644 --- a/packages/frontend/core/src/blocksuite/ai/chat-panel/ai-title.ts +++ b/packages/frontend/core/src/blocksuite/ai/chat-panel/ai-title.ts @@ -1,4 +1,5 @@ import type { AIToolsConfigService } from '@affine/core/modules/ai-button'; +import type { ServerService } from '@affine/core/modules/cloud'; import type { WorkspaceDialogService } from '@affine/core/modules/dialogs'; import type { FeatureFlagService } from '@affine/core/modules/feature-flag'; import type { AppThemeService } from '@affine/core/modules/theme'; @@ -94,6 +95,9 @@ export class AIChatPanelTitle extends SignalWatcher( @property({ attribute: false }) accessor extensions!: ExtensionType[]; + @property({ attribute: false }) + accessor serverService!: ServerService; + @property({ attribute: false }) accessor affineFeatureFlagService!: FeatureFlagService; @@ -145,6 +149,7 @@ export class AIChatPanelTitle extends SignalWatcher( .searchMenuConfig=${this.searchMenuConfig} .docDisplayConfig=${this.docDisplayConfig} .extensions=${this.extensions} + .serverService=${this.serverService} .affineFeatureFlagService=${this.affineFeatureFlagService} .affineThemeService=${this.affineThemeService} .notificationService=${this.notificationService} diff --git a/packages/frontend/core/src/blocksuite/ai/chat-panel/index.ts b/packages/frontend/core/src/blocksuite/ai/chat-panel/index.ts index faba297b3..57d72da02 100644 --- a/packages/frontend/core/src/blocksuite/ai/chat-panel/index.ts +++ b/packages/frontend/core/src/blocksuite/ai/chat-panel/index.ts @@ -3,7 +3,10 @@ import type { AIToolsConfigService, } from '@affine/core/modules/ai-button'; import type { AIModelService } from '@affine/core/modules/ai-button/services/models'; -import type { SubscriptionService } from '@affine/core/modules/cloud'; +import type { + ServerService, + SubscriptionService, +} from '@affine/core/modules/cloud'; import type { WorkspaceDialogService } from '@affine/core/modules/dialogs'; import type { FeatureFlagService } from '@affine/core/modules/feature-flag'; import type { PeekViewService } from '@affine/core/modules/peek-view'; @@ -107,6 +110,9 @@ export class ChatPanel extends SignalWatcher( @property({ attribute: false }) accessor extensions!: ExtensionType[]; + @property({ attribute: false }) + accessor serverService!: ServerService; + @property({ attribute: false }) accessor affineFeatureFlagService!: FeatureFlagService; @@ -429,6 +435,7 @@ export class ChatPanel extends SignalWatcher( .searchMenuConfig=${this.searchMenuConfig} .docDisplayConfig=${this.docDisplayConfig} .extensions=${this.extensions} + .serverService=${this.serverService} .affineFeatureFlagService=${this.affineFeatureFlagService} .affineWorkspaceDialogService=${this.affineWorkspaceDialogService} .affineThemeService=${this.affineThemeService} @@ -456,6 +463,7 @@ export class ChatPanel extends SignalWatcher( .searchMenuConfig=${this.searchMenuConfig} .docDisplayConfig=${this.docDisplayConfig} .extensions=${this.extensions} + .serverService=${this.serverService} .affineFeatureFlagService=${this.affineFeatureFlagService} .affineWorkspaceDialogService=${this.affineWorkspaceDialogService} .affineThemeService=${this.affineThemeService} diff --git a/packages/frontend/core/src/blocksuite/ai/components/ai-chat-composer/ai-chat-composer.ts b/packages/frontend/core/src/blocksuite/ai/components/ai-chat-composer/ai-chat-composer.ts index e8ba8c8db..634b3c3e8 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/ai-chat-composer/ai-chat-composer.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/ai-chat-composer/ai-chat-composer.ts @@ -5,7 +5,10 @@ import type { AIToolsConfigService, } from '@affine/core/modules/ai-button'; import type { AIModelService } from '@affine/core/modules/ai-button/services/models'; -import type { SubscriptionService } from '@affine/core/modules/cloud'; +import type { + ServerService, + SubscriptionService, +} from '@affine/core/modules/cloud'; import type { WorkspaceDialogService } from '@affine/core/modules/dialogs'; import type { ContextEmbedStatus, @@ -128,6 +131,9 @@ export class AIChatComposer extends SignalWatcher( @property({ attribute: false }) accessor portalContainer: HTMLElement | null = null; + @property({ attribute: false }) + accessor serverService!: ServerService; + @property({ attribute: false }) accessor affineWorkspaceDialogService!: WorkspaceDialogService; @@ -197,6 +203,7 @@ export class AIChatComposer extends SignalWatcher( .reasoningConfig=${this.reasoningConfig} .docDisplayConfig=${this.docDisplayConfig} .searchMenuConfig=${this.searchMenuConfig} + .serverService=${this.serverService} .affineFeatureFlagService=${this.affineFeatureFlagService} .aiDraftService=${this.aiDraftService} .aiToolsConfigService=${this.aiToolsConfigService} diff --git a/packages/frontend/core/src/blocksuite/ai/components/ai-chat-content/ai-chat-content.ts b/packages/frontend/core/src/blocksuite/ai/components/ai-chat-content/ai-chat-content.ts index b90ae1f2a..4ee32a30e 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/ai-chat-content/ai-chat-content.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/ai-chat-content/ai-chat-content.ts @@ -4,7 +4,10 @@ import type { } from '@affine/core/modules/ai-button'; import type { AIDraftState } from '@affine/core/modules/ai-button/services/ai-draft'; import type { AIModelService } from '@affine/core/modules/ai-button/services/models'; -import type { SubscriptionService } from '@affine/core/modules/cloud'; +import type { + ServerService, + SubscriptionService, +} from '@affine/core/modules/cloud'; import type { WorkspaceDialogService } from '@affine/core/modules/dialogs'; import type { FeatureFlagService } from '@affine/core/modules/feature-flag'; import type { PeekViewService } from '@affine/core/modules/peek-view'; @@ -151,6 +154,9 @@ export class AIChatContent extends SignalWatcher( @property({ attribute: false }) accessor extensions!: ExtensionType[]; + @property({ attribute: false }) + accessor serverService!: ServerService; + @property({ attribute: false }) accessor affineFeatureFlagService!: FeatureFlagService; @@ -472,6 +478,7 @@ export class AIChatContent extends SignalWatcher( .reasoningConfig=${this.reasoningConfig} .docDisplayConfig=${this.docDisplayConfig} .searchMenuConfig=${this.searchMenuConfig} + .serverService=${this.serverService} .affineWorkspaceDialogService=${this.affineWorkspaceDialogService} .notificationService=${this.notificationService} .aiDraftService=${this.aiDraftService} diff --git a/packages/frontend/core/src/blocksuite/ai/components/ai-chat-input/ai-chat-input.ts b/packages/frontend/core/src/blocksuite/ai/components/ai-chat-input/ai-chat-input.ts index 2876438df..3b53d5810 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/ai-chat-input/ai-chat-input.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/ai-chat-input/ai-chat-input.ts @@ -3,7 +3,10 @@ import type { AIToolsConfigService, } from '@affine/core/modules/ai-button'; import type { AIModelService } from '@affine/core/modules/ai-button/services/models'; -import type { SubscriptionService } from '@affine/core/modules/cloud'; +import type { + ServerService, + SubscriptionService, +} from '@affine/core/modules/cloud'; import type { FeatureFlagService } from '@affine/core/modules/feature-flag'; import type { CopilotChatHistoryFragment } from '@affine/graphql'; import { SignalWatcher, WithDisposable } from '@blocksuite/affine/global/lit'; @@ -359,6 +362,9 @@ export class AIChatInput extends SignalWatcher( @property({ attribute: false }) accessor searchMenuConfig!: SearchMenuConfig; + @property({ attribute: false }) + accessor serverService!: ServerService; + @property({ attribute: false }) accessor aiDraftService: AIDraftService | undefined; @@ -533,6 +539,7 @@ export class AIChatInput extends SignalWatcher( .networkSearchVisible=${!!this.networkSearchConfig.visible.value} .isNetworkActive=${this._isNetworkActive} .onNetworkActiveChange=${this._toggleNetworkSearch} + .serverService=${this.serverService} .toolsConfigService=${this.aiToolsConfigService} .notificationService=${this.notificationService} .subscriptionService=${this.subscriptionService} diff --git a/packages/frontend/core/src/blocksuite/ai/components/ai-chat-input/preference-popup.ts b/packages/frontend/core/src/blocksuite/ai/components/ai-chat-input/preference-popup.ts index 2f613fdcc..3aedbf8bb 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/ai-chat-input/preference-popup.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/ai-chat-input/preference-popup.ts @@ -1,8 +1,12 @@ import type { AIToolsConfigService } from '@affine/core/modules/ai-button'; import type { AIModelService } from '@affine/core/modules/ai-button/services/models'; -import type { SubscriptionService } from '@affine/core/modules/cloud'; +import type { + ServerService, + SubscriptionService, +} from '@affine/core/modules/cloud'; import { type CopilotChatHistoryFragment, + ServerDeploymentType, SubscriptionStatus, } from '@affine/graphql'; import { @@ -110,6 +114,9 @@ export class ChatInputPreference extends SignalWatcher( | undefined; // --------- search props end --------- + @property({ attribute: false }) + accessor serverService!: ServerService; + @property({ attribute: false }) accessor toolsConfigService!: AIToolsConfigService; @@ -153,6 +160,9 @@ export class ChatInputPreference extends SignalWatcher( options: { items: this.aiModelService.models.value.map(model => { const isSelected = model.id === this.model.value?.id; + const isSelfHosted = + this.serverService.server.config$.value?.type === + ServerDeploymentType.Selfhosted; const status = this.subscriptionService.subscription.ai$.value?.status; const isSubscribed = status === SubscriptionStatus.Active; @@ -172,7 +182,7 @@ export class ChatInputPreference extends SignalWatcher( `, select: () => { - if (model.isPro && !isSubscribed) { + if (model.isPro && !isSelfHosted && !isSubscribed) { this.notificationService.toast( `Pro models require an AFFiNE AI subscription.` ); diff --git a/packages/frontend/core/src/blocksuite/ai/components/playground/chat.ts b/packages/frontend/core/src/blocksuite/ai/components/playground/chat.ts index 2b9c69da9..9246ea751 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/playground/chat.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/playground/chat.ts @@ -1,4 +1,5 @@ import type { AIToolsConfigService } from '@affine/core/modules/ai-button'; +import type { ServerService } from '@affine/core/modules/cloud'; import type { WorkspaceDialogService } from '@affine/core/modules/dialogs'; import type { FeatureFlagService } from '@affine/core/modules/feature-flag'; import type { AppThemeService } from '@affine/core/modules/theme'; @@ -167,6 +168,9 @@ export class PlaygroundChat extends SignalWatcher( @property({ attribute: false }) accessor extensions!: ExtensionType[]; + @property({ attribute: false }) + accessor serverService!: ServerService; + @property({ attribute: false }) accessor affineFeatureFlagService!: FeatureFlagService; @@ -373,6 +377,7 @@ export class PlaygroundChat extends SignalWatcher( .playgroundConfig=${this.playgroundConfig} .docDisplayConfig=${this.docDisplayConfig} .searchMenuConfig=${this.searchMenuConfig} + .serverService=${this.serverService} .notificationService=${this.notificationService} .aiToolsConfigService=${this.aiToolsConfigService} .affineWorkspaceDialogService=${this.affineWorkspaceDialogService} diff --git a/packages/frontend/core/src/blocksuite/ai/components/playground/content.ts b/packages/frontend/core/src/blocksuite/ai/components/playground/content.ts index a1e95dbb6..099751177 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/playground/content.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/playground/content.ts @@ -1,4 +1,5 @@ import type { AIToolsConfigService } from '@affine/core/modules/ai-button'; +import type { ServerService } from '@affine/core/modules/cloud'; import type { FeatureFlagService } from '@affine/core/modules/feature-flag'; import type { AppThemeService } from '@affine/core/modules/theme'; import type { CopilotChatHistoryFragment } from '@affine/graphql'; @@ -84,6 +85,9 @@ export class PlaygroundContent extends SignalWatcher( @property({ attribute: false }) accessor extensions!: ExtensionType[]; + @property({ attribute: false }) + accessor serverService!: ServerService; + @property({ attribute: false }) accessor affineFeatureFlagService!: FeatureFlagService; @@ -348,6 +352,7 @@ export class PlaygroundContent extends SignalWatcher( .searchMenuConfig=${this.searchMenuConfig} .docDisplayConfig=${this.docDisplayConfig} .extensions=${this.extensions} + .serverService=${this.serverService} .affineFeatureFlagService=${this.affineFeatureFlagService} .affineThemeService=${this.affineThemeService} .notificationService=${this.notificationService} diff --git a/packages/frontend/core/src/blocksuite/ai/peek-view/chat-block-peek-view.ts b/packages/frontend/core/src/blocksuite/ai/peek-view/chat-block-peek-view.ts index 7e2c1f74a..10699daed 100644 --- a/packages/frontend/core/src/blocksuite/ai/peek-view/chat-block-peek-view.ts +++ b/packages/frontend/core/src/blocksuite/ai/peek-view/chat-block-peek-view.ts @@ -3,7 +3,10 @@ import type { AIToolsConfigService, } from '@affine/core/modules/ai-button'; import type { AIModelService } from '@affine/core/modules/ai-button/services/models'; -import type { SubscriptionService } from '@affine/core/modules/cloud'; +import type { + ServerService, + SubscriptionService, +} from '@affine/core/modules/cloud'; import type { WorkspaceDialogService } from '@affine/core/modules/dialogs'; import type { FeatureFlagService } from '@affine/core/modules/feature-flag'; import type { @@ -624,6 +627,7 @@ export class AIChatBlockPeekView extends LitElement { }} .portalContainer=${this.parentElement} .reasoningConfig=${this.reasoningConfig} + .serverService=${this.serverService} .subscriptionService=${this.subscriptionService} .aiModelService=${this.aiModelService} .onAISubscribe=${this.onAISubscribe} @@ -646,6 +650,9 @@ export class AIChatBlockPeekView extends LitElement { @property({ attribute: false }) accessor reasoningConfig!: AIReasoningConfig; + @property({ attribute: false }) + accessor serverService!: ServerService; + @property({ attribute: false }) accessor docDisplayConfig!: DocDisplayConfig; @@ -708,6 +715,7 @@ export const AIChatBlockPeekViewTemplate = ( searchMenuConfig: SearchMenuConfig, networkSearchConfig: AINetworkSearchConfig, reasoningConfig: AIReasoningConfig, + serverService: ServerService, affineFeatureFlagService: FeatureFlagService, affineWorkspaceDialogService: WorkspaceDialogService, aiDraftService: AIDraftService, @@ -723,6 +731,7 @@ export const AIChatBlockPeekViewTemplate = ( .docDisplayConfig=${docDisplayConfig} .searchMenuConfig=${searchMenuConfig} .reasoningConfig=${reasoningConfig} + .serverService=${serverService} .affineFeatureFlagService=${affineFeatureFlagService} .affineWorkspaceDialogService=${affineWorkspaceDialogService} .aiDraftService=${aiDraftService} diff --git a/packages/frontend/core/src/desktop/pages/workspace/detail-page/tabs/chat.tsx b/packages/frontend/core/src/desktop/pages/workspace/detail-page/tabs/chat.tsx index 654f2acc8..f5dd23b6b 100644 --- a/packages/frontend/core/src/desktop/pages/workspace/detail-page/tabs/chat.tsx +++ b/packages/frontend/core/src/desktop/pages/workspace/detail-page/tabs/chat.tsx @@ -10,7 +10,7 @@ import { AIToolsConfigService, } from '@affine/core/modules/ai-button'; import { AIModelService } from '@affine/core/modules/ai-button/services/models'; -import { SubscriptionService } from '@affine/core/modules/cloud'; +import { ServerService, SubscriptionService } from '@affine/core/modules/cloud'; import { WorkspaceDialogService } from '@affine/core/modules/dialogs'; import { FeatureFlagService } from '@affine/core/modules/feature-flag'; import { PeekViewService } from '@affine/core/modules/peek-view'; @@ -92,6 +92,7 @@ export const EditorChatPanel = forwardRef(function EditorChatPanel( chatPanelRef.current.reasoningConfig = reasoningConfig; chatPanelRef.current.playgroundConfig = playgroundConfig; chatPanelRef.current.extensions = specs; + chatPanelRef.current.serverService = framework.get(ServerService); chatPanelRef.current.affineFeatureFlagService = framework.get(FeatureFlagService); chatPanelRef.current.affineWorkspaceDialogService = framework.get( diff --git a/packages/frontend/core/src/modules/peek-view/view/ai-chat-block-peek-view/index.tsx b/packages/frontend/core/src/modules/peek-view/view/ai-chat-block-peek-view/index.tsx index 6a731e37b..c34b6e3c2 100644 --- a/packages/frontend/core/src/modules/peek-view/view/ai-chat-block-peek-view/index.tsx +++ b/packages/frontend/core/src/modules/peek-view/view/ai-chat-block-peek-view/index.tsx @@ -8,7 +8,7 @@ import { AIToolsConfigService, } from '@affine/core/modules/ai-button'; import { AIModelService } from '@affine/core/modules/ai-button/services/models'; -import { SubscriptionService } from '@affine/core/modules/cloud'; +import { ServerService, SubscriptionService } from '@affine/core/modules/cloud'; import { WorkspaceDialogService } from '@affine/core/modules/dialogs'; import { FeatureFlagService } from '@affine/core/modules/feature-flag'; import type { EditorHost } from '@blocksuite/affine/std'; @@ -32,6 +32,7 @@ export const AIChatBlockPeekView = ({ } = useAIChatConfig(); const framework = useFramework(); + const serverService = framework.get(ServerService); const affineFeatureFlagService = framework.get(FeatureFlagService); const affineWorkspaceDialogService = framework.get(WorkspaceDialogService); const aiDraftService = framework.get(AIDraftService); @@ -48,6 +49,7 @@ export const AIChatBlockPeekView = ({ searchMenuConfig, networkSearchConfig, reasoningConfig, + serverService, affineFeatureFlagService, affineWorkspaceDialogService, aiDraftService, @@ -64,6 +66,7 @@ export const AIChatBlockPeekView = ({ searchMenuConfig, networkSearchConfig, reasoningConfig, + serverService, affineFeatureFlagService, affineWorkspaceDialogService, aiDraftService,