ankban commited on
Commit
7c1803b
Β·
verified Β·
1 Parent(s): 8c8ef2f

Update written_module.py

Browse files
Files changed (1) hide show
  1. written_module.py +78 -45
written_module.py CHANGED
@@ -1,45 +1,49 @@
1
  import gradio as gr
2
  import uuid
 
3
  from app_utils import (
4
- LANG_CODES, client, save_to_db, fetch_user_sessions
 
 
 
5
  )
 
6
 
 
7
 
8
- def generate_written_feedback(text, language):
9
- prompt = f"""You are a writing tutor. Please respond in [language={language}].
10
- Evaluate the user's writing on the following 6 criteria:
11
- 1. Clarity & Conciseness
12
- 2. Organization & Flow
13
- 3. Grammar & Mechanics
14
- 4. Vocabulary & Style
15
- 5. Tone Appropriateness
16
- 6. Originality & Creativity
17
 
18
- For each:
19
- - Give a score out of 10
20
- - Write a short explanation
21
 
22
- Then provide:
23
- - An overall summary
24
- - One motivational closing line
25
 
26
- Writing:
 
 
 
 
 
 
27
  {text}
 
28
  """
 
29
  response = client.chat.completions.create(
30
  model="gpt-4",
31
  messages=[
32
- {"role": "system", "content": f"You are a supportive writing coach responding in {language}."},
33
  {"role": "user", "content": prompt}
34
  ],
35
  temperature=0.7
36
  )
37
  return response.choices[0].message.content
38
 
39
-
40
  def improve_written_text(text, language):
41
- prompt = f"""You are a writing coach. Rewrite this piece to improve structure, grammar, and clarity.
42
- Make it more compelling while keeping the original meaning.
43
 
44
  Text:
45
  {text}
@@ -53,29 +57,46 @@ Text:
53
  )
54
  return response.choices[0].message.content
55
 
56
-
57
- def written_dashboard():
58
  with gr.Column() as written_panel:
59
  gr.Markdown("""
60
- <div id=\"header\" style=\"text-align: center;\">
61
- <img src=\"file/images/chatter_owl.png\" width=\"120\">
62
  <h2>✍️ Written Communication with <strong>Chatter the Owl</strong></h2>
63
- <p>Paste your writing or upload a file, select language, and I’ll help you sharpen your message.</p>
64
  </div>
65
  """)
66
 
67
- nickname_box = gr.Textbox(label="πŸ‘€ Your Nickname", placeholder="Enter your name…")
68
  language_dropdown = gr.Dropdown(label="🌍 Select Language", choices=list(LANG_CODES.keys()), value="English")
69
- font_size_slider = gr.Slider(12, 24, value=16, step=1, label="πŸ”  Font Size")
70
- contrast_toggle = gr.Checkbox(label="πŸŒ“ High Contrast Text")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
 
72
  with gr.Row():
73
  input_text = gr.Textbox(lines=7, label="πŸ“ Your Writing", elem_id="input_text", elem_classes=["text_area"])
74
- file_input = gr.File(label="πŸ“„ Upload Text File", file_types=[".txt", ".md"])
75
 
76
  feedback_box = gr.Textbox(label="πŸ’‘ Feedback", interactive=False, elem_id="feedback_box")
77
  improved_box = gr.Textbox(label="🎯 Improved Version", interactive=False, elem_id="improved_box")
78
  history_table = gr.Dataframe(headers=["πŸ•’ Timestamp", "🌐 Language", "✍️ Writing Preview", "πŸ“‹ Feedback Preview"])
 
 
 
79
 
80
  def extract_text(file):
81
  if file is None:
@@ -85,30 +106,42 @@ def written_dashboard():
85
 
86
  file_input.change(fn=extract_text, inputs=file_input, outputs=input_text)
87
 
88
- def tutor_written(text, language, nickname):
89
  if not text.strip():
90
- return "", "", []
91
 
92
- feedback = generate_written_feedback(text, language)
93
- improved = improve_written_text(text, language)
 
94
 
 
 
95
  save_to_db(nickname, text, feedback, language)
 
96
  sessions = fetch_user_sessions(nickname)
97
  session_table = [[s.timestamp, s.language, s.transcript[:40], s.feedback[:40]] for s in sessions]
98
 
99
- return feedback, improved, session_table
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
 
101
  input_text.change(
102
  fn=tutor_written,
103
- inputs=[input_text, language_dropdown, nickname_box],
104
- outputs=[feedback_box, improved_box, history_table]
105
  )
106
 
107
- def update_styles(font_size, high_contrast):
108
- # Dummy update to trigger refresh, can't update style directly in gr.update
109
- return "", "", ""
110
-
111
- font_size_slider.change(update_styles, [font_size_slider, contrast_toggle], [input_text, feedback_box, improved_box])
112
- contrast_toggle.change(update_styles, [font_size_slider, contrast_toggle], [input_text, feedback_box, improved_box])
113
-
114
- return written_panel
 
1
  import gradio as gr
2
  import uuid
3
+ import matplotlib.pyplot as plt
4
  from app_utils import (
5
+ LANG_CODES, save_to_db, fetch_user_sessions,
6
+ parse_scores_from_feedback, generate_progress_summary,
7
+ build_score_comparison_data, render_score_chart,
8
+ build_trend_data, render_trend_chart
9
  )
10
+ from openai import OpenAI
11
 
12
+ client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
13
 
14
+ def generate_written_feedback(text, language, goal="general improvement", focus_areas=None, previous_text=None):
15
+ focus_str = ", ".join(focus_areas) if focus_areas else "Clarity, Structure, Grammar, Style, Tone, and Creativity"
16
+ history_section = f"\n\nCompare this to their previous writing:\n{previous_text}" if previous_text else ""
 
 
 
 
 
 
17
 
18
+ prompt = f"""
19
+ You are a supportive writing coach helping someone working on: **{goal}**.
 
20
 
21
+ First, return a JSON object of the scores (0–10) for these categories:
22
+ {focus_str}
 
23
 
24
+ Then, explain each score briefly.
25
+
26
+ End with:
27
+ - A summary of strengths and improvement areas
28
+ - One motivational sentence
29
+
30
+ Text:
31
  {text}
32
+ {history_section}
33
  """
34
+
35
  response = client.chat.completions.create(
36
  model="gpt-4",
37
  messages=[
38
+ {"role": "system", "content": f"You are a thoughtful writing tutor responding in {language}."},
39
  {"role": "user", "content": prompt}
40
  ],
41
  temperature=0.7
42
  )
43
  return response.choices[0].message.content
44
 
 
45
  def improve_written_text(text, language):
46
+ prompt = f"""Rewrite this piece to improve structure, grammar, clarity, and tone without changing its meaning.
 
47
 
48
  Text:
49
  {text}
 
57
  )
58
  return response.choices[0].message.content
59
 
60
+ def written_dashboard(nickname):
 
61
  with gr.Column() as written_panel:
62
  gr.Markdown("""
63
+ <div id="header" style="text-align: center;">
64
+ <img src="file/images/chatter_owl.png" width="120">
65
  <h2>✍️ Written Communication with <strong>Chatter the Owl</strong></h2>
66
+ <p>Paste or upload writing, select your goal and focus, and receive tailored feedback and trends over time.</p>
67
  </div>
68
  """)
69
 
 
70
  language_dropdown = gr.Dropdown(label="🌍 Select Language", choices=list(LANG_CODES.keys()), value="English")
71
+
72
+ goal_dropdown = gr.Dropdown(
73
+ label="🎯 Writing Goal",
74
+ choices=[
75
+ "Essay for school",
76
+ "Job application",
77
+ "Public blog post",
78
+ "Creative writing",
79
+ "General improvement"
80
+ ],
81
+ value="General improvement"
82
+ )
83
+
84
+ focus_checkboxes = gr.CheckboxGroup(
85
+ label="🧠 Areas to Focus On",
86
+ choices=["Clarity", "Organization", "Grammar", "Vocabulary", "Tone", "Creativity"],
87
+ value=["Clarity", "Organization", "Grammar", "Vocabulary", "Tone", "Creativity"]
88
+ )
89
 
90
  with gr.Row():
91
  input_text = gr.Textbox(lines=7, label="πŸ“ Your Writing", elem_id="input_text", elem_classes=["text_area"])
92
+ file_input = gr.File(label="πŸ“„ Upload Text File", file_types=[".txt", ".md"])
93
 
94
  feedback_box = gr.Textbox(label="πŸ’‘ Feedback", interactive=False, elem_id="feedback_box")
95
  improved_box = gr.Textbox(label="🎯 Improved Version", interactive=False, elem_id="improved_box")
96
  history_table = gr.Dataframe(headers=["πŸ•’ Timestamp", "🌐 Language", "✍️ Writing Preview", "πŸ“‹ Feedback Preview"])
97
+ score_chart = gr.Plot(label="πŸ“Š Current vs Previous Scores")
98
+ trend_chart = gr.Plot(label="πŸ“ˆ Progress on Clarity Over Time")
99
+ milestone_box = gr.Markdown(visible=False)
100
 
101
  def extract_text(file):
102
  if file is None:
 
106
 
107
  file_input.change(fn=extract_text, inputs=file_input, outputs=input_text)
108
 
109
+ def tutor_written(text, language, goal, focus_areas):
110
  if not text.strip():
111
+ return "", "", [], None, None, gr.update(visible=False)
112
 
113
+ sessions = fetch_user_sessions(nickname)
114
+ previous_text = sessions[-1].transcript if sessions else None
115
+ previous_feedback = sessions[-1].feedback if sessions else None
116
 
117
+ feedback = generate_written_feedback(text, language, goal, focus_areas, previous_text)
118
+ improved = improve_written_text(text, language)
119
  save_to_db(nickname, text, feedback, language)
120
+
121
  sessions = fetch_user_sessions(nickname)
122
  session_table = [[s.timestamp, s.language, s.transcript[:40], s.feedback[:40]] for s in sessions]
123
 
124
+ # Score chart
125
+ chart_data = build_score_comparison_data(feedback, previous_feedback) if previous_feedback else None
126
+ chart_plot = render_score_chart(chart_data) if chart_data else None
127
+
128
+ # Trend chart
129
+ dates, clarity_scores = build_trend_data(sessions, category="Clarity")
130
+ trend_plot = render_trend_chart(dates, clarity_scores, "Clarity") if clarity_scores else None
131
+
132
+ # Milestone
133
+ session_count = len(sessions)
134
+ milestone_msg = ""
135
+ if session_count in [3, 5, 10]:
136
+ milestone_msg = f"πŸŽ‰ You've completed **{session_count} writing sessions**!"
137
+ feedback += f"\n\n{milestone_msg}"
138
+
139
+ return feedback, improved, session_table, chart_plot, trend_plot, gr.update(visible=bool(milestone_msg), value=milestone_msg)
140
 
141
  input_text.change(
142
  fn=tutor_written,
143
+ inputs=[input_text, language_dropdown, goal_dropdown, focus_checkboxes],
144
+ outputs=[feedback_box, improved_box, history_table, score_chart, trend_chart, milestone_box]
145
  )
146
 
147
+ return written_panel