15 juil. 2023

[Dynamo += Open AI] utiliser des requêtes HTTP


Exemple d'utilisation de l'API OpenAI via des requêtes HTTP
if this article is not in your language, use the Google Translate widget ⬈ (bottom of page for Mobile version )



Dans un article précédent, j'avais décris la possibilité d'utiliser l'API d'Open AI via leur package Python.

Voici une alternative en utilisant une requête HTTP qui est compatible avec n'importe quel moteur Python sans installation de package Python. La requête s'effectue via la classe HttpClient (System.Net.Http )

Lorsque vous souhaitez effectuer des requêtes HTTP en Python, vous connaissez probablement des packages couramment utilisés tels que requests, urllib ou httplib. Cependant, avec l'accès à l'environnement .Net, il existe une alternative intéressante pour réaliser des requêtes HTTP sans avoir à installer des packages supplémentaires. 

Dans cet article, nous explorerons comment utiliser la classe HttpClient de la bibliothèque System.Net.Http pour effectuer des requêtes HTTP en utilisant la méthode PostAsync et ainsi simplifier vos interactions avec des API.

La documentation pour effectuer des requêtes API d'Open AI se trouve ici
https://platform.openai.com/docs/api-reference/making-requests

  • Voici un exemple pour la traduction d'un mot


  • .Exemple 1 Code avec la librairie Newtonsoft.Json (IronPython) .

import sys
import clr
import System
from System.Text import *
from System.Net import *
clr.AddReference("System.Net.Http")
from System.Net.Http import *

clr.AddReference('Newtonsoft.Json')
import Newtonsoft.Json;

clr.AddReference("System.Core")
clr.ImportExtensions(System.Linq)


apikey = "YOUR_API_KEY" # "sk-bC................................"

def translate_OpenAI(text="maison", source="french", target="english"):
    input = "Hello translate this {0} word '{2}' in {1}".format(source, target, text)
    result = None
    with HttpClient() as client:
        client.DefaultRequestHeaders.Add("Authorization", "Bearer {}".format(apikey))
        content = {\
        "model": "gpt-3.5-turbo", \
        'max_tokens': 100 ,\
        "messages": [{"role": "user", "content": input}], \
        }
        jsonRequest = Newtonsoft.Json.JsonConvert.SerializeObject(content);
        httpContent = StringContent(jsonRequest, Encoding.UTF8, "application/json");
        response = client.PostAsync("https://api.openai.com/v1/chat/completions", httpContent)
        jsonResponse = response.Result.Content.ReadAsStringAsync().Result
        #print(jsonResponse)
        data = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonResponse);
        try:
            result = data["choices"][0]["message"]["content"].ToString()
        except Exception as ex:
            return "{}\n{}".format(ex, jsonResponse)
    return result

OUT = translate_OpenAI(IN[0])
  • . Exemple 2 Code avec la librairie python json (IronPython ou CPython3) .

import sys
import clr
import System
from System.Text import *
from System.Net import *
clr.AddReference("System.Net.Http")
from System.Net.Http import *
import json

apikey = "YOUR_API_KEY" # "sk-bC................................"

def translate_OpenAI(text="maison", source="french", target="english"):
    input = "Hello translate this {0} word '{2}' in {1}.Write only the answer (word or expression)".format(source, target, text)
    result = None
    with HttpClient() as client:
        client.DefaultRequestHeaders.Add("Authorization", "Bearer {}".format(apikey))
        content = {\
        "model": "gpt-3.5-turbo", \
        'max_tokens': 100 ,\
        "messages": [{"role": "user", "content": input}], \
        }
        #
        jsonRequest = json.dumps(content, indent = 4)
        #
        httpContent = StringContent(jsonRequest, Encoding.UTF8, "application/json")
        response = client.PostAsync("https://api.openai.com/v1/chat/completions", httpContent)
        jsonResponse = response.Result.Content.ReadAsStringAsync().Result
        data = json.loads(jsonResponse)
        try:
            result = data["choices"][0]["message"]["content"]
        except Exception as ex:
            return "{}\n{}".format(ex, jsonResponse)
    return result

OUT = translate_OpenAI(IN[0])


  • Un autre exemple pour de la correction grammatical et orthographique




Note
pour la rédaction de cet article, j'ai effectué une dizaine de traductions et une dizaine de corrections pour un cout de moins de 1 centime d'euro

5 commentaires:

  1. I keep getting this error. Can you Help?

    Warning: CPythonEvaluator.EvaluatePythonScript operation failed.
    Index was out of range. Must be non-negative and less than the size of the collection.
    Parameter name: index

    RépondreSupprimer
    Réponses
    1. Hi,
      I've updated the code so you can identify the error

      some examples
      - wrong api key ?
      - no more credits on your open AI account ?

      Supprimer
    2. Cyril,

      Thanks for updating. I am trying to make this .net method work so I can call the API in Dynamo. I have had no success. I tried a new API key, and I tried adding credits. It should work, I have not modified the script at all but it gives me this same error. Is there a specific python version I need to be running or something i need to install that i am missing?

      I am a python beginner and I appreciate your blog and help.

      Sam

      Supprimer
    3. ok, I see, It's a PythonNet bug (CPython3 engine)
      I added another example with a different Library (json)
      or I can switch to IronPython

      Supprimer
  2. Merci Cyril! This is working and I will see if i can adapt this method to make other types of calls as well.
    Thank you for you help it is appreciated!!!

    RépondreSupprimer