fbpx

小ネタ:yaspinでターミナルにクルクルを出そう #ai #azure #openai #llm #python

簡単なスクリプト

次のような Azure OpenAI に問い合わせる簡単なPythonスクリプトがあるとします。

import os
from openai import AzureOpenAI
from dotenv import load_dotenv
load_dotenv()

def send_prompt(prompt):
    response = None
    try:
        client = AzureOpenAI(
            api_key = os.getenv("AZURE_OPENAI_API_KEY"),
            azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
            api_version = os.getenv("AZURE_OPENAI_API_VERSION")
        )
        response = client.chat.completions.create(
            model = os.getenv("AZURE_OPENAI_MODEL_NAME"),
            messages = [{"role": "user", "content": prompt}],
            max_tokens = 1024,
            temperature = 0.95
        )
    except Exception as e:
        print(f"error: {e}")
        response = None
    return response

res = send_prompt("What is Docker?")
if res:
    model_dump = res.model_dump()
    print({"response": model_dump['choices'][0]['message']['content']})

これを実行すると、応答が返ってくるまで何も表示されないので「本当に大丈夫なのかな?」と心配になってきます。ウェブなら待ちのときに、次のようなクルクル(spinnerというらしい?)を出すこともできますが…。

https://commons.wikimedia.org/wiki/File:Loading_icon.gif

yaspin: Yet Another Terminal Spinner for Python

そこで yaspin の出番です。次のような処理待ちのクルクルを簡単に作ることができます。

次がサンプルスクリプトです。

import time
from yaspin import yaspin

with yaspin(text="Processing", color="yellow") as spinner:
    time.sleep(5)
    spinner.ok("✅ ")

これを実行すると、次のように5秒間クルクルしてから完了します。

では早速yaspinを先のAzure OpenAIスクリプトに組み込んでみましょう。

import os
from yaspin import yaspin
from openai import AzureOpenAI
from dotenv import load_dotenv
load_dotenv()

def send_prompt(prompt):
    response = None
    with yaspin(text="Processing", color="yellow") as spinner:
      try:
        client = AzureOpenAI(
            api_key = os.getenv("AZURE_OPENAI_API_KEY"),
            azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
            api_version = os.getenv("AZURE_OPENAI_API_VERSION")
        )
        response = client.chat.completions.create(
            model = os.getenv("AZURE_OPENAI_MODEL_NAME"),
            messages = [{"role": "user", "content": prompt}],
            max_tokens = 1024,
            temperature = 0.95
        )
        spinner.ok("✅ ")
      except Exception as e:
        print(f"error: {e}")
        response = None
        spinner.fail("💥 ")
    return response

res = send_prompt("What is Docker?")
if res:
    model_dump = res.model_dump()
    print({"response": model_dump['choices'][0]['message']['content']})

差分は次のようになります。

--- 10__simple.py    2024-10-28 14:43:36.765549180 +0900
+++ 11__yaspin.py    2024-10-28 17:26:28.336770580 +0900
@@ -1,13 +1,15 @@
 #!python3

 import os
+from yaspin import yaspin
 from openai import AzureOpenAI
 from dotenv import load_dotenv
 load_dotenv()

 def send_prompt(prompt):
     response = None
-    try:
+    with yaspin(text="Processing", color="yellow") as spinner:
+      try:
         client = AzureOpenAI(
             api_key = os.getenv("AZURE_OPENAI_API_KEY"),
             azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
@@ -19,9 +21,11 @@
             max_tokens = 1024,
             temperature = 0.95
         )
-    except Exception as e:
+        spinner.ok("✅ ")
+      except Exception as e:
         print(f"error: {e}")
         response = None
+        spinner.fail("💥 ")
     return response

 res = send_prompt("What is Docker?")

これを実行すると、処理待ち中はクルクルしています。

まとめ

yaspinを使うと、処理待ち中のターミナルにクルクルを出すことができます。単純なクルクルだけでなく、いくつか種類があるのでお好みで使い分けてみてください。

Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA