Aggiornare l'elenco di elementi consentiti dei modelli di 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_bodyRiferimento API
Aggiornare l'elenco di elementi consentiti dei modelli di Devin Desktop
Sostituisci in modo programmatico l’elenco di elementi consentiti dei modelli di Devin Desktop del tuo team: imposta gli UID e i tag dei modelli consentiti con una verifica ETag sullo stato attuale.
PUT
/
api
/
v2alpha
/
models
Aggiornare l'elenco di elementi consentiti dei modelli di 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_bodyPanoramica
Sostituisce l’elenco di elementi consentiti dei modelli del tuo team, ovvero la stessa impostazione che gli amministratori gestiscono nei controlli dell’organizzazione in Devin Desktop. Il corpo della richiesta rappresenta lo stato desiderato completo: i due elenchi sostituiscono quelli salvati. Per evitare di sovrascrivere una modifica che non hai ancora visto, la richiesta deve includere nell’intestazioneIf-Match l’ETag di una risposta di List Models. Se da quella risposta sono cambiati l’elenco di elementi consentiti dei modelli, i modelli disponibili o i relativi prezzi, l’aggiornamento viene rifiutato con 412 e dovrai elencare di nuovo i modelli.
Questo endpoint è in fase alpha (
v2alpha). La struttura della richiesta e della risposta potrebbe cambiare.Autenticazione
Passa una chiave API nell’intestazioneAuthorization:
Authorization: Bearer <api-key>
cog_...). Oltre all’autorizzazione Use Devin Desktop richiesta da List Models, il ruolo dell’utente di servizio deve includere l’autorizzazione Windsurf admin (account.windsurf.admin), già prevista dal ruolo integrato Account Admin. Un utente di servizio privo di questa autorizzazione può elencare i modelli, ma riceve un errore 403 su questo endpoint.
Richiesta
string
obbligatorio
Il valore dell’intestazione
ETag di una risposta GET /api/v2alpha/models che riflette lo stato attuale. Obbligatorio; * non è accettato.string[]
obbligatorio
UID dei modelli che gli utenti possono selezionare, ad es.
["claude-sonnet-4-5"]. Passa [] per consentire i modelli solo in base ai tag.string[]
obbligatorio
Tag dei modelli che gli utenti possono selezionare, inclusi i tag dei fornitori come
provider-anthropic o provider-openai. Passa [] per consentire solo i modelli con gli UID elencati.Esempio di richiesta
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"]}'
Risposta
In caso di esito positivo, la risposta è identica a quella di List Models, con il nuovo elenco di elementi consentiti applicato: tutti i modelli con il relativo flagallowed, i valori salvati di allowed_model_uids e allowed_model_tags e una nuova intestazione ETag.
Risposte di errore
Gli errori vengono restituiti nel formato{"error": "<message>"}.
| Stato | Causa |
|---|---|
400 | Il corpo non è in formato JSON, contiene campi sconosciuti oppure non include allowed_model_uids o allowed_model_tags; oppure è impostato il parametro di query filter (accettato solo da List Models) |
401 | Chiave API mancante o non valida, oppure chiave API legacy di Windsurf (sono accettate solo le chiavi degli utenti di servizio Devin cog_...) |
403 | L’utente associato alla chiave non ha accesso a Devin Desktop, oppure il suo ruolo non dispone dell’autorizzazione Windsurf admin (account.windsurf.admin) |
412 | If-Match non corrisponde all’ETag attuale; elenca di nuovo i modelli e riprova |
428 | Intestazione If-Match mancante |
429 | Limite di richieste superato; attendi il tempo indicato nell’intestazione Retry-After prima di riprovare |

