Skip to content

feat: Free Models page with provider logos and public API#1608

Merged
SebConejo merged 2 commits intomainfrom
update-ui
Apr 18, 2026
Merged

feat: Free Models page with provider logos and public API#1608
SebConejo merged 2 commits intomainfrom
update-ui

Conversation

@SebConejo
Copy link
Copy Markdown
Member

@SebConejo SebConejo commented Apr 18, 2026

Summary

  • Add Free Models page with daily cron sync from awesome-free-llm-apis GitHub repo
  • Add provider logos (SVG) for all 15 free providers with dark mode variants
  • Add icon resolution in ProviderIcon.tsx for Routing, Overview, and Messages pages
  • Add public endpoint GET /api/v1/public/free-providers (no auth required)
  • Connect buttons link to built-in provider modals for known providers
  • Ollama Cloud disabled in cloud mode with tooltip
  • Rename "Z AI (Zhipu AI)" to "Z AI"

Test plan

  • Verify Free Models page shows all provider logos in light and dark mode
  • Verify Connect buttons link to correct provider modals
  • Verify curl /api/v1/public/free-providers returns 15 providers without auth
  • Verify Ollama Cloud button is disabled in cloud mode
  • Run backend tests: cd packages/backend && npx jest --no-coverage
  • Run frontend tests: cd packages/frontend && npx vitest run --no-coverage

Summary by cubic

Adds a new Free Models page with provider logos and daily-synced data, plus a public API to fetch free provider info. Also unifies provider icon rendering across the app.

  • New Features

    • Free Models page: shows 15 free providers with light/dark logos, tags, warnings, and model details; “Connect” opens provider modals (Ollama Cloud disabled in cloud mode with tooltip); added toggle to show models for providers without base_url.
    • Daily sync from GitHub repo mnfst/awesome-free-llm-apis on startup and at midnight; results cached for 1h.
    • Endpoints: GET /api/v1/free-models (app) and GET /api/v1/public/free-providers (public, no auth).
    • Added SVG logos for all providers and renamed “Z AI (Zhipu AI)” to “Z AI”.
  • Refactors

    • Centralized custom provider logo resolution in ProviderIcon.tsx across Routing, Overview, and Messages; custom providers now render proper logos; tests updated.
    • Added CSS for dark-mode logo swaps and disabled-button tooltip styling; extended FreeModels tests for dark mode, connect links, and cloud tooltip (line coverage 100%).

Written for commit 80ba28f. Summary will update on new commits.

- Add Free Models page syncing provider data from awesome-free-llm-apis
  GitHub repo (daily cron at midnight + on startup)
- Add provider logos for all 15 free providers (SVG icons with dark mode variants)
- Add CUSTOM_PROVIDER_LOGOS map in ProviderIcon.tsx for icon resolution
  across Routing, Overview, and Messages pages
- Add public endpoint GET /api/v1/public/free-providers (no auth required)
- Connect button links to built-in provider modal for known providers
  (Gemini, Mistral, OpenRouter, Z AI, Ollama Cloud)
- Ollama Cloud connect button disabled in cloud mode with tooltip
- Rename "Z AI (Zhipu AI)" display name to "Z AI"
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 18, 2026

Codecov Report

❌ Patch coverage is 98.69281% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 97.99%. Comparing base (6d60e55) to head (80ba28f).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main    #1608      +/-   ##
==========================================
- Coverage   98.01%   97.99%   -0.03%     
==========================================
  Files         119      120       +1     
  Lines        8967     8967              
  Branches     3372     3405      +33     
==========================================
- Hits         8789     8787       -2     
- Misses        176      178       +2     
  Partials        2        2              
Flag Coverage Δ
frontend 97.98% <98.69%> (-0.03%) ⬇️
shared 100.00% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3 issues found across 36 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/frontend/tests/pages/Overview.test.tsx">

<violation number="1" location="packages/frontend/tests/pages/Overview.test.tsx:414">
P3: Scope this assertion to the Recent Messages section; otherwise it can pass because the same Groq logo also appears in Cost by Model.</violation>
</file>

<file name="packages/backend/src/free-models/free-models-provider-metadata.ts">

<violation number="1" location="packages/backend/src/free-models/free-models-provider-metadata.ts:56">
P2: Kilo Code references a logo file that is not present, so the Free Models page will render a broken image for this provider.</violation>

<violation number="2" location="packages/backend/src/free-models/free-models-provider-metadata.ts:61">
P3: LLM7.io is configured with an empty logo path, so it can never display a provider logo.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

warning: '',
},
'Kilo Code': {
logo: '/icons/kilocode.jpg',
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot Apr 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Kilo Code references a logo file that is not present, so the Free Models page will render a broken image for this provider.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/backend/src/free-models/free-models-provider-metadata.ts, line 56:

<comment>Kilo Code references a logo file that is not present, so the Free Models page will render a broken image for this provider.</comment>

<file context>
@@ -0,0 +1,96 @@
+    warning: '',
+  },
+  'Kilo Code': {
+    logo: '/icons/kilocode.jpg',
+    tags: ['No credit card required'],
+    warning: 'Prompts and outputs are logged on free models to improve provider products.',
</file context>
Fix with Cubic

Comment on lines +414 to +415
const img = container.querySelector('img[alt="Groq"]');
expect(img).not.toBeNull();
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot Apr 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: Scope this assertion to the Recent Messages section; otherwise it can pass because the same Groq logo also appears in Cost by Model.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/frontend/tests/pages/Overview.test.tsx, line 414:

<comment>Scope this assertion to the Recent Messages section; otherwise it can pass because the same Groq logo also appears in Cost by Model.</comment>

<file context>
@@ -406,14 +406,13 @@ describe("Overview", () => {
-        const letter = container.querySelector(".provider-card__logo-letter");
-        expect(letter).not.toBeNull();
-        expect(letter!.textContent).toBe("G");
+        const img = container.querySelector('img[alt="Groq"]');
+        expect(img).not.toBeNull();
       });
</file context>
Suggested change
const img = container.querySelector('img[alt="Groq"]');
expect(img).not.toBeNull();
const recentPanel = Array.from(container.querySelectorAll('.panel')).find((panel) =>
panel.textContent?.includes('Recent Messages'),
);
const img = recentPanel?.querySelector('img[alt="Groq"]');
expect(img).not.toBeNull();
Fix with Cubic

warning: 'Prompts and outputs are logged on free models to improve provider products.',
},
'LLM7.io': {
logo: '',
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot Apr 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: LLM7.io is configured with an empty logo path, so it can never display a provider logo.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/backend/src/free-models/free-models-provider-metadata.ts, line 61:

<comment>LLM7.io is configured with an empty logo path, so it can never display a provider logo.</comment>

<file context>
@@ -0,0 +1,96 @@
+    warning: 'Prompts and outputs are logged on free models to improve provider products.',
+  },
+  'LLM7.io': {
+    logo: '',
+    tags: ['No credit card required'],
+    warning: '',
</file context>
Fix with Cubic

- Add test for dark mode logo variants
- Add test for disabled Ollama Cloud button in cloud mode
- Add test for built-in provider connect links
- Add test for show models toggle on providers without base_url
@SebConejo SebConejo merged commit 8f1a338 into main Apr 18, 2026
14 checks passed
@SebConejo SebConejo deleted the update-ui branch April 18, 2026 04:33
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 18, 2026

Bundle Report

Changes will increase total bundle size by 8.39kB (1.29%) ⬆️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
manifest-frontend-esm 658.36kB 8.39kB (1.29%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: manifest-frontend-esm

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/index-*.css 773 bytes 135.43kB 0.57%
assets/Routing-*.js 37 bytes 112.33kB 0.03%
assets/routing-*.js 621 bytes 30.07kB 2.11%
assets/Overview-*.js 32 bytes 22.99kB 0.14%
assets/overview-*.js 37 bytes 22.26kB 0.17%
assets/ModelPrices-*.js 32 bytes 14.06kB 0.23%
assets/FreeModels-*.js 375 bytes 10.52kB 3.7%
assets/MessageLog-*.js 32 bytes 9.99kB 0.32%
assets/providers-*.js (New) 6.26kB 6.26kB 100.0% 🚀
assets/api-*.js 94 bytes 2.35kB 4.16%
assets/free-*.js (New) 94 bytes 94 bytes 100.0% 🚀

Files in assets/routing-*.js:

  • ./src/components/ProviderIcon.tsx → Total Size: 30.85kB

Files in assets/FreeModels-*.js:

  • ./src/pages/FreeModels.tsx → Total Size: 17.55kB

brunobuddy added a commit that referenced this pull request Apr 20, 2026
Resolves conflicts introduced by the free-models public endpoint added
on main (#1608) against the MANIFEST_PUBLIC_STATS gating from this PR.

- public-stats.controller.ts: keep the FreeModelsService dependency from
  main and extend the assertEnabled() gate to cover the new
  /api/v1/public/free-providers endpoint, so the 404-by-default behavior
  applies consistently to all four public endpoints.
- public-stats.controller.spec.ts: merge the disabled-state suite with
  the getFreeProviders suite and add a 404 test for getFreeProviders
  under MANIFEST_PUBLIC_STATS=false.
- docker/DOCKER_README.md: drop stale "NODE_ENV=development for
  auto-migrations" line — migrations now run unconditionally.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant