Skip to content

Commit 33dd48d

Browse files
chore(ai-proxy): remove expired isActiveReviewPromo and related code (#1688)
* chore(ai-proxy): remove expired isActiveReviewPromo and related code The Sonnet 4.6 free review promo (Feb 18-25, 2026) has ended. Remove all promo logic: the isActiveReviewPromo function, REVIEW_PROMO_* constants, balance gate bypass, cost zeroing, response rewriting, admin stats endpoint, UI '(free)' badge, promo logging, and the test/migration scripts. * Format --------- Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> Co-authored-by: Christiaan Arnoldus <christiaan@kilocode.ai> Co-authored-by: Christiaan Arnoldus <christiaan.arnoldus@outlook.com>
1 parent ce90707 commit 33dd48d

File tree

8 files changed

+6
-713
lines changed

8 files changed

+6
-713
lines changed

src/app/api/openrouter/[...path]/route.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ import { handleRequestLogging } from '@/lib/handleRequestLogging';
7575
import { grokCodeFastOptimizedRequest } from '@/lib/custom-llm/customLlmRequest';
7676
import { normalizeModelId } from '@/lib/model-utils';
7777
import { isForbiddenFreeModel } from '@/lib/forbidden-free-models';
78-
import { isActiveReviewPromo } from '@/lib/code-reviews/core/constants';
7978
import { isCloudflareIP } from '@/lib/cloudflare-ip';
8079
import { applyResolvedAutoModel, isKiloAutoModel } from '@/lib/kilo-auto-model';
8180
import { fixOpenCodeDuplicateReasoning } from '@/lib/providers/fixOpenCodeDuplicateReasoning';
@@ -416,12 +415,7 @@ export async function POST(request: NextRequest): Promise<NextResponseType<unkno
416415
if (!isAnonymousContext(user) && !bypassAccessCheck) {
417416
const { balance, settings, plan } = await balanceAndSettingsPromise;
418417

419-
if (
420-
balance <= 0 &&
421-
!isFreeModel(originalModelIdLowerCased) &&
422-
!userByok &&
423-
!isActiveReviewPromo(botId, originalModelIdLowerCased)
424-
) {
418+
if (balance <= 0 && !isFreeModel(originalModelIdLowerCased) && !userByok) {
425419
return await usageLimitExceededResponse(user, balance);
426420
}
427421

@@ -605,8 +599,7 @@ export async function POST(request: NextRequest): Promise<NextResponseType<unkno
605599

606600
const isFreeModelRequiringCostRemoval =
607601
(provider.id === 'openrouter' || provider.id === 'vercel') &&
608-
(isKiloFreeModel(originalModelIdLowerCased) ||
609-
isActiveReviewPromo(botId, originalModelIdLowerCased));
602+
isKiloFreeModel(originalModelIdLowerCased);
610603
const isStealthModelRequiringNameRemoval = isKiloStealthModel(originalModelIdLowerCased);
611604
const isProviderRequiringResponseFixes = provider.id === 'corethink';
612605

src/components/code-reviews/ReviewConfigForm.tsx

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import { ModelCombobox } from '@/components/shared/ModelCombobox';
3131
import { cn } from '@/lib/utils';
3232
import { RepositoryMultiSelect, type Repository } from './RepositoryMultiSelect';
3333
import { PRIMARY_DEFAULT_MODEL } from '@/lib/models';
34-
import { REVIEW_PROMO_MODEL, REVIEW_PROMO_END } from '@/lib/code-reviews/core/constants';
3534
import {
3635
getAvailableThinkingEfforts,
3736
thinkingEffortLabel,
@@ -195,14 +194,6 @@ export function ReviewConfigForm({
195194
// Fetch available models
196195
const { modelOptions, isLoadingModels } = useOrganizationModels(organizationId);
197196

198-
const promoModelOptions = useMemo(() => {
199-
const promoActive = Date.now() < Date.parse(REVIEW_PROMO_END);
200-
if (!promoActive) return modelOptions;
201-
return modelOptions.map(m =>
202-
m.id === REVIEW_PROMO_MODEL ? { ...m, name: `${m.name} (free)` } : m
203-
);
204-
}, [modelOptions]);
205-
206197
// Local state
207198
const [isEnabled, setIsEnabled] = useState(false);
208199
const [reviewStyle, setReviewStyle] = useState<'strict' | 'balanced' | 'lenient' | 'roast'>(
@@ -553,7 +544,7 @@ export function ReviewConfigForm({
553544
{/* AI Model Selection */}
554545
<ModelCombobox
555546
label="AI Model"
556-
models={promoModelOptions}
547+
models={modelOptions}
557548
value={selectedModel}
558549
onValueChange={setSelectedModel}
559550
isLoading={isLoadingModels}

src/lib/code-reviews/core/constants.ts

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,6 @@ export const DEFAULT_CODE_REVIEW_MODEL = 'anthropic/claude-sonnet-4.6';
1616
*/
1717
export const DEFAULT_CODE_REVIEW_MODE = 'code' as const;
1818

19-
// ============================================================================
20-
// Sonnet 4.6 Review Promotion
21-
// ============================================================================
22-
23-
export const REVIEW_PROMO_MODEL = 'anthropic/claude-sonnet-4.6';
24-
export const REVIEW_PROMO_START = '2026-02-18T14:00:00Z'; // used only for admin logging
25-
export const REVIEW_PROMO_END = '2026-02-25T14:00:00Z';
26-
27-
/** Single source of truth: is the free-review promo active for this request? */
28-
export function isActiveReviewPromo(botId: string | undefined, model: string): boolean {
29-
if (botId !== 'reviewer') return false;
30-
if (model !== REVIEW_PROMO_MODEL) return false;
31-
32-
return Date.now() < Date.parse(REVIEW_PROMO_END);
33-
}
34-
3519
// ============================================================================
3620
// Feature Flags
3721
// ============================================================================

src/lib/code-reviews/triggers/prepare-review-payload.ts

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,6 @@ import {
4242
DEFAULT_CODE_REVIEW_MODEL,
4343
DEFAULT_CODE_REVIEW_MODE,
4444
FEATURE_FLAG_INCREMENTAL_REVIEW,
45-
isActiveReviewPromo,
46-
REVIEW_PROMO_START,
47-
REVIEW_PROMO_END,
4845
} from '../core/constants';
4946
import type { Owner } from '../core';
5047
import { generateReviewPrompt } from '../prompts/generate-prompt';
@@ -440,16 +437,6 @@ export async function prepareReviewPayload(
440437
...(gateThreshold !== 'off' ? { gateThreshold } : {}),
441438
};
442439

443-
if (isActiveReviewPromo('reviewer', sessionInput.model)) {
444-
logExceptInTest('[prepareReviewPayload] Promotional model selected for code review', {
445-
reviewId,
446-
owner,
447-
model: sessionInput.model,
448-
promoStart: REVIEW_PROMO_START,
449-
promoEnd: REVIEW_PROMO_END,
450-
});
451-
}
452-
453440
// Log the session input for GitLab
454441
if (platform === PLATFORM.GITLAB) {
455442
logExceptInTest('[prepareReviewPayload] GitLab session input prepared', {

src/lib/processUsage.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import { getEffectiveKiloPassThreshold } from '@/lib/kilo-pass/threshold';
2828
import { appendKiloPassAuditLog } from '@/lib/kilo-pass/issuance';
2929
import { KiloPassAuditLogAction, KiloPassAuditLogResult } from '@/lib/kilo-pass/enums';
3030
import { reportAbuseCost } from '@/lib/abuse-service';
31-
import { isActiveReviewPromo } from '@/lib/code-reviews/core/constants';
3231
import type {
3332
BalanceUpdateResult,
3433
ChatCompletionChunk,
@@ -839,14 +838,10 @@ async function processTokenData(
839838
console.error('[Abuse] Failed to report cost:', error);
840839
});
841840

842-
// Preserve the real cost before zeroing for free/BYOK/promo
841+
// Preserve the real cost before zeroing for free/BYOK
843842
usageStats.market_cost = usageStats.cost_mUsd;
844843

845-
if (
846-
isFreeModel(usageContext.requested_model) ||
847-
usageContext.user_byok ||
848-
isActiveReviewPromo(usageContext.botId, usageContext.requested_model)
849-
) {
844+
if (isFreeModel(usageContext.requested_model) || usageContext.user_byok) {
850845
usageStats.cost_mUsd = 0;
851846
usageStats.cacheDiscount_mUsd = 0;
852847
}

src/routers/admin-code-reviews-router.ts

Lines changed: 1 addition & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,8 @@
11
import { adminProcedure, createTRPCRouter } from '@/lib/trpc/init';
22
import { db } from '@/lib/drizzle';
3-
import {
4-
cloud_agent_code_reviews,
5-
kilocode_users,
6-
microdollar_usage,
7-
microdollar_usage_metadata,
8-
organizations,
9-
} from '@kilocode/db/schema';
3+
import { cloud_agent_code_reviews, kilocode_users, organizations } from '@kilocode/db/schema';
104
import * as z from 'zod';
115
import { sql, and, gte, lt, eq, isNotNull, isNull, desc, ilike, or, type SQL } from 'drizzle-orm';
12-
import {
13-
REVIEW_PROMO_MODEL,
14-
REVIEW_PROMO_START,
15-
REVIEW_PROMO_END,
16-
isActiveReviewPromo,
17-
} from '@/lib/code-reviews/core/constants';
186

197
/**
208
* SQL condition that identifies billing/credits errors (402 Payment Required).
@@ -639,67 +627,4 @@ export const adminCodeReviewsRouter = createTRPCRouter({
639627

640628
return result;
641629
}),
642-
643-
getReviewPromotionStats: adminProcedure.query(async () => {
644-
// Aggregates: total requests, unique users, unique orgs
645-
const aggregates = await db
646-
.select({
647-
total_requests: sql<number>`COUNT(*)`,
648-
unique_users: sql<number>`COUNT(DISTINCT ${microdollar_usage.kilo_user_id})`,
649-
unique_orgs: sql<number>`COUNT(DISTINCT ${microdollar_usage.organization_id})`,
650-
})
651-
.from(microdollar_usage)
652-
.innerJoin(
653-
microdollar_usage_metadata,
654-
eq(microdollar_usage.id, microdollar_usage_metadata.id)
655-
)
656-
.where(
657-
and(
658-
eq(microdollar_usage.requested_model, REVIEW_PROMO_MODEL),
659-
eq(microdollar_usage.cost, 0),
660-
sql`(${microdollar_usage_metadata.is_user_byok} IS NULL OR ${microdollar_usage_metadata.is_user_byok} = false)`,
661-
gte(microdollar_usage.created_at, REVIEW_PROMO_START),
662-
lt(microdollar_usage.created_at, REVIEW_PROMO_END)
663-
)
664-
);
665-
666-
// Daily breakdown
667-
const daily = await db
668-
.select({
669-
day: sql<string>`DATE_TRUNC('day', ${microdollar_usage.created_at})::date::text`,
670-
total: sql<number>`COUNT(*)`,
671-
unique_users: sql<number>`COUNT(DISTINCT ${microdollar_usage.kilo_user_id})`,
672-
})
673-
.from(microdollar_usage)
674-
.innerJoin(
675-
microdollar_usage_metadata,
676-
eq(microdollar_usage.id, microdollar_usage_metadata.id)
677-
)
678-
.where(
679-
and(
680-
eq(microdollar_usage.requested_model, REVIEW_PROMO_MODEL),
681-
eq(microdollar_usage.cost, 0),
682-
sql`(${microdollar_usage_metadata.is_user_byok} IS NULL OR ${microdollar_usage_metadata.is_user_byok} = false)`,
683-
gte(microdollar_usage.created_at, REVIEW_PROMO_START),
684-
lt(microdollar_usage.created_at, REVIEW_PROMO_END)
685-
)
686-
)
687-
.groupBy(sql`DATE_TRUNC('day', ${microdollar_usage.created_at})`)
688-
.orderBy(sql`DATE_TRUNC('day', ${microdollar_usage.created_at})`);
689-
690-
const agg = aggregates[0];
691-
return {
692-
promoActive: isActiveReviewPromo('reviewer', REVIEW_PROMO_MODEL),
693-
promoStart: REVIEW_PROMO_START,
694-
promoEnd: REVIEW_PROMO_END,
695-
totalRequests: Number(agg.total_requests) || 0,
696-
uniqueUsers: Number(agg.unique_users) || 0,
697-
uniqueOrgs: Number(agg.unique_orgs) || 0,
698-
daily: daily.map(row => ({
699-
day: row.day,
700-
total: Number(row.total) || 0,
701-
uniqueUsers: Number(row.unique_users) || 0,
702-
})),
703-
};
704-
}),
705630
});

0 commit comments

Comments
 (0)