Revert "fix: resolve chat conversation hanging and stream interruption issues (#1971)"

This reverts commit e68593f22d.
This commit is contained in:
Stijnus
2025-09-07 00:14:13 +02:00
committed by Stijnus
parent e68593f22d
commit 37217a5c7b
61 changed files with 1432 additions and 8811 deletions

View File

@@ -1,10 +1,10 @@
import { BaseProvider } from '~/lib/modules/llm/base-provider';
import type { ModelInfo } from '~/lib/modules/llm/types';
import type { IProviderSetting } from '~/types/model';
import type { LanguageModelV1 } from 'ai';
import type { IProviderSetting } from '~/types/model';
import { createAnthropic } from '@ai-sdk/anthropic';
export class AnthropicProvider extends BaseProvider {
export default class AnthropicProvider extends BaseProvider {
name = 'Anthropic';
getApiKeyLink = 'https://console.anthropic.com/settings/keys';
@@ -13,50 +13,6 @@ export class AnthropicProvider extends BaseProvider {
};
staticModels: ModelInfo[] = [
/*
* Claude Opus 4.1: Most powerful model for coding and reasoning
* Released August 5, 2025
*/
{
name: 'claude-opus-4-1-20250805',
label: 'Claude Opus 4.1',
provider: 'Anthropic',
maxTokenAllowed: 200000,
maxCompletionTokens: 64000,
supportsSmartAI: false, // Base model without SmartAI
},
{
name: 'claude-opus-4-1-20250805-smartai',
label: 'Claude Opus 4.1 (SmartAI)',
provider: 'Anthropic',
maxTokenAllowed: 200000,
maxCompletionTokens: 64000,
supportsSmartAI: true,
isSmartAIEnabled: true,
},
/*
* Claude Sonnet 4: Hybrid instant/extended response model
* Released May 14, 2025
*/
{
name: 'claude-sonnet-4-20250514',
label: 'Claude Sonnet 4',
provider: 'Anthropic',
maxTokenAllowed: 200000,
maxCompletionTokens: 64000,
supportsSmartAI: false, // Base model without SmartAI
},
{
name: 'claude-sonnet-4-20250514-smartai',
label: 'Claude Sonnet 4 (SmartAI)',
provider: 'Anthropic',
maxTokenAllowed: 200000,
maxCompletionTokens: 64000,
supportsSmartAI: true,
isSmartAIEnabled: true,
},
/*
* Essential fallback models - only the most stable/reliable ones
* Claude 3.5 Sonnet: 200k context, excellent for complex reasoning and coding
@@ -66,17 +22,7 @@ export class AnthropicProvider extends BaseProvider {
label: 'Claude 3.5 Sonnet',
provider: 'Anthropic',
maxTokenAllowed: 200000,
maxCompletionTokens: 8192,
supportsSmartAI: false, // Base model without SmartAI
},
{
name: 'claude-3-5-sonnet-20241022-smartai',
label: 'Claude 3.5 Sonnet (SmartAI)',
provider: 'Anthropic',
maxTokenAllowed: 200000,
maxCompletionTokens: 8192,
supportsSmartAI: true,
isSmartAIEnabled: true,
maxCompletionTokens: 128000,
},
// Claude 3 Haiku: 200k context, fastest and most cost-effective
@@ -85,17 +31,16 @@ export class AnthropicProvider extends BaseProvider {
label: 'Claude 3 Haiku',
provider: 'Anthropic',
maxTokenAllowed: 200000,
maxCompletionTokens: 4096,
supportsSmartAI: false, // Base model without SmartAI
maxCompletionTokens: 128000,
},
// Claude Opus 4: 200k context, 32k output limit (latest flagship model)
{
name: 'claude-3-haiku-20240307-smartai',
label: 'Claude 3 Haiku (SmartAI)',
name: 'claude-opus-4-20250514',
label: 'Claude 4 Opus',
provider: 'Anthropic',
maxTokenAllowed: 200000,
maxCompletionTokens: 4096,
supportsSmartAI: true,
isSmartAIEnabled: true,
maxCompletionTokens: 32000,
},
];
@@ -119,8 +64,7 @@ export class AnthropicProvider extends BaseProvider {
const response = await fetch(`https://api.anthropic.com/v1/models`, {
headers: {
'x-api-key': `${apiKey}`,
['anthropic-version']: '2023-06-01',
['Content-Type']: 'application/json',
'anthropic-version': '2023-06-01',
},
});
@@ -146,21 +90,15 @@ export class AnthropicProvider extends BaseProvider {
contextWindow = 200000; // Claude 3 Sonnet has 200k context
}
// Determine max completion tokens based on model
let maxCompletionTokens = 4096; // default fallback
// Determine completion token limits based on specific model
let maxCompletionTokens = 128000; // default for older Claude 3 models
if (m.id?.includes('claude-sonnet-4') || m.id?.includes('claude-opus-4')) {
maxCompletionTokens = 64000;
} else if (m.id?.includes('claude-3-7-sonnet')) {
maxCompletionTokens = 64000;
} else if (m.id?.includes('claude-3-5-sonnet')) {
maxCompletionTokens = 8192;
} else if (m.id?.includes('claude-3-haiku')) {
maxCompletionTokens = 4096;
} else if (m.id?.includes('claude-3-opus')) {
maxCompletionTokens = 4096;
} else if (m.id?.includes('claude-3-sonnet')) {
maxCompletionTokens = 4096;
if (m.id?.includes('claude-opus-4')) {
maxCompletionTokens = 32000; // Claude 4 Opus: 32K output limit
} else if (m.id?.includes('claude-sonnet-4')) {
maxCompletionTokens = 64000; // Claude 4 Sonnet: 64K output limit
} else if (m.id?.includes('claude-4')) {
maxCompletionTokens = 32000; // Other Claude 4 models: conservative 32K limit
}
return {
@@ -169,7 +107,6 @@ export class AnthropicProvider extends BaseProvider {
provider: this.name,
maxTokenAllowed: contextWindow,
maxCompletionTokens,
supportsSmartAI: true, // All Anthropic models support SmartAI
};
});
}
@@ -180,27 +117,19 @@ export class AnthropicProvider extends BaseProvider {
apiKeys?: Record<string, string>;
providerSettings?: Record<string, IProviderSetting>;
}) => LanguageModelV1 = (options) => {
const { model, serverEnv, apiKeys, providerSettings } = options;
const { apiKey, baseUrl } = this.getProviderBaseUrlAndKey({
const { apiKeys, providerSettings, serverEnv, model } = options;
const { apiKey } = this.getProviderBaseUrlAndKey({
apiKeys,
providerSettings: providerSettings?.[this.name],
providerSettings,
serverEnv: serverEnv as any,
defaultBaseUrlKey: '',
defaultApiTokenKey: 'ANTHROPIC_API_KEY',
});
if (!apiKey) {
throw `Missing API key for ${this.name} provider`;
}
const anthropic = createAnthropic({
apiKey,
baseURL: baseUrl || 'https://api.anthropic.com/v1',
headers: { 'anthropic-beta': 'output-128k-2025-02-19' },
});
// Handle SmartAI variant by using the base model name
const actualModel = model.replace('-smartai', '');
return anthropic(actualModel);
return anthropic(model);
};
}