Mettre à jour la liste de modèles autorisés de Devin Desktop
curl --request PUT \
--url https://server.codeium.com/api/v2alpha/models \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'If-Match: <if-match>' \
--data '
{
"allowed_model_uids": [
"<string>"
],
"allowed_model_tags": [
"<string>"
]
}
'import requests
url = "https://server.codeium.com/api/v2alpha/models"
payload = {
"allowed_model_uids": ["<string>"],
"allowed_model_tags": ["<string>"]
}
headers = {
"If-Match": "<if-match>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
'If-Match': '<if-match>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({allowed_model_uids: ['<string>'], allowed_model_tags: ['<string>']})
};
fetch('https://server.codeium.com/api/v2alpha/models', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://server.codeium.com/api/v2alpha/models",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'allowed_model_uids' => [
'<string>'
],
'allowed_model_tags' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"If-Match: <if-match>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://server.codeium.com/api/v2alpha/models"
payload := strings.NewReader("{\n \"allowed_model_uids\": [\n \"<string>\"\n ],\n \"allowed_model_tags\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("If-Match", "<if-match>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://server.codeium.com/api/v2alpha/models")
.header("If-Match", "<if-match>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"allowed_model_uids\": [\n \"<string>\"\n ],\n \"allowed_model_tags\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.codeium.com/api/v2alpha/models")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["If-Match"] = '<if-match>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"allowed_model_uids\": [\n \"<string>\"\n ],\n \"allowed_model_tags\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_bodyRéférence de l’API
Mettre à jour la liste de modèles autorisés de Devin Desktop
Remplacez par programmation la liste de modèles autorisés de Devin Desktop pour votre équipe : définissez les UID de modèles et les balises autorisés, avec une vérification ETag par rapport à l’état actuel.
PUT
/
api
/
v2alpha
/
models
Mettre à jour la liste de modèles autorisés de Devin Desktop
curl --request PUT \
--url https://server.codeium.com/api/v2alpha/models \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'If-Match: <if-match>' \
--data '
{
"allowed_model_uids": [
"<string>"
],
"allowed_model_tags": [
"<string>"
]
}
'import requests
url = "https://server.codeium.com/api/v2alpha/models"
payload = {
"allowed_model_uids": ["<string>"],
"allowed_model_tags": ["<string>"]
}
headers = {
"If-Match": "<if-match>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
'If-Match': '<if-match>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({allowed_model_uids: ['<string>'], allowed_model_tags: ['<string>']})
};
fetch('https://server.codeium.com/api/v2alpha/models', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://server.codeium.com/api/v2alpha/models",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'allowed_model_uids' => [
'<string>'
],
'allowed_model_tags' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"If-Match: <if-match>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://server.codeium.com/api/v2alpha/models"
payload := strings.NewReader("{\n \"allowed_model_uids\": [\n \"<string>\"\n ],\n \"allowed_model_tags\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("If-Match", "<if-match>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://server.codeium.com/api/v2alpha/models")
.header("If-Match", "<if-match>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"allowed_model_uids\": [\n \"<string>\"\n ],\n \"allowed_model_tags\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.codeium.com/api/v2alpha/models")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["If-Match"] = '<if-match>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"allowed_model_uids\": [\n \"<string>\"\n ],\n \"allowed_model_tags\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_bodyVue d’ensemble
Remplace la liste de modèles autorisés de votre équipe, c’est-à-dire le paramètre que les administrateurs gèrent dans les contrôles de l’organisation de Devin Desktop. Le corps de la requête décrit l’état complet souhaité : les deux listes remplacent celles qui sont enregistrées. Pour éviter d’écraser une modification dont vous n’avez pas connaissance, la requête doit transmettre dans l’en-têteIf-Match l’ETag d’une réponse List Models. Si la liste de modèles autorisés, les modèles disponibles ou leurs tarifs ont changé depuis cette réponse, la mise à jour est rejetée avec le code 412 : listez alors à nouveau les modèles.
Cet endpoint est en version alpha (
v2alpha). La structure de la requête et de la réponse est susceptible d’évoluer.Authentification
Transmettez une clé d’API dans l’en-têteAuthorization :
Authorization: Bearer <api-key>
cog_...). En plus de l’autorisation Use Devin Desktop requise par List Models, le rôle de l’utilisateur de service doit disposer de l’autorisation Windsurf admin (account.windsurf.admin), incluse dans le rôle intégré Account Admin. Sans cette autorisation, un utilisateur de service peut lister les modèles, mais reçoit une erreur 403 sur cet endpoint.
Requête
string
requis
L’en-tête
ETag d’une réponse GET /api/v2alpha/models reflétant l’état actuel. Obligatoire ; * n’est pas accepté.string[]
requis
UID des modèles que les utilisateurs peuvent sélectionner, p. ex.
["claude-sonnet-4-5"]. Passez [] pour autoriser les modèles uniquement par balise.string[]
requis
Balises des modèles que les utilisateurs peuvent sélectionner, y compris les balises de fournisseur comme
provider-anthropic ou provider-openai. Passez [] pour n’autoriser que les UID de modèles indiqués.Exemple de requête
ETAG=$(curl -s -D - -o /dev/null https://server.codeium.com/api/v2alpha/models \
-H "Authorization: Bearer $DEVIN_API_KEY" | awk 'tolower($1)=="etag:" {print $2}' | tr -d '\r')
curl -X PUT https://server.codeium.com/api/v2alpha/models \
-H "Authorization: Bearer $DEVIN_API_KEY" \
-H "If-Match: $ETAG" \
-H "Content-Type: application/json" \
-d '{"allowed_model_uids": ["claude-sonnet-4-5"], "allowed_model_tags": ["provider-anthropic"]}'
Réponse
En cas de succès, la réponse est identique à celle de List Models, avec la nouvelle liste d’autorisation appliquée : chaque modèle accompagné de son indicateurallowed, les valeurs enregistrées de allowed_model_uids et allowed_model_tags, ainsi qu’un nouvel en-tête ETag.
Réponses d’erreur
Les erreurs sont renvoyées sous la forme{"error": "<message>"}.
| Statut | Cause |
|---|---|
400 | Le corps n’est pas au format JSON, contient des champs inconnus ou ne comporte pas allowed_model_uids ou allowed_model_tags ; ou bien le paramètre de requête filter est défini (il n’est accepté que par List Models) |
401 | Clé d’API manquante ou invalide, ou clé d’API de l’Ancien Windsurf (seules les API key d’utilisateur de service Devin cog_... sont acceptées) |
403 | L’utilisateur associé à la clé n’a pas accès à Devin Desktop, ou son rôle ne dispose pas de l’autorisation Windsurf admin (account.windsurf.admin) |
412 | If-Match ne correspond pas à l’ETag actuel ; récupérez à nouveau la liste des modèles, puis réessayez |
428 | En-tête If-Match manquant |
429 | Limite de débit dépassée ; attendez le délai indiqué par l’en-tête Retry-After avant de réessayer |

