Jump to content

Aperture - AI-Powered Recommendations for Emby


Recommended Posts

Neminem
Posted (edited)

Just tried this as well.

A little info about my setup.

192.168.40.1 unRaid main server with a Nvidia 1080ti runs my Ollama docker.

192.168.40.2 unRaid test server runs Aperture and test Emby server.

How do I link Ollama to Aperture ?

image.png.ed38dce199e9d8eee3323cd71e9e91ad.png

Edited by Neminem
TheGru
Posted
3 hours ago, Neminem said:

Just tried this as well.

A little info about my setup.

192.168.40.1 unRaid main server with a Nvidia 1080ti runs my Ollama docker.

192.168.40.2 unRaid test server runs Aperture and test Emby server.

How do I link Ollama to Aperture ?

image.png.ed38dce199e9d8eee3323cd71e9e91ad.png

I’ll have to investigate the setup wizard. 

  • Agree 1
TheGru
Posted

It's a route authorization issue. During first setup there is no logged in user, and the AI provider router is currently looking for one. I need to fix the route pattern.

TheGru
Posted

🚀 Aperture 0.4.3-llm Beta - Multi-Provider AI Support

Hey everyone! I'm excited to share a beta build with a major overhaul to how Aperture handles AI/LLM integration. This release migrates to the Vercel AI SDK v5 with full multi-provider support.

🎯 What's New

Multi-Provider AI Support

You can now choose from multiple AI providers for each function:

  • OpenAI (recommended)
  • Anthropic (Claude)
  • Google AI (Gemini)
  • Groq
  • DeepSeek
  • Ollama (self-hosted)
  • OpenAI-Compatible endpoints (LM Studio, LocalAI, etc.)

Each AI function (Embeddings, Chat, Text Generation) can use a different provider - mix and match as you like!

Multi-Dimension Embedding Support

Switching embedding models no longer wipes your existing embeddings! The system now stores embeddings in dimension-specific tables, so you can:

  • Keep your OpenAI embeddings while testing Ollama
  • Switch between models without losing data
  • Clean up old embeddings when you're ready via the Maintenance tab

Improved Setup Wizard

  • AI setup now works on fresh installs (previously failed because no auth existed yet)
  • All 3 AI functions are now required during setup
  • Existing configurations auto-populate when re-running the wizard
  • Added exit button for admins to return to settings

Ollama Improvements

  • Added installation instructions directly in the UI
  • Full list of recommended models for each function
  • Fixed compatibility with AI SDK v5 using ai-sdk-ollama@2.2.0

🐛 Bug Fixes

  • Chat Assistant: Fixed embedding lookups that broke after multi-dimension migration
  • Similarity Graph: Added info button (ⓘ) on nodes to navigate to detail pages while preserving drill-down
  • Create Playlist: Fixed button layout issues on desktop
  • Legacy Embeddings: Added cleanup option in Maintenance tab
  • Setup Wizard: Now properly loads existing settings from database

📦 How to Test

Pull the beta Docker image:

docker pull ghcr.io/dgruhin/aperture:llm

Or update your docker-compose:

image: ghcr.io/dgruhin/aperture:llm

⚠️ Beta Notes

  • This is a beta build - backup your database before upgrading
  • The multi-dimension embedding migration runs automatically on first start
  • If you encounter issues, check the Maintenance tab for legacy embedding cleanup options

🙏 Feedback Welcome!

Please report any issues or feedback in this thread or open an issue on github. Specifically interested in:

  • Ollama/local model experiences
  • Any issues with the setup wizard
  • Performance with different providers

Thanks for testing!


Note: This will be merged into a stable 0.4.3 release once testing is complete.

  • Like 2
TheGru
Posted

Quick quality of life fix and a bump to 0.4.4-llm for the beta

How to Test

Pull the beta Docker image:

docker pull ghcr.io/dgruhin/aperture:llm

Or update your docker-compose:

image: ghcr.io/dgruhin/aperture:llm

 

  • Like 1
Neminem
Posted

Got it connected now 😁

Its working fast enough for me using Ollama with a Nvidia 1080ti really old 😉

  • Like 1
TheGru
Posted
4 minutes ago, Neminem said:

Got it connected now 😁

Its working fast enough for me using Ollama with a Nvidia 1080ti really old 😉

Awesome! Glad it's working. I am going to merge this branch in to dev and then merge it to main and push a 0.4.4 release to the :latest tag once I am back from my wife's colonoscopy. The wifi here is terrible and I have no cell service in the building!

  • Like 2
TheGru
Posted

Aperture v0.4.4 Release Notes

Hey everyone! 👋

This release brings a major architectural upgrade to Aperture's AI infrastructure with multi-provider LLM support, plus important bug fixes and mobile UI improvements.
If you were on the beta :llm tag please switch back to :latest


🤖 Multi-Provider AI System (Vercel AI SDK v5)

Aperture now supports multiple AI providers beyond OpenAI! Choose the best provider for each function based on cost, quality, or privacy needs.

Supported Providers

Cloud Providers:

  • OpenAI — GPT-4o, GPT-4o Mini, GPT-4.1, text-embedding-3-large/small
  • Anthropic — Claude Sonnet 4.5, Claude Haiku 3.5
  • Google — Gemini 2.0 Flash, Gemini 1.5 Pro
  • Groq — Fast inference with Llama, Mixtral, and more
  • DeepSeek — DeepSeek-V3, DeepSeek-R1 (reasoning model)

Self-Hosted Options:

  • Ollama — Run models locally (Llama 3.2, Mistral, Qwen, Nomic embeddings)
  • LM Studio — Local model hosting
  • OpenAI-Compatible — Any OpenAI-compatible endpoint

Per-Function Provider Selection

Choose different providers for different tasks:

  • Embeddings — Use OpenAI embeddings for quality, or Ollama's Nomic models for free self-hosted
  • Chat Assistant (Encore) — Use Claude for better conversations, GPT-4o for tool use, or Ollama for privacy
  • Text Generation — Use GPT-4o Mini for cost efficiency, or DeepSeek for advanced reasoning

Navigate to Admin → Settings → AI / LLM Setup to configure.

Smart Capabilities Detection

Aperture now validates model capabilities and warns you if:

  • A model lacks tool calling support (required for Encore assistant)
  • A model can't generate embeddings
  • A model doesn't support structured output

Dynamic Pricing & Cost Estimation

  • Real-time pricing from Helicone API (refreshes weekly)
  • Updated cost estimator supports all providers
  • Accurate calculations for embeddings, chat, and text generation
  • Shows both cloud and self-hosted options

🎓 Improved Setup Wizard

AI Configuration Step

The setup wizard now uses the same multi-provider AI configuration:

  • Card-based UI for each AI function (Embeddings, Chat, Text Generation)
  • All functions required — ensures complete AI functionality from the start
  • Provider auto-detection — shows available providers during setup
  • Connection testing — validates API keys before proceeding

Setup Wizard Enhancements

  • Exit button for admins re-running the wizard (returns to Admin Settings)
  • File Locations auto-detection now more reliable
  • Better error handling with detailed messages
  • Finish button navigation properly returns to login or admin settings

🗄️ Multi-Dimension Embedding Tables

Breaking change for advanced users:

  • Separate embedding tables per dimension (256, 384, 512, 768, 1024, 1536, 3072)
  • Enables switching between embedding models without conflicts
  • Automatic migration of existing embeddings to dimension-specific tables
  • Old tables renamed to *_legacy for rollback safety

Why this matters: You can now switch from text-embedding-3-small (1536d) to text-embedding-3-large (3072d) without re-running embeddings for your entire library.


🐛 Bug Fixes

AI & Assistant Fixes

  • Embedding model format — Fixed assistant search using wrong model ID format (now uses provider:model)
  • Dynamic table names — Assistant tools now use correct embedding table based on configured dimensions
  • Setup form population — AI setup wizard now loads existing configuration instead of defaulting to empty
  • Ollama compatibility — Updated to latest ollama-ai-provider for AI SDK v5 compatibility
  • Test connection — Now falls back to saved API keys if not provided in test request

Setup Wizard Fixes

  • Finish button — Now properly navigates to login (first-run) or admin settings (re-run)
  • Admin access — Admins can now re-enter setup wizard after initial completion
  • User/job endpoints — Fixed 403 errors when admins tried to access setup endpoints
  • Exit button location — Returns admin to their previous location in settings

UI Fixes

  • Mobile responsiveness — Better layouts for media detail pages and similarity graphs
  • User card spacing — Fixed spacing between labels and toggles on mobile
  • Create Playlist button — Proper sizing and no word wrap
  • Graph info button — New ⓘ button on graph nodes to navigate to detail page without drilling down
  • Legacy embeddings section — Fixed interface mismatch with API response

CI/CD

  • Docker tags — Removed SHA tagging to prevent GHCR storage bloat (only dev, latest, and version tags remain)

📊 Technical Details

New Database Migrations

Three new migrations run automatically on upgrade:

  • 0075_ai_provider_config.sql — New ai_config system setting, migrates existing OpenAI configs
  • 0076_fix_ai_config_api_keys.sql — Ensures proper API key migration for existing users
  • 0077_update_embedding_model_names.sql — Updates embedding model IDs to new provider:model format
  • 0078_multi_dimension_embeddings.sql — Creates dimension-specific embedding tables

New API Endpoints

AI Configuration:

  • GET /api/settings/ai/providers — List available AI providers
  • GET /api/settings/ai/models — Get models for a provider and function
  • GET /api/settings/ai/:function — Get current config for embeddings/chat/textGeneration
  • PATCH /api/settings/ai/:function — Update function configuration
  • POST /api/settings/ai/test — Test provider connection with credentials
  • GET /api/settings/ai/credentials/:provider — Get saved credentials for a provider

Setup Wizard:

  • GET /api/setup/ai/* — Unauthenticated versions of AI endpoints for first-run setup
  • Uses requireSetupWritable() pattern (public during first-run, admin-only after)

New Background Job

  • refresh-ai-pricing — Fetches latest pricing from Helicone API weekly (AI System category)

New Dependencies

{
  "@ai-sdk/openai": "^1.0.7",
  "@ai-sdk/anthropic": "^1.0.8",
  "@ai-sdk/google": "^1.0.11",
  "@ai-sdk/groq": "^1.0.8",
  "@ai-sdk/deepseek": "^1.0.3",
  "ai-sdk-ollama": "^2.2.0"
}

🚀 Upgrade Instructions

For OpenAI Users

Your existing configuration will migrate automatically:

  • OpenAI API key preserved
  • Embedding model updated to openai:text-embedding-3-large (or small)
  • Chat and text generation models set to openai:gpt-4o-mini
  • No action required!

For New Installations

  • Run through the setup wizard
  • Configure AI providers in the new AI Setup step
  • Choose providers for each function (all three required)
  • Test connections before proceeding

For Advanced Users

  • Backup your database before upgrading (automatic backups run daily)
  • Migrations will run automatically
  • Existing embeddings migrate to dimension-specific tables
  • Review your AI configuration in Admin → Settings → AI / LLM Setup
  • Consider switching to cost-effective providers (e.g., GPT-4o Mini for text generation)

💡 Use Cases

Cost Optimization

Embeddings:    text-embedding-3-small ($0.02/M tokens)
Chat:          GPT-4o Mini ($0.15/$0.60 per M)
Text Gen:      GPT-4o Mini ($0.15/$0.60 per M)

Estimated monthly cost for 1000 movies: ~$2-5

Self-Hosted Privacy

Embeddings:    Ollama (nomic-embed-text)
Chat:          Ollama (llama3.2)
Text Gen:      Ollama (mistral)

Cost: $0 (runs locally)

Balanced Approach

Embeddings:    OpenAI text-embedding-3-large (best quality)
Chat:          Claude Sonnet 4.5 (best conversation)
Text Gen:      DeepSeek-V3 (best reasoning, low cost)

🔄 Breaking Changes

AI Configuration Format

The ai_config system setting now uses a structured format:

{
  "embeddings": { "provider": "openai", "model": "text-embedding-3-large", ... },
  "chat": { "provider": "anthropic", "model": "claude-sonnet-4-5", ... },
  "textGeneration": { "provider": "openai", "model": "gpt-4o-mini", ... }
}

Old OpenAI-specific settings are migrated automatically.

Embedding Model IDs

Model IDs now include provider prefix: openai:text-embedding-3-large instead of just text-embedding-3-large.

Database migration handles this automatically.


🎯 What's Next?

In future releases, you can expect:

  • More AI provider integrations
  • Custom model fine-tuning support
  • Advanced embedding strategies (hybrid search, reranking)
  • Per-user AI provider preferences

📦 How to Update

Pull the LATEST Docker image:

docker pull ghcr.io/dgruhin/aperture:latest
Or update your docker-compose:

image: ghcr.io/dgruhin/aperture:latest

🙏 Credits

Big thanks to the AI SDK team at Vercel for the excellent multi-provider abstraction layer, and to the community for testing and feedback on the mobile UI improvements!


Enjoy the flexibility of choosing your AI providers! If you run into any issues or have questions, please open an issue on GitHub. 🍿

Neminem
Posted

Is there any way to get rit off these duplicates?

Or is this just the nature of the beast 😁

image.png.4cf61f1c6ad268c4a1c23cca2e51e95f.png

image.png.d0e709e3d6f3303d4ed3ca0a26ae1407.png

  • Like 1
TheGru
Posted
2 minutes ago, Neminem said:

Is there any way to get rit off these duplicates?

Or is this just the nature of the beast 😁

image.png.4cf61f1c6ad268c4a1c23cca2e51e95f.png

image.png.d0e709e3d6f3303d4ed3ca0a26ae1407.png

It’s just how Emby sees things. Nothing I can do about that one 

I have a movie library a movies 4k library and my AI recommendations library so I have Triplicates!

TheGru
Posted
Just now, TheGru said:

It’s just how Emby sees things. Nothing I can do about that one 

I have a movie library a movies 4k library and my AI recommendations library so I have Triplicates!

Although it’s odd your dupes don’t show posters or the metadata. 
 

IMG_2520.thumb.jpeg.f0be94c5d0fe5abffd7ec32b9255a978.jpeg

GoldSpacer
Posted

For search duplicates you can turn on the library option 'Exclude from global seach'.

  • Like 1
TheGru
Posted
Just now, GoldSpacer said:

For search duplicates you can turn on the library option 'Exclude from global seach'.

Hmm maybe I can set that via API on the libraries it creates! I’ll look in to it. 

  • Agree 1
Neminem
Posted
1 minute ago, TheGru said:

Although it’s odd your dupes don’t show posters or the metadata. 

Test server with all metadata beside media files.

No metadata providers enabled 😉

That why 😁

TheGru
Posted
Just now, TheGru said:

Hmm maybe I can set that via API on the libraries it creates! I’ll look in to it. 

Would be nice if the Emby team could also add exclude duplicates from continue watching and exclude duplicates from Recently released on the home screen @Luke

  • Agree 2
TheGru
Posted
1 minute ago, Neminem said:

Test server with all metadata beside media files.

No metadata providers enabled 😉

That why 😁

Cool. I’ve been triaging so many custom environments I just assumed you had a special use case!

  • Haha 1
Neminem
Posted (edited)

Yeah main server is master, that provides metadata to media.

Then Test server picks that up 😉

I don't want them both doing this.

And I like that the changes on main goes to test.

Edited by Neminem
FlameRed
Posted

Ok, I have another silly question I admit. I have been looking at this for a few hours, but I must be overlooking the obvious. So my apologies in advance.

I configured OMDb, MDBList, TMDb integration under settings and the API keys, tested connectivity,  and enabled them. Then waited overnight. 

The AI Recommendations seem to all be for items already existing on the Emby server. I was thinking AI would pick up Recommendation from the OMDb, MDBList, TMDb sources that are NOT yet on Emby. Is it just a matter of waiting more than a day for it to pull recommendations from OMDb, MDBList, TMDb or is there something I need to do to trigger pulling the recommendations from OMDb, MDBList, TMDb? 

Or do I complete misunderstand what OMDb, MDBList, TMDb is used for? 

Posted
1 hour ago, TheGru said:

Would be nice if the Emby team could also add exclude duplicates from continue watching and exclude duplicates from Recently released on the home screen @Luke

Can't you exclude the library from continue watching in the "Home Screen" settings for the user?

TheGru
Posted
29 minutes ago, ebr said:

Can't you exclude the library from continue watching in the "Home Screen" settings for the user?

I don’t know, can you? Is that a setting that exists??

TheGru
Posted
58 minutes ago, FlameRed said:

Ok, I have another silly question I admit. I have been looking at this for a few hours, but I must be overlooking the obvious. So my apologies in advance.

I configured OMDb, MDBList, TMDb integration under settings and the API keys, tested connectivity,  and enabled them. Then waited overnight. 

The AI Recommendations seem to all be for items already existing on the Emby server. I was thinking AI would pick up Recommendation from the OMDb, MDBList, TMDb sources that are NOT yet on Emby. Is it just a matter of waiting more than a day for it to pull recommendations from OMDb, MDBList, TMDb or is there something I need to do to trigger pulling the recommendations from OMDb, MDBList, TMDb? 

Or do I complete misunderstand what OMDb, MDBList, TMDb is used for? 

Aperture surfaces content in your Libraries you may enjoy. It does not recommend content you do not have, as it current can't help you "get" that content. The concept is to use your watch history, embeddings, and metadata to help you save time when trying to find something you could watch right then and there. The integrations with external APIs are used to enrich metadata for better matching results.

  • Like 1
TheGru
Posted
44 minutes ago, ebr said:

Can't you exclude the library from continue watching in the "Home Screen" settings for the user?

There is no setting to do this on the iOS app or the Web directly, there is no Continue Watching setting at all other than to select which row position you want it in.

TheGru
Posted

Hey all, just a quick status update.

I’m actively working on Ollama + other non-OpenAI provider support, but I’m currently bottlenecked on local testing because I don’t have a GPU strong enough to run real validation.

If anyone wants to help push this forward:

  • jump in and help test providers,

  • toss a few bucks into Buy Me a Coffee,

  • or donate/ship a GPU that can handle local models.

Either way, I appreciate the support, it helps expand provider coverage faster.

TheGru
Posted
5 minutes ago, TheGru said:

Hey all, just a quick status update.

I’m actively working on Ollama + other non-OpenAI provider support, but I’m currently bottlenecked on local testing because I don’t have a GPU strong enough to run real validation.

If anyone wants to help push this forward:

  • jump in and help test providers,

  • toss a few bucks into Buy Me a Coffee,

  • or donate/ship a GPU that can handle local models.

Either way, I appreciate the support, it helps expand provider coverage faster.

as an example, I asked my local Ollama via Aperture Encore chat to Find me shows like Fallout

It took Ollama 5 minutes on my setup to return a result, by which point Aperture had already timed out the api connection. While I can significantly increase the timeouts for testing, it's not a realistic solution to my local testing.

FlameRed
Posted
1 hour ago, TheGru said:

Aperture surfaces content in your Libraries you may enjoy. It does not recommend content you do not have, as it current can't help you "get" that content. The concept is to use your watch history, embeddings, and metadata to help you save time when trying to find something you could watch right then and there. The integrations with external APIs are used to enrich metadata for better matching results.

Got it. 

It is amazing that you developed this in just a couple of week. Unbelievable! 

Just a humble suggestion for some distant future release. For me, it would be so useful to have AI recommendations of new content that might be out there that I don't know even exists that might be something I like. Even just as a separate category that list them so I could consider and pull myself. 

But now I understand the intent better. 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...