evo-gov-copilot-mu / feedback.py
HemanM's picture
Create feedback.py
9810d33 verified
# feedback.py β€” Step 9
# Minimal CSV logger for Helpful / Not helpful signals.
# Writes to data/feedback.csv and auto-creates header on first write.
from pathlib import Path
import csv
import time
FEEDBACK_CSV = Path("data/feedback.csv")
FEEDBACK_CSV.parent.mkdir(parents=True, exist_ok=True)
_FIELDS = [
"ts_question",
"ts_feedback",
"session",
"feedback", # "helpful" | "not_helpful"
"note", # optional free text
"lang",
"mode",
"temperature",
"max_tokens",
"top_k",
"question",
"answer",
"sources",
"links",
"forms",
]
def _ensure_header(path: Path):
if not path.exists() or path.stat().st_size == 0:
with path.open("w", newline="", encoding="utf-8") as f:
csv.DictWriter(f, fieldnames=_FIELDS).writeheader()
def _flatten(s: str, lim: int = 2000) -> str:
"""Make single-line, truncate to keep rows compact."""
if s is None:
return ""
s = " ".join(str(s).split())
return s[:lim]
def log_feedback(entry: dict) -> str:
"""
entry expects at least:
ts_question, session, feedback, note, lang, mode, temperature, max_tokens, top_k,
question, answer, sources, links, forms
"""
_ensure_header(FEEDBACK_CSV)
row = {k: "" for k in _FIELDS}
row.update({
"ts_question": entry.get("ts_question", int(time.time())),
"ts_feedback": int(time.time()),
"session": entry.get("session", ""),
"feedback": entry.get("feedback", ""),
"note": _flatten(entry.get("note", "")),
"lang": entry.get("lang", ""),
"mode": entry.get("mode", ""),
"temperature": entry.get("temperature", ""),
"max_tokens": entry.get("max_tokens", ""),
"top_k": entry.get("top_k", ""),
"question": _flatten(entry.get("question", ""), 1000),
"answer": _flatten(entry.get("answer", ""), 2000),
"sources": _flatten(entry.get("sources", ""), 1000),
"links": _flatten(entry.get("links", ""), 1000),
"forms": _flatten(entry.get("forms", ""), 1000),
})
with FEEDBACK_CSV.open("a", newline="", encoding="utf-8") as f:
w = csv.DictWriter(f, fieldnames=_FIELDS)
w.writerow(row)
return f"Thanks β€” logged as **{row['feedback']}** for session `{row['session']}`."