sanatan_ai / modules /quiz /quiz_helper.py
vikramvasudevan's picture
Upload folder using huggingface_hub
36c0ef0 verified
raw
history blame
2.71 kB
import random
from typing import Literal
from config import SanatanConfig
from modules.quiz.models import Question
from sanatan_assistant import query, allowedCollections
from openai import OpenAI
client = OpenAI()
def generate_question(
collection: allowedCollections,
complexity: Literal["beginner", "intermediate", "advanced"],
mode: Literal["mcq", "open"],
preferred_lamguage: str = "English",
) -> Question:
"""
Fetch a random scripture record and have the LLM generate a structured Question.
"""
print("Generating question ...", collection, complexity,mode, preferred_lamguage)
# 1. Fetch random scripture record
context = query(
collection_name=collection,
query=None,
metadata_where_clause=None,
n_results=1,
search_type="random",
)
if not context:
raise ValueError(f"No records found in collection {collection}")
# 2. Prompt (grounded in record only)
prompt = f"""
You are a quiz generator. Use ONLY the following scripture record to create a question.
Context from {collection}:
{context}
Rules:
- Do not invent facts beyond the context.
- Difficulty level: {complexity}
- Mode: {mode}
- If mode is 'mcq', generate 3–4 plausible choices (with one correct).
- If mode is 'open', leave 'choices' empty and provide a reference answer.
- Provide all fields in JSON. The `native_lyrics` field MUST always be populated from the context, even if short. Do not omit.
- Ensure all text fields, including 'native_lyrics', are valid JSON strings.
- Escape all newlines as \\n. Do not omit any part of the verse.
- User's preferred language is {preferred_lamguage}. Translate everything except the native verses to this language.
"""
# 3. Structured response with Pydantic class reference
response = client.chat.completions.parse(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
response_format=Question,
)
# print(response)
return response.choices[0].message.parsed
# Example usage
if __name__ == "__main__":
for i in range(3):
q = generate_question(
collection=random.choice(
[
s["collection_name"]
for s in SanatanConfig.scriptures
if s["collection_name"] != "yt_metadata"
]
),
complexity=random.choice(["beginner", "intermediate", "advanced"]),
mode=random.choice(["mcq", "open"]),
preferred_lamguage="Tamil",
)
print(q.model_dump_json(indent=1))
print("_______________________")