1414import json
1515import logging
1616import os
17+ from collections .abc import Mapping
1718from dataclasses import dataclass , field
1819from types import MappingProxyType
1920from typing import Any
3233 "supports_tool_calls" ,
3334]
3435
35- COPILOT_INTEGRATION_ID = " vscode-chat"
36+ COPILOT_INTEGRATION_ID = os . getenv ( "COPILOT_INTEGRATION_ID" , " vscode-chat")
3637
3738
3839# ---------------------------------------------------------------------------
@@ -45,13 +46,17 @@ class APIProvider:
4546
4647 name : str
4748 base_url : str
48- models_catalog : str = "models"
49+ models_catalog : str = "/ models"
4950 default_model : str = "gpt-4.1"
50- extra_headers : dict [str , str ] = field (default_factory = dict )
51+ extra_headers : Mapping [str , str ] = field (default_factory = dict )
5152
5253 def __post_init__ (self ) -> None :
54+ # Ensure base_url ends with / so httpx URL.join() preserves the path
55+ if self .base_url and not self .base_url .endswith ("/" ):
56+ object .__setattr__ (self , "base_url" , self .base_url + "/" )
5357 # Freeze mutable headers so singleton providers can't be mutated
54- object .__setattr__ (self , "extra_headers" , MappingProxyType (self .extra_headers ))
58+ if isinstance (self .extra_headers , dict ):
59+ object .__setattr__ (self , "extra_headers" , MappingProxyType (self .extra_headers ))
5560
5661 # -- response parsing -----------------------------------------------------
5762
@@ -123,12 +128,13 @@ def check_tool_calls(self, _model: str, model_info: dict) -> bool:
123128 "models.github.ai" : _GitHubModelsProvider (
124129 name = "github-models" ,
125130 base_url = "https://models.github.ai/inference" ,
126- models_catalog = "catalog/models" ,
131+ models_catalog = "/ catalog/models" ,
127132 default_model = "openai/gpt-4.1" ,
128133 ),
129134 "api.openai.com" : _OpenAIProvider (
130135 name = "openai" ,
131136 base_url = "https://api.openai.com/v1" ,
137+ models_catalog = "/v1/models" ,
132138 default_model = "gpt-4.1" ,
133139 ),
134140}
0 commit comments