Skip to content

Commit 45bbbf0

Browse files
committed
Improves AI error messages (#4227)
1 parent c6a9338 commit 45bbbf0

File tree

6 files changed

+32
-15
lines changed

6 files changed

+32
-15
lines changed

src/constants.subscription.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export const enum SubscriptionPlanId {
88
CommunityWithAccount = 'community-with-account',
99
Pro = 'pro',
1010
Advanced = 'advanced',
11-
Teams = 'teams',
11+
Business = 'teams', // teams is the old name for Business; do not change
1212
Enterprise = 'enterprise',
1313
}
1414

src/plus/ai/aiProviderService.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
vscodeProviderDescriptor,
1414
xAIProviderDescriptor,
1515
} from '../../constants.ai';
16+
import { SubscriptionPlanId } from '../../constants.subscription';
1617
import type { AIGenerateDraftEventData, Source, TelemetryEvents } from '../../constants.telemetry';
1718
import type { Container } from '../../container';
1819
import {
@@ -46,6 +47,7 @@ import { getSettledValue, getSettledValues } from '../../system/promise';
4647
import { PromiseCache } from '../../system/promiseCache';
4748
import type { ServerConnection } from '../gk/serverConnection';
4849
import { ensureFeatureAccess } from '../gk/utils/-webview/acount.utils';
50+
import { compareSubscriptionPlans, getSubscriptionPlanTier, isSubscriptionPaid } from '../gk/utils/subscription.utils';
4951
import type {
5052
AIActionType,
5153
AIModel,
@@ -933,11 +935,27 @@ export class AIProviderService implements Disposable {
933935
void window.showErrorMessage(ex.message);
934936
return undefined;
935937

936-
case AIErrorReason.Entitlement:
937-
void window.showErrorMessage(
938-
'You do not have the required entitlement or are over the limits to use this AI feature',
938+
case AIErrorReason.Entitlement: {
939+
const sub = await this.container.subscription.getSubscription();
940+
941+
const plan = isSubscriptionPaid(sub)
942+
? compareSubscriptionPlans(sub.plan.actual.id, SubscriptionPlanId.Advanced) <= 0
943+
? SubscriptionPlanId.Business
944+
: SubscriptionPlanId.Advanced
945+
: SubscriptionPlanId.Pro;
946+
947+
const upgrade = { title: `Upgrade to ${getSubscriptionPlanTier(plan)}` };
948+
const result = await window.showErrorMessage(
949+
'You do not have the required entitlement to use this AI feature. Please upgrade your plan and try again.',
950+
upgrade,
939951
);
952+
953+
if (result === upgrade) {
954+
void this.container.subscription.upgrade(plan, source);
955+
}
956+
940957
return undefined;
958+
}
941959
case AIErrorReason.RequestTooLarge: {
942960
const switchModel: MessageItem = { title: 'Switch Model' };
943961
const result = await window.showErrorMessage(

src/plus/ai/gitkrakenProvider.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,8 @@ export class GitKrakenProvider extends OpenAICompatibleProvider<typeof provider.
151151
}
152152

153153
throw new AIError(
154-
entitlementId === 'ai.tokens.weekly'
155-
? AIErrorReason.UserQuotaExceeded
156-
: AIErrorReason.Entitlement,
154+
// If there is an `entitlementValue` then we are over the limit, otherwise it is an entitlement error
155+
data?.entitlementValue ? AIErrorReason.UserQuotaExceeded : AIErrorReason.Entitlement,
157156
new Error(`(${this.name}) ${status}.${code}: ${message}`),
158157
);
159158
}

src/plus/gk/__debug__accountDebug.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ type SimulateQuickPickItem = QuickPickItemOfT<
6565
expiredPaid?: boolean;
6666
planId?:
6767
| SubscriptionPlanId.Pro
68-
| SubscriptionPlanId.Teams
6968
| SubscriptionPlanId.Advanced
69+
| SubscriptionPlanId.Business
7070
| SubscriptionPlanId.Enterprise;
7171
featurePreviews?: never;
7272
}
@@ -198,7 +198,7 @@ class AccountDebug {
198198
label: 'Business',
199199
description: 'Business plan, account',
200200
iconPath: new ThemeIcon('blank'),
201-
item: { state: SubscriptionState.Paid, planId: SubscriptionPlanId.Teams },
201+
item: { state: SubscriptionState.Paid, planId: SubscriptionPlanId.Business },
202202
},
203203
{
204204
label: 'Enterprise',

src/plus/gk/utils/checkin.utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ function convertLicenseTypeToPlanId(licenseType: GKLicenseType): SubscriptionPla
162162
case 'bundle-teams':
163163
case 'gitkraken_v1-teams':
164164
case 'gitkraken-v1-teams':
165-
return SubscriptionPlanId.Teams;
165+
return SubscriptionPlanId.Business;
166166
case 'gitlens-advanced':
167167
case 'bundle-advanced':
168168
case 'gitkraken_v1-advanced':

src/plus/gk/utils/subscription.utils.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ export function computeSubscriptionState(subscription: Optional<Subscription, 's
8989

9090
case SubscriptionPlanId.Pro:
9191
case SubscriptionPlanId.Advanced:
92-
case SubscriptionPlanId.Teams:
92+
case SubscriptionPlanId.Business:
9393
case SubscriptionPlanId.Enterprise:
9494
return SubscriptionState.Paid;
9595
}
@@ -113,7 +113,7 @@ export function computeSubscriptionState(subscription: Optional<Subscription, 's
113113

114114
case SubscriptionPlanId.Pro:
115115
case SubscriptionPlanId.Advanced:
116-
case SubscriptionPlanId.Teams:
116+
case SubscriptionPlanId.Business:
117117
case SubscriptionPlanId.Enterprise:
118118
return actual.id === SubscriptionPlanId.Community
119119
? SubscriptionState.ProPreview
@@ -156,7 +156,7 @@ export function getSubscriptionPlanTier(
156156
return 'Pro';
157157
case SubscriptionPlanId.Advanced:
158158
return 'Advanced';
159-
case SubscriptionPlanId.Teams:
159+
case SubscriptionPlanId.Business:
160160
return 'Business';
161161
case SubscriptionPlanId.Enterprise:
162162
return 'Enterprise';
@@ -169,7 +169,7 @@ export function getSubscriptionPlanTierType(id: SubscriptionPlanId): 'PRO' | 'AD
169169
switch (id) {
170170
case SubscriptionPlanId.Advanced:
171171
return 'ADVANCED';
172-
case SubscriptionPlanId.Teams:
172+
case SubscriptionPlanId.Business:
173173
return 'BUSINESS';
174174
case SubscriptionPlanId.Enterprise:
175175
return 'ENTERPRISE';
@@ -184,7 +184,7 @@ const plansPriority = new Map<SubscriptionPlanId | undefined, number>([
184184
[SubscriptionPlanId.CommunityWithAccount, 1],
185185
[SubscriptionPlanId.Pro, 2],
186186
[SubscriptionPlanId.Advanced, 3],
187-
[SubscriptionPlanId.Teams, 4],
187+
[SubscriptionPlanId.Business, 4],
188188
[SubscriptionPlanId.Enterprise, 5],
189189
]);
190190

0 commit comments

Comments
 (0)