mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-06 16:30:57 +00:00
fix(clawsweeper): address review for automerge-openclaw-openclaw-73388 (2)
This commit is contained in:
@@ -209,4 +209,80 @@ describe("arcee provider plugin", () => {
|
||||
baseUrl: "https://openrouter.ai/api/v1",
|
||||
});
|
||||
});
|
||||
|
||||
it("repairs stale Trinity tool compat on existing Arcee configs and runtime models", async () => {
|
||||
const provider = await registerSingleProviderPlugin(arceePlugin);
|
||||
|
||||
expect(
|
||||
provider.normalizeConfig?.({
|
||||
provider: "arcee",
|
||||
providerConfig: {
|
||||
api: "openai-completions",
|
||||
baseUrl: "https://openrouter.ai/v1/",
|
||||
models: [
|
||||
{
|
||||
id: "arcee/trinity-large-thinking",
|
||||
name: "Trinity Large Thinking",
|
||||
reasoning: true,
|
||||
input: ["text"],
|
||||
contextWindow: 262144,
|
||||
maxTokens: 80000,
|
||||
cost: {
|
||||
input: 0.25,
|
||||
output: 0.9,
|
||||
cacheRead: 0.25,
|
||||
cacheWrite: 0.25,
|
||||
},
|
||||
compat: {
|
||||
supportsReasoningEffort: false,
|
||||
supportsStrictMode: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
} as never),
|
||||
).toMatchObject({
|
||||
baseUrl: "https://openrouter.ai/api/v1",
|
||||
models: [
|
||||
{
|
||||
id: "arcee/trinity-large-thinking",
|
||||
compat: {
|
||||
supportsReasoningEffort: false,
|
||||
supportsStrictMode: true,
|
||||
supportsTools: false,
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
expect(
|
||||
provider.contributeResolvedModelCompat?.({
|
||||
provider: "arcee",
|
||||
modelId: "arcee/trinity-large-thinking",
|
||||
model: {
|
||||
provider: "arcee",
|
||||
id: "arcee/trinity-large-thinking",
|
||||
name: "Trinity Large Thinking",
|
||||
api: "openai-completions",
|
||||
baseUrl: "https://openrouter.ai/api/v1",
|
||||
reasoning: true,
|
||||
input: ["text"],
|
||||
contextWindow: 262144,
|
||||
maxTokens: 80000,
|
||||
cost: {
|
||||
input: 0.25,
|
||||
output: 0.9,
|
||||
cacheRead: 0.25,
|
||||
cacheWrite: 0.25,
|
||||
},
|
||||
compat: {
|
||||
supportsReasoningEffort: false,
|
||||
},
|
||||
},
|
||||
} as never),
|
||||
).toEqual({
|
||||
supportsReasoningEffort: false,
|
||||
supportsTools: false,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -5,6 +5,10 @@ import {
|
||||
type ProviderCatalogContext,
|
||||
} from "openclaw/plugin-sdk/provider-catalog-shared";
|
||||
import { OPENAI_COMPATIBLE_REPLAY_HOOKS } from "openclaw/plugin-sdk/provider-model-shared";
|
||||
import {
|
||||
ARCEE_TRINITY_LARGE_THINKING_COMPAT,
|
||||
isArceeTrinityLargeThinkingModelId,
|
||||
} from "./models.js";
|
||||
import {
|
||||
applyArceeConfig,
|
||||
applyArceeOpenRouterConfig,
|
||||
@@ -17,6 +21,7 @@ import {
|
||||
normalizeArceeOpenRouterBaseUrl,
|
||||
toArceeOpenRouterModelId,
|
||||
} from "./provider-catalog.js";
|
||||
import { normalizeArceeProviderConfig } from "./provider-policy-api.js";
|
||||
|
||||
const PROVIDER_ID = "arcee";
|
||||
const ARCEE_WIZARD_GROUP = {
|
||||
@@ -120,13 +125,12 @@ export default definePluginEntry({
|
||||
config,
|
||||
providerId: PROVIDER_ID,
|
||||
}),
|
||||
normalizeConfig: ({ providerConfig }) => {
|
||||
const normalizedBaseUrl = normalizeArceeOpenRouterBaseUrl(providerConfig.baseUrl);
|
||||
return normalizedBaseUrl && normalizedBaseUrl !== providerConfig.baseUrl
|
||||
? { ...providerConfig, baseUrl: normalizedBaseUrl }
|
||||
: undefined;
|
||||
},
|
||||
normalizeConfig: ({ providerConfig }) => normalizeArceeProviderConfig(providerConfig),
|
||||
normalizeResolvedModel: ({ model }) => normalizeArceeResolvedModel(model),
|
||||
contributeResolvedModelCompat: ({ modelId, model }) =>
|
||||
isArceeTrinityLargeThinkingModelId(model.id) || isArceeTrinityLargeThinkingModelId(modelId)
|
||||
? ARCEE_TRINITY_LARGE_THINKING_COMPAT
|
||||
: undefined,
|
||||
normalizeTransport: ({ api, baseUrl }) => {
|
||||
const normalizedBaseUrl = normalizeArceeOpenRouterBaseUrl(baseUrl);
|
||||
return normalizedBaseUrl && normalizedBaseUrl !== baseUrl
|
||||
|
||||
@@ -1,6 +1,18 @@
|
||||
import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-model-shared";
|
||||
import type {
|
||||
ModelCompatConfig,
|
||||
ModelDefinitionConfig,
|
||||
} from "openclaw/plugin-sdk/provider-model-shared";
|
||||
|
||||
export const ARCEE_BASE_URL = "https://api.arcee.ai/api/v1";
|
||||
export const ARCEE_TRINITY_LARGE_THINKING_COMPAT = {
|
||||
supportsReasoningEffort: false,
|
||||
supportsTools: false,
|
||||
} as const satisfies ModelCompatConfig;
|
||||
|
||||
export function isArceeTrinityLargeThinkingModelId(modelId: string): boolean {
|
||||
const normalized = modelId.trim().toLowerCase();
|
||||
return normalized === "trinity-large-thinking" || normalized === "arcee/trinity-large-thinking";
|
||||
}
|
||||
|
||||
export const ARCEE_MODEL_CATALOG: ModelDefinitionConfig[] = [
|
||||
{
|
||||
@@ -44,10 +56,7 @@ export const ARCEE_MODEL_CATALOG: ModelDefinitionConfig[] = [
|
||||
cacheRead: 0.25,
|
||||
cacheWrite: 0.25,
|
||||
},
|
||||
compat: {
|
||||
supportsReasoningEffort: false,
|
||||
supportsTools: false,
|
||||
},
|
||||
compat: ARCEE_TRINITY_LARGE_THINKING_COMPAT,
|
||||
},
|
||||
];
|
||||
|
||||
|
||||
52
extensions/arcee/provider-policy-api.ts
Normal file
52
extensions/arcee/provider-policy-api.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
import type { ModelProviderConfig } from "openclaw/plugin-sdk/provider-model-types";
|
||||
import {
|
||||
ARCEE_TRINITY_LARGE_THINKING_COMPAT,
|
||||
isArceeTrinityLargeThinkingModelId,
|
||||
} from "./models.js";
|
||||
import { normalizeArceeOpenRouterBaseUrl } from "./provider-catalog.js";
|
||||
|
||||
export function normalizeArceeProviderConfig(
|
||||
providerConfig: ModelProviderConfig,
|
||||
): ModelProviderConfig {
|
||||
let changed = false;
|
||||
const normalizedBaseUrl = normalizeArceeOpenRouterBaseUrl(providerConfig.baseUrl);
|
||||
const baseUrl =
|
||||
normalizedBaseUrl && normalizedBaseUrl !== providerConfig.baseUrl
|
||||
? normalizedBaseUrl
|
||||
: providerConfig.baseUrl;
|
||||
if (baseUrl !== providerConfig.baseUrl) {
|
||||
changed = true;
|
||||
}
|
||||
|
||||
const hasModels = Array.isArray(providerConfig.models);
|
||||
const models = hasModels
|
||||
? providerConfig.models.map((model) => {
|
||||
if (!isArceeTrinityLargeThinkingModelId(model.id)) {
|
||||
return model;
|
||||
}
|
||||
if (
|
||||
model.compat?.supportsReasoningEffort ===
|
||||
ARCEE_TRINITY_LARGE_THINKING_COMPAT.supportsReasoningEffort &&
|
||||
model.compat?.supportsTools === ARCEE_TRINITY_LARGE_THINKING_COMPAT.supportsTools
|
||||
) {
|
||||
return model;
|
||||
}
|
||||
changed = true;
|
||||
return {
|
||||
...model,
|
||||
compat: {
|
||||
...model.compat,
|
||||
...ARCEE_TRINITY_LARGE_THINKING_COMPAT,
|
||||
},
|
||||
};
|
||||
})
|
||||
: providerConfig.models;
|
||||
|
||||
return changed
|
||||
? { ...providerConfig, baseUrl, ...(hasModels ? { models } : {}) }
|
||||
: providerConfig;
|
||||
}
|
||||
|
||||
export function normalizeConfig(params: { providerConfig: ModelProviderConfig }) {
|
||||
return normalizeArceeProviderConfig(params.providerConfig);
|
||||
}
|
||||
Reference in New Issue
Block a user