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)
何かの役に立てば幸いです。