|
|
@@ -1,10 +1,14 @@
|
|
|
+import { Anthropic } from "@anthropic-ai/sdk"
|
|
|
import { rooDefaultModelId, rooModels, type RooModelId } from "@roo-code/types"
|
|
|
import { CloudService } from "@roo-code/cloud"
|
|
|
|
|
|
import type { ApiHandlerOptions } from "../../shared/api"
|
|
|
-import { BaseOpenAiCompatibleProvider } from "./base-openai-compatible-provider"
|
|
|
+import { ApiStream } from "../transform/stream"
|
|
|
import { t } from "../../i18n"
|
|
|
|
|
|
+import type { ApiHandlerCreateMessageMetadata } from "../index"
|
|
|
+import { BaseOpenAiCompatibleProvider } from "./base-openai-compatible-provider"
|
|
|
+
|
|
|
export class RooHandler extends BaseOpenAiCompatibleProvider<RooModelId> {
|
|
|
constructor(options: ApiHandlerOptions) {
|
|
|
// Check if CloudService is available and get the session token.
|
|
|
@@ -21,7 +25,7 @@ export class RooHandler extends BaseOpenAiCompatibleProvider<RooModelId> {
|
|
|
super({
|
|
|
...options,
|
|
|
providerName: "Roo Code Cloud",
|
|
|
- baseURL: "https://api.roocode.com/proxy/v1",
|
|
|
+ baseURL: process.env.ROO_CODE_PROVIDER_URL ?? "https://api.roocode.com/proxy/v1",
|
|
|
apiKey: sessionToken,
|
|
|
defaultProviderModelId: rooDefaultModelId,
|
|
|
providerModels: rooModels,
|
|
|
@@ -29,6 +33,42 @@ export class RooHandler extends BaseOpenAiCompatibleProvider<RooModelId> {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
+ override async *createMessage(
|
|
|
+ systemPrompt: string,
|
|
|
+ messages: Anthropic.Messages.MessageParam[],
|
|
|
+ metadata?: ApiHandlerCreateMessageMetadata,
|
|
|
+ ): ApiStream {
|
|
|
+ const stream = await this.createStream(systemPrompt, messages, metadata)
|
|
|
+
|
|
|
+ for await (const chunk of stream) {
|
|
|
+ const delta = chunk.choices[0]?.delta
|
|
|
+
|
|
|
+ if (delta) {
|
|
|
+ if (delta.content) {
|
|
|
+ yield {
|
|
|
+ type: "text",
|
|
|
+ text: delta.content,
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if ("reasoning_content" in delta && typeof delta.reasoning_content === "string") {
|
|
|
+ yield {
|
|
|
+ type: "reasoning",
|
|
|
+ text: delta.reasoning_content,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (chunk.usage) {
|
|
|
+ yield {
|
|
|
+ type: "usage",
|
|
|
+ inputTokens: chunk.usage.prompt_tokens || 0,
|
|
|
+ outputTokens: chunk.usage.completion_tokens || 0,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
override getModel() {
|
|
|
const modelId = this.options.apiModelId || rooDefaultModelId
|
|
|
const modelInfo = this.providerModels[modelId as RooModelId] ?? this.providerModels[rooDefaultModelId]
|
|
|
@@ -44,7 +84,7 @@ export class RooHandler extends BaseOpenAiCompatibleProvider<RooModelId> {
|
|
|
maxTokens: 8192,
|
|
|
contextWindow: 262_144,
|
|
|
supportsImages: false,
|
|
|
- supportsPromptCache: false,
|
|
|
+ supportsPromptCache: true,
|
|
|
inputPrice: 0,
|
|
|
outputPrice: 0,
|
|
|
},
|