feat(githubcopilot): add ability to fetch supported models (#2717)

Signed-off-by: Gustavo Hoirisch <gugahoi@users.noreply.github.com>
This commit is contained in:
Gustavo Hoirisch
2025-07-29 19:01:18 +10:00
committed by GitHub
parent 71d5ae4961
commit c84dc392be
@@ -424,4 +424,45 @@ impl Provider for GithubCopilotProvider {
emit_debug_trace(&self.model, &payload, &response, &usage);
Ok((message, ProviderUsage::new(model, usage)))
}
/// Fetch supported models from GitHub Copliot; returns Err on failure, Ok(None) if not present
async fn fetch_supported_models_async(&self) -> Result<Option<Vec<String>>, ProviderError> {
let (endpoint, token) = self.get_api_info().await?;
let url = format!("{}/models", endpoint);
let mut headers = http::HeaderMap::new();
headers.insert(http::header::ACCEPT, "application/json".parse().unwrap());
headers.insert(
http::header::CONTENT_TYPE,
"application/json".parse().unwrap(),
);
headers.insert("Copilot-Integration-Id", "vscode-chat".parse().unwrap());
headers.insert(
http::header::AUTHORIZATION,
format!("Bearer {}", token).parse().unwrap(),
);
let response = self.client.get(url).headers(headers).send().await?;
let json: serde_json::Value = response.json().await?;
let arr = match json.get("data").and_then(|v| v.as_array()) {
Some(arr) => arr,
None => return Ok(None),
};
let mut models: Vec<String> = arr
.iter()
.filter_map(|m| {
if let Some(s) = m.as_str() {
Some(s.to_string())
} else if let Some(obj) = m.as_object() {
obj.get("id").and_then(|v| v.as_str()).map(str::to_string)
} else {
None
}
})
.collect();
models.sort();
Ok(Some(models))
}
}