generateSystemPrompt.ts 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import * as vscode from "vscode"
  2. import { WebviewMessage } from "../../shared/WebviewMessage"
  3. import { defaultModeSlug, getModeBySlug, getGroupName } from "../../shared/modes"
  4. import { buildApiHandler } from "../../api"
  5. import { SYSTEM_PROMPT } from "../prompts/system"
  6. import { MultiSearchReplaceDiffStrategy } from "../diff/strategies/multi-search-replace"
  7. import { Package } from "../../shared/package"
  8. import { ClineProvider } from "./ClineProvider"
  9. export const generateSystemPrompt = async (provider: ClineProvider, message: WebviewMessage) => {
  10. const {
  11. apiConfiguration,
  12. customModePrompts,
  13. customInstructions,
  14. browserViewportSize,
  15. mcpEnabled,
  16. experiments,
  17. browserToolEnabled,
  18. language,
  19. enableSubfolderRules,
  20. } = await provider.getState()
  21. const diffStrategy = new MultiSearchReplaceDiffStrategy()
  22. const cwd = provider.cwd
  23. const mode = message.mode ?? defaultModeSlug
  24. const customModes = await provider.customModesManager.getCustomModes()
  25. const rooIgnoreInstructions = provider.getCurrentTask()?.rooIgnoreController?.getInstructions()
  26. // Determine if browser tools can be used based on model support, mode, and user settings
  27. let modelInfo: any = undefined
  28. // Create a temporary API handler to check if the model supports browser capability
  29. // This avoids relying on an active Cline instance which might not exist during preview
  30. try {
  31. const tempApiHandler = buildApiHandler(apiConfiguration)
  32. modelInfo = tempApiHandler.getModel().info
  33. } catch (error) {
  34. console.error("Error checking if model supports browser capability:", error)
  35. }
  36. // Check if the current mode includes the browser tool group
  37. const modeConfig = getModeBySlug(mode, customModes)
  38. const modeSupportsBrowser = modeConfig?.groups.some((group) => getGroupName(group) === "browser") ?? false
  39. // Check if model supports browser capability (images)
  40. const modelSupportsBrowser = modelInfo && (modelInfo as any)?.supportsImages === true
  41. // Only enable browser tools if the model supports it, the mode includes browser tools,
  42. // and browser tools are enabled in settings
  43. const canUseBrowserTool = modelSupportsBrowser && modeSupportsBrowser && (browserToolEnabled ?? true)
  44. const systemPrompt = await SYSTEM_PROMPT(
  45. provider.context,
  46. cwd,
  47. canUseBrowserTool,
  48. mcpEnabled ? provider.getMcpHub() : undefined,
  49. diffStrategy,
  50. browserViewportSize ?? "900x600",
  51. mode,
  52. customModePrompts,
  53. customModes,
  54. customInstructions,
  55. experiments,
  56. language,
  57. rooIgnoreInstructions,
  58. {
  59. todoListEnabled: apiConfiguration?.todoListEnabled ?? true,
  60. useAgentRules: vscode.workspace.getConfiguration(Package.name).get<boolean>("useAgentRules") ?? true,
  61. enableSubfolderRules: enableSubfolderRules ?? false,
  62. newTaskRequireTodos: vscode.workspace
  63. .getConfiguration(Package.name)
  64. .get<boolean>("newTaskRequireTodos", false),
  65. isStealthModel: modelInfo?.isStealthModel,
  66. },
  67. undefined, // todoList
  68. undefined, // modelId
  69. provider.getSkillsManager(),
  70. )
  71. return systemPrompt
  72. }