gemini apiで遊んでみた。

#### Google gemini apiで遊べるようなので、プロンプトで実行して遊んでみました。


gemini api の api-keyを取得する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261995/c81dfe85-d056-87fb-0eda-1cba9cb3b0d1.png)

https://ai.google.dev/gemini-api/docs?hl=ja

apiキーを取得したら config.iniや環境変数にセットする。

>[!NOTE]
>※ このAPI_KEYはパスワードジェネレータでテキトーに作った文字列です。


```ini
[DEFAULT]
API_KEY=S3aW@o81643957s6d198_691!p3r88
```

#### モジュールインストールする。

```bash
python -m venv .venv
.venv/Scripts/Activate.ps1
pip install google-generativeai
```

#### コードで遊ぶ。
logger.py

```python
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
```python
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", "ｑ", "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)

```

実行結果
```bash
INFO    2024-11-16 19:16:25,419  start run_prompt
質問事項を入力してみよう。: 富士山の高さは何メートル？
INFO    2024-11-16 19:17:32,302  富士山標高は、測量方法によって多少異なりますが、一般的には **3776.24メートル** とされています。
```


以上、簡単にプロンプトを実行して遊ぶでした。