@@ -27,8 +27,8 @@ const PROVIDER_OPTIONS: Array<{
2727 {
2828 id : "OLLAMA" ,
2929 name : "Ollama (Local)" ,
30- subtitle : "Run locally on your machine" ,
31- allowedTiers : [ "LOCAL" ] ,
30+ subtitle : "Run on your machine (no provider API key) " ,
31+ allowedTiers : [ "LOCAL" , "BYOK" ] ,
3232 } ,
3333 {
3434 id : "OPENAI" ,
@@ -161,6 +161,30 @@ export function UserProfileMenu() {
161161 }
162162 } , [ ] ) ;
163163
164+ useEffect ( ( ) => {
165+ const allowedForTier = PROVIDER_OPTIONS . filter ( ( p ) =>
166+ p . allowedTiers . includes ( tier )
167+ ) ;
168+ if ( allowedForTier . length === 0 ) {
169+ if ( typeof window !== "undefined" ) {
170+ localStorage . removeItem ( "explanations_provider" ) ;
171+ }
172+ setSelectedExplanationProvider ( ( prev ) =>
173+ prev === "OPENAI" ? prev : "OPENAI"
174+ ) ;
175+ return ;
176+ }
177+ const currentOk = allowedForTier . some (
178+ ( p ) => p . id === selectedExplanationProvider
179+ ) ;
180+ if ( currentOk ) return ;
181+ const next = allowedForTier [ 0 ] . id ;
182+ setSelectedExplanationProvider ( next ) ;
183+ if ( typeof window !== "undefined" ) {
184+ localStorage . setItem ( "explanations_provider" , next ) ;
185+ }
186+ } , [ tier , selectedExplanationProvider ] ) ;
187+
164188 useEffect ( ( ) => {
165189 if ( typeof window === "undefined" ) return ;
166190 const params = new URLSearchParams ( window . location . search ) ;
@@ -331,6 +355,13 @@ export function UserProfileMenu() {
331355 < h3 className = "text-sm font-semibold text-gray-900 dark:text-gray-100" >
332356 Explanations Provider
333357 </ h3 >
358+ { ! [ "LOCAL" , "BYOK" , "HOSTED_AI" ] . includes ( tier ) && (
359+ < p className = "text-xs text-amber-700 dark:text-amber-300/90" >
360+ AI explanations (Ollama, cloud keys, or Ditectrev AI) unlock
361+ after you subscribe to an AI plan — Ads-free and Free tiers do
362+ not include server-side AI.
363+ </ p >
364+ ) }
334365 < div className = "grid grid-cols-2 gap-2" >
335366 { PROVIDER_OPTIONS . map ( ( provider ) => {
336367 const allowed = provider . allowedTiers . includes ( tier ) ;
0 commit comments