From e832dd6e3f85c7ef33dc12efff01a6b51d1ae5b2 Mon Sep 17 00:00:00 2001 From: binyangzhu000-sudo <224954946+binyangzhu000-sudo@users.noreply.github.com> Date: Wed, 4 Nov 2026 17:36:37 +0800 Subject: [PATCH] feat(models): add Atlas Cloud as an LLM supplier Atlas Cloud is an OpenAI-compatible gateway (https://api.atlascloud.ai/v1) that serves DeepSeek, Kimi, GLM, Qwen and MiniMax models behind a single API key. Register it in the supplier picker next to the other OpenAI-compatible suppliers, mirroring the MiniMax supplier (#996): icon, supplier entry, i18n label in all five locales, README provider table and unit tests. Co-Authored-By: Claude Sonnet 5.5 Signed-off-by: binyangzhu000-sudo <224954946+binyangzhu000-sudo@users.noreply.github.com> --- backend/tests/test_supplier_config.py | 43 ++++++++++++++++++ docs/README.en.md | 1 + .../assets/model/icon_atlascloud_colorful.png | Bin 0 -> 4620 bytes frontend/src/entity/supplier.ts | 20 ++++++++ frontend/src/i18n/en.json | 1 + frontend/src/i18n/ko-KR.json | 1 + frontend/src/i18n/th-TH.json | 1 + frontend/src/i18n/zh-CN.json | 1 + frontend/src/i18n/zh-TW.json | 1 + 9 files changed, 69 insertions(+) create mode 100644 frontend/src/assets/model/icon_atlascloud_colorful.png diff --git a/backend/tests/test_supplier_config.py b/backend/tests/test_supplier_config.py index 0e2692cc7..6d9f67fc9 100644 --- a/backend/tests/test_supplier_config.py +++ b/backend/tests/test_supplier_config.py @@ -197,6 +197,49 @@ def test_icon_not_empty(self): self.assertGreater(size, 100, "Icon file should be reasonably sized") +class TestAtlasCloudSupplierConfig(unittest.TestCase): + """Test the Atlas Cloud supplier entry, icon and i18n entries.""" + + LOCALES = ["en", "zh-CN", "zh-TW", "ko-KR", "th-TH"] + + def setUp(self): + supplier_path = os.path.join( + PROJECT_ROOT, "frontend", "src", "entity", "supplier.ts" + ) + with open(supplier_path, encoding="utf-8") as f: + self.supplier_content = f.read() + section = self.supplier_content.split("id: 16,", 1)[1] + self.section = section.split("/* {", 1)[0] + + def test_entry(self): + self.assertEqual(self.supplier_content.count("id: 16"), 1) + self.assertIn("name: 'Atlas Cloud'", self.section) + self.assertIn("i18nKey: 'supplier.atlascloud'", self.section) + self.assertIn("icon: icon_atlascloud_colorful", self.section) + self.assertIn("api_domain: 'https://api.atlascloud.ai/v1'", self.section) + + def test_uses_openai_protocol(self): + self.assertNotIn("type: 'vllm'", self.section) + self.assertNotIn("type: 'azure'", self.section) + + def test_icon_file_is_png(self): + icon_path = os.path.join( + PROJECT_ROOT, "frontend", "src", "assets", "model", + "icon_atlascloud_colorful.png", + ) + with open(icon_path, "rb") as f: + self.assertEqual(f.read(8), b"\x89PNG\r\n\x1a\n") + + def test_i18n_in_all_locales(self): + for locale in self.LOCALES: + path = os.path.join( + PROJECT_ROOT, "frontend", "src", "i18n", f"{locale}.json" + ) + with open(path, encoding="utf-8") as f: + data = json.load(f) + self.assertEqual(data["supplier"]["atlascloud"], "Atlas Cloud", locale) + + class TestModelFactoryConfig(unittest.TestCase): """Test that backend model_factory.py can support MiniMax via OpenAI protocol.""" diff --git a/docs/README.en.md b/docs/README.en.md index 02aacf3c5..569499b89 100644 --- a/docs/README.en.md +++ b/docs/README.en.md @@ -45,6 +45,7 @@ SQLBot is an intelligent data query system based on large language models and RA | Tencent Cloud | OpenAI Compatible | | Volcano Engine | OpenAI Compatible | | MiniMax | OpenAI Compatible | +| Atlas Cloud | OpenAI Compatible | | Generic OpenAI Compatible | Custom | ## Quick Start diff --git a/frontend/src/assets/model/icon_atlascloud_colorful.png b/frontend/src/assets/model/icon_atlascloud_colorful.png new file mode 100644 index 0000000000000000000000000000000000000000..3086d3afc778b4df2e779a04364bdcb38b22d9e6 GIT binary patch literal 4620 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