flowchart TD
subgraph A["User config: chatLanguageModels.json"]
A1["{ 'id': 'gemma4', 'url': 'https://api.nan.builders/v1', ... }"]
end
A2["{ 'id': 'llama3', 'url': 'https://api.nan.builders/v1', ... }"]
subgraph B["Provider: CustomEndpointBYOKModelProvider\n(providerId = 'customEndpoint')"]
B1["getAllModels(silent, apiKey, config)"]
B1a{"config.url exists?"}
B1a -- yes --> B2["Call super.getAllModels()"]
B1a -- no --> B3["Iterate config.models[] manually"]
B2["Fetch GET {url}/models"]
B2a["Parse data.data or data.models"]
B2b["Auto-discover model capabilities"]
B3["Return static models from JSON config"]
end
subgraph C["Discovery endpoint: /models"]
C1["GET https://api.nan.builders/v1/models"]
C2["Response: { data: [{ id, name, ... }] }"]
end
subgraph D["AbstractOpenAICompatibleLMProvider"]
D1["getModelsDiscoveryUrl() → {baseUrl}/models"]
D2["resolveModelCapabilities()"]
D3["byokKnownModelsToAPIInfoWithEffort()"]
end
subgraph E["Chat request"]
E1["User sends message"]
E2["resolveCustomEndpointUrl()"]
E3["POST {url}/v1/chat/completions"]
end
A1 --> B
A2 --> B
B --> B1
B1 --> B1a
B1a -->|yes| B2
B2 --> C1
C1 --> C2
C2 --> D1
D1 --> D2
D2 --> D3
B1 -->|no| B3
B --> E1
E1 --> E2
E2 --> E3
Como se ve aquí, hay una clase abstracta que tiene getAllModels
https://github.com/microsoft/vscode/blob/main/extensions/copilot/src/extension/byok/vscode-node/abstractLanguageModelChatProvider.ts#L189
Para nan se usa el customEndpointProvider
https://github.com/microsoft/vscode/blob/main/extensions/copilot/src/extension/byok/vscode-node/customEndpointProvider.ts#L131
de ahi... acba llegadno al dsicovery
https://github.com/microsoft/vscode/blob/main/extensions/copilot/src/extension/byok/vscode-node/abstractLanguageModelChatProvider.ts#L189
Por tanto, ...
flowchart TD subgraph A["User config: chatLanguageModels.json"] A1["{ 'id': 'gemma4', 'url': 'https://api.nan.builders/v1', ... }"] end A2["{ 'id': 'llama3', 'url': 'https://api.nan.builders/v1', ... }"] subgraph B["Provider: CustomEndpointBYOKModelProvider\n(providerId = 'customEndpoint')"] B1["getAllModels(silent, apiKey, config)"] B1a{"config.url exists?"} B1a -- yes --> B2["Call super.getAllModels()"] B1a -- no --> B3["Iterate config.models[] manually"] B2["Fetch GET {url}/models"] B2a["Parse data.data or data.models"] B2b["Auto-discover model capabilities"] B3["Return static models from JSON config"] end subgraph C["Discovery endpoint: /models"] C1["GET https://api.nan.builders/v1/models"] C2["Response: { data: [{ id, name, ... }] }"] end subgraph D["AbstractOpenAICompatibleLMProvider"] D1["getModelsDiscoveryUrl() → {baseUrl}/models"] D2["resolveModelCapabilities()"] D3["byokKnownModelsToAPIInfoWithEffort()"] end subgraph E["Chat request"] E1["User sends message"] E2["resolveCustomEndpointUrl()"] E3["POST {url}/v1/chat/completions"] end A1 --> B A2 --> B B --> B1 B1 --> B1a B1a -->|yes| B2 B2 --> C1 C1 --> C2 C2 --> D1 D1 --> D2 D2 --> D3 B1 -->|no| B3 B --> E1 E1 --> E2 E2 --> E3