Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/_locales/de/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,9 @@
"Pin Tab": "Tab anheften",
"Modules": "Module",
"API Params": "API-Parameter",
"Override provider temperature": "Anbieter-Temperatur überschreiben",
"The temperature parameter is not sent. The provider or model default is used.": "Der Temperaturparameter wird nicht gesendet. Es wird der Standardwert des Anbieters oder Modells verwendet.",
"The current model does not accept a custom temperature. The parameter will not be sent.": "Das aktuelle Modell akzeptiert keine benutzerdefinierte Temperatur. Der Parameter wird nicht gesendet.",
"API Url": "API-URL",
"Provider": "Anbieter",
"Others": "Andere",
Expand Down
3 changes: 3 additions & 0 deletions src/_locales/en/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,9 @@
"Pin Tab": "Pin Tab",
"Modules": "Modules",
"API Params": "API Params",
"Override provider temperature": "Override provider temperature",
"The temperature parameter is not sent. The provider or model default is used.": "The temperature parameter is not sent. The provider or model default is used.",
"The current model does not accept a custom temperature. The parameter will not be sent.": "The current model does not accept a custom temperature. The parameter will not be sent.",
"API Url": "API Url",
"Provider": "Provider",
"Others": "Others",
Expand Down
3 changes: 3 additions & 0 deletions src/_locales/es/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@
"Pin Tab": "Fijar pestaña",
"Modules": "Módulos",
"API Params": "Parámetros de la API",
"Override provider temperature": "Sobrescribir la temperatura del proveedor",
"The temperature parameter is not sent. The provider or model default is used.": "El parámetro de temperatura no se envía. Se utiliza el valor predeterminado del proveedor o del modelo.",
"The current model does not accept a custom temperature. The parameter will not be sent.": "El modelo actual no acepta una temperatura personalizada. El parámetro no se enviará.",
"API Url": "URL de la API",
"Provider": "Proveedor",
"Others": "Otros",
Expand Down
3 changes: 3 additions & 0 deletions src/_locales/fr/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@
"Pin Tab": "Épingler l'onglet",
"Modules": "Modules",
"API Params": "Paramètres de l'API",
"Override provider temperature": "Remplacer la température du fournisseur",
"The temperature parameter is not sent. The provider or model default is used.": "Le paramètre de température n’est pas envoyé. La valeur par défaut du fournisseur ou du modèle est utilisée.",
"The current model does not accept a custom temperature. The parameter will not be sent.": "Le modèle actuel n’accepte pas de température personnalisée. Le paramètre ne sera pas envoyé.",
"API Url": "URL de l'API",
"Provider": "Fournisseur",
"Others": "Autres",
Expand Down
3 changes: 3 additions & 0 deletions src/_locales/in/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@
"Pin Tab": "Sematkan Tab",
"Modules": "Modul",
"API Params": "Parameter API",
"Override provider temperature": "Timpa suhu penyedia",
"The temperature parameter is not sent. The provider or model default is used.": "Parameter suhu tidak dikirim. Nilai bawaan penyedia atau model akan digunakan.",
"The current model does not accept a custom temperature. The parameter will not be sent.": "Model saat ini tidak menerima suhu khusus. Parameter tidak akan dikirim.",
"API Url": "URL API",
"Provider": "Penyedia",
"Others": "Lainnya",
Expand Down
3 changes: 3 additions & 0 deletions src/_locales/it/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@
"Pin Tab": "Fissa scheda",
"Modules": "Moduli",
"API Params": "Parametri API",
"Override provider temperature": "Sovrascrivi la temperatura del provider",
"The temperature parameter is not sent. The provider or model default is used.": "Il parametro della temperatura non viene inviato. Viene usato il valore predefinito del provider o del modello.",
"The current model does not accept a custom temperature. The parameter will not be sent.": "Il modello attuale non accetta una temperatura personalizzata. Il parametro non verrà inviato.",
"API Url": "URL API",
"Provider": "Provider",
"Others": "Altri",
Expand Down
3 changes: 3 additions & 0 deletions src/_locales/ja/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@
"Pin Tab": "タブをピン留め",
"Modules": "モジュール",
"API Params": "APIパラメータ",
"Override provider temperature": "プロバイダーの温度を上書き",
"The temperature parameter is not sent. The provider or model default is used.": "温度パラメーターは送信されません。プロバイダーまたはモデルの既定値が使用されます。",
"The current model does not accept a custom temperature. The parameter will not be sent.": "現在のモデルはカスタム温度を受け付けません。このパラメーターは送信されません。",
"API Url": "API URL",
"Provider": "プロバイダー",
"Others": "その他",
Expand Down
3 changes: 3 additions & 0 deletions src/_locales/ko/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@
"Pin Tab": "탭 고정",
"Modules": "모듈",
"API Params": "API 매개변수",
"Override provider temperature": "공급자 온도 재정의",
"The temperature parameter is not sent. The provider or model default is used.": "온도 매개변수는 전송되지 않습니다. 공급자 또는 모델의 기본값이 사용됩니다.",
"The current model does not accept a custom temperature. The parameter will not be sent.": "현재 모델은 사용자 지정 온도를 허용하지 않습니다. 이 매개변수는 전송되지 않습니다.",
"API Url": "API 주소",
"Provider": "공급자",
"Others": "기타",
Expand Down
3 changes: 3 additions & 0 deletions src/_locales/pt/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@
"Pin Tab": "Fixar Tab",
"Modules": "Módulos",
"API Params": "Parâmetros da API",
"Override provider temperature": "Substituir a temperatura do provedor",
"The temperature parameter is not sent. The provider or model default is used.": "O parâmetro de temperatura não é enviado. O valor padrão do provedor ou do modelo é utilizado.",
"The current model does not accept a custom temperature. The parameter will not be sent.": "O modelo atual não aceita uma temperatura personalizada. O parâmetro não será enviado.",
"API Url": "URL da API",
"Provider": "Provedor",
"Others": "Outros",
Expand Down
3 changes: 3 additions & 0 deletions src/_locales/ru/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,9 @@
"Pin Tab": "Закрепить вкладку",
"Modules": "Модули",
"API Params": "Параметры API",
"Override provider temperature": "Переопределить температуру провайдера",
"The temperature parameter is not sent. The provider or model default is used.": "Параметр температуры не отправляется. Используется значение по умолчанию провайдера или модели.",
"The current model does not accept a custom temperature. The parameter will not be sent.": "Текущая модель не принимает пользовательскую температуру. Параметр не будет отправлен.",
"API Url": "URL API",
"Provider": "Провайдер",
"Others": "Другие",
Expand Down
3 changes: 3 additions & 0 deletions src/_locales/tr/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@
"Pin Tab": "Sekmeyi Sabitle",
"Modules": "Modüller",
"API Params": "API Parametreleri",
"Override provider temperature": "Sağlayıcı sıcaklığını geçersiz kıl",
"The temperature parameter is not sent. The provider or model default is used.": "Sıcaklık parametresi gönderilmez. Sağlayıcının veya modelin varsayılan değeri kullanılır.",
"The current model does not accept a custom temperature. The parameter will not be sent.": "Geçerli model özel bir sıcaklık kabul etmiyor. Parametre gönderilmeyecek.",
"API Url": "API Url'si",
"Provider": "Sağlayıcı",
"Others": "Diğerleri",
Expand Down
3 changes: 3 additions & 0 deletions src/_locales/zh-hans/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,9 @@
"Pin Tab": "固定页面",
"Modules": "模块",
"API Params": "API参数",
"Override provider temperature": "覆盖提供商的温度参数",
"The temperature parameter is not sent. The provider or model default is used.": "不会发送温度参数,将使用提供商或模型的默认值。",
"The current model does not accept a custom temperature. The parameter will not be sent.": "当前模型不接受自定义温度参数,因此不会发送该参数。",
"API Url": "API地址",
"Provider": "提供商",
"Others": "其他",
Expand Down
3 changes: 3 additions & 0 deletions src/_locales/zh-hant/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,9 @@
"Pin Tab": "固定頁面",
"Modules": "模組",
"API Params": "API 參數",
"Override provider temperature": "覆寫供應商的溫度參數",
"The temperature parameter is not sent. The provider or model default is used.": "不會傳送溫度參數,將使用供應商或模型的預設值。",
"The current model does not accept a custom temperature. The parameter will not be sent.": "目前的模型不接受自訂溫度參數,因此不會傳送這個參數。",
"API Url": "API 網址",
"Provider": "供應商",
"Others": "其他",
Expand Down
1 change: 1 addition & 0 deletions src/config/index.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -800,6 +800,7 @@ export const defaultConfig = {

maxResponseTokenLength: 2000,
maxConversationContextLength: 9,
temperatureOverrideEnabled: false,
temperature: 1,
customChatGptWebApiUrl: 'https://chatgpt.com',
customChatGptWebApiPath: '/backend-api/conversation',
Expand Down
49 changes: 41 additions & 8 deletions src/popup/sections/AdvancedPart.jsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import { useTranslation } from 'react-i18next'
import { parseFloatWithClamp, parseIntWithClamp } from '../../utils/index.mjs'
import { getModelValue } from '../../utils/model-name-convert.mjs'
import { isUsingAzureOpenAiApiModel } from '../../config/index.mjs'
import { canApplyTemperatureOverride } from '../../services/apis/temperature-params.mjs'
import PropTypes from 'prop-types'
import { Tab, TabList, TabPanel, Tabs } from 'react-tabs'
import Browser from 'webextension-polyfill'
Expand All @@ -11,6 +14,14 @@ ApiParams.propTypes = {

function ApiParams({ config, updateConfig }) {
const { t } = useTranslation()
const temperatureOverrideEnabled = config.temperatureOverrideEnabled === true
// Azure deployment names are opaque aliases, not canonical model identifiers.
const selectedModel = isUsingAzureOpenAiApiModel(config)
? null
: config.modelName === 'customModel' && !config.apiMode
? config.customModelName
: getModelValue(config)
const temperatureOverrideAvailable = canApplyTemperatureOverride(selectedModel)
Comment on lines +19 to +24

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No code change is needed here. getModelValue(config) resolves a custom API mode through apiModeToModelName() and modelNameToValue(), which removes the customApiModelKeys- prefix and returns the actual customName.

The request path also uses session.apiMode.customName, so the UI and request evaluate the same model ID.


return (
<>
Expand Down Expand Up @@ -43,19 +54,41 @@ function ApiParams({ config, updateConfig }) {
/>
</label>
<label>
{t('Temperature') + `: ${config.temperature}`}
<input
type="range"
min="0"
max="2"
step="0.1"
value={config.temperature}
type="checkbox"
checked={temperatureOverrideEnabled}
Comment thread
PeterDaveHello marked this conversation as resolved.
onChange={(e) => {
const value = parseFloatWithClamp(e.target.value, 1, 0, 2)
updateConfig({ temperature: value })
updateConfig({ temperatureOverrideEnabled: e.target.checked })
}}
/>
{t('Override provider temperature')}
</label>
{!temperatureOverrideEnabled ? (
<small>
{t('The temperature parameter is not sent. The provider or model default is used.')}
</small>
) : !temperatureOverrideAvailable ? (
<small>
{t(
'The current model does not accept a custom temperature. The parameter will not be sent.',
)}
</small>
) : (
<label>
{t('Temperature') + `: ${config.temperature}`}
<input
type="range"
min="0"
max="2"
step="0.1"
value={config.temperature}
onChange={(e) => {
const value = parseFloatWithClamp(e.target.value, 1, 0, 2)
updateConfig({ temperature: value })
}}
/>
</label>
)}
</>
)
}
Expand Down
10 changes: 6 additions & 4 deletions src/services/apis/azure-openai-api.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { getConversationPairs } from '../../utils/get-conversation-pairs.mjs'
import { fetchSSE } from '../../utils/fetch-sse.mjs'
import { isEmpty } from 'lodash-es'
import { getModelValue } from '../../utils/model-name-convert.mjs'
import { getTemperatureParams } from './temperature-params.mjs'

/**
* @param {Runtime.Port} port
Expand All @@ -13,8 +14,8 @@ import { getModelValue } from '../../utils/model-name-convert.mjs'
export async function generateAnswersWithAzureOpenaiApi(port, question, session) {
const { controller, messageListener, disconnectListener } = setAbortController(port)
const config = await getUserConfig()
let model = getModelValue(session)
if (!model) model = config.azureDeploymentName
let deploymentName = getModelValue(session)
if (!deploymentName) deploymentName = config.azureDeploymentName

const prompt = getConversationPairs(
session.conversationRecords.slice(-config.maxConversationContextLength),
Expand All @@ -27,7 +28,7 @@ export async function generateAnswersWithAzureOpenaiApi(port, question, session)
`${config.azureEndpoint.replace(
/\/$/,
'',
)}/openai/deployments/${model}/chat/completions?api-version=2024-02-01`,
)}/openai/deployments/${deploymentName}/chat/completions?api-version=2024-02-01`,
{
method: 'POST',
signal: controller.signal,
Expand All @@ -39,7 +40,8 @@ export async function generateAnswersWithAzureOpenaiApi(port, question, session)
messages: prompt,
stream: true,
max_tokens: config.maxResponseTokenLength,
temperature: config.temperature,
// Azure deployment names are opaque aliases, not canonical model identifiers.
...getTemperatureParams(config),
Comment thread
greptile-apps[bot] marked this conversation as resolved.
}),
onMessage(message) {
console.debug('sse message', message)
Expand Down
14 changes: 2 additions & 12 deletions src/services/apis/claude-api.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,7 @@ import { FETCH_RESPONSE_STREAM_FAILED, fetchSSE } from '../../utils/fetch-sse.mj
import { isEmpty } from 'lodash-es'
import { getConversationPairs } from '../../utils/get-conversation-pairs.mjs'
import { getModelValue } from '../../utils/model-name-convert.mjs'

function shouldOmitTemperature(model) {
return (
model === 'claude-opus-4-7' ||
model === 'claude-opus-4-8' ||
model === 'claude-sonnet-5' ||
model === 'claude-opus-5'
)
}
import { getTemperatureParams } from './temperature-params.mjs'

function shouldDisableDefaultThinking(model) {
return model === 'claude-sonnet-5'
Expand Down Expand Up @@ -40,13 +32,11 @@ export async function generateAnswersWithClaudeApi(port, question, session) {
messages: prompt,
stream: true,
max_tokens: config.maxResponseTokenLength,
...getTemperatureParams(config, model),
}
if (shouldDisableDefaultThinking(model)) {
body.thinking = { type: 'disabled' }
}
if (!shouldOmitTemperature(model)) {
body.temperature = config.temperature
}

let answer = ''
let stopReason = ''
Expand Down
1 change: 1 addition & 0 deletions src/services/apis/openai-api.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ function resolveModelName(session, config) {
const OPENAI_COMPATIBLE_RUNTIME_CONFIG_KEYS = [
'maxConversationContextLength',
'maxResponseTokenLength',
'temperatureOverrideEnabled',
'temperature',
]

Expand Down
10 changes: 6 additions & 4 deletions src/services/apis/openai-compatible-core.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { getConversationPairs } from '../../utils/get-conversation-pairs.mjs'
import { isEmpty } from 'lodash-es'
import { getCompletionPromptBase, pushRecord, setAbortController } from './shared.mjs'
import { getChatCompletionsTokenParams } from './openai-token-params.mjs'
import { getTemperatureParams } from './temperature-params.mjs'

function buildHeaders(apiKey, extraHeaders = {}) {
const headers = {
Expand Down Expand Up @@ -73,6 +74,8 @@ export async function generateAnswersWithOpenAICompatible({
? session.conversationRecords
: []
session.conversationRecords = conversationRecords
const safeExtraBody = { ...extraBody }
delete safeExtraBody.temperature
if (endpointType === 'completion') {
const prompt =
(await getCompletionPromptBase()) +
Expand All @@ -83,9 +86,9 @@ export async function generateAnswersWithOpenAICompatible({
model,
stream: true,
max_tokens: config.maxResponseTokenLength,
temperature: config.temperature,
...getTemperatureParams(config, model),
stop: '\nHuman',
...extraBody,
...safeExtraBody,
}
} else {
const messages = getConversationPairs(
Expand All @@ -100,14 +103,13 @@ export async function generateAnswersWithOpenAICompatible({
)
const conflictingTokenParamKey =
'max_completion_tokens' in tokenParams ? 'max_tokens' : 'max_completion_tokens'
const safeExtraBody = { ...extraBody }
delete safeExtraBody[conflictingTokenParamKey]
requestBody = {
messages,
model,
stream: true,
...tokenParams,
temperature: config.temperature,
...getTemperatureParams(config, model),
...safeExtraBody,
}
}
Expand Down
55 changes: 55 additions & 0 deletions src/services/apis/temperature-params.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
const MODELS_WITHOUT_CUSTOM_TEMPERATURE = new Set([
'claude-opus-4-7',
'claude-opus-4-8',
'claude-sonnet-5',
'claude-opus-5',
])

function normalizeModelId(model) {
return String(model || '')
.trim()
.toLowerCase()
.replace(/^(?:anthropic|google)\//, '')
.replace(/\./g, '-')
}

function matchesModelFamily(model, baseModel) {
return (
model === baseModel || model.startsWith(`${baseModel}-`) || model.startsWith(`${baseModel}:`)
)
}

function isKnownModelWithoutCustomTemperature(model) {
return [...MODELS_WITHOUT_CUSTOM_TEMPERATURE].some((baseModel) =>
matchesModelFamily(model, baseModel),
)
}

function isGeminiWithoutCustomTemperature(model) {
const match = /^gemini-(\d+)(?:-(\d+))?(?=$|[-:])/.exec(model)
if (!match) return false

const major = Number(match[1])
const minor = Number(match[2] || 0)
if (major > 3) return true
if (major !== 3) return false

const isGemini35FlashLite =
minor === 5 && matchesModelFamily(model, 'gemini-3-5-flash-lite')
return minor >= 6 || isGemini35FlashLite
Comment thread
qodo-code-review[bot] marked this conversation as resolved.
}

export function canApplyTemperatureOverride(model) {
const normalizedModel = normalizeModelId(model)
return (
!isKnownModelWithoutCustomTemperature(normalizedModel) &&
!isGeminiWithoutCustomTemperature(normalizedModel)
)
}

export function getTemperatureParams(config, model) {
if (config?.temperatureOverrideEnabled !== true) return {}
if (!Number.isFinite(config?.temperature)) return {}
if (!canApplyTemperatureOverride(model)) return {}
return { temperature: config.temperature }
}
Loading