Hi David, thanks for your kind help! Basically my input are shop names and zip codes in a Coda.io table. they are processed by a scrapper tool executed in python locally, and I would like to send the output to my trained Dustt agent to return to coda a clean set of info (phone, address, category of shop, instagram account...) it works great when I share manually the info to the agent but I cannot finalize the bridge from the scapper to dustt. here's what I have :
# Fonction pour envoyer les résultats à Dust pour synthèse
def get_dust_synthesis(business_result):
"""Envoie les résultats à l'agent Dust et retourne sa synthèse"""
try:
# Récupérer des snippets Instagram si disponible
instagram_snippets = get_instagram_snippets(business_result['instagram'])
# Construire le prompt pour Dust selon la consigne spécifique
prompt = f"""Tu es un assistant spécialisé dans la recherche d'informations sur des commerces indépendants en France.
Analyser les informations suivantes sur l'entreprise "{business_result['business_name']}" à {business_result['location']} et fais-en une synthèse structurée.
INSTAGRAM:
{', '.join(business_result['instagram']) if business_result['instagram'] else 'Aucun compte Instagram trouvé'}
SNIPPETS INSTAGRAM:
{', '.join(instagram_snippets) if instagram_snippets else 'Aucun snippet Instagram trouvé'}
FACEBOOK:
{', '.join(business_result['facebook']) if business_result['facebook'] else 'Aucune page Facebook trouvée'}
SITE WEB:
{', '.join(business_result['website'][:3]) if business_result['website'] else 'Aucun site web trouvé'}
TÉLÉPHONES:
{', '.join(business_result['phones']) if business_result['phones'] else 'Aucun numéro de téléphone trouvé'}
ADRESSES:
{', '.join(business_result['addresses']) if business_result['addresses'] else 'Aucune adresse trouvée'}
HORAIRES:
{', '.join([page_info.get('opening_hours', '') for page_info in business_result['raw_results'] if page_info.get('opening_hours')]) or 'Aucun horaire trouvé'}
SNIPPETS GOOGLE:
{', '.join(business_result['google_snippets'][:3]) if business_result['google_snippets'] else 'Aucun snippet Google trouvé'}
1. Analyse l'information reçue et ne retiens que les informations liées à la bonne "location".
2. Si tu vois plusieurs valeurs pour la même information, retiens celle qui revient le plus souvent.
3. Renvoie uniquement les informations demandées: téléphone, site web, réseaux sociaux (comptes Instagram et Facebook, snippet Instagram), adresse, horaires.
4. Sur la base de ce que tu as analysé, indique dans la base DB taxonomie quelle est l'activité principale du commerce (single select) et éventuellement les activités secondaires (multi select limité à 3).
5. Réponds UNIQUEMENT au format JSON structuré comme ci-dessous.
6. Ne pas ajouter de texte explicatif en dehors du JSON.
7. Si tu ne trouves pas une information, laisse le champ correspondant vide ("").
Réponds uniquement avec un JSON structuré comme ceci:
{{{{
"telephone": "+33 1 23 45 67 89",
"siteWeb": "https://exemple.com",
"instagram": "@exemple",
"snippet_instagram": "votre caviste gourmand à Blois",
"facebook": "https://facebook.com/exemple",
"adresse": "123 rue Exemple, 75000 Paris",
"horaires": "Lun-Ven: 9h-18h, Sam: 10h-17h",
"activite_principale": "caviste",
"activites_secondaires": ["restaurant", "", ""]
}}}}"""
print("\n--- PROMPT ENVOYÉ À DUST ---")
print(prompt[:300] + "..." if len(prompt) > 300 else prompt)
print("---------------------------\n")
# URL correcte pour l'API Dust
url = f"https://dust.tt/api/v1/workspaces/{DUST_WORKSPACE_ID}/assistants/{DUST_ASSISTANT_ID}/conversations"
headers = {
"Authorization": f"Bearer {DUST_API_KEY}",
"Content-Type": "application/json"
}
# Format correct de requête pour l'API Dust
data = {
"messages": [{
"role": "user",
"content": prompt
}],
"stream": False # Désactiver le streaming pour une réponse synchrone
}
print(f"Appel à l'API Dust: {url}")
response = requests.post(url, headers=headers, json=data, timeout=60)
print(f"Code de réponse Dust: {response.status_code}")
if response.status_code == 200:
try:
# Extraire la réponse JSON
dust_response = response.json()
print("Réponse Dust reçue!")
# Obtenir la réponse de l'assistant
assistant_message = dust_response.get("messages", [])[-1]
if assistant_message and assistant_message.get("role") == "assistant":
assistant_content = assistant_message["content"]
print("\n--- RÉPONSE DE DUST ---")
print(assistant_content[:300] + "..." if len(assistant_content) > 300 else assistant_content)
print("----------------------\n")
# Extraire le JSON de la réponse
json_match = re.search(r'\{[\s\S]*\}', assistant_content)
if json_match:
json_str = json_match.group(0)
return json.loads(json_str)
else:
print("⚠️ Impossible de trouver un JSON dans la réponse de Dust")
return {}
else:
print("⚠️ Pas de réponse de l'assistant dans la réponse Dust")
return {}
except Exception as e:
print(f"⚠️ Erreur lors du parsing de la réponse Dust: {e}")
print(f"Contenu de la réponse: {response.text[:500]}...")
return {}
else:
print(f"⚠️ Erreur lors de l'appel à Dust: {response.status_code}")
print(f"Détails: {response.text[:500]}...")
return {}
except Exception as e:
print(f"⚠️ Exception lors de l'appel à Dust: {e}")
return {}