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,