199 lines
5.7 KiB
TypeScript
199 lines
5.7 KiB
TypeScript
import { describe, expect, test } from 'vitest';
|
|
|
|
import { ClaudeMultimodelBridgeService } from './ClaudeMultimodelBridgeService';
|
|
|
|
import type { CliProviderId, CliProviderStatus } from '@shared/types';
|
|
|
|
interface RuntimeStatusMapper {
|
|
mapRuntimeProviderStatus: (
|
|
providerId: CliProviderId,
|
|
runtimeStatus: unknown
|
|
) => CliProviderStatus;
|
|
}
|
|
|
|
function mapRuntimeProviderStatus(
|
|
providerId: CliProviderId,
|
|
runtimeStatus: unknown
|
|
): CliProviderStatus {
|
|
const service = new ClaudeMultimodelBridgeService() as unknown as RuntimeStatusMapper;
|
|
return service.mapRuntimeProviderStatus(providerId, runtimeStatus);
|
|
}
|
|
|
|
describe('ClaudeMultimodelBridgeService runtime status mapping', () => {
|
|
test('maps Anthropic subscription rate limits from orchestrator runtime status', () => {
|
|
const provider = mapRuntimeProviderStatus('anthropic', {
|
|
supported: true,
|
|
authenticated: true,
|
|
authMethod: 'claude.ai',
|
|
verificationState: 'verified',
|
|
canLoginFromUi: true,
|
|
models: ['haiku'],
|
|
capabilities: {
|
|
teamLaunch: true,
|
|
oneShot: true,
|
|
},
|
|
subscriptionRateLimits: {
|
|
primary: {
|
|
usedPercent: 42.5,
|
|
windowDurationMins: 300,
|
|
resetsAt: 1_777_777_000,
|
|
},
|
|
secondary: {
|
|
usedPercent: 150,
|
|
windowDurationMins: Number.NaN,
|
|
resetsAt: Number.NaN,
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(provider.subscriptionRateLimits).toEqual({
|
|
primary: {
|
|
usedPercent: 42.5,
|
|
windowDurationMins: 300,
|
|
resetsAt: 1_777_777_000,
|
|
},
|
|
secondary: {
|
|
usedPercent: 100,
|
|
windowDurationMins: null,
|
|
resetsAt: null,
|
|
},
|
|
});
|
|
});
|
|
|
|
test('drops malformed Anthropic subscription rate limit windows', () => {
|
|
const provider = mapRuntimeProviderStatus('anthropic', {
|
|
supported: true,
|
|
authenticated: true,
|
|
authMethod: 'claude.ai',
|
|
verificationState: 'verified',
|
|
subscriptionRateLimits: {
|
|
primary: {
|
|
usedPercent: Number.NaN,
|
|
windowDurationMins: 300,
|
|
resetsAt: 1_777_777_000,
|
|
},
|
|
secondary: {
|
|
usedPercent: 60,
|
|
windowDurationMins: 10_080,
|
|
resetsAt: 1_777_999_000,
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(provider.subscriptionRateLimits).toEqual({
|
|
primary: null,
|
|
secondary: {
|
|
usedPercent: 60,
|
|
windowDurationMins: 10_080,
|
|
resetsAt: 1_777_999_000,
|
|
},
|
|
});
|
|
});
|
|
|
|
test('ignores subscription rate limits for non-Anthropic providers', () => {
|
|
const provider = mapRuntimeProviderStatus('codex', {
|
|
supported: true,
|
|
authenticated: true,
|
|
authMethod: 'oauth_token',
|
|
verificationState: 'verified',
|
|
subscriptionRateLimits: {
|
|
primary: {
|
|
usedPercent: 25,
|
|
windowDurationMins: 300,
|
|
resetsAt: 1_777_777_000,
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(provider.subscriptionRateLimits).toBeNull();
|
|
});
|
|
|
|
test('preserves OpenCode route metadata in runtime model catalog mapping', () => {
|
|
const provider = mapRuntimeProviderStatus('opencode', {
|
|
supported: true,
|
|
authenticated: true,
|
|
authMethod: 'opencode_configured_local',
|
|
verificationState: 'verified',
|
|
canLoginFromUi: false,
|
|
models: ['llama.cpp/qwen-test:0.5b'],
|
|
capabilities: {
|
|
teamLaunch: true,
|
|
oneShot: false,
|
|
},
|
|
modelCatalog: {
|
|
schemaVersion: 1,
|
|
providerId: 'opencode',
|
|
source: 'app-server',
|
|
status: 'ready',
|
|
fetchedAt: '2026-05-21T00:00:00.000Z',
|
|
staleAt: '2026-05-21T00:10:00.000Z',
|
|
defaultModelId: 'llama.cpp/qwen-test:0.5b',
|
|
defaultLaunchModel: 'llama.cpp/qwen-test:0.5b',
|
|
models: [
|
|
{
|
|
id: 'llama.cpp/qwen-test:0.5b',
|
|
launchModel: 'llama.cpp/qwen-test:0.5b',
|
|
displayName: 'qwen-test:0.5b',
|
|
hidden: false,
|
|
supportedReasoningEfforts: [],
|
|
defaultReasoningEffort: null,
|
|
inputModalities: ['text'],
|
|
supportsPersonality: true,
|
|
isDefault: true,
|
|
upgrade: false,
|
|
source: 'app-server',
|
|
metadata: {
|
|
cost: null,
|
|
context: 32768,
|
|
limits: null,
|
|
free: false,
|
|
opencode: {
|
|
providerId: 'llama.cpp',
|
|
modelId: 'qwen-test:0.5b',
|
|
sourceLabel: 'llama.cpp',
|
|
accessKind: 'configured_authless',
|
|
routeKind: 'configured_local',
|
|
proofState: 'needs_probe',
|
|
requiresExecutionProof: true,
|
|
reason: 'Execution proof required',
|
|
},
|
|
},
|
|
},
|
|
],
|
|
diagnostics: {
|
|
configReadState: 'ready',
|
|
appServerState: 'healthy',
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(provider.modelCatalog?.models[0]?.metadata?.opencode).toEqual({
|
|
providerId: 'llama.cpp',
|
|
modelId: 'qwen-test:0.5b',
|
|
sourceLabel: 'llama.cpp',
|
|
accessKind: 'configured_authless',
|
|
routeKind: 'configured_local',
|
|
proofState: 'needs_probe',
|
|
requiresExecutionProof: true,
|
|
reason: 'Execution proof required',
|
|
});
|
|
});
|
|
|
|
test('ignores Anthropic subscription rate limits for API key auth', () => {
|
|
const provider = mapRuntimeProviderStatus('anthropic', {
|
|
supported: true,
|
|
authenticated: true,
|
|
authMethod: 'api_key',
|
|
verificationState: 'verified',
|
|
subscriptionRateLimits: {
|
|
primary: {
|
|
usedPercent: 25,
|
|
windowDurationMins: 300,
|
|
resetsAt: 1_777_777_000,
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(provider.subscriptionRateLimits).toBeNull();
|
|
});
|
|
});
|