{
  "classes": {
    "clsMistral": {
      "heritage": "clsLLM",
      "attributs": {
        "maxToken": "entier",
        "seed": "entier",
        "presence_penalty": "réel",
        "frequency_penalty": "réel",
        "n": "entier",
        "prediction": "JSON",
        "safe_prompt": "booléen",
        "o_stop": "chaîne",
        "m_tabModels": "tableau de chaînes (PRIVÉ)"
      },
      "methodes": {
        "Constructeur": {
          "code": "PROCÉDURE Constructeur()\n\n//:Modele = \"open-mixtral-8x22b-2404\"\n:Modele = \"mistral-large-latest\"\n:o_temperature = 0.2\n:o_top_p = 1\n:maxToken = 1000\n:presence_penalty =\t0\n:frequency_penalty = 0\n:n=1\nprediction.type = \"content\"\nprediction.content = \"\"\nsafe_prompt = Faux\no_stop = \"string\""
        },
        "model_list": {
          "code": "PROCÉDURE PUBLIQUE model_list()\nhReponse\test une httpRéponse\nreqLLM\t\test une restRequête\nvReponse est un Variant\n\nSI TableauOccurrence(m_tabModels) > 1 ALORS\n\tRENVOYER (m_tabModels)\nFIN\n\nreqLLM.URL\t\t\t\t= :urlBase+\"models\"\nreqLLM.Méthode\t\t\t= httpGet\nSI :cleAPI <> \"\" ALORS\n\treqLLM.Entête[\"Authorization\"]\t= \"Bearer \" + cleAPI\nFIN\nreqLLM.Entête[\"Content-Type\"]\t= \"application/json\"\t\nhReponse\t\t\t\t= RESTEnvoie(reqLLM)\nSI hReponse.CodeEtat = 200 ALORS\n\tvReponse = JSONVersVariant(hReponse.Contenu)\n\tPOUR i = 1 _À_ TableauOccurrence(vReponse.data)\n\t\tTableauAjoute(m_tabModels,vReponse.data[i].id)\n\tFIN\nSINON\n\tTableauAjoute(m_tabModels,hReponse.Contenu)\nFIN\nRENVOYER(m_tabModels)"
        },
        "urlBase": {
          "code": "PROCÉDURE PUBLIQUE urlBase()\nRENVOYER(\"https://api.mistral.ai/v1/\")"
        },
        "cleAPI": {
          "code": "PROCÉDURE PUBLIQUE cleAPI()\n\nRENVOYER(\"2iGzTzE9csRQ9IoASoUjplHwEjA200Vh\")"
        },
        "urlFonction": {
          "code": "PROCÉDURE PUBLIQUE urlFonction()\n\nRENVOYER(\"chat/completions\")"
        },
        "Destructeur": {
          "code": "PROCÉDURE Destructeur()"
        },
        "interrogerRetourneReponse": {
          "code": "PROCÉDURE PROTÉGÉE interrogerRetourneReponse(LOCAL sReponse est une chaîne)\nsRetour est une chaîne\nvReponse est un Variant\nvReponse = JSONVersVariant(sReponse)\nsRetour = vReponse.choices[1].message.content\nRENVOYER(sRetour)"
        },
        "even_LLM_POST": {
          "code": "PROCÉDURE PROTÉGÉE even_LLM_POST(LOCAL sQuestion est une chaîne <utile>)\n\nContenu.messages[1].role\t= \"system\"\nContenu.messages[1].content\t= :prompt_system\nContenu.messages[2].role\t= \"user\"\nContenu.messages[2].content\t= sQuestion\nContenu.temperature = o_temperature\nContenu.top_p\t\t=  o_top_p\nSI :maxToken <> 0 ALORS\n\tContenu.max_tokens = maxToken\nFIN\nSI :seed <> 0 ALORS\n\tContenu.random_seed = :seed\nFIN\nSI :format <> \"\" ALORS\n\tContenu.response_format = :format\nFIN\n// Contenu.tools A déterminer\n// Contenu.tool_choice A déterminer\nContenu.presence_penalty\t= presence_penalty\nContenu.frequency_penalty\t= frequency_penalty\nContenu.n = 1\nContenu.prediction = :prediction\nContenu.stop = o_stop"
        }
      }
    },
    "clsOllama": {
      "heritage": "clsLLM",
      "attributs": {
        "suffix": "chaîne",
        "images": "Buffer",
        "template": "chaîne",
        "raw": "booléen",
        "keep_alive": "Durée",
        "o_mirostat": "entier",
        "o_mirostat_eta": "réel",
        "o_mirostat_tau": "réel",
        "o_num_ctx": "entier",
        "o_repeat_last_n": "entier",
        "o_repeat_penalty": "réel",
        "o_seed": "entier",
        "o_stop": "JSON",
        "o_num_predict": "entier",
        "o_min_p": "réel"
      },
      "methodes": {
        "Constructeur": {
          "code": "PROCÉDURE Constructeur()\no_mirostat\t\t\t= 0\no_mirostat_eta\t\t= 0.1\no_mirostat_tau\t\t= 5\no_num_ctx\t\t\t= 2048\no_repeat_last_n\t\t= 64\no_repeat_penalty\t= 1.1\no_temperature\t\t= 0.8\no_seed\t\t\t\t= 0\no_stop\t\t\t\t= []\no_num_predict\t\t= -1\no_top_k\t\t\t\t= 40\no_top_p\t\t\t\t= 0.9\no_min_p\t\t\t\t= 0\n\n\nraw\t\t\t\t\t= False\nkeep_alive\t\t\t= 5min"
        },
        "urlBase": {
          "code": "PROCÉDURE PROTÉGÉE urlBase() : chaîne\nRENVOYER(\"http://217.182.105.173:11434/\")"
        },
        "cleAPI": {
          "code": "PROCÉDURE PROTÉGÉE cleAPI() : chaîne\nRENVOYER(\"\")"
        },
        "Destructeur": {
          "code": "PROCÉDURE Destructeur()"
        },
        "Interroger": {
          "code": "PROCÉDURE Interroger(LOCAL sQuestion est une chaîne <utile>)\nm_sUrlFonction = \"api/generate\"\nRENVOYER(LLM_POST(sQuestion))"
        },
        "even_LLM_POST": {
          "code": "PROCÉDURE PROTÉGÉ VIRTUELLE even_LLM_POST(LOCAL sQuestion est une chaîne)\nContenu.system\t\t= :prompt_system\nContenu.prompt\t\t= sQuestion\nContenu.stream\t\t= :stream\nContenu.suffix\t\t= :suffix\nContenu.format\t\t= :format\nContenu.raw\t\t\t= :raw\nContenu.keep_alive\t= :keep_alive\nSI :images <> \"\" ALORS\n\t// A traiter\nFIN\n\nContenu.options.mirostat\t\t\t= o_mirostat\nContenu.options.mirostat_eta\t\t= o_mirostat_eta\nContenu.options.mirostat_tau\t\t= o_mirostat_tau\nContenu.options.num_ctx\t\t\t\t= o_num_ctx\nContenu.options.repeat_last_n\t\t= o_repeat_last_n\nContenu.options.repeat_penalty\t\t= o_repeat_penalty\nContenu.options.temperature\t\t\t= o_temperature\nContenu.options.seed\t\t\t\t= o_seed\nContenu.options.stop\t\t\t\t= o_stop\nContenu.options.num_predict\t\t\t= o_num_predict\nContenu.options.top_k\t\t\t\t= o_top_k\nContenu.options.top_p\t\t\t\t= o_top_p\nContenu.options.min_p\t\t\t\t= o_min_p"
        },
        "interrogerRetourneReponse": {
          "code": "PROCÉDURE PROTÉGÉ VIRTUELLE interrogerRetourneReponse(LOCAL sReponse est une chaîne <utile>)\nvMaReponse\test un Variant\nvMaReponse\t\t\t\t= JSONVersVariant(sReponse)\nRENVOYER(vMaReponse.response)"
        }
      }
    },
    "clsDeepSeek": {
      "heritage": "clsLLM",
      "attributs": {
        "frequency_penalty": "entier",
        "max_tokens": "entier",
        "presence_penalty": "entier",
        "logprobs": "booléen",
        "top_logprobs": "entier",
        "tool_choice": "chaîne"
      },
      "methodes": {
        "Constructeur": {
          "code": "PROCÉDURE Constructeur()\n\n:Modele = \"deepseek-chat\"\nfrequency_penalty = 0\nmax_tokens = 4096\npresence_penalty = 0\no_top_p\t= 1\nlogprobs = Faux\ntop_logprobs = 0\ntool_choice = \"\""
        },
        "cleAPI": {
          "code": "PROCÉDURE PROTÉGÉE cleAPI() : chaîne\n\nRENVOYER(\"sk-d359d9236ca84a5986f889631832d1e6\")"
        },
        "urlBase": {
          "code": "PROCÉDURE PROTÉGÉE urlBase() : chaîne\n\nRENVOYER(\"https://api.deepseek.com/\")"
        },
        "urlFonction": {
          "code": "PROCÉDURE urlFonction() : chaîne\n\nRENVOYER(\"chat/completions\")"
        },
        "model_list": {
          "code": "PROCÉDURE model_list() : tableau de chaînes\n\ntabRetour est un tableau de chaînes = [\"deepseek-chat\",\"deepseek-reasoner\"]\nRENVOYER(tabRetour)"
        },
        "Destructeur": {
          "code": "PROCÉDURE Destructeur()"
        },
        "even_LLM_POST": {
          "code": "PROCÉDURE PROTÉGÉ VIRTUELLE even_LLM_POST(LOCAL sQuestion est une chaîne <utile>)\n\nContenu.messages[1].role\t= \"system\"\nContenu.messages[1].content\t= :prompt_system\nContenu.messages[2].role\t= \"user\"\nContenu.messages[2].content\t= sQuestion\nContenu.stream\t\t= :stream\nContenu.frequency_penalty\t= :frequency_penalty\nContenu.max_tokens\t\t\t= :max_tokens\nContenu.presence_penalty\t= :presence_penalty\nSI :logprobs = Vrai ALORS\n\tContenu.logprobs\t\t\t= :logprobs\n\tContenu.top_logprobs\t\t= :top_logprobs\nFIN\nSI :tool_choice <> \"\" ALORS\n\tContenu.tool_choice\t\t\t= :tool_choice\nFIN"
        },
        "interrogerRetourneReponse": {
          "code": "PROCÉDURE PROTÉGÉ VIRTUELLE interrogerRetourneReponse(LOCAL sReponse est une chaîne)\nsRetour\t\test une chaîne\nvReponse\test un Variant\nvReponse\t= JSONVersVariant(sReponse)\nsRetour\t\t= vReponse.choices[1].message.content\nRENVOYER(sRetour)"
        }
      }
    },
    "clsPerplexity": {
      "heritage": "clsLLM",
      "attributs": {
        "maxToken": "entier",
        "presence_penalty": "entier",
        "frequency_penaly": "entier",
        "search_recency_filter": "chaîne",
        "search_domain_filter": "tableau de chaîne"
      },
      "methodes": {
        "Constructeur": {
          "code": "PROCÉDURE Constructeur()\nmaxToken = 1000\no_temperature = 0.5\no_top_p = 0.8\no_top_k = 0\npresence_penalty = 0\nfrequency_penaly = 1\nsearch_recency_filter = \"all\" // year\nprompt_system = \"Soyez précis et concis. Répondez uniquement en français. Effectuez une recherche approfondie et fournissez des informations détaillées et à jour.\""
        },
        "cleAPI": {
          "code": "PROCÉDURE PROTÉGÉE cleAPI() : chaîne\nRENVOYER(\"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\")"
        },
        "urlBase": {
          "code": "PROCÉDURE PROTÉGÉE urlBase() : chaîne\nRENVOYER(\"https://api.perplexity.ai/chat/completions\")"
        },
        "Destructeur": {
          "code": "PROCÉDURE Destructeur()"
        },
        "Interroger": {
          "code": "PROCÉDURE Interroger(LOCAL sQuestion est une chaîne)\n:Modele = \"sonar\"\nRENVOYER(LLM_POST(sQuestion))"
        },
        "even_LLM_POST": {
          "code": "PROCÉDURE PROTÉGÉE even_LLM_POST(LOCAL sQuestion est une chaîne)\n\nContenu.messages[1].role = \"system\"\nContenu.messages[1].content = :prompt_system\nContenu.messages[2].role = \"user\"\nContenu.messages[2].content = sQuestion\nSI :maxToken <> 0 ALORS\n\tContenu.max_tokens = maxToken\nFIN\nContenu.temperature = o_temperature\nSI :format <> \"\" ALORS\n\tContenu.response_format = :format\nFIN\nContenu.top_p =o_top_p\nSI TableauOccurrence(search_domain_filter) <> 0 ALORS\n\t// [\"perplexity.ai\"]\n\tContenu.search_domain_filter = search_domain_filter\nFIN\nContenu.return_images = Faux\nContenu.return_related_questions = Faux\nSI search_recency_filter <> \"all\" ALORS\n\tContenu.search_recency_filter = search_recency_filter\nFIN\nContenu.top_k =  o_top_k\nContenu.presence_penalty = presence_penalty\nContenu.frequency_penalty = frequency_penaly\nContenu.response_format = Null"
        },
        "interrogerRetourneReponse": {
          "code": "PROCÉDURE PROTÉGÉ VIRTUELLE interrogerRetourneReponse(LOCAL sReponse est une chaîne <utile>)\nvRepoonse est un Variant = JSONVersVariant(sReponse)\nsRetour est une chaîne\nsRetour = vRepoonse.choices[1].message.content\n\nRENVOYER(sRetour)"
        }
      }
    },
    "clsRAG": {
      "heritage": "",
      "attributs": {
        "sessionID": "chaîne (PUBLIQUE CONSTANT)",
        "reqRAG": "restRequête (PRIVÉ)",
        "taContenu": "tableau associatif de Variant (PRIVÉ)",
        "m_sChatID": "chaîne (PRIVÉ)",
        "mn_Question": "entier (PRIVÉ)"
      },
      "methodes": {
        "Constructeur": {
          "code": "PROCÉDURE Constructeur()\nreqRAG.Entête[\"Authorization\"]\t= \"Bearer \" + \"ragflow-c4YTNkMzcwZDM1ODExZWZiODA2MDI0Mm\"\nreqRAG.Entête[\"Content-Type\"]\t= \"application/json\"\t"
        },
        "urlBase": {
          "code": "PROCÉDURE PRIVÉE  urlBase()\n\nRENVOYER(\"http://10.103.0.100/api/v1/chats/\")"
        },
        "chatID": {
          "code": "PROCÉDURE PRIVÉE  chatID()\nSI m_sChatID <> \"\" ALORS \n\tRENVOYER(m_sChatID)\nSINON\n\tRENVOYER(\"ffb1058ed4b811ef8a900242ac120003\")\nFIN"
        },
        "setChatID": {
          "code": "PROCÉDURE PRIVÉ chatID(Valeur)\n\nm_sChatID = Valeur"
        },
        "Contenu": {
          "code": "PROCÉDURE PRIVÉE  Contenu()\nbufContenu est un Buffer\nSérialise(taContenu,bufContenu,psdJSON)\nRENVOYER(bufContenu)"
        },
        "urlChat": {
          "code": "PROCÉDURE PRIVÉE  urlChat()\n\nRENVOYER(:urlBase+chatID+\"/\")"
        },
        "Destructeur": {
          "code": "PROCÉDURE Destructeur()\n\nSI mn_Question = 0 OU EnModeTest() ALORS\n\tsupprimeSessionChat()\t\nFIN"
        },
        "creeSessionChat": {
          "code": "PROCÉDURE PRIVÉ creeSessionChat()\nvMaReponse est un Variant\nhReponse est une httpRéponse\nTableauSupprimeTout(taContenu)\nreqRAG.URL = :urlChat+\"sessions\"\nreqRAG.Méthode = httpPost\ntaContenu[\"name\"] = DateHeureVersChaîne(DateHeureSys,\"AAAAMMJJ_HHmmSS\")\nreqRAG.Contenu = :Contenu\n\nhReponse = RESTEnvoie(reqRAG)\nSI ErreurDétectée ALORS\n\tRENVOYER(Faux,TexteVersHTML(ErreurInfo()))\nSINON\n\tvMaReponse = JSONVersVariant(hReponse.Contenu)\n\tSI vMaReponse.code = 0\n\t\t:sessionID = vMaReponse.data.id\n\t\tRENVOYER(Vrai,:formateReponse(vMaReponse.data.messages[1].content))\n\tSINON\n\t\tRENVOYER(Faux,:formateReponse(vMaReponse.message))\n\tFIN\nFIN"
        },
        "Chat": {
          "code": "PROCÉDURE Chat(LOCAL sQuestion est une chaîne)\nbSessionCree est un booléen\nsReponse est une chaîne\nvMaReponse\test un Variant\nSI :sessionID = \"\" ALORS\n\t(bSessionCree,sReponse) = creeSessionChat()\n\tSI PAS bSessionCree ALORS\n\t\tRENVOYER(:formateReponse(sReponse))\n\tFIN\t\nFIN\n\nmn_Question++\nhReponse\test une httpRéponse\nTableauSupprimeTout(taContenu)\nreqRAG.URL\t\t\t= :urlChat+\"completions\"\nreqRAG.Méthode\t\t= httpPost\ntaContenu[\"question\"]\t\t= sQuestion\ntaContenu[\"stream\"]\t\t\t= False\ntaContenu[\"session_id\"]\t\t= :sessionID\nreqRAG.Contenu\t\t= :Contenu\n\nhReponse\t\t\t= RESTEnvoie(reqRAG)\nSI ErreurDétectée ALORS\n\tRENVOYER(TexteVersHTML(ErreurInfo()))\nSINON\n\tvMaReponse = JSONVersVariant(hReponse.Contenu)\n\tSI vMaReponse.code = 0 ALORS\n\t\tsReponse = vMaReponse.data.answer\n\t\tRENVOYER(:formateReponse(sReponse))\n\tSINON\n\t\tsReponse = vMaReponse.message\n\t\tRENVOYER(:formateReponse(sReponse))\n\tFIN\nFIN"
        },
        "formateReponse": {
          "code": "PROCÉDURE PUBLIQUE formateReponse(LOCAL sReponse est une chaîne)\nsRetour est une chaîne ANSI\nsRetour+=\"<div style=\"\"background-color: #e8f4ff; border: 1px solid #c2e0ff; border-radius: 10px; padding: 10px 15px; font-family: Arial, sans-serif; font-size: 14px; color: #000; display: inline-block;\"\">\"\nsRetour+=UnicodeVersAnsi(UTF8VersUnicode(MarkdownVersHTML(sReponse)))\nsRetour+=\"</div>\"\n//sRetourANSI = UnicodeVersAnsi(sRetourUnicode)\nRENVOYER(sRetour)"
        },
        "formateQuestion": {
          "code": "PROCÉDURE GLOBALE formateQuestion(LOCAL sQuestion est une chaîne)\nsRetour est une chaîne\nsRetour = \"<div style=\"\"text-align: right; font-family: Arial, sans-serif; font-size: 14px; color: #000; padding: 10px 15px;\"\">\"\nsRetour+= sQuestion\nsRetour+= \"</div>\"\nRENVOYER(sRetour)"
        },
        "supprimeSessionChat": {
          "code": "PROCÉDURE PRIVÉ supprimeSessionChat()\nvMaReponse\test un Variant\nsReponse\test une chaîne\nhReponse\test une httpRéponse\nTableauSupprimeTout(taContenu)\nreqRAG.URL\t\t\t\t\t= :urlChat+\"/sessions\"\nreqRAG.Méthode\t\t\t\t= httpDelete\ntaContenu[\"ids\"]\t\t\t= [sessionID]\nreqRAG.Contenu\t\t\t\t= :Contenu\n\nhReponse\t\t\t\t\t= RESTEnvoie(reqRAG)\nSI ErreurDétectée ALORS\n\tRENVOYER(TexteVersHTML(ErreurInfo()))\nSINON\n\tvMaReponse = JSONVersVariant(hReponse.Contenu)\n\tSI vMaReponse.code = 0 ALORS\n\t\tRENVOYER(\"OK\")\n\tSINON\n\t\tsReponse = vMaReponse.message\n\t\tRENVOYER(sReponse)\n\tFIN\nFIN"
        }
      }
    },
    "clsLLM": {
      "type": "abstraite",
      "attributs_publics": {
        "Modele": "chaîne",
        "prompt_system": "chaîne",
        "o_temperature": "réel",
        "o_top_k": "entier",
        "o_top_p": "réel"
      },
      "constantes_publiques": {
        "dureeTraitement": "Durée",
        "reponseErreur": "booléen"
      },
      "attributs_proteges": {
        "Contenu": "JSON",
        "m_sUrlFonction": "chaîne", 
        "stream": "booléen",
        "m_sFormat": "chaîne",
        "heureDepart": "Heure",
        "heureFin": "Heure"
      },
      "methodes": {
        "Constructeur": {
          "type": "procédure",
          "code": "stream = Faux"
        },
        "urlBase": {
          "type": "procédure protégée abstraite",
          "retour": "chaîne"
        },
        "cleAPI": {
          "type": "procédure protégée abstraite",
          "retour": "chaîne"
        },
        "urlFonction": {
          "type": "procédure publique",
          "code": "RENVOYER(m_sUrlFonction)"
        },
        "format": {
          "type": "procédure publique",
          "code": "RENVOYER(m_sFormat)"
        },
        "model_list": {
          "type": "procédure publique",
          "retour": "tableau de chaînes",
          "code": "tabModels est un tableau de chaînes\nRENVOYER(tabModels)"
        },
        "commandeAutorisation": {
          "type": "procédure publique",
          "code": "RENVOYER(\"Bearer\")"
        },
        "Interroger": {
          "type": "procédure",
          "parametres": ["sQuestion est une chaîne"],
          "retour": "chaîne",
          "code": "sReponse est une chaîne\nsReponse = LLM_POST(sQuestion)\nRENVOYER(sReponse)"
        },
        "LLM_POST": {
          "type": "procédure protégée",
          "code": "// Code complet de la méthode LLM_POST"
        },
        "even_LLM_POST": {
          "type": "procédure protégée abstraite virtuelle",
          "parametres": ["sQuestion est une chaîne <utile>"]
        },
        "interrogerRetourneReponse": {
          "type": "procédure protégé abstraite virtuelle",
          "parametres": ["sReponse est une chaîne <utile>"],
          "retour": "chaîne"
        }
      }
    },
    "clsDeepl": {
      "herite_de": "clsLLM",
      "attributs": {
        "langueSource": "chaîne",
        "langueDesti": "chaîne",
        "context": "chaîne",
        "split_sentences": "chaîne",
        "preserve_formatting": "booléen",
        "formality": "chaîne",
        "show_billed_characters": "booléen",
        "tag_handling": "chaîne",
        "outline_detection": "booléen",
        "non_splitting_tags": "tableau de chaînes",
        "splitting_tags": "tableau de chaînes",
        "ignore_tags": "tableau de chaînes"
      },
      "constantes_publiques": {
        "glossaire_id": "tableau associatif (ccSansCasse) de chaînes",
        "m_tabGlossaireListePaire": "tableau de 0 par 2 chaînes"
      },
      "methodes": {
        "Constructeur": {
          "type": "procédure",
          "code": "// Initialisation des attributs par défaut"
        },
        "commandeAutorisation": {
          "type": "procédure publique",
          "code": "RENVOYER(\"DeepL-Auth-Key\")"
        },
        "cleAPI": {
          "type": "procédure protégée",
          "code": "RENVOYER(\"d42ee2f7-f4e6-d437-3237-fa40b4f45e65\")"
        },
        "urlBase": {
          "type": "procédure protégée",
          "code": "RENVOYER(\"https://api.deepl.com/v2/\")"
        },
        "model_list": {
          "type": "procédure",
          "code": "// Code qui retourne la liste des modèles disponibles"
        },
        "even_LLM_POST": {
          "type": "procédure protégée",
          "code": "// Code complet de gestion des paramètres DeepL"
        },
        "interrogerRetourneReponse": {
          "type": "procédure protégée",
          "code": "// Code de traitement de la réponse DeepL"
        },
        "glossaire_cree": {
          "type": "procédure",
          "code": "// Code de création d'un glossaire"
        },
        "glossaireRetrouveID": {
          "type": "procédure privée",
          "code": "// Code de récupération d'ID de glossaire"
        },
        "glossaireSupprime": {
          "type": "procédure privée",
          "code": "// Code de suppression d'un glossaire"
        }
      }
    }
  }
}