Skip to content

Commit fa45bb3

Browse files
eamodiod13
authored andcommitted
Improves AI error messages (#4227)
1 parent 364b65a commit fa45bb3

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
@@ -12,6 +12,7 @@ import {
1212
vscodeProviderDescriptor,
1313
xAIProviderDescriptor,
1414
} from '../../constants.ai';
15+
import { SubscriptionPlanId } from '../../constants.subscription';
1516
import type { AIGenerateDraftEventData, Source, TelemetryEvents } from '../../constants.telemetry';
1617
import type { Container } from '../../container';
1718
import {
@@ -45,6 +46,7 @@ import { getSettledValue, getSettledValues } from '../../system/promise';
4546
import { PromiseCache } from '../../system/promiseCache';
4647
import type { ServerConnection } from '../gk/serverConnection';
4748
import { ensureFeatureAccess } from '../gk/utils/-webview/acount.utils';
49+
import { compareSubscriptionPlans, getSubscriptionPlanTier, isSubscriptionPaid } from '../gk/utils/subscription.utils';
4850
import type {
4951
AIActionType,
5052
AIModel,
@@ -923,11 +925,27 @@ export class AIProviderService implements Disposable {
923925
void window.showErrorMessage(ex.message);
924926
return undefined;
925927

926-
case AIErrorReason.Entitlement:
927-
void window.showErrorMessage(
928-
'You do not have the required entitlement or are over the limits to use this AI feature',
928+
case AIErrorReason.Entitlement: {
929+
const sub = await this.container.subscription.getSubscription();
930+
931+
const plan = isSubscriptionPaid(sub)
932+
? compareSubscriptionPlans(sub.plan.actual.id, SubscriptionPlanId.Advanced) <= 0
933+
? SubscriptionPlanId.Business
934+
: SubscriptionPlanId.Advanced
935+
: SubscriptionPlanId.Pro;
936+
937+
const upgrade = { title: `Upgrade to ${getSubscriptionPlanTier(plan)}` };
938+
const result = await window.showErrorMessage(
939+
'You do not have the required entitlement to use this AI feature. Please upgrade your plan and try again.',
940+
upgrade,
929941
);
942+
943+
if (result === upgrade) {
944+
void this.container.subscription.upgrade(plan, source);
945+
}
946+
930947
return undefined;
948+
}
931949
case AIErrorReason.RequestTooLarge: {
932950
const switchModel: MessageItem = { title: 'Switch Model' };
933951
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)