mirror of
https://github.com/QwenLM/qwen-code.git
synced 2026-04-30 04:30:48 +00:00
61 lines
2 KiB
TypeScript
61 lines
2 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2025 Qwen Team
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
import { AuthType } from '@qwen-code/qwen-code-core';
|
|
import { z } from 'zod';
|
|
|
|
/**
|
|
* ACP model IDs are represented as `${modelId}(${authType})` in the ACP protocol.
|
|
*/
|
|
export function formatAcpModelId(modelId: string, authType: AuthType): string {
|
|
return `${modelId}(${authType})`;
|
|
}
|
|
|
|
/**
|
|
* Extracts the base model id from an ACP model id string.
|
|
*
|
|
* If the string ends with `(...)`, the suffix is removed; otherwise returns the
|
|
* trimmed input as-is.
|
|
*/
|
|
export function parseAcpBaseModelId(value: string): string {
|
|
const trimmed = value.trim();
|
|
const closeIdx = trimmed.lastIndexOf(')');
|
|
const openIdx = trimmed.lastIndexOf('(');
|
|
if (openIdx >= 0 && closeIdx === trimmed.length - 1 && openIdx < closeIdx) {
|
|
return trimmed.slice(0, openIdx);
|
|
}
|
|
return trimmed;
|
|
}
|
|
|
|
/**
|
|
* Parses an ACP model option string into `{ modelId, authType? }`.
|
|
*
|
|
* Supports the following formats:
|
|
* - `${modelId}(${authType})` - Standard registry model (e.g., "gpt-4(USE_OPENAI)")
|
|
* - `${snapshotId}(${authType})` - Runtime model snapshot (e.g., "$runtime|USE_OPENAI|gpt-4(USE_OPENAI)")
|
|
* where snapshotId is in format `$runtime|${authType}|${modelId}`
|
|
* - Plain model ID - Returns as-is with no authType
|
|
*
|
|
* If the string ends with `(...)` and `...` is a valid `AuthType`, returns both;
|
|
* otherwise returns the trimmed input as `modelId` only.
|
|
*/
|
|
export function parseAcpModelOption(input: string): {
|
|
modelId: string;
|
|
authType?: AuthType;
|
|
} {
|
|
const trimmed = input.trim();
|
|
const closeIdx = trimmed.lastIndexOf(')');
|
|
const openIdx = trimmed.lastIndexOf('(');
|
|
if (openIdx >= 0 && closeIdx === trimmed.length - 1 && openIdx < closeIdx) {
|
|
const maybeModelId = trimmed.slice(0, openIdx);
|
|
const maybeAuthType = trimmed.slice(openIdx + 1, closeIdx);
|
|
const parsedAuthType = z.nativeEnum(AuthType).safeParse(maybeAuthType);
|
|
if (parsedAuthType.success) {
|
|
return { modelId: maybeModelId, authType: parsedAuthType.data };
|
|
}
|
|
}
|
|
return { modelId: trimmed };
|
|
}
|