refactor: generalize prompt enhancement into single completion handler

- Rename enhance-prompt.ts to single-completion-handler.ts for better clarity
- Refactor enhancement logic to be more generic and reusable
- Update prompt template handling to use template literals
- Adjust tests and imports accordingly
This commit is contained in:
sam hoang
2025-01-24 01:14:48 +07:00
parent 149e86ed0a
commit 085d42873c
5 changed files with 39 additions and 28 deletions

View File

@@ -36,7 +36,7 @@ import { getNonce } from "./getNonce"
import { getUri } from "./getUri" import { getUri } from "./getUri"
import { playSound, setSoundEnabled, setSoundVolume } from "../../utils/sound" import { playSound, setSoundEnabled, setSoundVolume } from "../../utils/sound"
import { checkExistKey } from "../../shared/checkExistApiConfig" import { checkExistKey } from "../../shared/checkExistApiConfig"
import { enhancePrompt } from "../../utils/enhance-prompt" import { singleCompletionHandler } from "../../utils/single-completion-handler"
import { getCommitInfo, searchCommits, getWorkingState } from "../../utils/git" import { getCommitInfo, searchCommits, getWorkingState } from "../../utils/git"
import { ConfigManager } from "../config/ConfigManager" import { ConfigManager } from "../config/ConfigManager"
import { CustomModesManager } from "../config/CustomModesManager" import { CustomModesManager } from "../config/CustomModesManager"
@@ -996,11 +996,17 @@ export class ClineProvider implements vscode.WebviewViewProvider {
} }
} }
const enhancedPrompt = await enhancePrompt( const enhancedPrompt = await singleCompletionHandler(
configToUse, configToUse,
message.text, supportPrompt.create(
supportPrompt.get(customPrompts, "ENHANCE"), "ENHANCE",
{
userInput: message.text,
},
customPrompts,
),
) )
await this.postMessageToWebview({ await this.postMessageToWebview({
type: "enhancedPrompt", type: "enhancedPrompt",
text: enhancedPrompt, text: enhancedPrompt,

View File

@@ -77,12 +77,11 @@ describe("Code Action Prompts", () => {
describe("ENHANCE action", () => { describe("ENHANCE action", () => {
it("should format enhance prompt correctly", () => { it("should format enhance prompt correctly", () => {
const prompt = supportPrompt.create("ENHANCE", { const prompt = supportPrompt.create("ENHANCE", {
filePath: testFilePath, userInput: "test",
selectedText: testCode,
}) })
expect(prompt).toBe( expect(prompt).toBe(
"Generate an enhanced version of this prompt (reply with only the enhanced prompt - no conversation, explanations, lead-in, bullet points, placeholders, or surrounding quotes):", "Generate an enhanced version of this prompt (reply with only the enhanced prompt - no conversation, explanations, lead-in, bullet points, placeholders, or surrounding quotes):\n\ntest",
) )
// Verify it ignores parameters since ENHANCE template doesn't use any // Verify it ignores parameters since ENHANCE template doesn't use any
expect(prompt).not.toContain(testFilePath) expect(prompt).not.toContain(testFilePath)

View File

@@ -68,8 +68,9 @@ Please suggest improvements for:
Provide the improved code along with explanations for each enhancement. Provide the improved code along with explanations for each enhancement.
` `
const ENHANCE_TEMPLATE = const ENHANCE_TEMPLATE = `Generate an enhanced version of this prompt (reply with only the enhanced prompt - no conversation, explanations, lead-in, bullet points, placeholders, or surrounding quotes):
"Generate an enhanced version of this prompt (reply with only the enhanced prompt - no conversation, explanations, lead-in, bullet points, placeholders, or surrounding quotes):"
\${userInput}`
// Get template based on prompt type // Get template based on prompt type
const defaultTemplates = { const defaultTemplates = {

View File

@@ -1,7 +1,7 @@
import { enhancePrompt } from "../enhance-prompt" import { singleCompletionHandler } from "../single-completion-handler"
import { ApiConfiguration } from "../../shared/api" import { ApiConfiguration } from "../../shared/api"
import { buildApiHandler, SingleCompletionHandler } from "../../api" import { buildApiHandler, SingleCompletionHandler } from "../../api"
import { defaultPrompts } from "../../shared/modes" import { supportPrompt } from "../../shared/support-prompt"
// Mock the API handler // Mock the API handler
jest.mock("../../api", () => ({ jest.mock("../../api", () => ({
@@ -34,17 +34,29 @@ describe("enhancePrompt", () => {
}) })
it("enhances prompt using default enhancement prompt when no custom prompt provided", async () => { it("enhances prompt using default enhancement prompt when no custom prompt provided", async () => {
const result = await enhancePrompt(mockApiConfig, "Test prompt") const result = await singleCompletionHandler(mockApiConfig, "Test prompt")
expect(result).toBe("Enhanced prompt") expect(result).toBe("Enhanced prompt")
const handler = buildApiHandler(mockApiConfig) const handler = buildApiHandler(mockApiConfig)
expect((handler as any).completePrompt).toHaveBeenCalledWith(`${defaultPrompts.enhance}\n\nTest prompt`) expect((handler as any).completePrompt).toHaveBeenCalledWith(`Test prompt`)
}) })
it("enhances prompt using custom enhancement prompt when provided", async () => { it("enhances prompt using custom enhancement prompt when provided", async () => {
const customEnhancePrompt = "You are a custom prompt enhancer" const customEnhancePrompt = "You are a custom prompt enhancer"
const customEnhancePromptWithTemplate = customEnhancePrompt + "\n\n${userInput}"
const result = await enhancePrompt(mockApiConfig, "Test prompt", customEnhancePrompt) const result = await singleCompletionHandler(
mockApiConfig,
supportPrompt.create(
"ENHANCE",
{
userInput: "Test prompt",
},
{
ENHANCE: customEnhancePromptWithTemplate,
},
),
)
expect(result).toBe("Enhanced prompt") expect(result).toBe("Enhanced prompt")
const handler = buildApiHandler(mockApiConfig) const handler = buildApiHandler(mockApiConfig)
@@ -52,11 +64,11 @@ describe("enhancePrompt", () => {
}) })
it("throws error for empty prompt input", async () => { it("throws error for empty prompt input", async () => {
await expect(enhancePrompt(mockApiConfig, "")).rejects.toThrow("No prompt text provided") await expect(singleCompletionHandler(mockApiConfig, "")).rejects.toThrow("No prompt text provided")
}) })
it("throws error for missing API configuration", async () => { it("throws error for missing API configuration", async () => {
await expect(enhancePrompt({} as ApiConfiguration, "Test prompt")).rejects.toThrow( await expect(singleCompletionHandler({} as ApiConfiguration, "Test prompt")).rejects.toThrow(
"No valid API configuration provided", "No valid API configuration provided",
) )
}) })
@@ -75,7 +87,7 @@ describe("enhancePrompt", () => {
}), }),
}) })
await expect(enhancePrompt(mockApiConfig, "Test prompt")).rejects.toThrow( await expect(singleCompletionHandler(mockApiConfig, "Test prompt")).rejects.toThrow(
"The selected API provider does not support prompt enhancement", "The selected API provider does not support prompt enhancement",
) )
}) })
@@ -101,7 +113,7 @@ describe("enhancePrompt", () => {
}), }),
} as unknown as SingleCompletionHandler) } as unknown as SingleCompletionHandler)
const result = await enhancePrompt(openRouterConfig, "Test prompt") const result = await singleCompletionHandler(openRouterConfig, "Test prompt")
expect(buildApiHandler).toHaveBeenCalledWith(openRouterConfig) expect(buildApiHandler).toHaveBeenCalledWith(openRouterConfig)
expect(result).toBe("Enhanced prompt") expect(result).toBe("Enhanced prompt")
@@ -121,6 +133,6 @@ describe("enhancePrompt", () => {
}), }),
} as unknown as SingleCompletionHandler) } as unknown as SingleCompletionHandler)
await expect(enhancePrompt(mockApiConfig, "Test prompt")).rejects.toThrow("API Error") await expect(singleCompletionHandler(mockApiConfig, "Test prompt")).rejects.toThrow("API Error")
}) })
}) })

View File

@@ -1,16 +1,11 @@
import { ApiConfiguration } from "../shared/api" import { ApiConfiguration } from "../shared/api"
import { buildApiHandler, SingleCompletionHandler } from "../api" import { buildApiHandler, SingleCompletionHandler } from "../api"
import { defaultPrompts } from "../shared/modes"
/** /**
* Enhances a prompt using the configured API without creating a full Cline instance or task history. * Enhances a prompt using the configured API without creating a full Cline instance or task history.
* This is a lightweight alternative that only uses the API's completion functionality. * This is a lightweight alternative that only uses the API's completion functionality.
*/ */
export async function enhancePrompt( export async function singleCompletionHandler(apiConfiguration: ApiConfiguration, promptText: string): Promise<string> {
apiConfiguration: ApiConfiguration,
promptText: string,
enhancePrompt?: string,
): Promise<string> {
if (!promptText) { if (!promptText) {
throw new Error("No prompt text provided") throw new Error("No prompt text provided")
} }
@@ -25,7 +20,5 @@ export async function enhancePrompt(
throw new Error("The selected API provider does not support prompt enhancement") throw new Error("The selected API provider does not support prompt enhancement")
} }
const enhancePromptText = enhancePrompt ?? defaultPrompts.enhance return (handler as SingleCompletionHandler).completePrompt(promptText)
const prompt = `${enhancePromptText}\n\n${promptText}`
return (handler as SingleCompletionHandler).completePrompt(prompt)
} }