Google GeminiのChat Historyをjsonに変換する

はじめに

なんだか妙に手間取ったのでコードを共有します。
誰かの役に立つかも。

geminiのchat historyはjsonにシリアライズ出来ないオブジェクトで出てくるので単純に変換出来なくて超めんどかったという話です。

将来的にはjsonとかテキスト形式でhistory取れるようになると嬉しいですね。

ClaudeとかGPTとか、いくつかのLLMと相談したものの、中々解決できませんでしたが、とりあえずこんな感じでなんとかなりました。
pythonそんなに慣れてないので、もっとスマートな方法もあるのかも。

chat_history_save_and_load.py

# chat_history_save_and_load.py

from typing import List, Any
import json
from google.generativeai.protos import Content, Part

def save_gemini_history_to_json(gemini_history: List[Any], filename: str) -> None:
    print("Saving gemini_history to JSON. Structure of gemini_history:")
    
    # Contentオブジェクトから必要な情報を抽出
    serializable_history = [
        {
            "role": item.role,
            "parts": [
                {"text": part.text} if hasattr(part, 'text') else part
                for part in item.parts
            ]
        }
        for item in gemini_history
    ]
    
    try:
        with open(filename, 'w', encoding='utf-8') as f:
            json.dump(serializable_history, f, ensure_ascii=False, indent=2)
        print(f"Successfully saved to {filename}")
    except Exception as e:
        print(f"Error saving to JSON: {e}")

def load_gemini_history_from_json(filename: str) -> List[Content]:
    try:
        with open(filename, 'r', encoding='utf-8') as f:
            loaded_data = json.load(f)
        print(f"Successfully loaded from {filename}. Structure of loaded data:")
        
        # JSONデータをContentオブジェクトに変換
        gemini_history = []
        for item in loaded_data:
            parts = [Part(text=part['text']) for part in item['parts']]
            content = Content(role=item['role'], parts=parts)
            gemini_history.append(content)
        
        return gemini_history
    except Exception as e:
        print(f"Error loading from JSON: {e}")
        return []

save_gemini_history_to_json

見たまんまですがオブジェクトから必要な部分を引っこ抜いてjsonに変換可能な形式にシリアライズして、それをjson形式でテキストファイルに保存します。

入力のgemini_historyがgeminiから取り出したチャット履歴です。
こんな感じで取得して使います。

import chat_history_save_and_load
import google.generativeai as genai

gemini_chat_model = genai.GenerativeModel(model_name="gemini-1.5-flash-latest")
gemini_chat = gemini_chat_model.start_chat(history=[])

gemini_history = gemini_chat.history

chat_history_save_and_load.save_gemini_history_to_json(gemini_history, "history.json")

load_gemini_history_from_json

save_gemini_history_to_jsonで保存したjsonファイルから元のchat history用オブジェクトに戻す処理です。

リターンしてるgemini_historyをgemini APIに放り込めば、履歴を継続できます。

こういう感じで使います。

import chat_history_save_and_load
import google.generativeai as genai

gemini_history = chat_history_save_and_load.load_gemini_history_from_json("history.json")

gemini_chat_model = genai.GenerativeModel(model_name="gemini-1.5-flash-latest")
gemini_chat = gemini_chat_model.start_chat(history=gemini_history)


何かの役に立てば幸いです。

いいなと思ったら応援しよう!