File size: 4,928 Bytes
8a7669a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
492e0af
 
 
8a7669a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
492e0af
8a7669a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
be4adf4
8a7669a
 
 
 
 
 
be4adf4
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import zlib
import base64
import os
from dotenv import load_dotenv
from huggingface_hub import InferenceClient

load_dotenv()
os.environ["SAMBANOVA_API_KEY"]

PROMPT="""
###PERSONA : Tu es un analyste métier sénior, expert en vulgarisation et en diagrammes formels. 
###INSTRUCTION : En fonction d’un sujet donné, sélectionne le type de diagramme le plus adapté parmi ceux listés, puis génère un diagramme complet, lisible, et détaillé. Syntaxe Mermaid uniquement, sans explication hors-code.
Génère le code mermaid, et rien que le code mermaid expliquant le mieux la description qui suit.
### Sélection du type de diagramme (`mermaid_diag_type`) :
- `Graph TB` : **choix par défaut**. Regroupe les éléments par blocs. Applique des couleurs si possible.
- `flowchart TD` : pour les **processus** et **arbres de décision**.
- `sequenceDiagram` : pour les **enchaînements complexes** entre **acteurs ou systèmes**.
- `classDiagram` : si **demande explicite** ou si **entrants techniques** (ex. schéma SQL).
- `stateDiagram-v2` : si **demande explicite** ou **entrants techniques** comme une user story.
- `erDiagram` : autre **choix par défaut** pour exposer les relations entités-attributs. Regroupe et colore les blocs.
- `gantt` : si **thématique projet ou travaux**, avec des **tâches identifiables**.
- `timeline` : pour toute **chronologie**, **biographie**, ou **historique**. Regroupe les événements par **décennie**, ou **siècle** si nécessaire. Exemple de syntaxe : 
timeline
title History of Social Media Platform
2002 : LinkedIn
2004 : Facebook
: Google
2005 : YouTube
2006 : Twitter

### Règles de syntaxe :
- Pas de parenthèses dans les libellés, c'est réservé syntaxe mermaid, exemple JeuxDeDonnees[450 000 Jeux de Données (2024)] devient JeuxDeDonnees[450 000 Jeux de Données en 2024]
- Les noms d’entités doivent être **concis**, s'ils ne sont pas affichés, en sécuriser la syntax avec des underscores, pas d'accent etc.
- Évite aussi les caractères spéciaux non compatibles Mermaid (`@`, `{}`, `[]`, `(`, `)` etc.).
- Utilise des noms explicites pour les nœuds (ex. `AgentDemandeur` plutôt que `A`)
- Utilise `%%` pour commenter ou annoter hors rendu visuel.
- Segmente clairement, évite les diagrammes illisibles ou trop denses.
- Rédige dans la **langue du demandeur** ou celle du **texte d’origine**.

Objectif : produire un diagramme Mermaid clair, fidèle, et directement exploitable dans un contexte explicatif, technique ou décisionnel.
"""
import os



def getModelResponseFromContent(content, provider_name="sambanova", provider_env_key="SAMBANOVA_API_KEY", model="meta-llama/Llama-4-Scout-17B-16E-Instruct"):
    client = InferenceClient(
        provider=provider_name,
        api_key=os.environ[provider_env_key],
    )

    completion = client.chat.completions.create(
        model=model,
        messages=[
            {
                "role": "user",
                f"content": content
            }
        ],
        temperature=0.5
    )

    raw_response = completion.choices[0].message.content
    mermaid_code_cleaned = raw_response.replace("```mermaid", "").replace("```", "").strip()
    mermaid_diagram_type = mermaid_code_cleaned.split('\n', 1)[0].strip()
    
    return mermaid_code_cleaned, mermaid_diagram_type

def kroki_img_from_mermaid(mermaid_code: str, output_format: str = "svg") -> str:
    compressed = zlib.compress(mermaid_code.encode('utf-8'))
    b64 = base64.urlsafe_b64encode(compressed).decode('utf-8')
    image_url = f"https://kroki.io/mermaid/{output_format}/{b64}"
    html_img = f"""<a href="{image_url}" target="_blank"> <img src="{image_url}" alt="Diagramme Mermaid via Kroki" > </a>"""
    return html_img


def generateDiagram(input_text="I broke my car yesterday, and the mechanics will give it back to me after insurance payment.", input_precisions="Choose the best diagram paradigm"):
    """Generates a mermaid diagram to explain a submited text. The diagram is returned in different formats(html and raw code)
    
    Args:
        input_text: the text to explain with a diagram.
        input_precisions: diagram settings, by default the tool has the ability to choose the best type of diagram.
        
    Returns:
        kroki_html_result: *default for agentic chatbots* full kroki html to embed with link with image and link to kroki page.
        mermaid_diag_type: type of diagram selected by the tool
        mermaid_code: mermaid code
    """
    full_content_prompt = f"{PROMPT}. ###INPUT : {input_text}. ###PRECISIONS {input_precisions}"
    mermaid_code, mermaid_diag_type = getModelResponseFromContent(content=full_content_prompt )
    kroki_html_link = kroki_img_from_mermaid(mermaid_code)
    #kroki_html_img =  kroki_html_link[kroki_html_link.find('<img '):kroki_html_link.find('>', kroki_html_link.find('<img ')) + 1]
    return kroki_html_link, mermaid_diag_type, mermaid_code