openclaw/src/utils/message-provider.ts

113 lines
3.1 KiB
TypeScript

import {
GATEWAY_CLIENT_MODES,
GATEWAY_CLIENT_NAMES,
type GatewayClientMode,
type GatewayClientName,
normalizeGatewayClientMode,
normalizeGatewayClientName,
} from "../gateway/protocol/client-info.js";
import {
listChatProviderAliases,
normalizeChatProviderId,
PROVIDER_IDS,
} from "../providers/registry.js";
export const INTERNAL_MESSAGE_PROVIDER = "webchat" as const;
export type InternalMessageProvider = typeof INTERNAL_MESSAGE_PROVIDER;
export { GATEWAY_CLIENT_NAMES, GATEWAY_CLIENT_MODES };
export type { GatewayClientName, GatewayClientMode };
export { normalizeGatewayClientName, normalizeGatewayClientMode };
type GatewayClientInfoLike = {
mode?: string | null;
id?: string | null;
};
export function isGatewayCliClient(
client?: GatewayClientInfoLike | null,
): boolean {
return normalizeGatewayClientMode(client?.mode) === GATEWAY_CLIENT_MODES.CLI;
}
export function isInternalMessageProvider(
raw?: string | null,
): raw is InternalMessageProvider {
return normalizeMessageProvider(raw) === INTERNAL_MESSAGE_PROVIDER;
}
export function isWebchatClient(
client?: GatewayClientInfoLike | null,
): boolean {
const mode = normalizeGatewayClientMode(client?.mode);
if (mode === GATEWAY_CLIENT_MODES.WEBCHAT) return true;
return (
normalizeGatewayClientName(client?.id) === GATEWAY_CLIENT_NAMES.WEBCHAT_UI
);
}
export function normalizeMessageProvider(
raw?: string | null,
): string | undefined {
const normalized = raw?.trim().toLowerCase();
if (!normalized) return undefined;
if (normalized === INTERNAL_MESSAGE_PROVIDER)
return INTERNAL_MESSAGE_PROVIDER;
return normalizeChatProviderId(normalized) ?? normalized;
}
export const DELIVERABLE_MESSAGE_PROVIDERS = PROVIDER_IDS;
export type DeliverableMessageProvider =
(typeof DELIVERABLE_MESSAGE_PROVIDERS)[number];
export type GatewayMessageProvider =
| DeliverableMessageProvider
| InternalMessageProvider;
export const GATEWAY_MESSAGE_PROVIDERS = [
...DELIVERABLE_MESSAGE_PROVIDERS,
INTERNAL_MESSAGE_PROVIDER,
] as const;
export const GATEWAY_AGENT_PROVIDER_ALIASES = listChatProviderAliases();
export type GatewayAgentProviderHint = GatewayMessageProvider | "last";
export const GATEWAY_AGENT_PROVIDER_VALUES = Array.from(
new Set([
...GATEWAY_MESSAGE_PROVIDERS,
"last",
...GATEWAY_AGENT_PROVIDER_ALIASES,
]),
);
export function isGatewayMessageProvider(
value: string,
): value is GatewayMessageProvider {
return (GATEWAY_MESSAGE_PROVIDERS as readonly string[]).includes(value);
}
export function isDeliverableMessageProvider(
value: string,
): value is DeliverableMessageProvider {
return (DELIVERABLE_MESSAGE_PROVIDERS as readonly string[]).includes(value);
}
export function resolveGatewayMessageProvider(
raw?: string | null,
): GatewayMessageProvider | undefined {
const normalized = normalizeMessageProvider(raw);
if (!normalized) return undefined;
return isGatewayMessageProvider(normalized) ? normalized : undefined;
}
export function resolveMessageProvider(
primary?: string | null,
fallback?: string | null,
): string | undefined {
return (
normalizeMessageProvider(primary) ?? normalizeMessageProvider(fallback)
);
}