[PR #420] [MERGED] Add tenant-aware provider resolution for text/image/video/audio facades #725

Closed
opened 2026-03-13 21:05:53 +03:00 by kerem · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/AJaySi/ALwrity/pull/420
Author: @AJaySi
Created: 3/12/2026
Status: Merged
Merged: 3/12/2026
Merged by: @AJaySi

Base: mainHead: codex/add-tenant-config-resolver-module


📝 Commits (1)

  • feacbc6 Add tenant-aware provider config resolver across LLM facades

📊 Changes

5 files changed (+241 additions, -84 deletions)

View changed files

📝 backend/services/llm_providers/main_audio_generation.py (+10 -6)
📝 backend/services/llm_providers/main_image_generation.py (+18 -24)
📝 backend/services/llm_providers/main_text_generation.py (+31 -41)
📝 backend/services/llm_providers/main_video_generation.py (+14 -13)
backend/services/llm_providers/tenant_provider_config.py (+168 -0)

📄 Description

Motivation

  • Centralize per-request provider selection and credential resolution so facades can use tenant-scoped API keys (DB/onboarding) instead of relying on environment-only lookups.
  • Allow different modalities (text/image/video/audio) to resolve provider, default model policy, and credential source per user_id while keeping env vars as fallbacks.
  • Ensure downstream provider clients receive tenant-resolved keys where supported to enable multi-tenant credentialing.

Description

  • Added backend/services/llm_providers/tenant_provider_config.py which implements TenantProviderConfigResolver to resolve selected providers, model defaults, and credential source with priority: tenant DB (onboarding API keys) -> environment variables.
  • Updated text generation facade (main_text_generation.py) to call the resolver for modality="text", to pick a provider/model per request, to pass user_id into provider key lookup, and to inject resolved keys into env variables consumed by provider clients when available.
  • Updated image generation facade (main_image_generation.py) to resolve provider per-request (via tenant_provider_config_resolver) and to instantiate provider clients with tenant-resolved api_key where supported (HF/WaveSpeed/Stability/Gemini injection).
  • Updated video generation facade (main_video_generation.py) to resolve provider/credentials per-request and to pass user_id into the HuggingFace key lookup path (_get_api_key and _generate_with_huggingface) and to use resolved provider selection before dispatch.
  • Updated audio facade (main_audio_generation.py) to create WaveSpeed clients with tenant-resolved keys via a _get_wavespeed_client(user_id) helper and replaced direct env-only WaveSpeedClient() usage.
  • Minor API changes: get_api_key / _get_api_key signatures accept optional user_id to allow tenant-scoped resolution.

Testing

  • Compiled the updated modules with python -m py_compile backend/services/llm_providers/tenant_provider_config.py backend/services/llm_providers/main_text_generation.py backend/services/llm_providers/main_image_generation.py backend/services/llm_providers/main_video_generation.py backend/services/llm_providers/main_audio_generation.py and the compilation succeeded.
  • Verified changes were committed (commit message: "Add tenant-aware provider config resolver across LLM facades").

Codex Task


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/AJaySi/ALwrity/pull/420 **Author:** [@AJaySi](https://github.com/AJaySi) **Created:** 3/12/2026 **Status:** ✅ Merged **Merged:** 3/12/2026 **Merged by:** [@AJaySi](https://github.com/AJaySi) **Base:** `main` ← **Head:** `codex/add-tenant-config-resolver-module` --- ### 📝 Commits (1) - [`feacbc6`](https://github.com/AJaySi/ALwrity/commit/feacbc6d59b4155d78720de6af437c3b4d861187) Add tenant-aware provider config resolver across LLM facades ### 📊 Changes **5 files changed** (+241 additions, -84 deletions) <details> <summary>View changed files</summary> 📝 `backend/services/llm_providers/main_audio_generation.py` (+10 -6) 📝 `backend/services/llm_providers/main_image_generation.py` (+18 -24) 📝 `backend/services/llm_providers/main_text_generation.py` (+31 -41) 📝 `backend/services/llm_providers/main_video_generation.py` (+14 -13) ➕ `backend/services/llm_providers/tenant_provider_config.py` (+168 -0) </details> ### 📄 Description ### Motivation - Centralize per-request provider selection and credential resolution so facades can use tenant-scoped API keys (DB/onboarding) instead of relying on environment-only lookups. - Allow different modalities (text/image/video/audio) to resolve provider, default model policy, and credential source per `user_id` while keeping env vars as fallbacks. - Ensure downstream provider clients receive tenant-resolved keys where supported to enable multi-tenant credentialing. ### Description - Added `backend/services/llm_providers/tenant_provider_config.py` which implements `TenantProviderConfigResolver` to resolve selected providers, model defaults, and credential source with priority: tenant DB (onboarding API keys) -> environment variables. - Updated text generation facade (`main_text_generation.py`) to call the resolver for modality="text", to pick a provider/model per request, to pass `user_id` into provider key lookup, and to inject resolved keys into env variables consumed by provider clients when available. - Updated image generation facade (`main_image_generation.py`) to resolve provider per-request (via `tenant_provider_config_resolver`) and to instantiate provider clients with tenant-resolved `api_key` where supported (HF/WaveSpeed/Stability/Gemini injection). - Updated video generation facade (`main_video_generation.py`) to resolve provider/credentials per-request and to pass `user_id` into the HuggingFace key lookup path (`_get_api_key` and `_generate_with_huggingface`) and to use resolved provider selection before dispatch. - Updated audio facade (`main_audio_generation.py`) to create WaveSpeed clients with tenant-resolved keys via a `_get_wavespeed_client(user_id)` helper and replaced direct env-only `WaveSpeedClient()` usage. - Minor API changes: `get_api_key` / `_get_api_key` signatures accept optional `user_id` to allow tenant-scoped resolution. ### Testing - Compiled the updated modules with `python -m py_compile backend/services/llm_providers/tenant_provider_config.py backend/services/llm_providers/main_text_generation.py backend/services/llm_providers/main_image_generation.py backend/services/llm_providers/main_video_generation.py backend/services/llm_providers/main_audio_generation.py` and the compilation succeeded. - Verified changes were committed (commit message: "Add tenant-aware provider config resolver across LLM facades"). ------ [Codex Task](https://chatgpt.com/codex/tasks/task_e_69b0db68332883289b4aae6f01f33519) --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
kerem 2026-03-13 21:05:53 +03:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/ALwrity#725
No description provided.