# Application de workflow OPENAICHAT

## Aperçu

L'application de workflow **OPENAICHAT** vous permet d'interagir avec un modèle de chat OpenAI.

## Mode de fonctionnement

* L'application vous permet d'interagir avec les modèles de complétion OpenAI.
* Des logs d'application sont disponibles. Ceux-ci peuvent être spécifiés en définissant la valeur du paramètre `OpenAiChatLogLevel` dans le fichier `web.config` sur `0` pour désactiver la journalisation, `1` pour les logs d'erreur, `2` pour des logs d'informations ou `3` pour les logs de débogage; la valeur par défaut est `0`.

## Paramètres requis

<table data-full-width="true"><thead><tr><th width="202">Paramètre</th><th width="76">Type</th><th width="125">Direction</th><th>Description</th></tr></thead><tbody><tr><td><code>MODEL</code></td><td>TEXT</td><td>IN</td><td>ID du modèle à utiliser<br><br>Vous pouvez trouver les modèles disponibles au lien suivant : <a href="https://platform.openai.com/docs/models/model-endpoint-compatibility">https://platform.openai.com/docs/models/model-endpoint-compatibility</a>;</td></tr></tbody></table>

Vous pouvez utiliser l'une des configurations suivantes : avec des messages système/utilisateur, avec un numéro de message ou avec un tableau de messages JSON.

### Avec des messages système/utilisateur

<table data-full-width="true"><thead><tr><th width="202">Paramètre</th><th width="76">Type</th><th width="125">Direction</th><th>Description</th></tr></thead><tbody><tr><td><code>SYSTEM_MESSAGE</code></td><td>TEXT</td><td>IN</td><td>Le contenu du message système</td></tr><tr><td><code>USER_MESSAGE</code></td><td>TEXT</td><td>IN</td><td>Le contenu du message utilisateur</td></tr></tbody></table>

### Avec un numéro de message

<table data-full-width="true"><thead><tr><th width="216">Paramètre</th><th width="76">Type</th><th width="125">Direction</th><th>Description</th></tr></thead><tbody><tr><td><code>MESSAGE_ROLEx</code></td><td>TEXT</td><td>IN</td><td>Le type du message, où <code>x</code> correspond au numéro du message ; le la valeur doit être <code>assistant</code>, <code>system</code> ou <code>user</code></td></tr><tr><td><code>MESSAGE_CONTENTx</code></td><td>TEXT</td><td>IN</td><td>Le contenu du message utilisateur, où <code>x</code> correspond au numéro du message</td></tr></tbody></table>

### Avec un tableau de messages JSON

<table data-full-width="true"><thead><tr><th width="202">Paramètre</th><th width="76">Type</th><th width="125">Direction</th><th>Description</th></tr></thead><tbody><tr><td><code>MESSAGE_JSON</code></td><td>TEXT</td><td>IN</td><td><p>L'objet de message du tableau JSON ; la structure doit correspondre à ce qui suit :</p><pre class="language-json"><code class="lang-json">[
    {
        "role": "assistant/system/user",
        "content": "First message content"
    },
    {
        "role": "assistant/system/user",
        "content": "Second message content"
    }
]
</code></pre></td></tr></tbody></table>

## Paramètres facultatifs

<table data-full-width="true"><thead><tr><th width="319">Paramètres</th><th width="111">Type</th><th width="104">Direction</th><th>Description</th></tr></thead><tbody><tr><td><code>API_KEY</code></td><td>TEXT</td><td>IN</td><td><p>Clé API OpenAI</p><p><br>Par défaut, cette valeur provient du paramètre <code>OpenAiApiKey</code> du fichier <code>web.config</code>.</p></td></tr><tr><td><code>URL</code></td><td>TEXT</td><td>IN</td><td>Point de terminaison de l'API; cette valeur provient du paramètre <code>OpenAIChatApiUrl</code> dans le fichier <code>web.config</code>, s’il est défini</td></tr><tr><td><code>TEMPERATURE</code></td><td>NUMERIC</td><td>IN</td><td><p>Température d'échantillonnage, comprise entre <code>0</code> et <code>1</code>; la valeur par défaut est <code>1</code><br></p><p>Des valeurs plus élevées (par exemple <code>0.8</code>) rendront la sortie plus aléatoire, tandis que des valeurs plus faibles (par exemple <code>0.2</code>) la rendront plus ciblée et déterministe.</p></td></tr><tr><td><code>TOP_P</code></td><td>NUMERIC</td><td>IN</td><td><p>Une alternative à l'échantillonnage avec température, appelée échantillonnage de noyau, où le modèle prend en compte les résultats des jetons avec une masse de probabilité top_p. Ainsi, <code>0.1</code> signifie que seuls les jetons comprenant la masse de probabilité la plus élevée de 10 % sont pris en compte.</p><p>Par défaut : <code>1</code></p></td></tr><tr><td><code>FREQUENCY_PENALTY</code></td><td>NUMERIC</td><td>IN</td><td><p>Nombre compris entre <code>-2.0</code> et <code>2.0</code>. Les valeurs positives pénalisent les nouveaux jetons en fonction de leur fréquence existante dans le texte jusqu'à présent, réduisant ainsi la probabilité que le modèle répète mot pour mot la même ligne.</p><p>Par défaut : <code>0</code></p></td></tr><tr><td><code>MAX_TOKENS</code></td><td>NUMERIC</td><td>IN</td><td>Nombre maximum de jetons pouvant être générés lors de la fin du chat; la valeur par défaut est <code>256</code></td></tr><tr><td><code>PRESENCE_PENALTY</code></td><td>NUMERIC</td><td>IN</td><td><p>Numéro compris entre <code>-2.0</code> et <code>2.0</code> ; la valeur par défaut est <code>0</code></p><p>Les valeurs positives pénalisent les nouveaux jetons selon qu'ils apparaissent ou non dans le texte jusqu'à présent, augmentant ainsi la probabilité du modèle de parler de nouveaux sujets.</p></td></tr><tr><td><code>RESPONSE_FORMAT</code></td><td>TEXT</td><td>IN</td><td><p>Format de réponse : <code>text</code> , <code>json_object</code> ou de <code>json_schema</code>.<br></p><p>Lorsque la valeur est <code>json_object</code>, l'invite système doit contenir le mot-clé JSON.<br>Lorsque la valeur est <code>json_schema</code>, il faut renseigner le schema attendu dans le paramètre <code>RESPONSE_FORMAT_JSON_SCHEMA</code>.</p></td></tr><tr><td><code>RESPONSE_FORMAT_JSON_SCHEMA</code></td><td>TEXT</td><td>IN</td><td>Le schema JSON qui sera utilisé par le modèle pour répondre.<br>Un exemple est présent ici : <a data-mention href="#response_format_json_schema">#response_format_json_schema</a></td></tr><tr><td><code>APP_RESPONSE_IGNORE_ERROR</code></td><td>TEXT</td><td>IN</td><td><p>Spécifie (<code>Y</code> ou <code>N</code>) si l'erreur doit être ignorée; la valeur par défaut est <code>N</code><br></p><p>En cas d'erreur, si le paramètre a <code>Y</code> comme valeur, l'erreur sera ignorée et les paramètres OUT définis (<code>APP_RESPONSE_STATUS</code> ou <code>APP_RESPONSE_CONTENT</code>) seront mappés. Sinon, une exception sera levée.</p></td></tr><tr><td><code>TOOLS</code></td><td>TEXT</td><td>IN</td><td>Listes des outils à dispositions du modèle, le format doit être en json et correspondre au format d'OpenAI : <a href="https://platform.openai.com/docs/api-reference/chat/create#chat-create-tools">https://platform.openai.com/docs/api-reference/chat/create#chat-create-tools</a><br>Un exemple est présent ici : <a data-mention href="#tools">#tools</a></td></tr><tr><td><code>TOOL_CHOICE_REQUIRED</code></td><td>TEXT</td><td>IN</td><td>Spécifie si le modèle doit obligatoirement choisir un outil. <code>Y</code> ou <code>N</code> (défaut)</td></tr><tr><td><code>PARALLEL_TOOL</code></td><td>TEXT</td><td>IN</td><td>Spécifie si le modèle peut choisir plusieurs outils. <code>Y</code> (défaut) ou <code>N</code></td></tr><tr><td><code>MESSAGE_HISTORY</code></td><td>TEXT</td><td>INOUT</td><td>L'historique des messages</td></tr><tr><td><code>SELECTED_TOOLS</code></td><td>TEXT</td><td>OUT</td><td>La liste des noms d'outils qui ont été séléctionnés, séparé par une virgule.</td></tr><tr><td><code>SELECTED_TOOLS_PARAM</code></td><td>TEXT</td><td>OUT</td><td>Tableau JSON représentant la liste des outils sélectionnés avec leurs paramètres. Voir la section <a href="#selected_tools_params"><code>SELECTED_TOOLS_PARAMS</code></a> ci-dessous pour un exemple de rendu.</td></tr><tr><td><code>SELECTED_TOOLS_COUNT</code></td><td>NUMERIC</td><td>OUT</td><td>Le nombre d'outils sélectionnés.</td></tr><tr><td><code>RESULT</code></td><td>TEXT</td><td>OUT</td><td>Appel de résultat du chat</td></tr><tr><td><code>RESULT_CONTENT</code></td><td>TEXT</td><td>OUT</td><td>Contenu du message de l'assistant</td></tr><tr><td><code>RESULT_TOTAL_TOKENS</code></td><td>NUMERIC</td><td>OUT</td><td>Total des jetons utilisés pour la génération</td></tr><tr><td><code>RESULT_COMPLETION_TOKENS</code></td><td>NUMERIC</td><td>OUT</td><td>Total des jetons utilisés pour la génération</td></tr><tr><td><code>RESULT_PROMPT_TOKENS</code></td><td>NUMERIC</td><td>OUT</td><td>Total des jetons utilisés pour l'invite</td></tr><tr><td><code>APP_RESPONSE_STATUS</code></td><td>TEXT</td><td>OUT</td><td>Code d'état de la réponse</td></tr><tr><td><code>APP_RESPONSE_CONTENT</code></td><td>TEXT</td><td>OUT</td><td>Charge utile de réponse ou message d'erreur</td></tr></tbody></table>

## Cas de l'utilisation du schéma JSON

En utilisation un schéma JSON comme format de réponse, cela force l'application à répondre de manière structuré pour correspondre au schéma.&#x20;

Vous avez la possibilité d'extraire directement les valeurs retourné pour les mettre dans une données, il suffit d'indiquer en nom de paramètre le nom de la propriété à extraire et de mettre en OUT la donnée cible.&#x20;

## Exemples

### TOOLS

```json
[
    {
        "name": "GET_STOCK_INFORMATION",
        "description": "Get stock information about a product. If the product is not found, return an error. If the stock is less than 10, return a warning and a purchase order should be done.",      
        "parameters": {
            "type": "object",
            "properties": {
                "product_name": {
                    "type": "string",
                    "description": "The product name"
                },
                "serial_number": {
                    "type": "string",
                    "description": "The product serial number"
                }
            },
            "additionalProperties": false,
            "required": ["serial_number"]
        }
    },
    {
        "name": "PURCHASE_ORDER",
        "description": "Make a purchase order for a product.",    
        "parameters": {
            "type": "object",
            "properties": {
                "product_name": {
                    "type": "string",
                    "description": "The product name"
                },
                "serial_number": {
                    "type": "string",
                    "description": "The product serial number"
                },
                "quantity": {
                    "type": "number",
                    "description": "The quantity of the product to purchase"
                }
            },
            "additionalProperties": false,
            "required": ["serial_number", "quantity"]
        }
    }
]
```

### SELECTED\_TOOLS\_PARAMS

```json
[
    {
        "name": "GET_STOCK_INFORMATION",
        "id": "call_Vuc2Ga8jP7vUksxG9C0fwpY8",
        "parameters": {
            "product_name": "vis",
            "serial_number": "V45645"
        }
        
    },
    {
        "name": "GET_STOCK_INFORMATION",
        "id": "call_nq3SCVUk0FjAHCeqOZGNXpC8",
        "parameters": {
            "product_name": "boulons",
            "serial_number": "b456"
        }
    }
]
```

### RESPONSE\_FORMAT\_JSON\_SCHEMA

```json
{
  "name": "schema",
  "schema": {
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
      "advice": {
        "type": "string"
      },
      "next_action": {
        "type": "string",
        "enum": ["expert","sales","support","logistics",null]
      },
      "confidence_level": {
        "type": "number"
      }
    },
    "required": ["advice", "next_action","confidence_level"]
  }
}
```
