@@ -193,12 +193,38 @@ async def push_model_to_litellm(
193193 litellm_params = await _build_litellm_params (provider , model , session )
194194
195195 # Build model_info with pricing overrides
196- model_info = apply_pricing_overrides (
197- model .effective_params .copy (),
198- config = config ,
199- provider = provider ,
200- model = model ,
201- )
196+ if provider .type == "compat" and session and model .mapped_provider_id and model .mapped_model_id :
197+ from shared .crud import get_provider_by_id , get_model_by_provider_and_name
198+
199+ mapped_provider = await get_provider_by_id (session , model .mapped_provider_id )
200+ mapped_model = await get_model_by_provider_and_name (
201+ session , model .mapped_provider_id , model .mapped_model_id
202+ )
203+ if mapped_provider and mapped_model :
204+ model_info = apply_pricing_overrides (
205+ mapped_model .effective_params .copy (),
206+ config = config ,
207+ provider = mapped_provider ,
208+ model = mapped_model ,
209+ )
210+ compat_overrides = model .effective_params .copy ()
211+ compat_overrides .pop ("tags" , None )
212+ compat_overrides .pop ("mode" , None )
213+ model_info .update (compat_overrides )
214+ else :
215+ model_info = apply_pricing_overrides (
216+ model .effective_params .copy (),
217+ config = config ,
218+ provider = provider ,
219+ model = model ,
220+ )
221+ else :
222+ model_info = apply_pricing_overrides (
223+ model .effective_params .copy (),
224+ config = config ,
225+ provider = provider ,
226+ model = model ,
227+ )
202228
203229 # Copy pricing fields into litellm_params so LiteLLM can bill requests
204230 _merge_pricing_fields (litellm_params , model_info )
@@ -211,28 +237,16 @@ async def push_model_to_litellm(
211237 elif provider .type == "ollama" :
212238 model_info ["mode" ] = ollama_mode
213239 model_info ["litellm_provider" ] = "openai" if ollama_mode == "openai" else "ollama"
214- elif provider .type == "completion" :
215- model_info ["mode" ] = "completion"
216- if session and model .mapped_provider_id :
217- from shared .crud import get_provider_by_id , get_model_by_provider_and_name
218-
219- mapped_provider = await get_provider_by_id (session , model .mapped_provider_id )
220- mapped_model = None
221- if mapped_provider :
222- mapped_model = await get_model_by_provider_and_name (
223- session , model .mapped_provider_id , model .mapped_model_id or ""
224- )
225-
226- if mapped_provider :
227- if mapped_provider .type == "openai" :
228- model_info ["litellm_provider" ] = "openai"
229- elif mapped_provider .type == "ollama" :
230- mapped_ollama_mode = (
231- (mapped_model .ollama_mode if mapped_model else None )
232- or mapped_provider .default_ollama_mode
233- or "ollama_chat"
234- )
235- model_info ["litellm_provider" ] = "openai" if mapped_ollama_mode == "openai" else "ollama"
240+ elif provider .type == "compat" :
241+ compat_mode = _get_compat_mode (model )
242+ model_info .setdefault ("mode" , "completion" if compat_mode == "completion" else "chat" )
243+ if compat_mode == "completion" :
244+ model_info ["supports_completion" ] = True
245+ compat_model = litellm_params .get ("model" , "" )
246+ if compat_model .startswith (("ollama/" , "ollama_chat/" )):
247+ model_info ["litellm_provider" ] = "ollama"
248+ elif compat_model :
249+ model_info ["litellm_provider" ] = "openai"
236250
237251 # Generate tags
238252 from shared .models import ModelMetadata as PydanticModelMetadata
@@ -245,6 +259,15 @@ async def push_model_to_litellm(
245259 provider_tags = provider .tags_list ,
246260 mode = ollama_mode if provider .type != "compat" else None
247261 )
262+ if provider .type == "compat" :
263+ compat_mode = _get_compat_mode (model )
264+ tags = [t for t in tags if not t .startswith ("mode:" )]
265+ if compat_mode == "completion" :
266+ tags = [t for t in tags if t not in {"capability:chat" , "capability:completion" }]
267+ tags .extend (["capability:completion" , "mode:completion" ])
268+ else :
269+ tags = [t for t in tags if t != "capability:completion" ]
270+ tags .append ("mode:chat" )
248271
249272 litellm_params ["tags" ] = tags
250273 model_info ["tags" ] = tags
@@ -368,6 +391,12 @@ async def _needs_update(provider, model, litellm_model, config=None, session=Non
368391 return False
369392
370393
394+ def _get_compat_mode (model ) -> str :
395+ """Return compat mode (chat or completion)."""
396+ mode = (model .user_params_dict or {}).get ("mode" )
397+ return "completion" if mode == "completion" else "chat"
398+
399+
371400async def _build_litellm_params (provider , model , session = None ) -> dict :
372401 """Build litellm_params for a model."""
373402 litellm_params = {}
@@ -394,6 +423,9 @@ async def _build_litellm_params(provider, model, session=None) -> dict:
394423 litellm_params ["api_base" ] = provider .base_url
395424 elif provider .type == "compat" :
396425 # Compat models need to resolve their mapping to the actual provider/model
426+ compat_mode = _get_compat_mode (model )
427+ if compat_mode == "completion" :
428+ litellm_params ["supports_completion" ] = True
397429 if not session :
398430 logger .warning ("No session provided for compat model, using model_id as-is" )
399431 litellm_params ["model" ] = model_id
@@ -420,76 +452,34 @@ async def _build_litellm_params(provider, model, session=None) -> dict:
420452
421453 # Build params based on mapped provider type
422454 if mapped_provider .type == "openai" :
423- litellm_params ["model" ] = f"openai/{ model .mapped_model_id } "
455+ if compat_mode == "completion" :
456+ litellm_params ["model" ] = f"text-completion-openai/{ model .mapped_model_id } "
457+ else :
458+ litellm_params ["model" ] = f"openai/{ model .mapped_model_id } "
424459 litellm_params ["api_base" ] = mapped_provider .base_url
425460 litellm_params ["api_key" ] = mapped_provider .api_key or "sk-1234"
426461 elif mapped_provider .type == "ollama" :
427462 if mapped_ollama_mode == "openai" :
428- litellm_params ["model" ] = f"openai/{ model .mapped_model_id } "
463+ if compat_mode == "completion" :
464+ litellm_params ["model" ] = f"text-completion-openai/{ model .mapped_model_id } "
465+ else :
466+ litellm_params ["model" ] = f"openai/{ model .mapped_model_id } "
429467 api_base = mapped_provider .base_url .rstrip ("/" )
430468 litellm_params ["api_base" ] = f"{ api_base } /v1"
431469 litellm_params ["api_key" ] = mapped_provider .api_key or "sk-1234"
432470 elif mapped_ollama_mode == "ollama" :
433471 litellm_params ["model" ] = f"ollama/{ model .mapped_model_id } "
434472 litellm_params ["api_base" ] = mapped_provider .base_url
435473 else :
436- # Use ollama_chat as the preferred default
437- litellm_params ["model" ] = f"ollama_chat/{ model .mapped_model_id } "
474+ # Use ollama_chat as the preferred default for chat mode
475+ if compat_mode == "completion" :
476+ litellm_params ["model" ] = f"ollama/{ model .mapped_model_id } "
477+ else :
478+ litellm_params ["model" ] = f"ollama_chat/{ model .mapped_model_id } "
438479 litellm_params ["api_base" ] = mapped_provider .base_url
439480 else :
440481 logger .warning (f"Unsupported mapped provider type { mapped_provider .type } for compat model { model_id } " )
441482 litellm_params ["model" ] = model_id
442- elif provider .type == "completion" :
443- # Completion models resolve to a source provider/model but use completion routing
444- litellm_params ["supports_completion" ] = True
445- if not session :
446- logger .warning ("No session provided for completion model, using model_id as-is" )
447- litellm_params ["model" ] = model_id
448- else :
449- from shared .crud import get_provider_by_id , get_model_by_provider_and_name
450-
451- if not model .mapped_provider_id or not model .mapped_model_id :
452- logger .warning (f"Completion model { model_id } missing mapping, using model_id as-is" )
453- litellm_params ["model" ] = model_id
454- else :
455- mapped_provider = await get_provider_by_id (session , model .mapped_provider_id )
456- if not mapped_provider :
457- logger .warning (
458- "Mapped provider %s not found for completion model %s" ,
459- model .mapped_provider_id ,
460- model_id ,
461- )
462- litellm_params ["model" ] = model_id
463- else :
464- mapped_model = await get_model_by_provider_and_name (
465- session , model .mapped_provider_id , model .mapped_model_id
466- )
467- mapped_ollama_mode = (
468- (mapped_model .ollama_mode if mapped_model else None )
469- or mapped_provider .default_ollama_mode
470- or "ollama_chat"
471- )
472-
473- if mapped_provider .type == "openai" :
474- litellm_params ["model" ] = f"text-completion-openai/{ model .mapped_model_id } "
475- litellm_params ["api_base" ] = mapped_provider .base_url
476- litellm_params ["api_key" ] = mapped_provider .api_key or "sk-1234"
477- elif mapped_provider .type == "ollama" :
478- if mapped_ollama_mode == "openai" :
479- litellm_params ["model" ] = f"text-completion-openai/{ model .mapped_model_id } "
480- api_base = mapped_provider .base_url .rstrip ("/" )
481- litellm_params ["api_base" ] = f"{ api_base } /v1"
482- litellm_params ["api_key" ] = mapped_provider .api_key or "sk-1234"
483- else :
484- litellm_params ["model" ] = f"ollama/{ model .mapped_model_id } "
485- litellm_params ["api_base" ] = mapped_provider .base_url
486- else :
487- logger .warning (
488- "Unsupported mapped provider type %s for completion model %s" ,
489- mapped_provider .type ,
490- model_id ,
491- )
492- litellm_params ["model" ] = model_id
493483
494484 return litellm_params
495485
0 commit comments