Skip to content

Commit b676439

Browse files
committed
feat: add beta models gating for axon-code-2-pro
- Add backend API endpoint integration for beta model availability - Implement betaModelsEnabled state in ExtensionStateContext - Filter axon-code-2-pro from model list when beta not enabled - Add message types for fetchBetaModelsRequest and betaModelsResponse - Fix openrouter baseURL configuration (remove hardcoded localhost) - Fix indentation in openrouter.ts CompletionUsage interface
1 parent 019604e commit b676439

File tree

9 files changed

+95
-3
lines changed

9 files changed

+95
-3
lines changed

src/api/providers/openrouter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH
143143
const baseURL = this.options.openRouterBaseUrl || "https://api2.matterai.so/v1/web"
144144
const apiKey = this.options.openRouterApiKey ?? "not-provided"
145145

146-
this.client = new OpenAI({ baseURL: "http://localhost:4064/v1/web", apiKey, defaultHeaders: DEFAULT_HEADERS })
146+
this.client = new OpenAI({ baseURL, apiKey, defaultHeaders: DEFAULT_HEADERS })
147147
}
148148

149149
// kilocode_change start

src/core/webview/webviewMessageHandler.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3661,6 +3661,42 @@ ${comment.suggestion}
36613661
})
36623662
}
36633663
break
3664+
case "fetchBetaModelsRequest": // New handler for beta models
3665+
try {
3666+
const { apiConfiguration } = await provider.getState()
3667+
const kilocodeToken = apiConfiguration?.kilocodeToken
3668+
3669+
if (!kilocodeToken) {
3670+
provider.log("KiloCode token not found in extension state for beta models.")
3671+
provider.postMessageToWebview({
3672+
type: "betaModelsResponse",
3673+
payload: { success: false, error: "KiloCode API token not configured." },
3674+
})
3675+
break
3676+
}
3677+
3678+
const headers: Record<string, string> = {
3679+
Authorization: `Bearer ${kilocodeToken}`,
3680+
"Content-Type": "application/json",
3681+
}
3682+
3683+
const url = "https://api.matterai.so/axoncode/betamodels"
3684+
const response = await axios.get<{ enabled: boolean }>(url, { headers })
3685+
3686+
provider.postMessageToWebview({
3687+
type: "betaModelsResponse",
3688+
payload: { success: true, enabled: response.data.enabled },
3689+
})
3690+
} catch (error: any) {
3691+
const errorMessage =
3692+
error.response?.data?.message || error.message || "Failed to fetch beta models data from backend."
3693+
provider.log(`Error fetching beta models data: ${errorMessage}`)
3694+
provider.postMessageToWebview({
3695+
type: "betaModelsResponse",
3696+
payload: { success: false, error: errorMessage },
3697+
})
3698+
}
3699+
break
36643700

36653701
case "fetchMcpMarketplace": {
36663702
await provider.fetchMcpMarketplace(message.bool)

src/shared/ExtensionMessage.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { Mode } from "./modes"
2525
// kilocode_change start
2626
import {
2727
BalanceDataResponsePayload,
28+
BetaModelsResponsePayload,
2829
ProfileDataResponsePayload,
2930
TaskHistoryResponsePayload,
3031
TasksByIdResponsePayload,
@@ -130,6 +131,7 @@ export interface ExtensionMessage {
130131
| "profileDataResponse" // kilocode_change
131132
| "balanceDataResponse" // kilocode_change
132133
| "updateProfileData" // kilocode_change
134+
| "betaModelsResponse" // kilocode_change
133135
| "authenticatedUser"
134136
| "condenseTaskContextResponse"
135137
| "singleRouterModelFetchResponse"
@@ -165,6 +167,7 @@ export interface ExtensionMessage {
165167
payload?:
166168
| ProfileDataResponsePayload
167169
| BalanceDataResponsePayload
170+
| BetaModelsResponsePayload
168171
| TasksByIdResponsePayload
169172
| TaskHistoryResponsePayload
170173
| ImplementPlanPayload

src/shared/WebviewMessage.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ export interface WebviewMessage {
229229
| "shopBuyCredits" // kilocode_change
230230
| "balanceDataResponse" // kilocode_change
231231
| "updateProfileData" // kilocode_change
232+
| "fetchBetaModelsRequest" // kilocode_change
233+
| "betaModelsResponse" // kilocode_change
232234
| "condense" // kilocode_change
233235
| "toggleWorkflow" // kilocode_change
234236
| "refreshRules" // kilocode_change
@@ -472,6 +474,13 @@ export interface BalanceDataResponsePayload {
472474
error?: string
473475
}
474476

477+
export interface BetaModelsResponsePayload {
478+
// Payload for beta models availability
479+
success: boolean
480+
enabled?: boolean
481+
error?: string
482+
}
483+
475484
export interface SeeNewChangesPayload {
476485
commitRange: CommitRange
477486
}
@@ -593,6 +602,7 @@ export type WebViewMessagePayload =
593602
// kilocode_change start
594603
| ProfileDataResponsePayload
595604
| BalanceDataResponsePayload
605+
| BetaModelsResponsePayload
596606
| SeeNewChangesPayload
597607
| TasksByIdRequestPayload
598608
| TaskHistoryRequestPayload

webview-ui/src/App.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,13 @@ const App = () => {
251251
// Tell the extension that we are ready to receive messages.
252252
useEffect(() => vscode.postMessage({ type: "webviewDidLaunch" }), [])
253253

254+
// kilocode_change start: Fetch beta models availability on mount
255+
useEffect(() => {
256+
if (didHydrateState && apiConfiguration?.kilocodeToken) {
257+
vscode.postMessage({ type: "fetchBetaModelsRequest" })
258+
}
259+
}, [didHydrateState, apiConfiguration?.kilocodeToken])
260+
254261
// Initialize source map support for better error reporting
255262
useEffect(() => {
256263
// Initialize source maps for better error reporting in production

webview-ui/src/components/kilocode/common/OrganizationSelector.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ export const OrganizationSelector = ({ className, showLabel = false }: { classNa
7777
apiKey: apiConfiguration?.kilocodeToken,
7878
},
7979
})
80+
vscode.postMessage({
81+
type: "fetchBetaModelsRequest",
82+
})
8083
} else {
8184
vscode.postMessage({
8285
type: "upsertApiConfiguration",
@@ -89,6 +92,9 @@ export const OrganizationSelector = ({ className, showLabel = false }: { classNa
8992
vscode.postMessage({
9093
type: "fetchBalanceDataRequest",
9194
})
95+
vscode.postMessage({
96+
type: "fetchBetaModelsRequest",
97+
})
9298
}
9399
}
94100

webview-ui/src/components/kilocode/hooks/useProviderModels.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useMemo } from "react"
12
import {
23
type ProviderName,
34
type ProviderSettings,
@@ -64,10 +65,12 @@ export const getModelsByProvider = ({
6465
provider,
6566
routerModels,
6667
kilocodeDefaultModel,
68+
_betaModelsEnabled,
6769
}: {
6870
provider: ProviderName
6971
routerModels: RouterModels
7072
kilocodeDefaultModel: string
73+
_betaModelsEnabled?: boolean
7174
}): { models: ModelRecord; defaultModel: string } => {
7275
switch (provider) {
7376
case "openrouter": {
@@ -296,7 +299,7 @@ export const getModelsByProvider = ({
296299
export const useProviderModels = (apiConfiguration?: ProviderSettings) => {
297300
const provider = apiConfiguration?.apiProvider || "anthropic"
298301

299-
const { kilocodeDefaultModel } = useExtensionState()
302+
const { kilocodeDefaultModel, betaModelsEnabled } = useExtensionState()
300303

301304
const routerModels = useRouterModels({
302305
openRouterBaseUrl: apiConfiguration?.openRouterBaseUrl,
@@ -315,12 +318,24 @@ export const useProviderModels = (apiConfiguration?: ProviderSettings) => {
315318
provider,
316319
routerModels: routerModels.data,
317320
kilocodeDefaultModel,
321+
_betaModelsEnabled: betaModelsEnabled,
318322
})
319323
: FALLBACK_MODELS
320324

325+
// kilocode_change start: Filter out axon-code-2-pro if beta models are not enabled
326+
const filteredModels = useMemo(() => {
327+
if (betaModelsEnabled) {
328+
return models
329+
}
330+
// Filter out axon-code-2-pro when beta models are not enabled
331+
const { "axon-code-2-pro": _, ...rest } = models as ModelRecord
332+
return rest
333+
}, [models, betaModelsEnabled])
334+
// kilocode_change end
335+
321336
return {
322337
provider,
323-
providerModels: models as ModelRecord,
338+
providerModels: filteredModels as ModelRecord,
324339
providerDefaultModel: defaultModel,
325340
isLoading: routerModels.isLoading,
326341
isError: routerModels.isError,

webview-ui/src/components/kilocode/profile/ProfileView.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ const ProfileView: React.FC<ProfileViewProps> = ({ onDone }) => {
3434
useEffect(() => {
3535
vscode.postMessage({ type: "fetchProfileDataRequest" })
3636
vscode.postMessage({ type: "fetchBalanceDataRequest" })
37+
vscode.postMessage({ type: "fetchBetaModelsRequest" })
3738
}, [apiConfiguration?.kilocodeToken, organizationId])
3839

3940
useEffect(() => {
@@ -64,6 +65,9 @@ const ProfileView: React.FC<ProfileViewProps> = ({ onDone }) => {
6465
vscode.postMessage({
6566
type: "fetchBalanceDataRequest",
6667
})
68+
vscode.postMessage({
69+
type: "fetchBetaModelsRequest",
70+
})
6771
}
6872
}
6973

webview-ui/src/context/ExtensionStateContext.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ export interface ExtensionStateContextType extends ExtensionState {
205205
currentTokens: number
206206
maxTokens: number
207207
} // kilocode_change: Track context window usage
208+
betaModelsEnabled?: boolean // kilocode_change: Beta models availability
208209
}
209210

210211
export const ExtensionStateContext = createContext<ExtensionStateContextType | undefined>(undefined)
@@ -406,6 +407,16 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode
406407
}
407408
break
408409
}
410+
case "betaModelsResponse": {
411+
if (message.payload && "enabled" in message.payload) {
412+
const betaPayload = message.payload as { enabled?: boolean }
413+
setState((prevState) => ({
414+
...prevState,
415+
betaModelsEnabled: betaPayload.enabled,
416+
}))
417+
}
418+
break
419+
}
409420
case "action": {
410421
if (message.action === "toggleAutoApprove") {
411422
// Toggle the auto-approval state

0 commit comments

Comments
 (0)