From 0a879c5cd34ace9b2c3cabc6884fb6e3502dce5c Mon Sep 17 00:00:00 2001 From: Rick Sanchez <101627789+m4tinbeigi-official@users.noreply.github.com> Date: Mon, 28 Sep 2026 13:00:28 +0700 Subject: [PATCH] feat: add v1m System One provider --- open-sse/handlers/systemoneCore.js | 5 ++-- open-sse/providers/registry/index.js | 2 ++ open-sse/providers/registry/v1m.js | 31 ++++++++++++++++++++++ public/providers/v1m.png | Bin 0 -> 2006 bytes src/shared/constants/providers.js | 2 +- tests/unit/v1m-systemone-provider.test.js | 29 ++++++++++++++++++++ 6 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 open-sse/providers/registry/v1m.js create mode 100644 public/providers/v1m.png create mode 100644 tests/unit/v1m-systemone-provider.test.js diff --git a/open-sse/handlers/systemoneCore.js b/open-sse/handlers/systemoneCore.js index 82da570d..4fcb3004 100644 --- a/open-sse/handlers/systemoneCore.js +++ b/open-sse/handlers/systemoneCore.js @@ -19,7 +19,8 @@ export async function handleSystemoneCore({ }) { const { provider, model } = modelInfo; const cfg = PROVIDER_MEDIA[provider]?.systemoneConfig; - if (!cfg?.baseUrl) { + const targetUrl = credentials?.providerSpecificData?.baseUrl || cfg?.baseUrl; + if (!targetUrl) { return createErrorResult( HTTP_STATUS.BAD_REQUEST, `Provider '${provider}' does not support System One.` @@ -49,7 +50,7 @@ export async function handleSystemoneCore({ let providerResponse; try { - providerResponse = await fetch(cfg.baseUrl, { + providerResponse = await fetch(targetUrl, { method: "POST", headers, body: JSON.stringify(requestBody), diff --git a/open-sse/providers/registry/index.js b/open-sse/providers/registry/index.js index 6c9d1f41..17d1fea9 100644 --- a/open-sse/providers/registry/index.js +++ b/open-sse/providers/registry/index.js @@ -131,6 +131,7 @@ import p127 from "./atria.js"; import p129 from "./agnes.js"; import p130 from "./bai.js"; import p131 from "./tinyfish.js"; +import p132 from "./v1m.js"; export default [ p0, p1, @@ -262,4 +263,5 @@ export default [ p129, p130, p131, + p132, ]; diff --git a/open-sse/providers/registry/v1m.js b/open-sse/providers/registry/v1m.js new file mode 100644 index 00000000..9028785c --- /dev/null +++ b/open-sse/providers/registry/v1m.js @@ -0,0 +1,31 @@ +export default { + id: "v1m", + priority: 45, + alias: "v1m", + aliases: ["systemone", "jev"], + uiAlias: "v1m", + display: { + name: "v1m (System One)", + icon: "psychology", + color: "#6366F1", + textIcon: "V1", + website: "https://v1m.ir", + notice: { + text: "v1m System One calibrated decision engine. Fast probabilistic evaluations over state and questions.", + apiKeyUrl: "https://v1m.ir", + }, + }, + category: "apikey", + authType: "apikey", + hasProviderSpecificData: true, + models: [ + { id: "rev-latest", name: "v1m Rev Latest (Calibrated)", kind: "systemone" }, + { id: "v1m-decision-engine", name: "v1m Decision Engine", kind: "systemone" }, + ], + serviceKinds: ["systemone"], + systemoneConfig: { + baseUrl: "https://v1m.ir/v1/systemone", + authType: "apikey", + authHeader: "bearer", + }, +}; diff --git a/public/providers/v1m.png b/public/providers/v1m.png new file mode 100644 index 0000000000000000000000000000000000000000..5bfda74270af951583136ade6d387bc5797da9d7 GIT binary patch literal 2006 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 literal 0 HcmV?d00001 diff --git a/src/shared/constants/providers.js b/src/shared/constants/providers.js index 1e5f30f0..fa289469 100644 --- a/src/shared/constants/providers.js +++ b/src/shared/constants/providers.js @@ -1,6 +1,6 @@ // Provider definitions import REGISTRY from "open-sse/providers/registry/index.js"; -import { RISK_NOTICE } from "@/shared/constants/providersDisplay"; +import { RISK_NOTICE } from "@/shared/constants/providersDisplay.js"; const MEDIA_ENTRY_KEYS = [ "serviceKinds", "ttsConfig", "sttConfig", "embeddingConfig", diff --git a/tests/unit/v1m-systemone-provider.test.js b/tests/unit/v1m-systemone-provider.test.js new file mode 100644 index 00000000..39a44d46 --- /dev/null +++ b/tests/unit/v1m-systemone-provider.test.js @@ -0,0 +1,29 @@ +import { describe, expect, it } from "vitest"; +import REGISTRY from "../../open-sse/providers/registry/index.js"; +import { PROVIDER_MEDIA } from "../../open-sse/providers/index.js"; +import { AI_PROVIDERS, getProvidersByKind } from "@/shared/constants/providers"; + +describe("v1m System One provider", () => { + const entry = REGISTRY.find((e) => e.id === "v1m"); + + it("is registered as a System One apikey provider", () => { + expect(entry).toBeDefined(); + expect(entry.category).toBe("apikey"); + expect(entry.serviceKinds).toEqual(["systemone"]); + expect(PROVIDER_MEDIA["v1m"]?.systemoneConfig?.baseUrl).toBe("https://v1m.ir/v1/systemone"); + }); + + it("appears in getProvidersByKind('systemone')", () => { + const list = getProvidersByKind("systemone"); + const found = list.find((p) => p.id === "v1m"); + expect(found).toBeDefined(); + expect(found.alias).toBe("v1m"); + expect(found.systemoneConfig?.baseUrl).toBe("https://v1m.ir/v1/systemone"); + }); + + it("exposes calibrated models", () => { + const ids = (entry.models || []).map((m) => m.id); + expect(ids).toContain("rev-latest"); + expect(ids).toContain("v1m-decision-engine"); + }); +});