Skip to content

Commit 969e6c6

Browse files
authored
feat(core): add api provider filtering for modes and workflow features (#665)
1 parent 40ea0ec commit 969e6c6

File tree

21 files changed

+191
-45
lines changed

21 files changed

+191
-45
lines changed

packages/types/src/experiment.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import type { Keys, Equals, AssertEqual } from "./type-fu.js"
88

99
export const experimentIds = [
1010
"chatSearch",
11+
"commitReview",
1112
"alwaysIncludeFileDetails",
1213
"powerSteering",
1314
"multiFileApplyDiff",
@@ -27,6 +28,7 @@ export type ExperimentId = z.infer<typeof experimentIdsSchema>
2728
export const experimentsSchema = z.object({
2829
chatSearch: z.boolean().optional(),
2930
alwaysIncludeFileDetails: z.boolean().optional(),
31+
commitReview: z.boolean().optional(),
3032
powerSteering: z.boolean().optional(),
3133
multiFileApplyDiff: z.boolean().optional(),
3234
preventFocusDisruption: z.boolean().optional(),

packages/types/src/mode.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ export const modeConfigSchema = z.object({
7171
groups: groupEntryArraySchema,
7272
source: z.enum(["global", "project"]).optional(),
7373
workflow: z.boolean().optional(),
74+
apiProvider: z.string().optional(),
7475
})
7576

7677
export type ModeConfig = z.infer<typeof modeConfigSchema>
@@ -145,6 +146,7 @@ const WORKFLOW_MODES: readonly modelType[] = [
145146
groups: [],
146147
source: "project",
147148
workflow: true,
149+
apiProvider: "zgsm",
148150
},
149151
{
150152
slug: "requirements",
@@ -160,6 +162,7 @@ const WORKFLOW_MODES: readonly modelType[] = [
160162
groups: ["read", "edit"],
161163
source: "project",
162164
workflow: true,
165+
apiProvider: "zgsm",
163166
},
164167
{
165168
slug: "task",
@@ -175,6 +178,7 @@ const WORKFLOW_MODES: readonly modelType[] = [
175178
groups: ["read", "edit"],
176179
source: "project",
177180
workflow: true,
181+
apiProvider: "zgsm",
178182
},
179183
{
180184
slug: "test",
@@ -189,6 +193,7 @@ const WORKFLOW_MODES: readonly modelType[] = [
189193
groups: ["read", "edit", "command"],
190194
source: "project",
191195
workflow: true,
196+
apiProvider: "zgsm",
192197
},
193198
{
194199
slug: "testguide",
@@ -199,6 +204,7 @@ const WORKFLOW_MODES: readonly modelType[] = [
199204
groups: ["read", "edit", "command"],
200205
source: "project",
201206
workflow: true,
207+
apiProvider: "zgsm",
202208
},
203209
{
204210
slug: "review",
@@ -211,6 +217,7 @@ const WORKFLOW_MODES: readonly modelType[] = [
211217
groups: ["read", "mcp", "browser"],
212218
source: "project",
213219
workflow: false,
220+
apiProvider: "zgsm",
214221
},
215222
]
216223

src/api/providers/zgsm.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@ export class ZgsmAiHandler extends BaseProvider implements SingleCompletionHandl
277277
"zgsm-task-id": metadata?.taskId || "",
278278
"zgsm-request-id": requestId,
279279
"zgsm-client-id": clientId,
280+
"zgsm-provider": metadata?.provider,
280281
"zgsm-project-path": encodeURI(workspacePath),
281282
"x-caller": metadata?.mode === "review" ? "review-checker" : "chat",
282283
}
@@ -563,7 +564,7 @@ export class ZgsmAiHandler extends BaseProvider implements SingleCompletionHandl
563564
Object.assign(isAzureAiInference ? { path: OPENAI_AZURE_AI_INFERENCE_PATH } : {}, {
564565
headers: {
565566
...this.buildHeaders(
566-
{ language: metadata?.language, taskId: requestId },
567+
{ language: metadata?.language, taskId: requestId, provider: metadata?.provider },
567568
requestId,
568569
cachedClientId,
569570
cachedWorkspacePath,

src/core/costrict/code-review/gitCommitListener.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as vscode from "vscode"
22
import { API as GitAPI, Repository, GitExtension } from "./git"
33
import type { CodeReviewService } from "./codeReviewService"
44
import { t } from "../../../i18n"
5+
import { EXPERIMENT_IDS, experiments as Experiments } from "../../../shared/experiments"
56

67
export class GitCommitListener {
78
private lastSeenCommitHash: string | undefined
@@ -53,7 +54,15 @@ export class GitCommitListener {
5354
}
5455

5556
private setupRepositoryListener(repo: Repository): void {
56-
const disposable = repo.onDidCommit(() => {
57+
const disposable = repo.onDidCommit(async () => {
58+
const provider = this.reviewService.getProvider()
59+
60+
if (!provider) return
61+
62+
const { experiments = {} } = await provider.getState()
63+
64+
if (!Experiments.isEnabled(experiments ?? {}, EXPERIMENT_IDS.COMMIT_REVIEW)) return
65+
5766
this.handleNewCommit(repo)
5867
})
5968
this.disposables.push(disposable)

src/core/costrict/workflow/CoworkflowFileWatcher.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ export class CoworkflowFileWatcher implements ICoworkflowFileWatcher {
248248
this.config.watchPatterns.forEach((pattern) => {
249249
try {
250250
const filePath = path.join(coworkflowPath, pattern)
251-
const fileUri = vscode.Uri.file(filePath)
251+
// const fileUri = vscode.Uri.file(filePath)
252252
const globPattern = new vscode.RelativePattern(coworkflowPath, pattern)
253253

254254
const watcher = vscode.workspace.createFileSystemWatcher(globPattern)

src/core/task/Task.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1956,7 +1956,6 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
19561956
maxReadFileLine = -1,
19571957
maxReadCharacterLimit = 20000,
19581958
apiRequestBlockHide = true,
1959-
apiConfiguration,
19601959
} = (await this.providerRef.deref()?.getState()) ?? {}
19611960

19621961
await this.say(
@@ -1967,7 +1966,10 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
19671966
: currentUserContent.map((block) => formatContentBlockToMarkdown(block)).join("\n\n") +
19681967
"\n\nLoading...",
19691968
apiProtocol,
1970-
originModelId: apiConfiguration?.zgsmModelId,
1969+
originModelId:
1970+
this.apiConfiguration?.apiProvider === "zgsm"
1971+
? this.apiConfiguration?.zgsmModelId
1972+
: this.apiConfiguration?.apiModelId,
19711973
}),
19721974
)
19731975

@@ -2010,7 +2012,10 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
20102012
? undefined
20112013
: finalUserContent.map((block) => formatContentBlockToMarkdown(block)).join("\n\n"),
20122014
apiProtocol,
2013-
originModelId: apiConfiguration?.zgsmModelId,
2015+
originModelId:
2016+
this.apiConfiguration?.apiProvider === "zgsm"
2017+
? this.apiConfiguration?.zgsmModelId
2018+
: this.apiConfiguration?.apiModelId,
20142019
} satisfies ClineApiReqInfo)
20152020

20162021
await this.saveClineMessages()
@@ -2067,6 +2072,10 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
20672072
cost: totalCost ?? costResult.totalCost,
20682073
cancelReason,
20692074
streamingFailedMessage,
2075+
originModelId:
2076+
this.apiConfiguration?.apiProvider === "zgsm"
2077+
? this.apiConfiguration?.zgsmModelId
2078+
: this.apiConfiguration?.apiModelId,
20702079
} satisfies ClineApiReqInfo)
20712080
}
20722081

@@ -2195,7 +2204,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
21952204
case "automodel": {
21962205
// Check if it is Selected LLM information (only in Auto model mode).
21972206
if (
2198-
this.apiConfiguration.apiProvider === "zgsm" &&
2207+
this.apiConfiguration?.apiProvider === "zgsm" &&
21992208
lastApiReqIndex >= 0 &&
22002209
this.clineMessages[lastApiReqIndex]
22012210
) {
@@ -3169,6 +3178,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
31693178
const metadata: ApiHandlerCreateMessageMetadata = {
31703179
mode: mode,
31713180
zgsmCodeMode,
3181+
provider: this.apiConfiguration.apiProvider,
31723182
zgsmWorkflowMode: this.zgsmWorkflowMode,
31733183
rooTaskMode: this?.rootTask?._taskMode,
31743184
parentTaskMode: this?.parentTask?._taskMode,
@@ -3199,7 +3209,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
31993209
yield firstChunk.value
32003210
this.isWaitingForFirstChunk = false
32013211
} catch (error) {
3202-
const isZgsm = apiConfiguration?.apiProvider === "zgsm"
3212+
const isZgsm = this.apiConfiguration?.apiProvider === "zgsm"
32033213
let errorMsg = ""
32043214
if (isZgsm) {
32053215
const errorCodeManager = ErrorCodeManager.getInstance()

src/core/webview/webviewMessageHandler.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,21 @@ export const webviewMessageHandler = async (
442442
}
443443

444444
switch (message.type) {
445+
case "zgsmProviderTip": {
446+
const { tipType = "", msg = "" } = message.values || {}
447+
448+
if (!tipType || !msg) break
449+
450+
if (tipType === "info") {
451+
vscode.window.showInformationMessage(msg)
452+
} else if (tipType === "warning") {
453+
vscode.window.showWarningMessage(msg)
454+
} else if (tipType === "error") {
455+
vscode.window.showErrorMessage(msg)
456+
}
457+
458+
break
459+
}
445460
case "zgsmLogin": {
446461
try {
447462
TelemetryService.instance.captureEvent(TelemetryEventName.AUTHENTICATION_INITIATED)
@@ -666,7 +681,9 @@ export const webviewMessageHandler = async (
666681
const mcpHub = provider.getMcpHub()
667682

668683
if (mcpHub) {
669-
await Promise.race([mcpHub.handleMcpEnabledChange(newValue as boolean), delay(1500)])
684+
await Promise.race([mcpHub.handleMcpEnabledChange(newValue as boolean), delay(500)]).catch(
685+
() => {},
686+
)
670687
}
671688
} else if (key === "experiments") {
672689
if (!value) {

src/shared/WebviewMessage.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ export interface WebviewMessage {
157157
| "useZgsmCustomConfig"
158158
| "showZgsmCodebaseDisableConfirmDialog"
159159
| "fetchZgsmQuotaInfo"
160+
| "zgsmProviderTip"
160161
| "fetchZgsmInviteCode"
161162
| "fixCodebase"
162163
| "zgsmFollowupClearTimeout"

src/shared/__tests__/experiments.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ describe("experiments", () => {
2828
const experiments: Record<ExperimentId, boolean> = {
2929
powerSteering: false,
3030
multiFileApplyDiff: false,
31+
commitReview: false,
3132
preventFocusDisruption: false,
3233
imageGeneration: false,
3334
chatSearch: false,
@@ -43,6 +44,7 @@ describe("experiments", () => {
4344
multiFileApplyDiff: false,
4445
chatSearch: false,
4546
alwaysIncludeFileDetails: false,
47+
commitReview: false,
4648
preventFocusDisruption: false,
4749
imageGeneration: false,
4850
runSlashCommand: false,
@@ -56,6 +58,7 @@ describe("experiments", () => {
5658
multiFileApplyDiff: false,
5759
chatSearch: false,
5860
alwaysIncludeFileDetails: false,
61+
commitReview: false,
5962
preventFocusDisruption: false,
6063
imageGeneration: false,
6164
runSlashCommand: false,

src/shared/experiments.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { AssertEqual, Equals, Keys, Values, ExperimentId, Experiments } fro
33
export const EXPERIMENT_IDS = {
44
CHAT_SEARCH: "chatSearch",
55
ALWAYS_INCLUDE_FILE_DETAILS: "alwaysIncludeFileDetails",
6+
COMMIT_REVIEW: "commitReview",
67
MULTI_FILE_APPLY_DIFF: "multiFileApplyDiff",
78
POWER_STEERING: "powerSteering",
89
PREVENT_FOCUS_DISRUPTION: "preventFocusDisruption",
@@ -21,6 +22,7 @@ interface ExperimentConfig {
2122
export const experimentConfigsMap: Record<ExperimentKey, ExperimentConfig> = {
2223
CHAT_SEARCH: { enabled: false },
2324
ALWAYS_INCLUDE_FILE_DETAILS: { enabled: undefined },
25+
COMMIT_REVIEW: { enabled: undefined },
2426
MULTI_FILE_APPLY_DIFF: { enabled: false },
2527
POWER_STEERING: { enabled: false },
2628
PREVENT_FOCUS_DISRUPTION: { enabled: false },

0 commit comments

Comments
 (0)