104 lines
3.0 KiB
Python
104 lines
3.0 KiB
Python
import openai
|
|
import os
|
|
import sys
|
|
import json
|
|
from constants import API_KEY_ENV, CHAT_MODEL, OUTPUT_FILENAME
|
|
|
|
|
|
API_KEY = os.environ.get(API_KEY_ENV)
|
|
if not API_KEY:
|
|
raise ValueError("Please set the OPENAI_API_KEY environment variable.")
|
|
|
|
openai.api_key = API_KEY
|
|
|
|
# Given prompt template
|
|
PROMPT_TEMPLATE = """
|
|
Please come up with a title for the deck and a set of 10 index cards for memorization,
|
|
including a title, front, and back for each card. The index cards should completely
|
|
capture the main points and themes of the text. In addition, they should contain any
|
|
numbers or data that humans might find difficult to remember. The goal of the index
|
|
card set is that one who memorizes it can provide a summary of the text to someone
|
|
else, conveying the main points and themes.
|
|
|
|
You will provide the deck title, and the titles, questions, and answers for each card
|
|
in a structured format as follows:
|
|
```
|
|
Deck Title: Title of the Deck
|
|
Cards:
|
|
- Title: Card Title 1
|
|
Front: What is the capital of New York?
|
|
Back: Albany
|
|
- Title: Card Title 2
|
|
Front: Where in the world is Carmen San Diego?
|
|
Back: Nobody knows
|
|
```
|
|
|
|
{content}
|
|
"""
|
|
|
|
|
|
def prompt_for_card_content(text_content):
|
|
# Prepare the prompt
|
|
prompt = PROMPT_TEMPLATE.format(content=text_content)
|
|
|
|
# Get completion from the OpenAI ChatGPT API
|
|
response = openai.ChatCompletion.create(
|
|
model=CHAT_MODEL,
|
|
messages=[
|
|
{"role": "user", "content": prompt}
|
|
],
|
|
temperature=0,
|
|
)
|
|
|
|
# Extract content from response and save to a new file
|
|
return response.choices[0]['message']['content']
|
|
|
|
|
|
def response_to_json(response_text):
|
|
lines = [line.strip() for line in response_text.split("\n") if line.strip()]
|
|
|
|
deck_title = None
|
|
cards = []
|
|
current_card = {}
|
|
|
|
for line in lines:
|
|
if "Deck Title:" in line and not deck_title:
|
|
deck_title = line.split("Deck Title:", 1)[1].strip()
|
|
elif "Title:" in line:
|
|
if current_card: # If there's a card being processed, add it to cards
|
|
cards.append(current_card)
|
|
current_card = {}
|
|
current_card["Title"] = line.split("Title:", 1)[1].strip()
|
|
elif "Front:" in line:
|
|
current_card["Question"] = line.split("Front:", 1)[1].strip()
|
|
elif "Back:" in line:
|
|
current_card["Answer"] = line.split("Back:", 1)[1].strip()
|
|
|
|
if current_card: # Add the last card if it exists
|
|
cards.append(current_card)
|
|
|
|
return {
|
|
"DeckTitle": deck_title,
|
|
"Cards": cards
|
|
}
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) != 2:
|
|
print("Usage: python prompt4cards.py <text_file_path>")
|
|
sys.exit(1)
|
|
|
|
text_file_path = sys.argv[1]
|
|
|
|
# Read the text content
|
|
with open(text_file_path, 'r') as file:
|
|
text_content = file.read()
|
|
|
|
response_text = prompt_for_card_content(text_content)
|
|
deck_json = response_to_json(response_text)
|
|
|
|
with open(OUTPUT_FILENAME, 'w') as json_file:
|
|
json.dump(deck_json, json_file)
|
|
|
|
print(f"Saved generated deck to {OUTPUT_FILENAME}")
|