feat: check server type in chat (#13875)

This commit is contained in:
DarkSky
2025-11-06 20:55:32 +08:00
committed by GitHub
parent c9a4129a3e
commit d33df659f8
11 changed files with 76 additions and 9 deletions

View File

@@ -1,4 +1,5 @@
import type { AIToolsConfigService } from '@affine/core/modules/ai-button'; 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 { WorkspaceDialogService } from '@affine/core/modules/dialogs';
import type { FeatureFlagService } from '@affine/core/modules/feature-flag'; import type { FeatureFlagService } from '@affine/core/modules/feature-flag';
import type { AppThemeService } from '@affine/core/modules/theme'; import type { AppThemeService } from '@affine/core/modules/theme';
@@ -94,6 +95,9 @@ export class AIChatPanelTitle extends SignalWatcher(
@property({ attribute: false }) @property({ attribute: false })
accessor extensions!: ExtensionType[]; accessor extensions!: ExtensionType[];
@property({ attribute: false })
accessor serverService!: ServerService;
@property({ attribute: false }) @property({ attribute: false })
accessor affineFeatureFlagService!: FeatureFlagService; accessor affineFeatureFlagService!: FeatureFlagService;
@@ -145,6 +149,7 @@ export class AIChatPanelTitle extends SignalWatcher(
.searchMenuConfig=${this.searchMenuConfig} .searchMenuConfig=${this.searchMenuConfig}
.docDisplayConfig=${this.docDisplayConfig} .docDisplayConfig=${this.docDisplayConfig}
.extensions=${this.extensions} .extensions=${this.extensions}
.serverService=${this.serverService}
.affineFeatureFlagService=${this.affineFeatureFlagService} .affineFeatureFlagService=${this.affineFeatureFlagService}
.affineThemeService=${this.affineThemeService} .affineThemeService=${this.affineThemeService}
.notificationService=${this.notificationService} .notificationService=${this.notificationService}

View File

@@ -3,7 +3,10 @@ import type {
AIToolsConfigService, AIToolsConfigService,
} from '@affine/core/modules/ai-button'; } from '@affine/core/modules/ai-button';
import type { AIModelService } from '@affine/core/modules/ai-button/services/models'; 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 { WorkspaceDialogService } from '@affine/core/modules/dialogs';
import type { FeatureFlagService } from '@affine/core/modules/feature-flag'; import type { FeatureFlagService } from '@affine/core/modules/feature-flag';
import type { PeekViewService } from '@affine/core/modules/peek-view'; import type { PeekViewService } from '@affine/core/modules/peek-view';
@@ -107,6 +110,9 @@ export class ChatPanel extends SignalWatcher(
@property({ attribute: false }) @property({ attribute: false })
accessor extensions!: ExtensionType[]; accessor extensions!: ExtensionType[];
@property({ attribute: false })
accessor serverService!: ServerService;
@property({ attribute: false }) @property({ attribute: false })
accessor affineFeatureFlagService!: FeatureFlagService; accessor affineFeatureFlagService!: FeatureFlagService;
@@ -429,6 +435,7 @@ export class ChatPanel extends SignalWatcher(
.searchMenuConfig=${this.searchMenuConfig} .searchMenuConfig=${this.searchMenuConfig}
.docDisplayConfig=${this.docDisplayConfig} .docDisplayConfig=${this.docDisplayConfig}
.extensions=${this.extensions} .extensions=${this.extensions}
.serverService=${this.serverService}
.affineFeatureFlagService=${this.affineFeatureFlagService} .affineFeatureFlagService=${this.affineFeatureFlagService}
.affineWorkspaceDialogService=${this.affineWorkspaceDialogService} .affineWorkspaceDialogService=${this.affineWorkspaceDialogService}
.affineThemeService=${this.affineThemeService} .affineThemeService=${this.affineThemeService}
@@ -456,6 +463,7 @@ export class ChatPanel extends SignalWatcher(
.searchMenuConfig=${this.searchMenuConfig} .searchMenuConfig=${this.searchMenuConfig}
.docDisplayConfig=${this.docDisplayConfig} .docDisplayConfig=${this.docDisplayConfig}
.extensions=${this.extensions} .extensions=${this.extensions}
.serverService=${this.serverService}
.affineFeatureFlagService=${this.affineFeatureFlagService} .affineFeatureFlagService=${this.affineFeatureFlagService}
.affineWorkspaceDialogService=${this.affineWorkspaceDialogService} .affineWorkspaceDialogService=${this.affineWorkspaceDialogService}
.affineThemeService=${this.affineThemeService} .affineThemeService=${this.affineThemeService}

View File

@@ -5,7 +5,10 @@ import type {
AIToolsConfigService, AIToolsConfigService,
} from '@affine/core/modules/ai-button'; } from '@affine/core/modules/ai-button';
import type { AIModelService } from '@affine/core/modules/ai-button/services/models'; 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 { WorkspaceDialogService } from '@affine/core/modules/dialogs';
import type { import type {
ContextEmbedStatus, ContextEmbedStatus,
@@ -128,6 +131,9 @@ export class AIChatComposer extends SignalWatcher(
@property({ attribute: false }) @property({ attribute: false })
accessor portalContainer: HTMLElement | null = null; accessor portalContainer: HTMLElement | null = null;
@property({ attribute: false })
accessor serverService!: ServerService;
@property({ attribute: false }) @property({ attribute: false })
accessor affineWorkspaceDialogService!: WorkspaceDialogService; accessor affineWorkspaceDialogService!: WorkspaceDialogService;
@@ -197,6 +203,7 @@ export class AIChatComposer extends SignalWatcher(
.reasoningConfig=${this.reasoningConfig} .reasoningConfig=${this.reasoningConfig}
.docDisplayConfig=${this.docDisplayConfig} .docDisplayConfig=${this.docDisplayConfig}
.searchMenuConfig=${this.searchMenuConfig} .searchMenuConfig=${this.searchMenuConfig}
.serverService=${this.serverService}
.affineFeatureFlagService=${this.affineFeatureFlagService} .affineFeatureFlagService=${this.affineFeatureFlagService}
.aiDraftService=${this.aiDraftService} .aiDraftService=${this.aiDraftService}
.aiToolsConfigService=${this.aiToolsConfigService} .aiToolsConfigService=${this.aiToolsConfigService}

View File

@@ -4,7 +4,10 @@ import type {
} from '@affine/core/modules/ai-button'; } from '@affine/core/modules/ai-button';
import type { AIDraftState } from '@affine/core/modules/ai-button/services/ai-draft'; 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 { 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 { WorkspaceDialogService } from '@affine/core/modules/dialogs';
import type { FeatureFlagService } from '@affine/core/modules/feature-flag'; import type { FeatureFlagService } from '@affine/core/modules/feature-flag';
import type { PeekViewService } from '@affine/core/modules/peek-view'; import type { PeekViewService } from '@affine/core/modules/peek-view';
@@ -151,6 +154,9 @@ export class AIChatContent extends SignalWatcher(
@property({ attribute: false }) @property({ attribute: false })
accessor extensions!: ExtensionType[]; accessor extensions!: ExtensionType[];
@property({ attribute: false })
accessor serverService!: ServerService;
@property({ attribute: false }) @property({ attribute: false })
accessor affineFeatureFlagService!: FeatureFlagService; accessor affineFeatureFlagService!: FeatureFlagService;
@@ -472,6 +478,7 @@ export class AIChatContent extends SignalWatcher(
.reasoningConfig=${this.reasoningConfig} .reasoningConfig=${this.reasoningConfig}
.docDisplayConfig=${this.docDisplayConfig} .docDisplayConfig=${this.docDisplayConfig}
.searchMenuConfig=${this.searchMenuConfig} .searchMenuConfig=${this.searchMenuConfig}
.serverService=${this.serverService}
.affineWorkspaceDialogService=${this.affineWorkspaceDialogService} .affineWorkspaceDialogService=${this.affineWorkspaceDialogService}
.notificationService=${this.notificationService} .notificationService=${this.notificationService}
.aiDraftService=${this.aiDraftService} .aiDraftService=${this.aiDraftService}

View File

@@ -3,7 +3,10 @@ import type {
AIToolsConfigService, AIToolsConfigService,
} from '@affine/core/modules/ai-button'; } from '@affine/core/modules/ai-button';
import type { AIModelService } from '@affine/core/modules/ai-button/services/models'; 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 { FeatureFlagService } from '@affine/core/modules/feature-flag';
import type { CopilotChatHistoryFragment } from '@affine/graphql'; import type { CopilotChatHistoryFragment } from '@affine/graphql';
import { SignalWatcher, WithDisposable } from '@blocksuite/affine/global/lit'; import { SignalWatcher, WithDisposable } from '@blocksuite/affine/global/lit';
@@ -359,6 +362,9 @@ export class AIChatInput extends SignalWatcher(
@property({ attribute: false }) @property({ attribute: false })
accessor searchMenuConfig!: SearchMenuConfig; accessor searchMenuConfig!: SearchMenuConfig;
@property({ attribute: false })
accessor serverService!: ServerService;
@property({ attribute: false }) @property({ attribute: false })
accessor aiDraftService: AIDraftService | undefined; accessor aiDraftService: AIDraftService | undefined;
@@ -533,6 +539,7 @@ export class AIChatInput extends SignalWatcher(
.networkSearchVisible=${!!this.networkSearchConfig.visible.value} .networkSearchVisible=${!!this.networkSearchConfig.visible.value}
.isNetworkActive=${this._isNetworkActive} .isNetworkActive=${this._isNetworkActive}
.onNetworkActiveChange=${this._toggleNetworkSearch} .onNetworkActiveChange=${this._toggleNetworkSearch}
.serverService=${this.serverService}
.toolsConfigService=${this.aiToolsConfigService} .toolsConfigService=${this.aiToolsConfigService}
.notificationService=${this.notificationService} .notificationService=${this.notificationService}
.subscriptionService=${this.subscriptionService} .subscriptionService=${this.subscriptionService}

View File

@@ -1,8 +1,12 @@
import type { AIToolsConfigService } from '@affine/core/modules/ai-button'; import type { AIToolsConfigService } from '@affine/core/modules/ai-button';
import type { AIModelService } from '@affine/core/modules/ai-button/services/models'; 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 { import {
type CopilotChatHistoryFragment, type CopilotChatHistoryFragment,
ServerDeploymentType,
SubscriptionStatus, SubscriptionStatus,
} from '@affine/graphql'; } from '@affine/graphql';
import { import {
@@ -110,6 +114,9 @@ export class ChatInputPreference extends SignalWatcher(
| undefined; | undefined;
// --------- search props end --------- // --------- search props end ---------
@property({ attribute: false })
accessor serverService!: ServerService;
@property({ attribute: false }) @property({ attribute: false })
accessor toolsConfigService!: AIToolsConfigService; accessor toolsConfigService!: AIToolsConfigService;
@@ -153,6 +160,9 @@ export class ChatInputPreference extends SignalWatcher(
options: { options: {
items: this.aiModelService.models.value.map(model => { items: this.aiModelService.models.value.map(model => {
const isSelected = model.id === this.model.value?.id; const isSelected = model.id === this.model.value?.id;
const isSelfHosted =
this.serverService.server.config$.value?.type ===
ServerDeploymentType.Selfhosted;
const status = const status =
this.subscriptionService.subscription.ai$.value?.status; this.subscriptionService.subscription.ai$.value?.status;
const isSubscribed = status === SubscriptionStatus.Active; const isSubscribed = status === SubscriptionStatus.Active;
@@ -172,7 +182,7 @@ export class ChatInputPreference extends SignalWatcher(
</div> </div>
`, `,
select: () => { select: () => {
if (model.isPro && !isSubscribed) { if (model.isPro && !isSelfHosted && !isSubscribed) {
this.notificationService.toast( this.notificationService.toast(
`Pro models require an AFFiNE AI subscription.` `Pro models require an AFFiNE AI subscription.`
); );

View File

@@ -1,4 +1,5 @@
import type { AIToolsConfigService } from '@affine/core/modules/ai-button'; 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 { WorkspaceDialogService } from '@affine/core/modules/dialogs';
import type { FeatureFlagService } from '@affine/core/modules/feature-flag'; import type { FeatureFlagService } from '@affine/core/modules/feature-flag';
import type { AppThemeService } from '@affine/core/modules/theme'; import type { AppThemeService } from '@affine/core/modules/theme';
@@ -167,6 +168,9 @@ export class PlaygroundChat extends SignalWatcher(
@property({ attribute: false }) @property({ attribute: false })
accessor extensions!: ExtensionType[]; accessor extensions!: ExtensionType[];
@property({ attribute: false })
accessor serverService!: ServerService;
@property({ attribute: false }) @property({ attribute: false })
accessor affineFeatureFlagService!: FeatureFlagService; accessor affineFeatureFlagService!: FeatureFlagService;
@@ -373,6 +377,7 @@ export class PlaygroundChat extends SignalWatcher(
.playgroundConfig=${this.playgroundConfig} .playgroundConfig=${this.playgroundConfig}
.docDisplayConfig=${this.docDisplayConfig} .docDisplayConfig=${this.docDisplayConfig}
.searchMenuConfig=${this.searchMenuConfig} .searchMenuConfig=${this.searchMenuConfig}
.serverService=${this.serverService}
.notificationService=${this.notificationService} .notificationService=${this.notificationService}
.aiToolsConfigService=${this.aiToolsConfigService} .aiToolsConfigService=${this.aiToolsConfigService}
.affineWorkspaceDialogService=${this.affineWorkspaceDialogService} .affineWorkspaceDialogService=${this.affineWorkspaceDialogService}

View File

@@ -1,4 +1,5 @@
import type { AIToolsConfigService } from '@affine/core/modules/ai-button'; 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 { FeatureFlagService } from '@affine/core/modules/feature-flag';
import type { AppThemeService } from '@affine/core/modules/theme'; import type { AppThemeService } from '@affine/core/modules/theme';
import type { CopilotChatHistoryFragment } from '@affine/graphql'; import type { CopilotChatHistoryFragment } from '@affine/graphql';
@@ -84,6 +85,9 @@ export class PlaygroundContent extends SignalWatcher(
@property({ attribute: false }) @property({ attribute: false })
accessor extensions!: ExtensionType[]; accessor extensions!: ExtensionType[];
@property({ attribute: false })
accessor serverService!: ServerService;
@property({ attribute: false }) @property({ attribute: false })
accessor affineFeatureFlagService!: FeatureFlagService; accessor affineFeatureFlagService!: FeatureFlagService;
@@ -348,6 +352,7 @@ export class PlaygroundContent extends SignalWatcher(
.searchMenuConfig=${this.searchMenuConfig} .searchMenuConfig=${this.searchMenuConfig}
.docDisplayConfig=${this.docDisplayConfig} .docDisplayConfig=${this.docDisplayConfig}
.extensions=${this.extensions} .extensions=${this.extensions}
.serverService=${this.serverService}
.affineFeatureFlagService=${this.affineFeatureFlagService} .affineFeatureFlagService=${this.affineFeatureFlagService}
.affineThemeService=${this.affineThemeService} .affineThemeService=${this.affineThemeService}
.notificationService=${this.notificationService} .notificationService=${this.notificationService}

View File

@@ -3,7 +3,10 @@ import type {
AIToolsConfigService, AIToolsConfigService,
} from '@affine/core/modules/ai-button'; } from '@affine/core/modules/ai-button';
import type { AIModelService } from '@affine/core/modules/ai-button/services/models'; 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 { WorkspaceDialogService } from '@affine/core/modules/dialogs';
import type { FeatureFlagService } from '@affine/core/modules/feature-flag'; import type { FeatureFlagService } from '@affine/core/modules/feature-flag';
import type { import type {
@@ -624,6 +627,7 @@ export class AIChatBlockPeekView extends LitElement {
}} }}
.portalContainer=${this.parentElement} .portalContainer=${this.parentElement}
.reasoningConfig=${this.reasoningConfig} .reasoningConfig=${this.reasoningConfig}
.serverService=${this.serverService}
.subscriptionService=${this.subscriptionService} .subscriptionService=${this.subscriptionService}
.aiModelService=${this.aiModelService} .aiModelService=${this.aiModelService}
.onAISubscribe=${this.onAISubscribe} .onAISubscribe=${this.onAISubscribe}
@@ -646,6 +650,9 @@ export class AIChatBlockPeekView extends LitElement {
@property({ attribute: false }) @property({ attribute: false })
accessor reasoningConfig!: AIReasoningConfig; accessor reasoningConfig!: AIReasoningConfig;
@property({ attribute: false })
accessor serverService!: ServerService;
@property({ attribute: false }) @property({ attribute: false })
accessor docDisplayConfig!: DocDisplayConfig; accessor docDisplayConfig!: DocDisplayConfig;
@@ -708,6 +715,7 @@ export const AIChatBlockPeekViewTemplate = (
searchMenuConfig: SearchMenuConfig, searchMenuConfig: SearchMenuConfig,
networkSearchConfig: AINetworkSearchConfig, networkSearchConfig: AINetworkSearchConfig,
reasoningConfig: AIReasoningConfig, reasoningConfig: AIReasoningConfig,
serverService: ServerService,
affineFeatureFlagService: FeatureFlagService, affineFeatureFlagService: FeatureFlagService,
affineWorkspaceDialogService: WorkspaceDialogService, affineWorkspaceDialogService: WorkspaceDialogService,
aiDraftService: AIDraftService, aiDraftService: AIDraftService,
@@ -723,6 +731,7 @@ export const AIChatBlockPeekViewTemplate = (
.docDisplayConfig=${docDisplayConfig} .docDisplayConfig=${docDisplayConfig}
.searchMenuConfig=${searchMenuConfig} .searchMenuConfig=${searchMenuConfig}
.reasoningConfig=${reasoningConfig} .reasoningConfig=${reasoningConfig}
.serverService=${serverService}
.affineFeatureFlagService=${affineFeatureFlagService} .affineFeatureFlagService=${affineFeatureFlagService}
.affineWorkspaceDialogService=${affineWorkspaceDialogService} .affineWorkspaceDialogService=${affineWorkspaceDialogService}
.aiDraftService=${aiDraftService} .aiDraftService=${aiDraftService}

View File

@@ -10,7 +10,7 @@ import {
AIToolsConfigService, AIToolsConfigService,
} from '@affine/core/modules/ai-button'; } from '@affine/core/modules/ai-button';
import { AIModelService } from '@affine/core/modules/ai-button/services/models'; 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 { WorkspaceDialogService } from '@affine/core/modules/dialogs';
import { FeatureFlagService } from '@affine/core/modules/feature-flag'; import { FeatureFlagService } from '@affine/core/modules/feature-flag';
import { PeekViewService } from '@affine/core/modules/peek-view'; import { PeekViewService } from '@affine/core/modules/peek-view';
@@ -92,6 +92,7 @@ export const EditorChatPanel = forwardRef(function EditorChatPanel(
chatPanelRef.current.reasoningConfig = reasoningConfig; chatPanelRef.current.reasoningConfig = reasoningConfig;
chatPanelRef.current.playgroundConfig = playgroundConfig; chatPanelRef.current.playgroundConfig = playgroundConfig;
chatPanelRef.current.extensions = specs; chatPanelRef.current.extensions = specs;
chatPanelRef.current.serverService = framework.get(ServerService);
chatPanelRef.current.affineFeatureFlagService = chatPanelRef.current.affineFeatureFlagService =
framework.get(FeatureFlagService); framework.get(FeatureFlagService);
chatPanelRef.current.affineWorkspaceDialogService = framework.get( chatPanelRef.current.affineWorkspaceDialogService = framework.get(

View File

@@ -8,7 +8,7 @@ import {
AIToolsConfigService, AIToolsConfigService,
} from '@affine/core/modules/ai-button'; } from '@affine/core/modules/ai-button';
import { AIModelService } from '@affine/core/modules/ai-button/services/models'; 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 { WorkspaceDialogService } from '@affine/core/modules/dialogs';
import { FeatureFlagService } from '@affine/core/modules/feature-flag'; import { FeatureFlagService } from '@affine/core/modules/feature-flag';
import type { EditorHost } from '@blocksuite/affine/std'; import type { EditorHost } from '@blocksuite/affine/std';
@@ -32,6 +32,7 @@ export const AIChatBlockPeekView = ({
} = useAIChatConfig(); } = useAIChatConfig();
const framework = useFramework(); const framework = useFramework();
const serverService = framework.get(ServerService);
const affineFeatureFlagService = framework.get(FeatureFlagService); const affineFeatureFlagService = framework.get(FeatureFlagService);
const affineWorkspaceDialogService = framework.get(WorkspaceDialogService); const affineWorkspaceDialogService = framework.get(WorkspaceDialogService);
const aiDraftService = framework.get(AIDraftService); const aiDraftService = framework.get(AIDraftService);
@@ -48,6 +49,7 @@ export const AIChatBlockPeekView = ({
searchMenuConfig, searchMenuConfig,
networkSearchConfig, networkSearchConfig,
reasoningConfig, reasoningConfig,
serverService,
affineFeatureFlagService, affineFeatureFlagService,
affineWorkspaceDialogService, affineWorkspaceDialogService,
aiDraftService, aiDraftService,
@@ -64,6 +66,7 @@ export const AIChatBlockPeekView = ({
searchMenuConfig, searchMenuConfig,
networkSearchConfig, networkSearchConfig,
reasoningConfig, reasoningConfig,
serverService,
affineFeatureFlagService, affineFeatureFlagService,
affineWorkspaceDialogService, affineWorkspaceDialogService,
aiDraftService, aiDraftService,