Compare commits

...
Author SHA1 Message Date
abeatrix 2d5a1737a7 feat: add abort functionality for Cline Provider API requests
Implement request cancellation by:
- Add AbortController to ClineHandler to manage request lifecycle
- Thread abort signal through createOpenRouterStream to API calls
- Expose abort() method to allow cancellation of in-flight requests
- Add logging for abort operations

This enables users to cancel long-running API requests, improving control over resource usage and user experience.
2025-12-04 14:24:51 -08:00
2 changed files with 11 additions and 1 deletions
+9 -1
View File
@@ -38,6 +38,7 @@ export class ClineHandler implements ApiHandler {
private readonly _baseUrl = ClineEnv.config().apiBaseUrl
lastGenerationId?: string
private lastRequestId?: string
private abortController?: AbortController
constructor(options: ClineHandlerOptions) {
this.options = options
@@ -101,7 +102,7 @@ export class ClineHandler implements ApiHandler {
async *createMessage(systemPrompt: string, messages: ClineStorageMessage[], tools?: OpenAITool[]): ApiStream {
try {
const client = await this.ensureClient()
this.abortController = new AbortController()
this.lastGenerationId = undefined
this.lastRequestId = undefined
@@ -117,6 +118,7 @@ export class ClineHandler implements ApiHandler {
this.options.openRouterProviderSorting,
tools,
this.options.geminiThinkingLevel,
this.abortController.signal,
)
const toolCallProcessor = new ToolCallProcessor()
@@ -271,6 +273,12 @@ export class ClineHandler implements ApiHandler {
return this.lastRequestId
}
abort(): void {
this.abortController?.abort()
this.abortController = undefined
Logger.log("ClineHandler: Aborted ongoing request")
}
getModel(): { id: string; info: ModelInfo } {
const modelId = this.options.openRouterModelId
const modelInfo = this.options.openRouterModelInfo
@@ -23,6 +23,7 @@ export async function createOpenRouterStream(
openRouterProviderSorting?: string,
tools?: Array<ChatCompletionTool>,
geminiThinkingLevel?: string,
abortSignal?: AbortSignal,
) {
// Convert Anthropic messages to OpenAI format
let openAiMessages: OpenAI.Chat.ChatCompletionMessageParam[] = [
@@ -209,6 +210,7 @@ export async function createOpenRouterStream(
...(model.id.includes("gemini") && geminiThinkingLevel
? { thinking_config: { thinking_level: geminiThinkingLevel, include_thoughts: true } }
: {}),
signal: abortSignal,
})
return stream