



























@@ -69,6 +69,14 @@ describe("arcee provider plugin", () => {
6969"arcee/trinity-large-preview",
7070"arcee/trinity-large-thinking",
7171]);
72+expect(
73+config?.models?.providers?.arcee?.models?.find(
74+(model) => model.id === "arcee/trinity-large-thinking",
75+)?.compat,
76+).toMatchObject({
77+supportsReasoningEffort: false,
78+supportsTools: false,
79+});
7280});
73817482it("keeps direct Arcee auth env candidates separate from OpenRouter", () => {
@@ -92,6 +100,12 @@ describe("arcee provider plugin", () => {
92100"trinity-large-preview",
93101"trinity-large-thinking",
94102]);
103+expect(
104+catalogProvider.models?.find((model) => model.id === "trinity-large-thinking")?.compat,
105+).toMatchObject({
106+supportsReasoningEffort: false,
107+supportsTools: false,
108+});
95109});
9611097111it("builds the OpenRouter-backed Arcee AI model catalog", async () => {
@@ -112,6 +126,12 @@ describe("arcee provider plugin", () => {
112126"arcee/trinity-large-preview",
113127"arcee/trinity-large-thinking",
114128]);
129+expect(
130+catalogProvider.models?.find((model) => model.id === "arcee/trinity-large-thinking")?.compat,
131+).toMatchObject({
132+supportsReasoningEffort: false,
133+supportsTools: false,
134+});
115135});
116136117137it("normalizes Arcee OpenRouter models to vendor-prefixed runtime ids", async () => {
@@ -130,6 +150,10 @@ describe("arcee provider plugin", () => {
130150} as never),
131151).toMatchObject({
132152id: "arcee/trinity-large-thinking",
153+compat: {
154+supportsReasoningEffort: false,
155+supportsTools: false,
156+},
133157});
134158135159expect(
@@ -176,6 +200,10 @@ describe("arcee provider plugin", () => {
176200).toMatchObject({
177201id: "arcee/trinity-large-thinking",
178202baseUrl: "https://openrouter.ai/api/v1",
203+compat: {
204+supportsReasoningEffort: false,
205+supportsTools: false,
206+},
179207});
180208181209expect(
@@ -189,4 +217,152 @@ describe("arcee provider plugin", () => {
189217baseUrl: "https://openrouter.ai/api/v1",
190218});
191219});
220+221+it("repairs stale Trinity tool compat on existing Arcee configs and runtime models", async () => {
222+const provider = await registerSingleProviderPlugin(arceePlugin);
223+224+expect(
225+provider.normalizeConfig?.({
226+provider: "arcee",
227+providerConfig: {
228+api: "openai-completions",
229+baseUrl: "https://openrouter.ai/v1/",
230+models: [
231+{
232+id: "arcee/trinity-large-thinking",
233+name: "Trinity Large Thinking",
234+reasoning: true,
235+input: ["text"],
236+contextWindow: 262144,
237+maxTokens: 80000,
238+cost: {
239+input: 0.25,
240+output: 0.9,
241+cacheRead: 0.25,
242+cacheWrite: 0.25,
243+},
244+compat: {
245+supportsReasoningEffort: false,
246+supportsStrictMode: true,
247+},
248+},
249+],
250+},
251+} as never),
252+).toMatchObject({
253+baseUrl: "https://openrouter.ai/api/v1",
254+models: [
255+{
256+id: "arcee/trinity-large-thinking",
257+compat: {
258+supportsReasoningEffort: false,
259+supportsStrictMode: true,
260+supportsTools: false,
261+},
262+},
263+],
264+});
265+266+expect(
267+provider.normalizeConfig?.({
268+provider: "arcee",
269+providerConfig: {
270+api: "openai-completions",
271+baseUrl: "https://api.arcee.ai/api/v1",
272+models: [
273+{
274+id: "trinity-large-thinking",
275+name: "Trinity Large Thinking",
276+reasoning: true,
277+input: ["text"],
278+contextWindow: 262144,
279+maxTokens: 80000,
280+cost: {
281+input: 0.25,
282+output: 0.9,
283+cacheRead: 0.25,
284+cacheWrite: 0.25,
285+},
286+compat: {
287+supportsReasoningEffort: false,
288+},
289+},
290+],
291+},
292+} as never),
293+).toMatchObject({
294+baseUrl: "https://api.arcee.ai/api/v1",
295+models: [
296+{
297+id: "trinity-large-thinking",
298+compat: {
299+supportsReasoningEffort: false,
300+supportsTools: false,
301+},
302+},
303+],
304+});
305+306+const trinityRuntimeModel = {
307+name: "Trinity Large Thinking",
308+api: "openai-completions",
309+reasoning: true,
310+input: ["text"],
311+contextWindow: 262144,
312+maxTokens: 80000,
313+cost: {
314+input: 0.25,
315+output: 0.9,
316+cacheRead: 0.25,
317+cacheWrite: 0.25,
318+},
319+compat: {
320+supportsReasoningEffort: false,
321+},
322+};
323+324+const trinityCompat = {
325+supportsReasoningEffort: false,
326+supportsTools: false,
327+};
328+329+expect(
330+provider.contributeResolvedModelCompat?.({
331+provider: "arcee",
332+modelId: "arcee/trinity-large-thinking",
333+model: {
334+ ...trinityRuntimeModel,
335+provider: "arcee",
336+id: "arcee/trinity-large-thinking",
337+baseUrl: "https://openrouter.ai/api/v1",
338+},
339+} as never),
340+).toEqual(trinityCompat);
341+342+expect(
343+provider.contributeResolvedModelCompat?.({
344+provider: "arcee",
345+modelId: "trinity-large-thinking",
346+model: {
347+ ...trinityRuntimeModel,
348+provider: "arcee",
349+id: "trinity-large-thinking",
350+baseUrl: "https://api.arcee.ai/api/v1",
351+},
352+} as never),
353+).toEqual(trinityCompat);
354+355+expect(
356+provider.contributeResolvedModelCompat?.({
357+provider: "openrouter",
358+modelId: "trinity-large-thinking",
359+model: {
360+ ...trinityRuntimeModel,
361+provider: "openrouter",
362+id: "trinity-large-thinking",
363+baseUrl: "https://openrouter.ai/api/v1",
364+},
365+} as never),
366+).toBeUndefined();
367+});
192368});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。