77 lines
2.3 KiB
Python
77 lines
2.3 KiB
Python
# scripts/summarize.py
|
|
import json
|
|
from datetime import datetime
|
|
from config import MEMORY_DIR, SUMMARY_DIR, load_config
|
|
import requests
|
|
|
|
def load_memory(date_str):
|
|
path = MEMORY_DIR / f"{date_str}.json"
|
|
if not path.exists():
|
|
print(f"⚠️ メモリファイルが見つかりません: {path}")
|
|
return None
|
|
with open(path, "r") as f:
|
|
return json.load(f)
|
|
|
|
def save_summary(date_str, content):
|
|
SUMMARY_DIR.mkdir(parents=True, exist_ok=True)
|
|
path = SUMMARY_DIR / f"{date_str}_summary.json"
|
|
with open(path, "w") as f:
|
|
json.dump(content, f, indent=2, ensure_ascii=False)
|
|
print(f"✅ 要約を保存しました: {path}")
|
|
|
|
def build_prompt(logs):
|
|
messages = [
|
|
{"role": "system", "content": "あなたは要約AIです。以下の会話ログを要約してください。"},
|
|
{"role": "user", "content": "\n".join(f"{entry['sender']}: {entry['message']}" for entry in logs)}
|
|
]
|
|
return messages
|
|
|
|
def summarize_with_llm(messages):
|
|
cfg = load_config()
|
|
if cfg["provider"] == "openai":
|
|
headers = {
|
|
"Authorization": f"Bearer {cfg['api_key']}",
|
|
"Content-Type": "application/json",
|
|
}
|
|
payload = {
|
|
"model": cfg["model"],
|
|
"messages": messages,
|
|
"temperature": 0.7
|
|
}
|
|
response = requests.post(cfg["url"], headers=headers, json=payload)
|
|
response.raise_for_status()
|
|
return response.json()["choices"][0]["message"]["content"]
|
|
|
|
elif cfg["provider"] == "ollama":
|
|
payload = {
|
|
"model": cfg["model"],
|
|
"prompt": "\n".join(m["content"] for m in messages),
|
|
"stream": False,
|
|
}
|
|
response = requests.post(cfg["url"], json=payload)
|
|
response.raise_for_status()
|
|
return response.json()["response"]
|
|
|
|
else:
|
|
raise ValueError(f"Unsupported provider: {cfg['provider']}")
|
|
|
|
def main():
|
|
date_str = datetime.now().strftime("%Y-%m-%d")
|
|
logs = load_memory(date_str)
|
|
if not logs:
|
|
return
|
|
|
|
prompt_messages = build_prompt(logs)
|
|
summary_text = summarize_with_llm(prompt_messages)
|
|
|
|
summary = {
|
|
"date": date_str,
|
|
"summary": summary_text,
|
|
"total_messages": len(logs)
|
|
}
|
|
|
|
save_summary(date_str, summary)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|