From cf7ecba81a138821b9065aa1788355b0390802da Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Thu, 8 Oct 2026 03:40:43 +0000 Subject: [PATCH] feat(ui): show Moyai in the Top agents panel Co-Authored-By: Ishaan Jaffer <155045088+ishaan-berri@users.noreply.github.com> --- .../components/overview/agentCatalog.test.ts | 10 ++++++++++ .../_components/components/overview/agentCatalog.ts | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/ui/litellm-dashboard/src/app/(dashboard)/usage/_components/components/overview/agentCatalog.test.ts b/ui/litellm-dashboard/src/app/(dashboard)/usage/_components/components/overview/agentCatalog.test.ts index 14ad625c79f..82b3e54316a 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/usage/_components/components/overview/agentCatalog.test.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/usage/_components/components/overview/agentCatalog.test.ts @@ -50,6 +50,16 @@ describe("isUserAgentTag", () => { }); describe("topAgents", () => { + it("recognises Moyai as an agent and keeps it in the agent group", () => { + const agents = topAgents([row("User-Agent: Moyai", 5, 900), row("User-Agent: python", 10, 1000)]); + const agentGroup = agents.filter((agent) => agent.kind === "agent"); + const sdkGroup = agents.filter((agent) => agent.kind === "sdk"); + const moyai = { id: "moyai", label: "Moyai", kind: "agent", tokens: 900 }; + expect(agentGroup[0]).toMatchObject(moyai); + expect(agentGroup[0].logo).toBeTruthy(); + expect(sdkGroup[0]).toMatchObject({ id: "python", kind: "sdk" }); + }); + it("counts a product from its bare rollup row, not again from its versioned children", () => { const agents = topAgents([ row("User-Agent: python", 100, 1000), diff --git a/ui/litellm-dashboard/src/app/(dashboard)/usage/_components/components/overview/agentCatalog.ts b/ui/litellm-dashboard/src/app/(dashboard)/usage/_components/components/overview/agentCatalog.ts index 57f481c14be..cb2ed4fa663 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/usage/_components/components/overview/agentCatalog.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/usage/_components/components/overview/agentCatalog.ts @@ -5,6 +5,7 @@ import githubLogo from "../../../../../../../public/assets/logos/github.svg"; import hermesLogo from "../../../../../../../public/assets/logos/hermes.png"; import langchainLogo from "../../../../../../../public/assets/logos/langchain.svg"; import litellmLogo from "../../../../../../../public/assets/logos/litellm_monogram.svg"; +import moyaiLogo from "../../../../../../../public/assets/moyai/moyai-head.svg"; import openaiLogo from "../../../../../../../public/assets/logos/openai_small.svg"; import openaiAgentsLogo from "../../../../../../../public/assets/logos/openai-agents.svg"; import opencodeLogo from "../../../../../../../public/assets/moyai/logos/opencode.svg"; @@ -48,6 +49,14 @@ interface AgentFamily { * mark as in the Lens trace view; Claude Code gets its own spark tile rather than Anthropic's wordmark. */ const FAMILIES: readonly AgentFamily[] = [ + { + id: "moyai", + label: "Moyai", + description: "Cloud coding agent", + kind: "agent", + logo: moyaiLogo.src, + match: /^moyai\b/i, + }, { id: "claude-code", label: "Claude Code",