Skip to content

Commit 08e7d73

Browse files
committed
Merge branch 'main' into add_api_key_env_vars
Signed-off-by: Geoff Wilson <[email protected]>
2 parents 11fe352 + 1d8b51d commit 08e7d73

File tree

24 files changed

+121
-40
lines changed

24 files changed

+121
-40
lines changed

packages/types/src/provider-settings.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ const unboundSchema = baseProviderSettingsSchema.extend({
234234
})
235235

236236
const requestySchema = baseProviderSettingsSchema.extend({
237+
requestyBaseUrl: z.string().optional(),
237238
requestyApiKey: z.string().optional(),
238239
requestyConfigUseEnvVars: z.boolean().optional(),
239240
requestyModelId: z.string().optional(),

src/api/providers/__tests__/requesty.spec.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,21 @@ describe("RequestyHandler", () => {
6565
})
6666
})
6767

68+
it("can use a base URL instead of the default", () => {
69+
const handler = new RequestyHandler({ ...mockOptions, requestyBaseUrl: "some-base-url" })
70+
expect(handler).toBeInstanceOf(RequestyHandler)
71+
72+
expect(OpenAI).toHaveBeenCalledWith({
73+
baseURL: "some-base-url",
74+
apiKey: mockOptions.requestyApiKey,
75+
defaultHeaders: {
76+
"HTTP-Referer": "https://github.com/RooVetGit/Roo-Cline",
77+
"X-Title": "Roo Code",
78+
"User-Agent": `RooCode/${Package.version}`,
79+
},
80+
})
81+
})
82+
6883
describe("fetchModel", () => {
6984
it("returns correct model info when options are provided", async () => {
7085
const handler = new RequestyHandler(mockOptions)

src/api/providers/requesty.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export class RequestyHandler extends BaseProvider implements SingleCompletionHan
4747
this.options = options
4848

4949
this.client = new OpenAI({
50-
baseURL: "https://router.requesty.ai/v1",
50+
baseURL: options.requestyBaseUrl || "https://router.requesty.ai/v1",
5151
apiKey: this.options.requestyApiKey ?? "not-provided",
5252
defaultHeaders: DEFAULT_HEADERS,
5353
})

src/core/checkpoints/index.ts

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,8 @@ export async function getCheckpointService(
2323
if (!cline.enableCheckpoints) {
2424
return undefined
2525
}
26-
2726
if (cline.checkpointService) {
28-
if (cline.checkpointServiceInitializing) {
29-
console.log("[Task#getCheckpointService] checkpoint service is still initializing")
30-
const service = cline.checkpointService
31-
await pWaitFor(
32-
() => {
33-
console.log("[Task#getCheckpointService] waiting for service to initialize")
34-
return service.isInitialized
35-
},
36-
{ interval, timeout },
37-
)
38-
return service.isInitialized ? cline.checkpointService : undefined
39-
} else {
40-
return cline.checkpointService
41-
}
27+
return cline.checkpointService
4228
}
4329

4430
const provider = cline.providerRef.deref()
@@ -78,25 +64,32 @@ export async function getCheckpointService(
7864
shadowDir: globalStorageDir,
7965
log,
8066
}
81-
67+
if (cline.checkpointServiceInitializing) {
68+
await pWaitFor(
69+
() => {
70+
console.log("[Task#getCheckpointService] waiting for service to initialize")
71+
return !!cline.checkpointService && !!cline?.checkpointService?.isInitialized
72+
},
73+
{ interval, timeout },
74+
)
75+
if (!cline?.checkpointService) {
76+
cline.enableCheckpoints = false
77+
return undefined
78+
}
79+
return cline.checkpointService
80+
}
81+
if (!cline.enableCheckpoints) {
82+
return undefined
83+
}
8284
const service = RepoPerTaskCheckpointService.create(options)
8385
cline.checkpointServiceInitializing = true
84-
85-
// Check if Git is installed before initializing the service
86-
// Only assign the service after successful initialization
87-
try {
88-
await checkGitInstallation(cline, service, log, provider)
89-
cline.checkpointService = service
90-
return service
91-
} catch (err) {
92-
// Clean up on failure
93-
cline.checkpointServiceInitializing = false
94-
cline.enableCheckpoints = false
95-
throw err
96-
}
86+
await checkGitInstallation(cline, service, log, provider)
87+
cline.checkpointService = service
88+
return service
9789
} catch (err) {
9890
log(`[Task#getCheckpointService] ${err.message}`)
9991
cline.enableCheckpoints = false
92+
cline.checkpointServiceInitializing = false
10093
return undefined
10194
}
10295
}
@@ -175,13 +168,6 @@ export async function checkpointSave(cline: Task, force = false) {
175168
return
176169
}
177170

178-
if (!service.isInitialized) {
179-
const provider = cline.providerRef.deref()
180-
provider?.log("[checkpointSave] checkpoints didn't initialize in time, disabling checkpoints for this task")
181-
cline.enableCheckpoints = false
182-
return
183-
}
184-
185171
TelemetryService.instance.captureCheckpointCreated(cline.taskId)
186172

187173
// Start the checkpoint process in the background.

webview-ui/src/components/settings/ModelPicker.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ export const ModelPicker = ({
155155
aria-expanded={open}
156156
className="w-full justify-between"
157157
data-testid="model-picker-button">
158-
<div>{selectedModelId ?? t("settings:common.select")}</div>
158+
<div className="truncate">{selectedModelId ?? t("settings:common.select")}</div>
159159
<ChevronsUpDown className="opacity-50" />
160160
</Button>
161161
</PopoverTrigger>
@@ -194,7 +194,7 @@ export const ModelPicker = ({
194194
value={model}
195195
onSelect={onSelect}
196196
data-testid={`model-option-${model}`}>
197-
{model}
197+
<span className="truncate" title={model}>{model}</span>
198198
<Check
199199
className={cn(
200200
"size-4 p-0.5 ml-auto",

webview-ui/src/components/settings/providers/Requesty.tsx

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { useState } from "react"
1+
import { useCallback, useEffect, useState } from "react"
2+
import { VSCodeCheckbox, VSCodeTextField } from "@vscode/webview-ui-toolkit/react"
23

34
import { type ProviderSettings, type OrganizationAllowList, requestyDefaultModelId, API_KEYS } from "@roo-code/types"
45

@@ -11,6 +12,7 @@ import { Button } from "@src/components/ui"
1112
import { ModelPicker } from "../ModelPicker"
1213
import { RequestyBalanceDisplay } from "./RequestyBalanceDisplay"
1314
import { ApiKey } from "../ApiKey"
15+
import { inputEventTransform } from "../transforms"
1416

1517
type RequestyProps = {
1618
apiConfiguration: ProviderSettings
@@ -32,6 +34,23 @@ export const Requesty = ({
3234
const { t } = useAppTranslation()
3335

3436
const [didRefetch, setDidRefetch] = useState<boolean>()
37+
const [requestyEndpointSelected, setRequestyEndpointSelected] = useState(!!apiConfiguration.requestyBaseUrl)
38+
39+
// This ensures that the "Use custom URL" checkbox is hidden when the user deletes the URL.
40+
useEffect(() => {
41+
setRequestyEndpointSelected(!!apiConfiguration?.requestyBaseUrl)
42+
}, [apiConfiguration?.requestyBaseUrl])
43+
44+
const handleInputChange = useCallback(
45+
<K extends keyof ProviderSettings, E>(
46+
field: K,
47+
transform: (event: E) => ProviderSettings[K] = inputEventTransform,
48+
) =>
49+
(event: E | Event) => {
50+
setApiConfigurationField(field, transform(event as E))
51+
},
52+
[setApiConfigurationField],
53+
)
3554

3655
return (
3756
<>
@@ -50,6 +69,30 @@ export const Requesty = ({
5069
)
5170
}
5271
/>
72+
<VSCodeCheckbox
73+
checked={requestyEndpointSelected}
74+
onChange={(e: any) => {
75+
const isChecked = e.target.checked === true
76+
if (!isChecked) {
77+
setApiConfigurationField("requestyBaseUrl", undefined)
78+
}
79+
80+
setRequestyEndpointSelected(isChecked)
81+
}}>
82+
{t("settings:providers.requestyUseCustomBaseUrl")}
83+
</VSCodeCheckbox>
84+
{requestyEndpointSelected && (
85+
<VSCodeTextField
86+
value={apiConfiguration?.requestyBaseUrl || ""}
87+
type="text"
88+
onInput={handleInputChange("requestyBaseUrl")}
89+
placeholder={t("settings:providers.getRequestyBaseUrl")}
90+
className="w-full">
91+
<div className="flex justify-between items-center mb-1">
92+
<label className="block font-medium">{t("settings:providers.getRequestyBaseUrl")}</label>
93+
</div>
94+
</VSCodeTextField>
95+
)}
5396
<Button
5497
variant="outline"
5598
onClick={() => {

webview-ui/src/i18n/locales/ca/settings.json

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

webview-ui/src/i18n/locales/de/settings.json

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

webview-ui/src/i18n/locales/en/settings.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,8 @@
253253
"error": "Failed to refresh models list. Please try again."
254254
},
255255
"getRequestyApiKey": "Get Requesty API Key",
256+
"getRequestyBaseUrl": "Base URL",
257+
"requestyUseCustomBaseUrl": "Use custom base URL",
256258
"openRouterTransformsText": "Compress prompts and message chains to the context size (<a>OpenRouter Transforms</a>)",
257259
"anthropicApiKey": "Anthropic API Key",
258260
"getAnthropicApiKey": "Get Anthropic API Key",

webview-ui/src/i18n/locales/es/settings.json

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)