From 778b89e46d3a684787c993610ff95d2751863bf0 Mon Sep 17 00:00:00 2001 From: hannesrudolph Date: Thu, 24 Apr 2025 19:25:37 -0600 Subject: [PATCH] docs: Add prompt caching feature for Gemini 2.5 models and update release notes for version 3.14.2 --- docs/providers/gemini.md | 7 +++++++ docs/providers/openrouter.md | 8 +++++++- docs/update-notes/index.md | 1 + docs/update-notes/v3.14.2.md | 20 ++++++++++++++++++++ sidebars.ts | 1 + static/img/v3.14.2/v3.14.2.png | Bin 0 -> 21372 bytes 6 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 docs/update-notes/v3.14.2.md create mode 100644 static/img/v3.14.2/v3.14.2.png diff --git a/docs/providers/gemini.md b/docs/providers/gemini.md index 83763e11..647d7b54 100644 --- a/docs/providers/gemini.md +++ b/docs/providers/gemini.md @@ -42,6 +42,13 @@ Refer to the [Gemini documentation](https://ai.google.dev/models/gemini) for mor 3. **Enter API Key:** Paste your Gemini API key into the "Gemini API Key" field. 4. **Select Model:** Choose your desired Gemini model from the "Model" dropdown. +5. **(Optional) Enable Prompt Caching (Gemini 2.5 Models):** For supported Gemini 2.5 models, check the "Enable Prompt Caching" box if you wish to activate prompt caching. See the note below for important details specific to this provider. + Prompt Caching Checkbox for Gemini Provider ## Tips and Notes +* **Prompt Caching (Manual Activation Required):** + * Prompt caching is available for supported Gemini 2.5 models. + * However, for the **Google Gemini provider**, caching is **not enabled by default**. + * You **must manually check** the "Enable Prompt Caching" box in the provider settings to activate it. + * **Reason:** This manual step is a temporary workaround due to potential response delays sometimes observed with Google's caching mechanism when accessed directly via this provider. * **Pricing:** Gemini API usage is priced based on input and output tokens. Refer to the [Gemini pricing page](https://ai.google.dev/pricing) for detailed information. diff --git a/docs/providers/openrouter.md b/docs/providers/openrouter.md index 959082d3..b83382db 100644 --- a/docs/providers/openrouter.md +++ b/docs/providers/openrouter.md @@ -26,6 +26,8 @@ OpenRouter supports a large and growing number of models. Roo Code automaticall 4. **Select Model:** Choose your desired model from the "Model" dropdown. 5. **(Optional) Custom Base URL:** If you need to use a custom base URL for the OpenRouter API, check "Use custom base URL" and enter the URL. Leave this blank for most users. +6. **(Optional) Enable Prompt Caching (Supported Models):** For models accessed via OpenRouter that support caching (like Gemini 2.5), check the "Enable Prompt Caching" box if you wish to activate it. See the note below for important details specific to this provider. + Prompt Caching Checkbox for OpenRouter Provider ## Supported Transforms OpenRouter provides an [optional "middle-out" message transform](https://openrouter.ai/docs/features/message-transforms) to help with prompts that exceed the maximum context size of a model. You can enable it by checking the "Compress prompts and message chains to the context size" box. @@ -34,4 +36,8 @@ OpenRouter provides an [optional "middle-out" message transform](https://openrou * **Model Selection:** OpenRouter offers a wide range of models. Experiment to find the best one for your needs. * **Pricing:** OpenRouter charges based on the underlying model's pricing. See the [OpenRouter Models page](https://openrouter.ai/models) for details. -* **Prompt Caching:** Some providers support prompt caching. See the OpenRouter documentation for supported models. +* **Prompt Caching:** + * OpenRouter passes caching requests to underlying models that support it. Check the [OpenRouter Models page](https://openrouter.ai/models) to see which models offer caching. + * For most models, caching should activate automatically if supported by the model itself (similar to how Requesty works). + * **Exception for Gemini Models via OpenRouter:** Due to potential response delays sometimes observed with Google's caching mechanism when accessed via OpenRouter, a manual activation step is required *specifically for Gemini models*. + * If using a **Gemini model** via OpenRouter, you **must manually check** the "Enable Prompt Caching" box in the provider settings to activate caching for that model. This checkbox serves as a temporary workaround. For non-Gemini models on OpenRouter, this checkbox is not necessary for caching. diff --git a/docs/update-notes/index.md b/docs/update-notes/index.md index d9029daa..b4c8894e 100644 --- a/docs/update-notes/index.md +++ b/docs/update-notes/index.md @@ -4,6 +4,7 @@ This section contains notes about recent updates to Roo Code, listed by version ## Version 3.14 +* [3.14.2](/update-notes/v3.14.2) (2025-04-24) * [3.14.1](/update-notes/v3.14.1) (2025-04-24) * [3.14.0](/update-notes/v3.14.0) (2025-04-23) diff --git a/docs/update-notes/v3.14.2.md b/docs/update-notes/v3.14.2.md new file mode 100644 index 00000000..13b8baf7 --- /dev/null +++ b/docs/update-notes/v3.14.2.md @@ -0,0 +1,20 @@ +# Roo Code 3.14.2 Release Notes (2025-04-24) + +This release introduces prompt caching for Gemini, user control over caching for specific models on OpenRouter, improved terminal output handling, and adds Russian language support. + +## Gemini 2.5 Caching is HERE! + +* **Prompt Caching for Gemini 2.5 Models:** Prompt caching is now available for supported Google Gemini 2.5 models when using the [Requesty](/providers/requesty), [Google Gemini](/providers/gemini), or [OpenRouter](/providers/openrouter) providers. +* **Manual Caching Toggle (Google Gemini & OpenRouter Only):** + * For the **[Google Gemini](/providers/gemini)** and **[OpenRouter](/providers/openrouter)** providers specifically, a new checkbox allows you to manually enable prompt caching for supported Gemini 2.5 models. + Prompt Caching Checkbox in Provider Settings + * **Why the checkbox?** This setting is provided as a temporary workaround for potential response delays sometimes observed with Google's caching mechanism when accessed via these two providers. Caching is *not* enabled by default for them. + * **Requesty:** Caching remains automatic for supported models via Requesty. + +## Terminal Improvments + +* Improved handling of terminal output containing backspace characters for cleaner display (thanks KJ7LNW!). + +## Internationalization: Russian Language Added + +* Added Russian language support (Спасибо asychin!). \ No newline at end of file diff --git a/sidebars.ts b/sidebars.ts index 292b0eb3..3498b7b0 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -143,6 +143,7 @@ const sidebars: SidebarsConfig = { type: 'category', label: '3.14', items: [ +{ type: 'doc', id: 'update-notes/v3.14.2', label: '3.14.2' }, { type: 'doc', id: 'update-notes/v3.14.1', label: '3.14.1' }, { type: 'doc', id: 'update-notes/v3.14.0', label: '3.14.0' }, ], diff --git a/static/img/v3.14.2/v3.14.2.png b/static/img/v3.14.2/v3.14.2.png new file mode 100644 index 0000000000000000000000000000000000000000..754ae9568ab34adc146934c402a296f401e7c559 GIT binary patch literal 21372 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