From f15307d2f7f13b0681666c1615b5696a6977239c Mon Sep 17 00:00:00 2001 From: Nathan Schneider Date: Mon, 19 Oct 2026 08:30:29 -0600 Subject: [PATCH] README: images bill to system key (no customUserVars gate); pluginauths inert --- README.md | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 0b2ad86..e336ddc 100644 --- a/README.md +++ b/README.md @@ -232,13 +232,14 @@ needed. is deliberately NOT in the chat picker (image models are not chat models; chat-calling it was the source of the old 500s). - **Image generation — two paths**: - 1. **MCP tool (default, no key ever)**: `inference-image` server (tool - `generate_image`) — members select it in the composer's **+** palette - and just ask. The server uses the member's `IC_API_KEY` if LibreChat - injected one, otherwise sends a **keyless request** (the gateway bills - the request; per-member billing is NOT enforced on this path). - `customUserVars` were removed from the live yaml on 2026-10-19 — - members are never asked for a key. + 1. **MCP tool (default, no key ever, no gate)**: `inference-image` server + (tool `generate_image`) — members select it in the composer's **+** + palette and just ask. Images bill to the co-op SYSTEM key + (`SYSTEM_IMAGE_KEY`, LiteLLM alias `system-image-fallback`, $5/30d, + `regolo/qwen-image` only). No `customUserVars` gate: it made the credential + REQUIRED and blocked the whole server for any not-yet-seeded member + (first-login gap) before the fallback could run, and v0.8.8 has no + optional-flag escape hatch. 2. **Agent tool**: LibreChat's built-in "OpenAI Image Tools" (env `IMAGE_GEN_OAI_BASEURL`/`IMAGE_GEN_OAI_MODEL` → gateway; no admin key, members paste their own). Note LibreChat v0.8.8 renders the generated @@ -266,9 +267,11 @@ member's own portal-provisioned key automatically: that feed and upserts, per member with a sandbox account: - `keys` collection: `{userId, name: "Inference Co-op", value: encrypt(JSON.stringify({apiKey}))}` — consumed by the chat endpoint (`apiKey: "user_provided"` in the yaml). - - `pluginauths` collection: `{userId, pluginKey: "mcp:inference-image", - authField: "IC_API_KEY", value: encrypt(key)}` — consumed by the MCP - `customUserVars` config so image generation bills to the member's team. + - `pluginauths` collection: `{userId, pluginKey: "mcp_inference-image", + authField: "IC_API_KEY", value: encrypt(key)}` — currently INERT: image + generation bills to the system key instead (see Feature notes), so this + row is only written for forward-compatibility if per-member image billing + is re-enabled later. Encryption uses LibreChat's own scheme (`CREDS_KEY`/`CREDS_IV`, AES-256-CBC via `@librechat/data-schemas` `encrypt()`), read from the app process env (`/proc/1/environ`) because `cloudron exec` sessions don't inherit it.