NatureLM-Audio / hub_logger.py
Milad Alizadeh
tweaks to beats config/init (#114)
515204e
Raw
History Blame Contribute Delete
2.27 kB
"""Log user interactions to a HuggingFace Hub dataset."""
import json
import os
import uuid
from pathlib import Path
from huggingface_hub import HfApi, HfFileSystem
DATASET_REPO = "EarthSpeciesProject/naturelm-audio-space-logs"
SPLIT = "test"
TESTING = os.getenv("TESTING", "0") == "1"
_hf_token = os.getenv("HF_TOKEN", None)
_api = HfApi(token=_hf_token)
_fs = HfFileSystem(token=_hf_token)
_METADATA_PATH = f"datasets/{DATASET_REPO}/{SPLIT}/metadata.jsonl"
def log_interaction(
audio: str | Path,
user_text: str,
model_response: str,
session_id: str = "",
model_version: str = "",
) -> None:
"""Log a single user/model exchange (audio + text) to the Hub dataset.
Parameters
----------
audio : str | Path
Local path to the audio file uploaded by the user.
user_text : str
The user's query text.
model_response : str
The model's generated response.
session_id : str
Unique identifier for the user session.
model_version : str
Version string of the model that produced the response.
"""
data_id = str(uuid.uuid4())
if TESTING:
data_id = "test-" + data_id
session_id = "test-" + session_id
suffix = Path(audio).suffix
audio_repo_path = f"{SPLIT}/audio/{session_id}{suffix}"
if not _fs.exists(f"datasets/{DATASET_REPO}/{audio_repo_path}"):
_api.upload_file(
path_or_fileobj=str(audio),
path_in_repo=audio_repo_path,
repo_id=DATASET_REPO,
repo_type="dataset",
)
record = {
"user_message": user_text,
"model_response": model_response,
"file_name": f"audio/{session_id}{suffix}",
"original_fn": Path(audio).name,
"id": data_id,
"session_id": session_id,
"model_version": model_version,
}
line = json.dumps(record) + "\n"
# HfFileSystem doesn't support append, so read-then-write.
if _fs.exists(_METADATA_PATH):
with _fs.open(_METADATA_PATH, "r") as f:
lines = f.readlines()
lines.append(line)
with _fs.open(_METADATA_PATH, "w") as f:
f.writelines(lines)
else:
with _fs.open(_METADATA_PATH, "w") as f:
f.write(line)