Skip to content

adr: Eden AI as an EU-resident model provider - #104

Open
SamyMe wants to merge 1 commit into
yc-software:mainfrom
SamyMe:adr-edenai
Open

adr: Eden AI as an EU-resident model provider#104
SamyMe wants to merge 1 commit into
yc-software:mainfrom
SamyMe:adr-edenai

Conversation

@SamyMe

@SamyMe SamyMe commented Aug 1, 2026

Copy link
Copy Markdown

Hi! There's no MODEL_PROVIDER value today that keeps a turn inside the EU, which is a hard blocker for orgs with a data-residency requirement rather than a nice-to-have. Short notes on adding Eden AI's EU endpoint, plus a question about how many models to expose.

Prototyped it at https://github.com/SamyMe/qm/tree/edenai-eu-provider if that's useful, and happy to send over an API key with credits so you can try it without spending anything. Disclosure: I work at Eden AI.


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

@SamyMe

SamyMe commented Aug 1, 2026

Copy link
Copy Markdown
Author

Oh and a bit of context on us: Eden AI is the largest AI gateway in Europe, backed by Olivier Pomel (Datadog) and Nicolas Dessaigne (Algolia).

@SamyMe

SamyMe commented Aug 2, 2026

Copy link
Copy Markdown
Author

@16francej I think this is close to your OpenRouter PR (#22), so maybe you are the right person to look. cc @ReganBell

@SamyMe

SamyMe commented Aug 3, 2026

Copy link
Copy Markdown
Author

@16francej @ReganBell any news on this?:)

@16francej 16francej added adr Text proposal in adrs/ per CONTRIBUTING adr-looks-human ADR reads as human-written per guidelines enhancement New feature or request connector Proposes a new connector/surface/provider labels Aug 4, 2026
pull Bot pushed a commit to danielabelski/qm that referenced this pull request Aug 4, 2026
…tered providers

Two layers of custom model endpoints:

1. ANTHROPIC_BASE_URL / OPENAI_BASE_URL / OPENROUTER_BASE_URL are parsed
   and validated once in config (bad URLs fail at boot), resolved through
   one provider-endpoints module, and applied uniformly: the pi harness,
   the claude/codex child harness process envs, and admin key validation
   (a gateway-issued key validates against the configured endpoint).

2. An org admin can register additional providers that speak the OpenAI
   or Anthropic wire protocol — base URL, API key, and the model ids to
   expose — via PUT /v1/admin/custom-providers/:slug. Registered models
   resolve through the same choke point as built-ins, surface in the
   catalog and model pickers, and serve on the pi and opencode harnesses.
   Keys validate against the registered endpoint (skippable for gateways
   without a models listing), live in the same encrypted store as the
   built-in provider keys, and are write-only. Built-in model ids and
   provider slugs are reserved. The admin portal gets a Custom providers
   card. DeepSeek / Kimi / xAI / a corporate gateway become request
   bodies, not code.

QA hardening: custom keys reach the model runtime for every provider,
models.json materialization is cached per registry version, a corrupt
custom key degrades only its provider, slashed custom ids win the
opencode modelRef lookup, model/name input caps, double-delete 404s,
and the picker refreshes when registrations change.

Addresses the custom-endpoint asks in yc-software#110, yc-software#60, yc-software#116, yc-software#104.
kikoncuo added a commit to Omniloy/qm that referenced this pull request Aug 11, 2026
Review verdict on the sanitizer: no XSS bypass across 26 payloads, and
logoCssUrl is escape-proof for both the CSS string and the style element.
What it did find was a logo that passes validation and then renders as
nothing, plus three defects elsewhere.

Accepted-but-invisible logos now fail loudly instead. A bare & (realistic
for a company name), an unquoted attribute value, or markup inside an
attribute all made the SVG unparseable while validation returned ok, so
the favicon broke and --brand-logo resolved to nothing with no diagnostic.
The same for a missing or wrong xmlns, which renders blank in both sinks.
Character references are now decoded before the external-reference check,
which was bypassable with &yc-software#104;ttp://.

The admin console never received the two new fields: its fetchBrand still
copied only accent, mark and selfLabel, so the shell rendered a blank
<title> Admin</title>, an org's own product name never reached it, and
the logo variable this work added could never paint. The shell cache key
now covers both fields too. Where branding is missing entirely, the title
falls back to the shipped name rather than emptiness.

A product name carrying a quote or backslash corrupted manifest.json and
Chrome then refused the whole extension. Such characters are stripped at
every entry point, and the zip builder re-parses the JSON and ships the
original on failure.

The new brand guard would have failed CI on an unrelated npm install: it
scanned base64 integrity hashes, where +QM/ or +QM= appears by chance.
It reuses the older guard's integrity scrub.

Also serves favicons under a sandboxed CSP, so a future sanitizer gap
cannot escalate from a broken image to same-origin script.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

adr Text proposal in adrs/ per CONTRIBUTING adr-looks-human ADR reads as human-written per guidelines connector Proposes a new connector/surface/provider enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants