88API88API
User GuideAI ApplicationsAPI ReferenceHelp & Support

Module de gestion des canaux

Description de la fonction

Le préfixe de l'API est uniformément http(s)://<your-domain>

HTTPS doit être utilisé dans les environnements de production pour sécuriser les jetons d'authentification. HTTP n'est recommandé que pour les environnements de développement.

Un système de gestion complet pour les canaux des fournisseurs de services d’IA. Prend en charge les opérations CRUD pour les canaux, les opérations par lots, les tests de connectivité, les demandes de solde et la gestion des balises. Inclut des fonctionnalités avancées telles que la synchronisation des capacités du modèle et la duplication des canaux.

🔐 Authentification de l'administrateur

Obtenir la liste des chaînes

  • Nom de l'interface: Obtenir la liste des chaînes
  • Méthode HTTP: GET
  • Chemin: /api/channel/
  • Exigence d'authentification: Administrateur
  • Description de la fonction: Paginez et récupérez les informations de liste pour tous les canaux du système, prenant en charge le filtrage par type, statut et mode de balise

💡 Exemple de demande:

const response = await fetch('/api/channel/?p=1&page_size=20&id_sort=false&tag_mode=false&type=1&status=enabled', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  }
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": "",
  "data": {
    "items": [
      {
        "id": 1,
        "name": "OpenAIchannel",
        "type": 1,
        "status": 1,
        "priority": 10,
        "weight": 100,
        "models": "gpt-3.5-turbo,gpt-4",
        "group": "default",
        "response_time": 1500,
        "test_time": 1640995200
      }
    ],
    "total": 50,
    "type_counts": {
      "1": 20,
      "2": 15,
      "all": 35
    }
  }
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Failed to obtain channel list"
}

🧾 Description du champ:

  • p (Numéro): Numéro de page, par défaut 1
  • page_size (Nombre) : éléments par page, par défaut 20
  • id_sort (Booléen): s'il faut trier par ID, par défaut le tri par priorité
  • tag_mode (Booléen): s'il faut activer le mode tag
  • type (Numéro): Filtre de type de canal
  • status (String) : Filtre d'état, valeurs facultatives : "enabled", "disabled", "all"

Canaux de recherche

  • Nom de l'interface: chaînes de recherche
  • Méthode HTTP: GET
  • Chemin: /api/channel/search
  • Exigence d'authentification: Administrateur
  • Description de la fonction: rechercher des chaînes en fonction de mots-clés, de groupes, de modèles et d'autres conditions

💡 Exemple de demande:

const response = await fetch('/api/channel/search?keyword=openai&group=default&model=gpt-4&id_sort=false&tag_mode=false&p=1&page_size=20&type=1&status=enabled', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  }
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": "",
  "data": {
    "items": [
      {
        "id": 1,
        "name": "OpenAIofficial channels",
        "type": 1,
        "status": 1,
        "models": "gpt-3.5-turbo,gpt-4",
        "group": "default"
      }
    ],
    "total": 1,
    "type_counts": {
      "1": 1,
      "all": 1
    }
  }
}

❗ Exemple de réponse échouée:

{    "success": false,    "message": "Search channel failed"  }

🧾 Description du champ:

  • keyword (Chaîne) : mot-clé de recherche, peut correspondre au nom de la chaîne
  • group (String) : Condition de filtre de groupe
  • model (String): condition du filtre du modèle
  • Les autres paramètres sont les mêmes que ceux de l'interface Get Channel List

Capacités du modèle de canal de requête

  • Nom de l'interface: capacités du modèle de canal de requête
  • Méthode HTTP: GET
  • Chemin: /api/channel/models
  • Exigence d'authentification: Administrateur
  • Description de la fonction: Récupérez la liste des modèles pris en charge par tous les canaux du système

💡 Exemple de demande:

const response = await fetch('/api/channel/models', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  }
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": "",
  "data": [
    {
      "id": "gpt-3.5-turbo",
      "name": "GPT-3.5 Turbo"
    },
    {
      "id": "gpt-4",
      "name": "GPT-4"
    },
    {
      "id": "claude-3-sonnet",
      "name": "Claude 3 Sonnet"
    }
  ]
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Failed to get model list"
}

🧾 Description du champ:

data (Array): Liste des informations sur le modèle

  • id (Chaîne) : ID du modèle
  • name (Chaîne): Nom d'affichage du modèle

Capacités de modèle activées par les requêtes

  • Nom de l'interface: capacités du modèle activé par les requêtes
  • Méthode HTTP: GET
  • Chemin: /api/channel/models_enabled
  • Exigence d'authentification: Administrateur
  • Description de la fonction: Récupérez la liste des modèles pris en charge par les canaux actuellement activés

💡 Exemple de demande:

const response = await fetch('/api/channel/models_enabled', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  }
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": "",
  "data": [
    "gpt-3.5-turbo",
    "gpt-4",
    "claude-3-sonnet"
  ]
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Failed to get enabled model"
}

🧾 Description du champ:

data (Array): Liste des ID de modèle activés

Obtenez un seul canal

  • Nom de l'interface: Obtenez un seul canal
  • Méthode HTTP: GET
  • Chemin: /api/channel/:id
  • Exigence d'authentification: Administrateur
  • Description de la fonction: Récupérer des informations détaillées sur le canal spécifié, à l'exclusion des informations clés sensibles

💡 Exemple de demande:

const response = await fetch('/api/channel/123', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  }
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": "",
  "data": {
    "id": 123,
    "name": "OpenAIchannel",
    "type": 1,
    "status": 1,
    "priority": 10,
    "weight": 100,
    "models": "gpt-3.5-turbo,gpt-4",
    "group": "default",
    "base_url": "https://api.openai.com",
    "model_mapping": "{}",
    "channel_info": {
      "is_multi_key": false,
      "multi_key_mode": "random"
    }
  }
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Channel does not exist"
}

🧾 Description du champ:

  • id (Numéro): ID de chaîne, transmis via le chemin URL
  • Renvoie des informations complètes sur la chaîne, mais exclut les champs clés

Connectivité des canaux de test par lots

  • Nom de l'interface: Connectivité du canal de test par lots
  • Méthode HTTP: GET
  • Chemin: /api/channel/test
  • Exigence d'authentification: Administrateur
  • Description de la fonction: testez par lots la connectivité et le temps de réponse de tous les canaux ou de certains canaux

💡 Exemple de demande:

const response = await fetch('/api/channel/test?model=gpt-3.5-turbo', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  }
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": "Batch testing completed",
  "data": {
    "total": 10,
    "success": 8,
    "failed": 2,
    "results": [
      {
        "channel_id": 1,
        "channel_name": "OpenAIchannel",
        "success": true,
        "time": 1.25,
        "message": ""
      },
      {
        "channel_id": 2,
        "channel_name": "Claudechannel",
        "success": false,
        "time": 0,
        "message": "Connection timeout"
      }
    ]
  }
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Batch test failed"
}

🧾 Description du champ:

  • model (String) : Facultatif, précise le modèle de test
  • results (Array) : Liste des résultats des tests
  • success (Booléen): indique si le test a réussi
  • time (Nombre): Temps de réponse (secondes)

Test monocanal

  • Nom de l'interface: Test monocanal
  • Méthode HTTP: GET
  • Chemin: /api/channel/test/:id
  • Exigence d'authentification: Administrateur
  • Description de la fonction: testez la connectivité du canal spécifié, prenant en charge un modèle de test spécifié

💡 Exemple de demande:

const response = await fetch('/api/channel/test/123?model=gpt-4', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  }
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": "",
  "time": 1.25
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "APIInvalid key",
  "time": 0.5
}

🧾 Description du champ:

  • id (Numéro): ID de chaîne, transmis via le chemin URL
  • model (String) : Facultatif, précise le nom du modèle de test
  • time (Nombre): Temps de réponse (secondes)

Actualisation du solde par lots

  • Nom de l'interface: Solde d'actualisation par lots
  • Méthode HTTP: GET
  • Chemin: /api/channel/update_balance
  • Exigence d'authentification: Administrateur
  • Description de la fonction: mise à jour par lots des informations de solde pour tous les canaux activés

💡 Exemple de demande:

const response = await fetch('/api/channel/update_balance', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  }
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": "Batch update balance completed"
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Batch update balance failed"
}

🧾 Description du champ:

Aucun paramètre de demande, le système met automatiquement à jour le solde de tous les canaux activés

Solde de rafraîchissement unique

  • Nom de l'interface: mettre à jour la balance des canaux spécifiée
  • Méthode HTTP: GET
  • Chemin: /api/channel/update_balance/:id
  • Exigence d'authentification: Administrateur
  • Description de la fonction: Mettre à jour les informations de solde pour le canal spécifié. La demande de solde n'est pas prise en charge pour les canaux multi-clés.

💡 Exemple de demande:

const response = await fetch('/api/channel/update_balance/123', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  }
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": "",
  "balance": 25.50
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Multi-key channels do not support balance inquiries"
}

🧾 Description du champ:

  • id (Numéro): ID de chaîne, transmis via le chemin URL
  • balance (Numéro): solde des chaînes mis à jour

Ajouter une chaîne

  • Nom de l'interface: Ajouter une chaîne
  • Méthode HTTP: POST
  • Chemin: /api/channel/
  • Exigence d'authentification: Administrateur
  • Description de la fonction: créez un nouveau canal de service IA, prenant en charge les modes simple, par lots et multi-clés

💡 Exemple de demande:

const response = await fetch('/api/channel/', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  },
  body: JSON.stringify({
    mode: "single",
    channel: {
      name: "OpenAIchannel",
      type: 1,
      key: "`<YOUR_API_KEY>`",
      base_url: "https://api.openai.com",
      models: "gpt-3.5-turbo,gpt-4,claude-3-sonnet",
      groups: ["default"],
      priority: 10,
      weight: 100
    }
  })
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": ""
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Unsupported add mode"
}

🧾 Description du champ:

  • mode (String) : Mode d'addition, valeurs facultatives : "single", "batch", "multi_to_single"
  • multi_key_mode (String): Mode multi-touches, requis lorsque le mode est "multi_to_single"
  • channel (Objet): informations de configuration du canal
  • name (Chaîne): Nom de la chaîne
  • type (Numéro): Type de canal
  • key (Chaîne): Clé API
  • base_url (Chaîne): URL de base
  • models (String): liste des modèles pris en charge, séparés par des virgules, facultatif
  • groups (Array) : Liste des groupes disponibles
  • priority (Numéro) : Priorité
  • weight (Nombre): Poids

Mettre à jour la chaîne

  • Nom de l'interface: canal de mise à jour
  • Méthode HTTP: PUT
  • Chemin: /api/channel/
  • Exigence d'authentification: Administrateur
  • Description de la fonction: Mettre à jour les informations de configuration d'un canal existant

💡 Exemple de demande:

const response = await fetch('/api/channel/', {
  method: 'PUT',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  },
  body: JSON.stringify({
    id: 123,
    name: "updatedOpenAIchannel",
    status: 1,
    priority: 15,
    weight: 120
  })
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": ""
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Channel does not exist"
}

🧾 Description du champ:

  • id (Numéro): ID de chaîne, requis
  • Les autres champs sont identiques à ceux de l'interface Ajouter une chaîne et sont facultatifs

Supprimer les chaînes désactivées

  • Nom de l'interface: Supprimer les chaînes désactivées
  • Méthode HTTP: SUPPRIMER
  • Chemin: /api/channel/disabled
  • Exigence d'authentification: Administrateur
  • Description de la fonction: Suppression par lots de toutes les chaînes désactivées

💡 Exemple de demande:

const response = await fetch('/api/channel/disabled', {
  method: 'DELETE',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  }
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": "",
  "data": 5
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Delete failed"
}

🧾 Description du champ:

  • Aucun paramètre de requête
  • data (Numéro) : Nombre de chaînes supprimées

Désactivation par lots des chaînes marquées

  • Nom de l'interface: désactivation par lots des canaux balisés
  • Méthode HTTP: POST
  • Chemin: /api/channel/tag/disabled
  • Exigence d'authentification: Administrateur
  • Description de la fonction: désactivation par lots des canaux en fonction des balises

💡 Exemple de demande:

const response = await fetch('/api/channel/tag/disabled', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  },
  body: JSON.stringify({
    tag: "test-tag"
  })
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": ""
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Parameter error"
}

🧾 Description du champ:

tag (String): tag de canal à désactiver, obligatoire

Activer par lots les canaux balisés

  • Nom de l'interface: activation par lots des canaux balisés
  • Méthode HTTP: POST
  • Chemin: /api/channel/tag/enabled
  • Exigence d'authentification: Administrateur
  • Description de la fonction: Activation par lots des canaux en fonction des balises

💡 Exemple de demande:

const response = await fetch('/api/channel/tag/enabled', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  },
  body: JSON.stringify({
    tag: "production-tag"
  })
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": ""
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Parameter error"
}

🧾 Description du champ:

tag (String): balise de canal à activer, obligatoire

Modifier les balises de la chaîne

  • Nom de l'interface: modifier les balises de la chaîne
  • Méthode HTTP: PUT
  • Chemin: /api/channel/tag
  • Exigence d'authentification: Administrateur
  • Description de la fonction: Attributs de canal de modification par lots pour les balises spécifiées

💡 Exemple de demande:

const response = await fetch('/api/channel/tag', {
  method: 'PUT',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  },
  body: JSON.stringify({
    tag: "old-tag",
    new_tag: "new-tag",
    priority: 20,
    weight: 150,
    models: "gpt-3.5-turbo,gpt-4,claude-3-sonnet",
    groups: "default,vip"
  })
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": ""
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "tagcannot be empty"
}

🧾 Description du champ:

  • tag (String) : Nom du tag à éditer, obligatoire
  • new_tag (String) : Nouveau nom de tag, facultatif
  • priority (Numéro) : Nouvelle priorité, optionnel
  • weight (Nombre): Nouveau poids, en option
  • model_mapping (String): configuration du mappage de modèle, en option
  • models (String): liste des modèles pris en charge, séparés par des virgules, facultatif
  • groups (String) : Liste des groupes disponibles, séparés par des virgules, facultatif

Supprimer la chaîne

  • Nom de l'interface: Supprimer la chaîne
  • Méthode HTTP: SUPPRIMER
  • Chemin: /api/channel/:id
  • Exigence d'authentification: Administrateur
  • Description de la fonction: Supprimez définitivement la chaîne spécifiée. Le cache des chaînes sera actualisé après la suppression.

💡 Exemple de demande:

const response = await fetch('/api/channel/123', {
  method: 'DELETE',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  }
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": ""
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Channel does not exist"
}

🧾 Description du champ:

id (Numéro): ID de chaîne, transmis via le chemin URL

Chaînes de suppression par lots

  • Nom de l'interface: chaînes de suppression par lots
  • Méthode HTTP: POST
  • Chemin: /api/channel/batch
  • Exigence d'authentification: Administrateur
  • Description de la fonction: Suppression par lots de canaux en fonction d'une liste d'identifiants

💡 Exemple de demande:

const response = await fetch('/api/channel/batch', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  },
  body: JSON.stringify({
    ids: [1, 2, 3, 4, 5]
  })
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": "",
  "data": 5
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Parameter error"
}

🧾 Description du champ:

  • ids (Array): Liste des ID de chaîne à supprimer, obligatoire et ne peut pas être vide
  • data (Nombre): Nombre de chaînes supprimées avec succès

Tableau des capacités des canaux de correction

  • Nom de l'interface: tableau des capacités des canaux correctifs
  • Méthode HTTP: POST
  • Chemin: /api/channel/fix
  • Exigence d'authentification: Administrateur
  • Description de la fonction: Corrigez les données du tableau de capacités des canaux et reconstruisez la relation de mappage entre les canaux et les modèles

💡 Exemple de demande:

const response = await fetch('/api/channel/fix', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  }
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": "",
  "data": {
    "success": 45,
    "fails": 2
  }
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Failed to repair ability table"
}

🧾 Description du champ:

  • Aucun paramètre de requête
  • data.success (Nombre): Nombre de chaînes corrigées avec succès
  • data.fails (Nombre): Nombre de chaînes dont la correction n'a pas réussi

Récupérer des modèles à canal unique

  • Nom de l'interface: récupérer des modèles à canal unique
  • Méthode HTTP: GET
  • Chemin: /api/channel/fetch_models/:id
  • Exigence d'authentification: Administrateur
  • Description de la fonction: Récupérer la liste des modèles disponibles depuis l'API amont du canal spécifié

💡 Exemple de demande:

const response = await fetch('/api/channel/fetch_models/123', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  }
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": "",
  "data": [
    "gpt-3.5-turbo",
    "gpt-4",
    "gpt-4-turbo-preview"
  ]
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Failed to parse response: invalid character 'H' looking for beginning of value"
}

🧾 Description du champ:

  • id (Numéro): ID de chaîne, transmis via le chemin URL
  • data (Array): Liste des ID de modèle récupérés depuis l'amont

Récupérer tous les modèles de chaînes

  • Nom de l'interface: récupérer tous les modèles de canaux
  • Méthode HTTP: POST
  • Chemin: /api/channel/fetch_models
  • Exigence d'authentification: Administrateur
  • Description de la fonction: Récupérez la liste des modèles de l'API en amont à l'aide des informations de configuration fournies, utilisées pour la prévisualisation lors de la création d'un nouveau canal

💡 Exemple de demande:

const response = await fetch('/api/channel/fetch_models', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  },
  body: JSON.stringify({
    base_url: "https://api.openai.com",
    type: 1,
    key: "`<YOUR_API_KEY>`"
  })
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "data": [
    "gpt-3.5-turbo",
    "gpt-4",
    "text-davinci-003"
  ]
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Failed to fetch models"
}

🧾 Description du champ:

  • base_url (String) : URL de base, facultative, utilise l'URL par défaut si elle est vide
  • type (Numéro): Type de canal requis
  • key (String): clé API, obligatoire
  • data (Array) : Liste des modèles récupérés

Balises de canal définies par lots

  • Nom de l'interface: balises de canal définies par lots
  • Méthode HTTP: POST
  • Chemin: /api/channel/batch/tag
  • Exigence d'authentification: Administrateur
  • Description de la fonction: balises définies par lots pour la liste de canaux spécifiée

💡 Exemple de demande:

const response = await fetch('/api/channel/batch/tag', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  },
  body: JSON.stringify({
    ids: [1, 2, 3],
    tag: "production"
  })
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": "",
  "data": 3
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "Parameter error"
}

🧾 Description du champ:

  • ids (Array): Liste des ID de canal pour lesquels définir des balises, obligatoire et ne peut pas être vide
  • tag (String) : Nom du tag à paramétrer. Passer null efface la balise.
  • data (Nombre): Nombre de chaînes taguées avec succès

Obtenir des modèles par balise

  • Nom de l'interface: obtenir les modèles par balise
  • Méthode HTTP: GET
  • Chemin: /api/channel/tag/models
  • Exigence d'authentification: Administrateur
  • Description de la fonction: Récupérez la liste de modèles qui a le nombre de modèles le plus élevé parmi tous les canaux sous la balise spécifiée.

💡 Exemple de demande:

const response = await fetch('/api/channel/tag/models?tag=production', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  }
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": "",
  "data": "gpt-3.5-turbo,gpt-4,claude-3-sonnet"
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "tagcannot be empty"
}

🧾 Description du champ:

  • tag (String) : Nom du tag, obligatoire
  • data (String) : Liste des modèles de la chaîne avec le plus de modèles sous cette balise, séparés par des virgules

Copier la chaîne

  • Nom de l'interface: Copier le canal
  • Méthode HTTP: POST
  • Chemin: /api/channel/copy/:id
  • Exigence d'authentification: Administrateur
  • Description de la fonction: dupliquez un canal existant pour en créer un nouveau, prenant en charge les suffixes personnalisés et les options de réinitialisation de la balance.

💡 Exemple de demande:

const response = await fetch('/api/channel/copy/123?suffix=_backup&reset_balance=true', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your_admin_token',
    'New-Api-User': 'your_user_id'
  }
});
const data = await response.json();

✅ Exemple de réponse réussie:

{
  "success": true,
  "message": "",
  "data": {
    "id": 124
  }
}

❗ Exemple de réponse échouée:

{
  "success": false,
  "message": "invalid id"
}

🧾 Description du champ:

  • id (Numéro): ID de chaîne à copier, transmis via le chemin URL
  • suffix (String): facultatif, suffixe ajouté au nom d'origine, par défaut "_copy"
  • reset_balance (Booléen): Facultatif, s'il faut réinitialiser le solde et le quota utilisé à 0, la valeur par défaut est true
  • data.id (Numéro): ID de la chaîne nouvellement créée