Quand on ouvre un interpreteur python (avec… python
) ou ruby (avec irb
), on est face à un REPL, c’est à dire un programme qui boucle en :
Read, Eval, Print, Loop. REPL.
On peut implémenter la base assez facilement, mais il y a 2-3 outils assez intéressants, comme la gestion de l’historique, la complétion, etc. que l’on retrouve avec un simple import readline
python:
import os
import readline
import atexit
import getpass
def run_repl(eval_func):
# Load history, if any
HISTORY_FILE = os.path.join(os.path.expanduser("~"), ".gpt3_repl_history")
if os.path.exists(HISTORY_FILE):
readline.read_history_file(HISTORY_FILE)
# default history len is -1 (infinite), which may grow unruly
readline.set_history_length(1000)
atexit.register(readline.write_history_file, HISTORY_FILE)
current_user = getpass.getuser()
# our REPL
while True:
try:
line = input(f"{current_user} > ")
if len(line.strip()) > 0:
readline.write_history_file(HISTORY_FILE)
answer = eval_func(line)
print(answer)
except ValueError as e:
print("error:", e)
except (KeyboardInterrupt, EOFError):
break
if __name__ == "__main__":
run_repl(eval)
Si on croise ce bout de code avec la fonction ask_openai
vue un post précédent, on a un REPL pour échanger avec l’IA d’openAI. J’ai appelé le mien Jarvis
#!/usr/bin/env python3
# coding=utf-8
import openai, os, time
import readline
from dotenv import load_dotenv
import getpass
def ask_openai(prompt: str) -> str:
"""
Send the 'prompt' to ChatGPT.
Return the answer (that may span multiple seconds)
"""
response = openai.Completion.create(
model="text-davinci-003",
prompt=prompt,
max_tokens=4000, # tune how many tokens you want
temperature=0,
stream=True,
)
pieces = [e["choices"][0]["text"] for e in response]
return "".join(pieces)
def run_repl(eval_func):
current_user = getpass.getuser()
# Load history, if any
HISTORY_FILE = os.path.expanduser("~/.gpt3_repl_history")
if os.path.exists(HISTORY_FILE):
readline.read_history_file(HISTORY_FILE)
# our REPL
while True:
try:
line = input(f"{current_user} > ")
if len(line.strip()) > 0:
readline.write_history_file(HISTORY_FILE)
print(eval_func(line))
except ValueError as e:
print("error:", e)
except (KeyboardInterrupt, EOFError):
break
def main():
# Load the environment variables from .env
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
run_repl(ask_openai)
if __name__ == "__main__":
main()