SHRANJEVANJE POGOVORA
Cilji
- Razumeti, kje program hrani
conversation_id
in kako se upravlja s pogovori. - Nadgraditi program, da poleg
conversation_id
dosledno shranjuje tudi vsebino pogovora v JSON datoteko.
- Pregled kode:
CONVERSATIONS_FILE = "conversations.json"
— ime datoteke za shranjevanje.load_conversations()
— naloži obstoječe pogovore iz JSON (če obstaja).save_conversations(conversations)
— SHRANJEVALNA funkcija, uporabljajson.dump(..., ensure_ascii=False, indent=4)
.get_conversation(conversations)
— ustvari nov pogovor zclient.conversations.create()
in nastaviCONVERSATION_ID
, ter takoj kličesave_conversations(conversations)
po kreaciji.- V zanki
start_chat()
ob uspešnem odgovoru:- Dodajanje v sporočila:
conversation["messages"].append({ "question": user_input, "response": answer })
- Posodobitev slovarja:
conversations[CONVERSATION_ID] = conversation
- Shranjevanje:
save_conversations(conversations)
- Dodajanje v sporočila:
- Naloga študentom (implementacija / preverjanje):
- Zaženi program in začni nov pogovor — preveri, da se ob ustvarjanju novega ID-ja v
conversations.json
pojavi prazen vnos (funkcijaget_conversation
+save_conversations
). - Pošlji nekaj vprašanj in preveri, da se v
conversations.json
pojavi poljemessages
z elementi, ki imajoquestion
inresponse
(del vstart_chat()
kjer se uporabljaconversation["messages"].append(...)
insave_conversations(conversations)
). - Spremljaj, ali
load_conversations()
pravilno naloži shranjeno strukturo ob ponovnem zagonu.
- Zaženi program in začni nov pogovor — preveri, da se ob ustvarjanju novega ID-ja v
- Kratka razširitev (dodatna točka):
- Dodajte časovni žig (timestamp) na vsak vnos v
messages
pred klicemsave_conversations
. To uredite v bloku:conversation["messages"].append({ "question": user_input, "response": answer, "timestamp": ... }) save_conversations(conversations)
- Preverite JSON z orodjem (npr.
jq
ali tekstovni urejevalnik).
- Dodajte časovni žig (timestamp) na vsak vnos v
Kaj naj učenci preverijo kot rezultat
conversations.json
vsebuje ključ zCONVERSATION_ID
in poljemessages
z vprašanji in odgovori.- Funkcije
load_conversations()
insave_conversations()
delujejo brez napak pri zapiranju/odpiranju datoteke. - Ob ponovnem zagonu se program lahko poveže na obstoječi pogovor (če nastavite
CONVERSATION_ID
) in naloži zgodovino.
Posebno poudarjeno (koda za shranjevanje)
- Funkcija za pisanje v datoteko:
save_conversations(conversations)
(uporabljajson.dump
). - Mesto kjer se dodaja zapis in takoj shranjuje: v
start_chat()
po prejemuanswer
:conversation["messages"].append({ "question": user_input, "response": answer }) conversations[CONVERSATION_ID] = conversation save_conversations(conversations)
Varnost in dobra praksa
- Ne shranjujte občutljivih podatkov brez soglasja.
- Uporabite
ensure_ascii=False
inencoding="utf-8"
(že prisotno) za pravilno kodiranje slovenskih znakov. - Pri večprocesnem dostopu bi razmislili o zaklepanju datoteke (out of scope za vajo).
Končni rezultat
- Kratek eksperiment: izvedite pogovor, zaprite program, ponovno zaženite in potrdite, da se zgodovina iz
conversations.json
naloži in prikaže.
import os
import json
from openai import OpenAI
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# 🧠 Navodila asistenta
AI_AGENT_INSTRUCTIONS = """
Ti si AI pomočnik učitelju tehnike in tehnologije v osnovni šoli.
Tvoja naloga je pomagati pri pripravi učnih ur, pri iskanju idej za učne dejavnosti,
ter pri oblikovanju preprostih razlag za učence.
"""
# 🔁 Če želiš nadaljevati obstoječi pogovor, sem vnesi npr. "conv_abc123..."
CONVERSATION_ID = ""
CONVERSATIONS_FILE = "conversations.json"
def load_conversations():
"""Naloži pogovore iz datoteke, če obstaja."""
if os.path.exists(CONVERSATIONS_FILE):
with open(CONVERSATIONS_FILE, "r", encoding="utf-8") as f:
return json.load(f)
return {}
def save_conversations(conversations):
"""Shrani pogovore v datoteko."""
with open(CONVERSATIONS_FILE, "w", encoding="utf-8") as f:
json.dump(conversations, f, indent=4, ensure_ascii=False)
def get_conversation(conversations):
"""Preveri, ali obstaja pogovor, sicer ustvari novega."""
global CONVERSATION_ID
if not CONVERSATION_ID or CONVERSATION_ID not in conversations:
conv = client.conversations.create()
CONVERSATION_ID = conv.id
print(f"[Ustvarjen nov ID pogovora]: {CONVERSATION_ID}")
conversations[CONVERSATION_ID] = {"messages": []}
save_conversations(conversations)
else:
print(f"[Nadaljujem pogovor]: {CONVERSATION_ID}")
return conversations[CONVERSATION_ID]
def start_chat():
conversations = load_conversations()
conversation = get_conversation(conversations)
print("\nZačni pogovor (vpiši 'exit' za izhod)\n")
# Naloži prejšnje pogovore
if conversation["messages"]:
print("📜 Prejšnji pogovori:")
for msg in conversation["messages"]:
print(f"👤 {msg['question']}")
print(f"🧠 {msg['response']}\n")
while True:
user_input = input("👤 Ti: ").strip()
if user_input.lower() in ["exit", "quit"]:
print("🔚 Pogovor zaključen.")
break
response = client.responses.create(
model="gpt-4.1-mini",
conversation=CONVERSATION_ID,
input=[
{"role": "system", "content": AI_AGENT_INSTRUCTIONS},
{"role": "user", "content": user_input},
],
tools=[
# {
# "type": "file_search",
# "vector_store_ids": ["vs_68f0014fe51c819184b6c36568f1ade0"],
# }
],
)
answer = response.output_text
print(f"🧠 Asistent: {answer}\n")
# Shrani vprašanje in odgovor v datoteko
conversation["messages"].append({
"question": user_input,
"response": answer
})
conversations[CONVERSATION_ID] = conversation
save_conversations(conversations)
if __name__ == "__main__":
start_chat()