diff --git a/backend/app/model/model_platform.py b/backend/app/model/model_platform.py
index 2e16856a..a68bc8a9 100644
--- a/backend/app/model/model_platform.py
+++ b/backend/app/model/model_platform.py
@@ -18,6 +18,7 @@ from pydantic import BeforeValidator
PLATFORM_ALIAS_MAPPING: Final[dict[str, str]] = {
"z.ai": "zhipuai",
+ "ant-ling": "openai-compatible-model",
"ModelArk": "openai-compatible-model",
"grok": "openai-compatible-model",
"ernie": "qianfan",
diff --git a/backend/tests/app/model/test_chat.py b/backend/tests/app/model/test_chat.py
index 86b74a44..3955ef42 100644
--- a/backend/tests/app/model/test_chat.py
+++ b/backend/tests/app/model/test_chat.py
@@ -185,6 +185,11 @@ class TestModelPlatformMapping:
chat = self._create_chat("nebius")
assert chat.model_platform == "openai-compatible-model"
+ def test_chat_maps_ant_ling_to_openai_compatible_model(self):
+ """Test Chat maps Ant Ling (百灵) platform alias correctly."""
+ chat = self._create_chat("ant-ling")
+ assert chat.model_platform == "openai-compatible-model"
+
def test_chat_keeps_supported_platforms_unchanged(self):
"""Test Chat keeps native camel-ai platforms unchanged."""
chat = self._create_chat("mistral")
diff --git a/src/assets/model/ant-ling.svg b/src/assets/model/ant-ling.svg
new file mode 100644
index 00000000..3253266f
--- /dev/null
+++ b/src/assets/model/ant-ling.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/wechat_qr.jpg b/src/assets/wechat_qr.jpg
index aea450df..32a1dd4e 100644
Binary files a/src/assets/wechat_qr.jpg and b/src/assets/wechat_qr.jpg differ
diff --git a/src/components/ui/ShinyText/ShinyText.css b/src/components/ui/ShinyText/ShinyText.css
index a80131dc..4a7027a1 100644
--- a/src/components/ui/ShinyText/ShinyText.css
+++ b/src/components/ui/ShinyText/ShinyText.css
@@ -6,9 +6,19 @@
-webkit-background-clip: text;
background-clip: text;
display: inline-block;
+ animation: shine 3s linear infinite;
font-weight: 500;
}
+@keyframes shine {
+ 0% {
+ background-position: 200% center;
+ }
+ 100% {
+ background-position: -200% center;
+ }
+}
+
.shiny-text.disabled {
animation: none;
color: #71717b;
diff --git a/src/components/ui/WordCarousel/WordCarousel.css b/src/components/ui/WordCarousel/WordCarousel.css
index 373e81c9..cef47ebb 100644
--- a/src/components/ui/WordCarousel/WordCarousel.css
+++ b/src/components/ui/WordCarousel/WordCarousel.css
@@ -3,11 +3,13 @@
display: inline-block;
background: var(--word-gradient);
background-size: 200% 100%;
- background-position: 50% 50%;
+ background-position: 0% 50%;
-webkit-background-clip: text;
background-clip: text;
color: transparent;
white-space: nowrap;
+ animation: gradient-sweep var(--sweep-duration, 2200ms) linear infinite;
+ will-change: background-position, opacity;
}
.word-carousel.is-fading {
@@ -15,14 +17,26 @@
opacity: 0.35;
}
-/* Kept for API compatibility; the decorative gradient remains static. */
+/* run once, left-to-right */
.word-carousel.sweep-once {
- background-position: 50% 50%;
+ animation-iteration-count: 1;
+ animation-fill-mode: forwards;
+ animation-timing-function: cubic-bezier(0.22, 1, 0.36, 1);
+}
+
+@keyframes gradient-sweep {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 100% {
+ background-position: 100% 50%;
+ }
}
@media (prefers-reduced-motion: reduce) {
.word-carousel,
.word-carousel.sweep-once {
+ animation: none;
background-position: 50% 50%;
}
diff --git a/src/lib/llm.ts b/src/lib/llm.ts
index 5ec4faff..3d2024f9 100644
--- a/src/lib/llm.ts
+++ b/src/lib/llm.ts
@@ -243,6 +243,17 @@ export const INIT_PROVODERS: Provider[] = [
modelsEndpoint: '/models',
websiteUrl: 'https://docs.tokenfactory.nebius.com/quickstart',
},
+ {
+ id: 'ant-ling',
+ name: 'Ant Ling',
+ apiKey: '',
+ apiHost: 'https://api.ant-ling.com/v1',
+ description: 'Ant Ling model configuration',
+ is_valid: false,
+ model_type: '',
+ modelsEndpoint: '/models',
+ websiteUrl: 'https://developer.ant-ling.com',
+ },
{
id: 'openai-compatible-model',
name: 'OpenAI Compatible',
diff --git a/src/shared/modelProviderImages.ts b/src/shared/modelProviderImages.ts
index 27bfb91b..2a5cc479 100644
--- a/src/shared/modelProviderImages.ts
+++ b/src/shared/modelProviderImages.ts
@@ -12,6 +12,7 @@
// limitations under the License.
// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. =========
+import antLingImage from '@/assets/model/ant-ling.svg';
import anthropicImage from '@/assets/model/anthropic.svg';
import azureImage from '@/assets/model/azure.svg';
import bedrockImage from '@/assets/model/bedrock.svg';
@@ -42,6 +43,7 @@ const MODEL_PROVIDER_IMAGE_MAP: Record = {
cloud: eigentImage,
openai: openaiImage,
'codex-subscription': openaiImage,
+ 'ant-ling': antLingImage,
anthropic: anthropicImage,
gemini: geminiImage,
nebius: PROVIDER_AVATAR_URLS.nebius,