From 3611c143a9706b29a2bfeaba7bfc6038cc28b6c4 Mon Sep 17 00:00:00 2001 From: Wojciech Kordalski Date: Wed, 19 Mar 2025 16:01:19 +0100 Subject: [PATCH 1/3] Fake AI --- src/api/index.ts | 3 ++ src/api/providers/fake-provider.ts | 39 +++++++++++++++++++ src/exports/roo-code.d.ts | 1 + src/shared/api.ts | 3 ++ src/shared/checkExistApiConfig.ts | 4 +- src/shared/globalState.ts | 1 + .../src/components/settings/constants.ts | 1 + 7 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 src/api/providers/fake-provider.ts diff --git a/src/api/index.ts b/src/api/index.ts index cf8085e2893..f5c51756e9f 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -20,6 +20,7 @@ import { ApiStream } from "./transform/stream" import { UnboundHandler } from "./providers/unbound" import { RequestyHandler } from "./providers/requesty" import { HumanRelayHandler } from "./providers/human-relay" +import { FakeAIHandler } from "./providers/fake-provider" export interface SingleCompletionHandler { completePrompt(prompt: string): Promise @@ -75,6 +76,8 @@ export function buildApiHandler(configuration: ApiConfiguration): ApiHandler { return new RequestyHandler(options) case "human-relay": return new HumanRelayHandler(options) + case "fake-ai": + return new FakeAIHandler(options) default: return new AnthropicHandler(options) } diff --git a/src/api/providers/fake-provider.ts b/src/api/providers/fake-provider.ts new file mode 100644 index 00000000000..f7509c8b066 --- /dev/null +++ b/src/api/providers/fake-provider.ts @@ -0,0 +1,39 @@ +import { Anthropic } from "@anthropic-ai/sdk" +import { ApiHandler, SingleCompletionHandler } from ".." +import { ApiHandlerOptions, ModelInfo } from "../../shared/api" +import { ApiStream } from "../transform/stream" + +interface FakeAI { + createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream + getModel(): { id: string; info: ModelInfo } + countTokens(content: Array): Promise + completePrompt(prompt: string): Promise +} + +export class FakeAIHandler implements ApiHandler, SingleCompletionHandler { + private ai: FakeAI + + constructor(options: ApiHandlerOptions) { + if (!options.fakeAi) { + throw new Error("Fake AI is not set") + } + + this.ai = options.fakeAi as FakeAI + } + + async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + yield* this.ai.createMessage(systemPrompt, messages) + } + + getModel(): { id: string; info: ModelInfo } { + return this.ai.getModel() + } + + countTokens(content: Array): Promise { + return this.ai.countTokens(content) + } + + completePrompt(prompt: string): Promise { + return this.ai.completePrompt(prompt) + } +} diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index daa147add44..8cdedc4b1a4 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -254,6 +254,7 @@ export type GlobalStateKey = | "showRooIgnoredFiles" | "remoteBrowserEnabled" | "language" + | "fakeAi" export type ConfigurationKey = GlobalStateKey | SecretKey diff --git a/src/shared/api.ts b/src/shared/api.ts index 1bc432157b7..fa22dd4e00f 100644 --- a/src/shared/api.ts +++ b/src/shared/api.ts @@ -17,6 +17,7 @@ export type ApiProvider = | "unbound" | "requesty" | "human-relay" + | "fake-ai" export interface ApiHandlerOptions { apiModelId?: string @@ -76,6 +77,7 @@ export interface ApiHandlerOptions { modelTemperature?: number | null modelMaxTokens?: number modelMaxThinkingTokens?: number + fakeAi?: unknown } export type ApiConfiguration = ApiHandlerOptions & { @@ -134,6 +136,7 @@ export const API_CONFIG_KEYS: GlobalStateKey[] = [ "modelTemperature", "modelMaxTokens", "modelMaxThinkingTokens", + "fakeAi", ] // Models diff --git a/src/shared/checkExistApiConfig.ts b/src/shared/checkExistApiConfig.ts index 77b58fa31f8..5246e954abe 100644 --- a/src/shared/checkExistApiConfig.ts +++ b/src/shared/checkExistApiConfig.ts @@ -4,8 +4,8 @@ import { SECRET_KEYS } from "./globalState" export function checkExistKey(config: ApiConfiguration | undefined) { if (!config) return false - // Special case for human-relay provider which doesn't need any configuration - if (config.apiProvider === "human-relay") { + // Special case for human-relay and fake-ai providers which don't need any configuration + if (config.apiProvider === "human-relay" || config.apiProvider === "fake-ai") { return true } diff --git a/src/shared/globalState.ts b/src/shared/globalState.ts index 4331effce95..cf1a6ffe735 100644 --- a/src/shared/globalState.ts +++ b/src/shared/globalState.ts @@ -122,6 +122,7 @@ export const GLOBAL_STATE_KEYS = [ "remoteBrowserEnabled", "language", "maxWorkspaceFiles", + "fakeAi", ] as const export const PASS_THROUGH_STATE_KEYS = ["taskHistory"] as const diff --git a/webview-ui/src/components/settings/constants.ts b/webview-ui/src/components/settings/constants.ts index b5f3e13196c..ea7cb26432c 100644 --- a/webview-ui/src/components/settings/constants.ts +++ b/webview-ui/src/components/settings/constants.ts @@ -36,6 +36,7 @@ export const PROVIDERS = [ { value: "unbound", label: "Unbound" }, { value: "requesty", label: "Requesty" }, { value: "human-relay", label: "Human Relay" }, + { value: "fake-ai", label: "Fake AI" }, ].sort((a, b) => a.label.localeCompare(b.label)) export const AWS_REGIONS = [ From 62a03adfc8dcd47ca0b042dd6d11c370fef07711 Mon Sep 17 00:00:00 2001 From: Wojciech Kordalski Date: Wed, 19 Mar 2025 22:56:05 +0100 Subject: [PATCH 2/3] Do not show Fake AI in Roo-Code settings --- webview-ui/src/components/settings/constants.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/webview-ui/src/components/settings/constants.ts b/webview-ui/src/components/settings/constants.ts index ea7cb26432c..b5f3e13196c 100644 --- a/webview-ui/src/components/settings/constants.ts +++ b/webview-ui/src/components/settings/constants.ts @@ -36,7 +36,6 @@ export const PROVIDERS = [ { value: "unbound", label: "Unbound" }, { value: "requesty", label: "Requesty" }, { value: "human-relay", label: "Human Relay" }, - { value: "fake-ai", label: "Fake AI" }, ].sort((a, b) => a.label.localeCompare(b.label)) export const AWS_REGIONS = [ From 5cba8ee476af8335cbda76455a7e81c5051fa640 Mon Sep 17 00:00:00 2001 From: Wojciech Kordalski Date: Wed, 19 Mar 2025 23:12:43 +0100 Subject: [PATCH 3/3] Rename providers/fake-provider.ts to providers/fake-ai.ts --- src/api/index.ts | 2 +- src/api/providers/{fake-provider.ts => fake-ai.ts} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/api/providers/{fake-provider.ts => fake-ai.ts} (100%) diff --git a/src/api/index.ts b/src/api/index.ts index f5c51756e9f..0880f422182 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -20,7 +20,7 @@ import { ApiStream } from "./transform/stream" import { UnboundHandler } from "./providers/unbound" import { RequestyHandler } from "./providers/requesty" import { HumanRelayHandler } from "./providers/human-relay" -import { FakeAIHandler } from "./providers/fake-provider" +import { FakeAIHandler } from "./providers/fake-ai" export interface SingleCompletionHandler { completePrompt(prompt: string): Promise diff --git a/src/api/providers/fake-provider.ts b/src/api/providers/fake-ai.ts similarity index 100% rename from src/api/providers/fake-provider.ts rename to src/api/providers/fake-ai.ts