| import { describe, expect, it } from "vitest"; |
| import type { OpenClawConfig } from "../config/config.js"; |
| import { resolveChannelModelOverride } from "./model-overrides.js"; |
|
|
| describe("resolveChannelModelOverride", () => { |
| const cases = [ |
| { |
| name: "matches parent group id when topic suffix is present", |
| input: { |
| cfg: { |
| channels: { |
| modelByChannel: { |
| telegram: { |
| "-100123": "openai/gpt-4.1", |
| }, |
| }, |
| }, |
| } as unknown as OpenClawConfig, |
| channel: "telegram", |
| groupId: "-100123:topic:99", |
| }, |
| expected: { model: "openai/gpt-4.1", matchKey: "-100123" }, |
| }, |
| { |
| name: "prefers topic-specific match over parent group id", |
| input: { |
| cfg: { |
| channels: { |
| modelByChannel: { |
| telegram: { |
| "-100123": "openai/gpt-4.1", |
| "-100123:topic:99": "anthropic/claude-sonnet-4-6", |
| }, |
| }, |
| }, |
| } as unknown as OpenClawConfig, |
| channel: "telegram", |
| groupId: "-100123:topic:99", |
| }, |
| expected: { model: "anthropic/claude-sonnet-4-6", matchKey: "-100123:topic:99" }, |
| }, |
| { |
| name: "falls back to parent session key when thread id does not match", |
| input: { |
| cfg: { |
| channels: { |
| modelByChannel: { |
| discord: { |
| "123": "openai/gpt-4.1", |
| }, |
| }, |
| }, |
| } as unknown as OpenClawConfig, |
| channel: "discord", |
| groupId: "999", |
| parentSessionKey: "agent:main:discord:channel:123:thread:456", |
| }, |
| expected: { model: "openai/gpt-4.1", matchKey: "123" }, |
| }, |
| ] as const; |
|
|
| for (const testCase of cases) { |
| it(testCase.name, () => { |
| const resolved = resolveChannelModelOverride(testCase.input); |
| expect(resolved?.model).toBe(testCase.expected.model); |
| expect(resolved?.matchKey).toBe(testCase.expected.matchKey); |
| }); |
| } |
| }); |
|
|