Skip to content

[Website] Add a page listing every platform bridge with filters - #2635

Open
welcoMattic wants to merge 2 commits into
symfony:mainfrom
welcoMattic:platform-bridges-page
Open

welcoMattic wants to merge 2 commits into
symfony:mainfrom
welcoMattic:platform-bridges-page

Conversation

@welcoMattic

@welcoMattic welcoMattic commented Oct 2, 2026 •

Copy link
Copy Markdown
Member
Q A
Bug fix? no
New feature? no
Docs? no
Issues -
License MIT

Adds /bridges/platforms to ai.symfony.com: every platform bridge of src/platform/src/Bridge, with filters to find the ones matching a need.

platform-bridges-page

Filters, with a Symfony UX Live Component, kept in the query string so that a filtered list can be shared:

  • presets for common needs: AI agents, RAG and semantic search, voice apps, image generation, offline and private, no vendor lock-in
  • menus for capabilities, type, where models run (cloud or local), hosting (SaaS or self-hosted), server location and models (single provider or provider-agnostic), each option showing how many bridges it leads to
  • a search on names and descriptions, and a sort by popularity (Packagist downloads), name or number of capabilities

Data: bin/console app:platform-bridges:update reads the bridges from splitsh.json on GitHub and their downloads from Packagist, both without token. It runs every morning on Upsun (.upsun/config.yaml) and writes var/share/platform_bridges.json, so the page only reads local files and can be cached (public, 10 minutes). A bridge not classified yet, or not on Packagist yet, is still listed; until the first run, the downloads are missing and the list comes from the classification only.

Classification: config/platform_bridges.yaml, only with facts documented by the providers. A test checks that every platform bridge of splitsh.json is classified.

Logos: from Lobe Icons (MIT, licence shipped), SVG Logos and Simple Icons (CC0), and the websites of amazee.ai and Eden AI, see assets/icons/brands/README.md.

🤖 Generated with Claude Code

The /bridges/platforms page lists the platform bridges of the monorepo, with
filters on capabilities, where models run, hosting, data region, model access
and type, sorted by their downloads on Packagist.

A daily cron (app:platform-bridges:update) reads splitsh.json on GitHub and the
download counts on Packagist, without any token, and writes them to var/share.
The page only reads that file and config/platform_bridges.yaml, which classifies
each bridge.
…rs' logos

The filters open from menus under the search. Selecting several ways to run or
to host keeps the bridges supporting all of them, "Data region" becomes "Server
location", the capability badges are more discreet and the guide links read
"Docs".

The cards, and a band scrolling under the hero, show the logos of the providers
in color, from Lobe Icons (MIT), SVG Logos and Simple Icons (CC0): see
assets/icons/brands/README.md.

On large screens, the presets and the search block stay at hand while scrolling
the list.

Assisted-by: Claude <noreply@anthropic.com>
@carsonbot carsonbot added Website Issues & PRs about the Symfony AI website Status: Needs Review labels Oct 2, 2026

@wachterjohannes wachterjohannes left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The page works and the 43 bridges match the classification file. Changes requested:

  • The description ends with a "Generated with Claude Code" line. It ends up in the merge commit, so please drop it.
  • The preset chip cannot be toggled off. Already raised with the author directly, details inline for the record.

The hint box point below was also raised directly already.

Comment on lines +30 to +41
<a
href="{{ path('platform_bridges', this.presetParameters(preset)) }}"
class="platform-preset{{ preset_active ? ' is-active' }}"
data-action="live#action:prevent"
data-live-action-param="applyPreset"
data-live-preset-param="{{ preset.value }}"
title="{{ preset.description }}"
{% if preset_active %}aria-current="true"{% endif %}
>
{{ ux_icon(preset.icon, {width: 18, height: 18, 'aria-hidden': 'true'}) }}
{{ preset.label }}
</a>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Already raised directly, noted here for the record.

The preset chip cannot be toggled off. applyPreset (PlatformBridgeList.php:120-131) always calls clearAll() and then re-selects, so clicking the active chip re-applies the same state. Only the "Active filters" bar clears it. When the preset is active, the chip could clear instead, with the href pointing at the bare route. A button with aria-pressed would also fit better than aria-current="true".

model_access: multi-vendor
capabilities: [chat, tool-calling, structured-output, vision, embeddings]
icon: tabler:plug
note: What you get depends on the server you connect to.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Already raised directly, noted here for the record.

This caveat renders as a bordered callout right under capability chips that read as fixed facts. Generic is the only card where the note is about the chips themselves. A line in the summary, or marking Generic's chips as "depends on the server", would be quieter than a callout. Not blocking.

capabilities: [chat, structured-output, reasoning, web-search, vision]
website: https://www.perplexity.ai
icon: brands:perplexity
note: Perplexity announced the end of its Sonar API, set for September 27, 2026.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The note says the Sonar API ends on September 27, 2026. That date has passed. Should the note be reworded or dropped?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think it's fair to extend this file while creating a bridge, but we need a way to update this - how was it created? something we can reuse?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Status: Needs Work Website Issues & PRs about the Symfony AI website

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants