fix: separate Anthropic output and context limits
Direct Anthropic connections reused the configured context window as max_tokens, which could impose an unintended output value or send a provider-invalid request. Anthropic connections now expose an independent per-response maximum output setting, defaulting to 32K for the protocol-required field, while OpenAI direct requests remain without an added output token cap and direct tool rounds remain unmetered. Release note: Anthropic 直连模型现在可单独配置单次最大输出,不再复用上下文窗口;OpenAI 直连请求和工具调用轮次不增加额外配额。
This commit is contained in:
@@ -34,6 +34,7 @@ import type {
|
||||
} from '../../shared/contracts'
|
||||
import {
|
||||
defaultContextCompressionSettings,
|
||||
defaultAnthropicMaximumOutputTokens,
|
||||
builtinEmbeddingConnectionId,
|
||||
defaultModelProfileId as builtInDefaultModelProfileId,
|
||||
defaultRuntimeSettings,
|
||||
@@ -257,6 +258,9 @@ function toModelProfileDrafts(
|
||||
return settings.modelProfiles.map((profile) => ({
|
||||
...profile,
|
||||
supportsImageInput: profile.supportsImageInput ?? false,
|
||||
maximumOutputTokens:
|
||||
profile.maximumOutputTokens ??
|
||||
defaultAnthropicMaximumOutputTokens,
|
||||
apiKey: '',
|
||||
clearApiKey: false
|
||||
}))
|
||||
@@ -1285,6 +1289,7 @@ export function SettingsPanel({
|
||||
authentication: profile.authentication,
|
||||
supportsImageInput: profile.supportsImageInput,
|
||||
contextWindowTokens: profile.contextWindowTokens,
|
||||
maximumOutputTokens: profile.maximumOutputTokens,
|
||||
imageGenerationQuality: profile.imageGenerationQuality,
|
||||
apiKey: profile.clearApiKey
|
||||
? ({ action: 'clear' } as const)
|
||||
@@ -1670,6 +1675,7 @@ export function SettingsPanel({
|
||||
protocol: 'openai-chat-completions',
|
||||
authentication: defaultRuntimeSettings.modelAuthentication,
|
||||
supportsImageInput: defaultRuntimeSettings.supportsImageInput,
|
||||
maximumOutputTokens: defaultAnthropicMaximumOutputTokens,
|
||||
imageGenerationQuality:
|
||||
defaultRuntimeSettings.imageGenerationQuality,
|
||||
apiKeyConfigured: false,
|
||||
@@ -3136,6 +3142,34 @@ export function SettingsPanel({
|
||||
{t('model.profile.contextWindowDescription')}
|
||||
</small>
|
||||
</label>
|
||||
{profile.protocol === 'anthropic-messages' && (
|
||||
<label className="field">
|
||||
<span>{t('model.profile.maximumOutput')}</span>
|
||||
<input
|
||||
aria-label={t('model.profile.maximumOutput')}
|
||||
inputMode="numeric"
|
||||
max={10_000}
|
||||
min={1}
|
||||
onChange={(event) => {
|
||||
const value = event.target.valueAsNumber
|
||||
updateModelProfile(profile.id, {
|
||||
maximumOutputTokens: Number.isFinite(value)
|
||||
? Math.round(value * 1_000)
|
||||
: defaultAnthropicMaximumOutputTokens
|
||||
})
|
||||
}}
|
||||
placeholder="32"
|
||||
type="number"
|
||||
value={
|
||||
(profile.maximumOutputTokens ??
|
||||
defaultAnthropicMaximumOutputTokens) / 1_000
|
||||
}
|
||||
/>
|
||||
<small>
|
||||
{t('model.profile.maximumOutputDescription')}
|
||||
</small>
|
||||
</label>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
{profile.protocol ===
|
||||
|
||||
Reference in New Issue
Block a user