Documentation complète de l'API de gestion des conversations dans Devana.ai.
Base URL: https://api.devana.ai
Préfixe: /v1/conversations
Authentification: API Key requise
L'API Conversations permet de gérer les conversations existantes avec les agents IA :
Note importante : Cette API gère les conversations après leur création. Pour créer de nouvelles conversations, utilisez l'endpoint /v1/chat/completions.
Toutes les requêtes nécessitent une clé API dans le header Authorization :
Authorization: Bearer YOUR_API_KEY
Les permissions sont vérifiées au niveau de l'agent associé à la conversation.
Récupère les métriques détaillées d'un message spécifique, incluant les statistiques de tokens et les appels de conversation associés.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
id | String (CUID) | Oui | ID du message de conversation |
GET /v1/conversations/cm4msg123abc/metrics
Authorization: Bearer YOUR_API_KEY
{
"success": true,
"data": {
"id": "cm4msg123abc",
"message": "Voici les résultats de votre analyse...",
"score": 0.95,
"type": "assistant",
"model": "gpt-4",
"sources": [
{
"fileName": "guide.pdf",
"page": 12,
"relevance": 0.89
}
],
"status": "completed",
"agent": "cm4agent456def",
| Champ | Type | Description |
|---|---|---|
id | String | Identifiant unique du message |
message | String | Contenu du message |
score | Number | Score de pertinence (0-1) |
type | String | Rôle : user, assistant, system |
model | String | Modèle utilisé (ou modèle custom si défini) |
sources | Array | Sources utilisées pour la réponse |
status | String | Statut du message |
agent | String | ID de l'agent associé |
tokens.message | Number | Tokens utilisés pour ce message |
tokens.context | Number | Tokens de contexte utilisés |
conversationCalls | Array | Détails des appels API effectués |
curl -X GET https://api.devana.ai/v1/conversations/cm4msg123abc/metrics \
-H "Authorization: Bearer YOUR_API_KEY"
Récupère tous les messages d'une conversation, incluant le message principal et toutes les réponses.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
id | String (CUID) | Oui | ID de la conversation |
| Paramètre | Type | Requis | Description |
|---|---|---|---|
flagged | Boolean | Non | Si true, retourne uniquement les messages marqués par la modération |
GET /v1/conversations/cm4conv789xyz/messages
Authorization: Bearer YOUR_API_KEY
GET /v1/conversations/cm4conv789xyz/messages?flagged=true
Authorization: Bearer YOUR_API_KEY
{
"success": true,
"data": [
{
"id": "cm4msg001",
"date": "2024-10-28T10:00:00.000Z",
"message": "Comment optimiser cette fonction Python ?",
"role": "user",
"model": null,
"score": null,
"sources": null,
"tokens": 15,
"contextTokens": 0,
"toolCalls": null
},
{
| Champ | Type | Description |
|---|---|---|
id | String | Identifiant unique du message |
date | DateTime | Date et heure du message |
message | String | Contenu du message |
role | String | user, assistant, ou system |
model | String | Modèle utilisé (null pour user) |
score | Number | Score de pertinence |
sources | Array | Sources référencées |
tokens | Number | Nombre de tokens du message |
contextTokens | Number | Tokens de contexte |
toolCalls | Object | Outils appelés pendant la génération |
# Tous les messages
curl -X GET https://api.devana.ai/v1/conversations/cm4conv789xyz/messages \
-H "Authorization: Bearer YOUR_API_KEY"
# Messages marqués uniquement
curl -X GET "https://api.devana.ai/v1/conversations/cm4conv789xyz/messages?flagged=true" \
-H "Authorization: Bearer YOUR_API_KEY"
Supprime une conversation et tous ses messages enfants de manière récursive (soft delete).
| Paramètre | Type | Requis | Description |
|---|---|---|---|
id | String (CUID) | Oui | ID de la conversation à supprimer |
DELETE /v1/conversations/cm4conv789xyz
Authorization: Bearer YOUR_API_KEY
{
"success": true,
"data": {
"message": "Conversation deleted successfully",
"deletedId": "cm4conv789xyz"
}
}
deletedAtcurl -X DELETE https://api.devana.ai/v1/conversations/cm4conv789xyz \
-H "Authorization: Bearer YOUR_API_KEY"
interface ConversationMessage {
id: string; // CUID unique
date: DateTime; // Date de création
message: string; // Contenu du message
role: "user" | "assistant" | "system";
model: string | null; // Modèle utilisé
score: number | null; // Score de qualité (0-1)
sources: Source[] | null; // Sources référencées
tokens: number | null; // Nombre de tokens du message
contextTokens: number | null; // Tokens de contexte
toolCalls: object | null; // Appels d'outils effectués
}
interface ConversationMetrics {
id: string;
message: string;
score: number | null;
type: "user" | "assistant" | "system";
model: string; // Nom du modèle custom ou standard
sources: Source[] | null;
status: string | null;
agent: string; // ID de l'agent
tokens: {
message: number | null;
context: number | null;
};
conversationCalls: ConversationCall[];
}
interface ConversationCall {
type: string; // Type d'appel (completion, embedding, etc.)
messages: object | null; // Messages envoyés
messagesTokens: number | null; // Tokens des messages
outputContent: string | null; // Contenu généré
outputTokens: number | null; // Tokens générés
timeMs: number | null; // Temps d'exécution en ms
}
interface Source {
fileName: string; // Nom du fichier source
page?: number; // Page (si applicable)
relevance: number; // Score de pertinence (0-1)
excerpt?: string; // Extrait pertinent
}
La suppression d'une conversation parent entraîne automatiquement :
deletedAt (soft delete)Chaque endpoint vérifie :
guardAuthorizedAgentRightsdeletedAt: null)Les endpoints retournent automatiquement :
Le paramètre flagged permet de :
class ConversationMetrics {
constructor(apiKey) {
this.apiKey = apiKey;
this.baseUrl = "https://api.devana.ai/v1";
}
async getConversationStats(conversationId) {
// Récupérer tous les messages
const messagesResponse = await fetch(
`${this.baseUrl}/conversations/${conversationId}/messages`,
{
headers: {
Authorization: `Bearer ${this.apiKey}`,
},
}
);
const messages = await messagesResponse.json();
// Calculer les statistiques
const stats = {
totalMessages: messages.data.length,
userMessages: messages.data.filter((m) => m.role === "user").length,
assistantMessages: messages.data.filter((m) => m.role === )
.,
: ,
: ,
: (),
};
( message messages.) {
(message.) {
stats. += message.;
}
(message.) {
stats. += message.;
}
(message.) {
message..( {
stats..(source.);
});
}
}
stats. = stats. / stats. || ;
stats. = stats..;
lastAssistant = messages.
.( m. === )
.();
(lastAssistant) {
metricsResponse = (
,
{
: {
: ,
},
}
);
metrics = metricsResponse.();
stats. = metrics...(
sum + (call. || ),
);
}
stats;
}
() {
report = {
: [],
: ,
: ,
};
( id conversationIds) {
response = (
,
{
: {
: ,
},
}
);
messages = response.();
conversationTokens = messages..( {
sum + (msg. || ) + (msg. || );
}, );
report..({
id,
: conversationTokens,
: messages..,
});
report. += conversationTokens;
}
report. = (report. / ) * ;
report;
}
}
metrics = ();
stats = metrics.();
.(, stats);
report = metrics.([
,
,
,
]);
.(, report);
import requests
from typing import List, Dict
from datetime import datetime
class ConversationModerator:
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = "https://api.devana.ai/v1"
self.headers = {"Authorization": f"Bearer {api_key}"}
def get_flagged_messages(self, conversation_id: str) -> List[Dict]:
"""Récupère tous les messages marqués par la modération"""
response = requests.get(
f"{self.base_url}/conversations/{conversation_id}/messages",
headers=self.headers,
params={"flagged": "true"}
)
if response.status_code == 200:
return response.json()["data"]
return []
def analyze_conversation_safety(self, conversation_id: str) -> Dict:
"""Analyse la sécurité d'une conversation"""
# Récupérer tous les messages
all_messages = .get_all_messages(conversation_id)
flagged_messages = .get_flagged_messages(conversation_id)
analysis = {
: conversation_id,
: (all_messages),
: (flagged_messages),
: - ((flagged_messages) / (all_messages)) all_messages ,
: (flagged_messages) > ,
: []
}
msg flagged_messages:
analysis[].append({
: msg[],
: msg[],
: msg[][:] + (msg[]) > msg[],
: msg[]
})
analysis
() -> []:
response = requests.get(
,
headers=.headers
)
response.status_code == :
response.json()[]
[]
() -> :
analysis = .analyze_conversation_safety(conversation_id)
analysis[] < threshold:
response = requests.delete(
,
headers=.headers
)
response.status_code == :
()
() -> :
report = {
: datetime.now().isoformat(),
: (conversation_ids),
: ,
: ,
: []
}
conv_id conversation_ids:
analysis = .analyze_conversation_safety(conv_id)
analysis[]:
report[] +=
report[] += analysis[]
report[].append(analysis)
report[].sort(key= x: x[])
report
moderator = ConversationModerator()
analysis = moderator.analyze_conversation_safety()
()
report = moderator.generate_moderation_report([
,
,
])
()
#!/bin/bash
# Script d'export et archivage de conversations
API_KEY="YOUR_API_KEY"
BASE_URL="https://api.devana.ai/v1"
EXPORT_DIR="./conversation_exports"
# Créer le répertoire d'export
mkdir -p $EXPORT_DIR
export_conversation() {
local conv_id=$1
local export_file="$EXPORT_DIR/conversation_${conv_id}_$(date +%Y%m%d_%H%M%S).json"
echo "Exporting conversation $conv_id..."
# Récupérer les messages
curl -s -X GET "$BASE_URL/conversations/$conv_id/messages" \
-H "Authorization: Bearer $API_KEY" > "$export_file.tmp"
# Vérifier le succès
if [ $? -eq 0 ]; then
# Formatter le JSON
jq '.' "$export_file.tmp" > "$export_file"
rm "$export_file.tmp"
# Récupérer les métriques pour chaque message
messages=$(jq -r '.data[].id' "$export_file")
for msg_id in $messages;
curl -s -X GET \
-H >
}
export_conversation
CONVERSATION_IDS=( )
conv_id ;
export_conversation
tar -czf
/v1/conversations)/v1/chat/conversation)Pour les conversations publiques et widgets, consultez Public Conversations API.
| Code | Message | Description | Solution |
|---|---|---|---|
400 | Bad Request | Paramètres invalides (ID non CUID) | Vérifier le format de l'ID |
403 | Forbidden | Pas d'autorisation sur l'agent | Vérifier les permissions |
404 | Not Found | Conversation/Message introuvable | Vérifier l'ID et la suppression |
500 | Internal Server Error | Erreur serveur | Réessayer ou contacter le support |
| Limite | Valeur | Description |
|---|---|---|
| Messages par requête | 1000 | Maximum retourné par /messages |
| Profondeur récursive | Illimitée | Pour la suppression cascade |
| Rétention soft delete | 30 jours | Avant suppression définitive |
| Rate limit | 100 req/min | Par API Key |
Pour toute question ou problème concernant l'API Conversations :