Google gemini apiで遊べるようなので、プロンプトで実行して遊んでみました。
apiキーを取得したら config.iniや環境変数にセットする。
[!NOTE]
※ このAPI_KEYはパスワードジェネレータでテキトーに作った文字列です。
[DEFAULT]
API_KEY=S3aW@o81643957s6d198_691!p3r88
モジュールインストールする。
python -m venv .venv
.venv/Scripts/Activate.ps1
pip install google-generativeai
コードで遊ぶ。
logger.py
import logging
class Logger:
logging.basicConfig(
format="%(levelname)s %(asctime)s %(message)s",
level=logging.INFO,
)
logger = logging.getLogger(__name__)
@classmethod
def info(cls, msg, *args):
cls.logger.info(msg, *args)
@classmethod
def error(cls, msg, *args):
cls.logger.error(msg, *args)
def reporter(func):
Logger.info("start %s" % func.__name__)
def inner_wrapper(*args, **kwargs):
ret = func(*args, **kwargs)
return ret, Logger.info("end %s" % func.__name__)
return inner_wrapper
prompt.py
import sys
import configparser
from pprint import pformat
from enum import Enum
import google.generativeai as genai
from termcolor import colored
from logger import Logger, reporter
class ConfEnum(str, Enum):
DEFAULT = "DEFAULT"
INI = "./config.ini"
API_KEY = "API_KEY"
class ConnectModel(str, Enum):
GEMINI_15_FLASH: str = "gemini-1.5-flash"
class LogMessage(Enum):
PROMPT_ERROR = "プロンプトが入力されていません。"
PROMPT_EXCEPTION_ERROR = "{prompt_exc}が発生しました。"
CORRECT = "プロンプト投下。"
CANCELED_BY_USER = "キャンセルされました。"
EXCEPTION = "想定外の例外{exc}が発生しました。"
class Setup:
_api_key: str = None
@classmethod
def get_api_key(cls) -> str:
config = configparser.ConfigParser()
config.read(ConfEnum.INI)
cls._api_key = config[ConfEnum.DEFAULT][ConfEnum.API_KEY]
return cls._api_key
@reporter
def run_prompt(api_key: str) -> None:
quits = ("q", "quit", "quiet", "q", "n", "none")
genai.configure(api_key=api_key)
model = genai.GenerativeModel(ConnectModel.GEMINI_15_FLASH)
try:
while True:
prompt = input("質問事項を入力してみよう。: ")
if not prompt:
Logger.error(LogMessage.PROMPT_ERROR.value)
raise ValueError
if prompt.lower() in quits:
Logger.info(LogMessage.CANCELED_BY_USER.value)
sys.exit()
else:
response = model.generate_content(prompt)
Logger.info(colored(response.text, "cyan"))
except ValueError as prompt_exc:
Logger.error(
LogMessage.PROMPT_EXCEPTION_ERROR.value.format(
prompt_exc=prompt_exc.__class__.__name__
)
)
except Exception as exc:
Logger.error(
LogMessage.EXCEPTION.value.format(exc=exc.__class__.__name__)
)
Logger.error("\n%s" % pformat(locals(), 1))
sys.exit()
if __name__ == "__main__":
try:
run_prompt(Setup.get_api_key())
except KeyboardInterrupt:
Logger.info(LogMessage.CANCELED_BY_USER.value)
実行結果
INFO 2024-11-16 19:16:25,419 start run_prompt
質問事項を入力してみよう。: 富士山の高さは何メートル?
INFO 2024-11-16 19:17:32,302 富士山標高は、測量方法によって多少異なりますが、一般的には **3776.24メートル** とされています。
以上、簡単にプロンプトを実行して遊ぶでした。