Skip to content

Commit 63780cd

Browse files
authored
Merge pull request #4207 from Kilo-Org/mark/refactor-ghost-provider-tester-more-productioncode
refactor: simplify GhostProviderTester to use shared utility functions
2 parents 4aa6c2a + 7cad03f commit 63780cd

File tree

2 files changed

+46
-49
lines changed

2 files changed

+46
-49
lines changed

src/test-llm-autocompletion/ghost-provider-tester.ts

Lines changed: 13 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,9 @@
11
import { LLMClient } from "./llm-client.js"
22
import { HoleFiller, parseGhostResponse } from "../services/ghost/classic-auto-complete/HoleFiller.js"
33
import { FimPromptBuilder } from "../services/ghost/classic-auto-complete/FillInTheMiddle.js"
4-
import { AutocompleteInput } from "../services/ghost/types.js"
5-
import * as vscode from "vscode"
6-
import crypto from "crypto"
4+
import { extractPrefixSuffix, contextToAutocompleteInput, GhostContextProvider } from "../services/ghost/types.js"
75
import { createContext } from "./utils.js"
8-
9-
// Mock context provider for standalone testing
10-
function createMockContextProvider(prefix: string, suffix: string, filepath: string) {
11-
return {
12-
getProcessedSnippets: async () => ({
13-
filepathUri: `file://${filepath}`,
14-
helper: {
15-
filepath: `file://${filepath}`,
16-
lang: { name: "typescript", singleLineComment: "//" },
17-
prunedPrefix: prefix,
18-
prunedSuffix: suffix,
19-
},
20-
snippetsWithUris: [],
21-
workspaceDirs: [],
22-
}),
23-
} as any
24-
}
25-
26-
/**
27-
* Check if a model supports FIM (Fill-In-Middle) completions.
28-
* This mirrors the logic in KilocodeOpenrouterHandler.supportsFim()
29-
*/
30-
function modelSupportsFim(modelId: string): boolean {
31-
return modelId.includes("codestral")
32-
}
6+
import { createMockContextProvider, modelSupportsFim } from "./mock-context-provider.js"
337

348
export class GhostProviderTester {
359
private llmClient: LLMClient
@@ -45,25 +19,15 @@ export class GhostProviderTester {
4519
testCaseName: string = "test",
4620
): Promise<{ prefix: string; completion: string; suffix: string }> {
4721
const context = createContext(code, testCaseName)
48-
49-
const position = context.range?.start ?? new vscode.Position(0, 0)
50-
const offset = context.document.offsetAt(position)
51-
const text = context.document.getText()
52-
const prefix = text.substring(0, offset)
53-
const suffix = text.substring(offset)
22+
const { prefix, suffix } = extractPrefixSuffix(
23+
context.document,
24+
context.range?.start ?? context.document.positionAt(0),
25+
)
26+
const autocompleteInput = contextToAutocompleteInput(context)
5427
const languageId = context.document.languageId || "javascript"
55-
const filepath = context.document.uri.fsPath
5628

57-
// Common setup
58-
const mockContextProvider = createMockContextProvider(prefix, suffix, filepath)
59-
const autocompleteInput: AutocompleteInput = {
60-
isUntitledFile: false,
61-
completionId: crypto.randomUUID(),
62-
filepath,
63-
pos: { line: position.line, character: position.character },
64-
recentlyVisitedRanges: [],
65-
recentlyEditedRanges: [],
66-
}
29+
// Create mock context provider
30+
const mockContextProvider = createMockContextProvider(prefix, suffix, autocompleteInput.filepath)
6731

6832
// Auto-detect strategy based on model capabilities
6933
const supportsFim = modelSupportsFim(this.model)
@@ -75,8 +39,8 @@ export class GhostProviderTester {
7539
}
7640

7741
private async getFimCompletion(
78-
contextProvider: ReturnType<typeof createMockContextProvider>,
79-
autocompleteInput: AutocompleteInput,
42+
contextProvider: GhostContextProvider,
43+
autocompleteInput: ReturnType<typeof contextToAutocompleteInput>,
8044
): Promise<string> {
8145
const fimPromptBuilder = new FimPromptBuilder(contextProvider)
8246
const prompt = await fimPromptBuilder.getFimPrompts(autocompleteInput, this.model)
@@ -85,8 +49,8 @@ export class GhostProviderTester {
8549
}
8650

8751
private async getHoleFillerCompletion(
88-
contextProvider: ReturnType<typeof createMockContextProvider>,
89-
autocompleteInput: AutocompleteInput,
52+
contextProvider: GhostContextProvider,
53+
autocompleteInput: ReturnType<typeof contextToAutocompleteInput>,
9054
languageId: string,
9155
prefix: string,
9256
suffix: string,
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { GhostContextProvider } from "../services/ghost/types.js"
2+
3+
/**
4+
* Check if a model supports FIM (Fill-In-Middle) completions.
5+
* This mirrors the logic in KilocodeOpenrouterHandler.supportsFim()
6+
*/
7+
export function modelSupportsFim(modelId: string): boolean {
8+
return modelId.includes("codestral")
9+
}
10+
11+
/**
12+
* Create a mock GhostContextProvider for standalone testing.
13+
* This provider simulates the context retrieval without requiring VSCode services.
14+
*/
15+
export function createMockContextProvider(prefix: string, suffix: string, filepath: string): GhostContextProvider {
16+
return {
17+
ide: {
18+
readFile: async () => prefix + suffix,
19+
getWorkspaceDirs: async () => [],
20+
getClipboardContent: async () => ({ text: "", copiedAt: new Date().toISOString() }),
21+
},
22+
contextService: {
23+
initializeForFile: async () => {},
24+
getRootPathSnippets: async () => [],
25+
getSnippetsFromImportDefinitions: async () => [],
26+
getStaticContextSnippets: async () => [],
27+
},
28+
model: {
29+
supportsFim: () => modelSupportsFim(process.env.LLM_MODEL || "mistralai/codestral-2508"),
30+
getModelName: () => process.env.LLM_MODEL || "mistralai/codestral-2508",
31+
},
32+
} as unknown as GhostContextProvider
33+
}

0 commit comments

Comments
 (0)