Spaces:
Running
Running
content=user_message + "/n 請嚴格遵循instructions,擔任一位蘇格拉底家教,不要重複 user 的問句,用引導的方式指引方向,請一定要用繁體中文回答 zh-TW,並用台灣人的禮貌口語表達,回答時不要特別說明這是台灣人的語氣,請在回答的最後標註【參考:(時):(分):(秒)】,(如果是反問學生,就只問一個問題,請幫助學生更好的理解資料,字數在100字以內,回答時請用數學符號代替文字(Latex 用 $ 字號 render, ex: $x^2$)"
Browse files
app.py
CHANGED
@@ -572,6 +572,7 @@ def process_youtube_link(password, link):
|
|
572 |
questions = get_questions(video_id, formatted_simple_transcript, source)
|
573 |
questions_json = json.dumps(questions, ensure_ascii=False, indent=2)
|
574 |
summary_json = get_video_id_summary(video_id, formatted_simple_transcript, source)
|
|
|
575 |
summary = summary_json["summary"]
|
576 |
key_moments_json = get_key_moments(video_id, formatted_simple_transcript, formatted_transcript, source)
|
577 |
key_moments = key_moments_json["key_moments"]
|
@@ -586,6 +587,7 @@ def process_youtube_link(password, link):
|
|
586 |
mind_map = mind_map_json["mind_map"]
|
587 |
mind_map_html = get_mind_map_html(mind_map)
|
588 |
reading_passage_json = get_reading_passage(video_id, formatted_simple_transcript, source)
|
|
|
589 |
reading_passage = reading_passage_json["reading_passage"]
|
590 |
meta_data = get_meta_data(video_id)
|
591 |
subject = meta_data["subject"]
|
@@ -598,6 +600,7 @@ def process_youtube_link(password, link):
|
|
598 |
questions[1] if len(questions) > 1 else "", \
|
599 |
questions[2] if len(questions) > 2 else "", \
|
600 |
original_transcript, \
|
|
|
601 |
summary, \
|
602 |
key_moments_text, \
|
603 |
key_moments_html, \
|
@@ -607,6 +610,7 @@ def process_youtube_link(password, link):
|
|
607 |
simple_html_content, \
|
608 |
first_image, \
|
609 |
first_text, \
|
|
|
610 |
reading_passage, \
|
611 |
subject, \
|
612 |
grade
|
@@ -1428,7 +1432,12 @@ def get_LLM_content(video_id, kind):
|
|
1428 |
if is_file_exists:
|
1429 |
content = download_blob_to_string(gcs_client, bucket_name, blob_name)
|
1430 |
content_json = json.loads(content)
|
1431 |
-
|
|
|
|
|
|
|
|
|
|
|
1432 |
else:
|
1433 |
content_text = ""
|
1434 |
return content_text
|
@@ -1457,15 +1466,17 @@ def update_LLM_content(video_id, new_content, kind):
|
|
1457 |
blob_name = f"{video_id}/{file_name}"
|
1458 |
|
1459 |
if kind == "reading_passage":
|
|
|
|
|
1460 |
reading_passage_json = {"reading_passage": str(new_content)}
|
1461 |
reading_passage_text = json.dumps(reading_passage_json, ensure_ascii=False, indent=2)
|
1462 |
upload_file_to_gcs_with_json_string(gcs_client, bucket_name, blob_name, reading_passage_text)
|
1463 |
-
updated_content =
|
1464 |
elif kind == "summary":
|
1465 |
summary_json = {"summary": str(new_content)}
|
1466 |
summary_text = json.dumps(summary_json, ensure_ascii=False, indent=2)
|
1467 |
upload_file_to_gcs_with_json_string(gcs_client, bucket_name, blob_name, summary_text)
|
1468 |
-
updated_content =
|
1469 |
elif kind == "mind_map":
|
1470 |
mind_map_json = {"mind_map": str(new_content)}
|
1471 |
mind_map_text = json.dumps(mind_map_json, ensure_ascii=False, indent=2)
|
@@ -1831,7 +1842,7 @@ def chat_with_opan_ai_assistant(password, youtube_id, user_data, thread_id, tras
|
|
1831 |
client.beta.threads.messages.create(
|
1832 |
thread_id=thread.id,
|
1833 |
role="user",
|
1834 |
-
content=user_message + "/n 請嚴格遵循instructions
|
1835 |
)
|
1836 |
|
1837 |
# 运行助手,生成响应
|
@@ -2321,23 +2332,11 @@ with gr.Blocks(theme=gr.themes.Base(primary_hue=gr.themes.colors.orange, seconda
|
|
2321 |
ai_msg = gr.Textbox(label="訊息輸入",scale=3)
|
2322 |
ai_send_button = gr.Button("送出", variant="primary",scale=1)
|
2323 |
with gr.Tab("文章模式"):
|
2324 |
-
with gr.Row() as reading_passage_admin:
|
2325 |
-
reading_passage_kind = gr.Textbox(value="reading_passage", show_label=False)
|
2326 |
-
reading_passage_edit_button = gr.Button("編輯", size="sm", variant="primary")
|
2327 |
-
reading_passage_update_button = gr.Button("更新", size="sm", variant="primary")
|
2328 |
-
reading_passage_delete_button = gr.Button("刪除", size="sm", variant="primary")
|
2329 |
-
reading_passage_create_button = gr.Button("建立", size="sm", variant="primary")
|
2330 |
with gr.Row():
|
2331 |
reading_passage = gr.Markdown(show_label=False, latex_delimiters = [{"left": "$", "right": "$", "display": False}])
|
2332 |
reading_passage_speak_button = gr.Button("Speak", visible=False)
|
2333 |
reading_passage_audio_output = gr.Audio(label="Audio Output", visible=False)
|
2334 |
with gr.Tab("重點摘要"):
|
2335 |
-
with gr.Row() as summary_admmin:
|
2336 |
-
summary_kind = gr.Textbox(value="summary", show_label=False)
|
2337 |
-
summary_edit_button = gr.Button("編輯", size="sm", variant="primary")
|
2338 |
-
summary_update_button = gr.Button("更新", size="sm", variant="primary")
|
2339 |
-
summary_delete_button = gr.Button("刪除", size="sm", variant="primary")
|
2340 |
-
summary_create_button = gr.Button("建立", size="sm", variant="primary")
|
2341 |
with gr.Row():
|
2342 |
df_summarise = gr.Markdown(show_label=False, latex_delimiters = [{"left": "$", "right": "$", "display": False}])
|
2343 |
with gr.Tab("關鍵時刻"):
|
@@ -2439,6 +2438,26 @@ with gr.Blocks(theme=gr.themes.Base(primary_hue=gr.themes.colors.orange, seconda
|
|
2439 |
transcript_create_button = gr.Button("建立", size="sm", variant="primary")
|
2440 |
with gr.Row():
|
2441 |
df_string_output = gr.Textbox(lines=40, label="Data Text", interactive=False, show_copy_button=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2442 |
with gr.Tab("關鍵時刻本文"):
|
2443 |
with gr.Row() as key_moments_admin:
|
2444 |
key_moments_kind = gr.Textbox(value="key_moments", show_label=False)
|
@@ -2577,6 +2596,7 @@ with gr.Blocks(theme=gr.themes.Base(primary_hue=gr.themes.colors.orange, seconda
|
|
2577 |
btn_2,
|
2578 |
btn_3,
|
2579 |
df_string_output,
|
|
|
2580 |
df_summarise,
|
2581 |
key_moments,
|
2582 |
key_moments_html,
|
@@ -2586,6 +2606,7 @@ with gr.Blocks(theme=gr.themes.Base(primary_hue=gr.themes.colors.orange, seconda
|
|
2586 |
simple_html_content,
|
2587 |
slide_image,
|
2588 |
slide_text,
|
|
|
2589 |
reading_passage,
|
2590 |
content_subject,
|
2591 |
content_grade,
|
@@ -2635,47 +2656,57 @@ with gr.Blocks(theme=gr.themes.Base(primary_hue=gr.themes.colors.orange, seconda
|
|
2635 |
# web_link.change(process_web_link, inputs=web_link, outputs=[btn_1, btn_2, btn_3, df_summarise, df_string_output])
|
2636 |
|
2637 |
# reading_passage event
|
|
|
|
|
|
|
|
|
|
|
2638 |
reading_passage_create_button.click(
|
2639 |
create_LLM_content,
|
2640 |
inputs=[video_id, df_string_output, reading_passage_kind],
|
2641 |
-
outputs=[
|
2642 |
)
|
2643 |
reading_passage_delete_button.click(
|
2644 |
delete_LLM_content,
|
2645 |
inputs=[video_id, reading_passage_kind],
|
2646 |
-
outputs=[
|
2647 |
)
|
2648 |
reading_passage_edit_button.click(
|
2649 |
enable_edit_mode,
|
2650 |
inputs=[],
|
2651 |
-
outputs=[
|
2652 |
)
|
2653 |
reading_passage_update_button.click(
|
2654 |
update_LLM_content,
|
2655 |
-
inputs=[video_id,
|
2656 |
-
outputs=[
|
2657 |
)
|
2658 |
|
2659 |
# summary event
|
|
|
|
|
|
|
|
|
|
|
2660 |
summary_create_button.click(
|
2661 |
create_LLM_content,
|
2662 |
inputs=[video_id, df_string_output, summary_kind],
|
2663 |
-
outputs=[
|
2664 |
)
|
2665 |
summary_delete_button.click(
|
2666 |
delete_LLM_content,
|
2667 |
inputs=[video_id, summary_kind],
|
2668 |
-
outputs=[
|
2669 |
)
|
2670 |
summary_edit_button.click(
|
2671 |
enable_edit_mode,
|
2672 |
inputs=[],
|
2673 |
-
outputs=[
|
2674 |
)
|
2675 |
summary_update_button.click(
|
2676 |
update_LLM_content,
|
2677 |
-
inputs=[video_id,
|
2678 |
-
outputs=[
|
2679 |
)
|
2680 |
|
2681 |
# transcript event
|
|
|
572 |
questions = get_questions(video_id, formatted_simple_transcript, source)
|
573 |
questions_json = json.dumps(questions, ensure_ascii=False, indent=2)
|
574 |
summary_json = get_video_id_summary(video_id, formatted_simple_transcript, source)
|
575 |
+
summary_text = summary_json["summary"]
|
576 |
summary = summary_json["summary"]
|
577 |
key_moments_json = get_key_moments(video_id, formatted_simple_transcript, formatted_transcript, source)
|
578 |
key_moments = key_moments_json["key_moments"]
|
|
|
587 |
mind_map = mind_map_json["mind_map"]
|
588 |
mind_map_html = get_mind_map_html(mind_map)
|
589 |
reading_passage_json = get_reading_passage(video_id, formatted_simple_transcript, source)
|
590 |
+
reading_passage_text = reading_passage_json["reading_passage"]
|
591 |
reading_passage = reading_passage_json["reading_passage"]
|
592 |
meta_data = get_meta_data(video_id)
|
593 |
subject = meta_data["subject"]
|
|
|
600 |
questions[1] if len(questions) > 1 else "", \
|
601 |
questions[2] if len(questions) > 2 else "", \
|
602 |
original_transcript, \
|
603 |
+
summary_text, \
|
604 |
summary, \
|
605 |
key_moments_text, \
|
606 |
key_moments_html, \
|
|
|
610 |
simple_html_content, \
|
611 |
first_image, \
|
612 |
first_text, \
|
613 |
+
reading_passage_text, \
|
614 |
reading_passage, \
|
615 |
subject, \
|
616 |
grade
|
|
|
1432 |
if is_file_exists:
|
1433 |
content = download_blob_to_string(gcs_client, bucket_name, blob_name)
|
1434 |
content_json = json.loads(content)
|
1435 |
+
if kind == "reading_passage":
|
1436 |
+
content_text = content_json["reading_passage"]
|
1437 |
+
elif kind == "summary":
|
1438 |
+
content_text = content_json["summary"]
|
1439 |
+
else:
|
1440 |
+
content_text = json.dumps(content_json, ensure_ascii=False, indent=2)
|
1441 |
else:
|
1442 |
content_text = ""
|
1443 |
return content_text
|
|
|
1466 |
blob_name = f"{video_id}/{file_name}"
|
1467 |
|
1468 |
if kind == "reading_passage":
|
1469 |
+
print("=========reading_passage=======")
|
1470 |
+
print(new_content)
|
1471 |
reading_passage_json = {"reading_passage": str(new_content)}
|
1472 |
reading_passage_text = json.dumps(reading_passage_json, ensure_ascii=False, indent=2)
|
1473 |
upload_file_to_gcs_with_json_string(gcs_client, bucket_name, blob_name, reading_passage_text)
|
1474 |
+
updated_content = new_content
|
1475 |
elif kind == "summary":
|
1476 |
summary_json = {"summary": str(new_content)}
|
1477 |
summary_text = json.dumps(summary_json, ensure_ascii=False, indent=2)
|
1478 |
upload_file_to_gcs_with_json_string(gcs_client, bucket_name, blob_name, summary_text)
|
1479 |
+
updated_content = new_content
|
1480 |
elif kind == "mind_map":
|
1481 |
mind_map_json = {"mind_map": str(new_content)}
|
1482 |
mind_map_text = json.dumps(mind_map_json, ensure_ascii=False, indent=2)
|
|
|
1842 |
client.beta.threads.messages.create(
|
1843 |
thread_id=thread.id,
|
1844 |
role="user",
|
1845 |
+
content=user_message + "/n 請嚴格遵循instructions,擔任一位蘇格拉底家教,不要重複 user 的問句,用引導的方式指引方向,請一定要用繁體中文回答 zh-TW,並用台灣人的禮貌口語表達,回答時不要特別說明這是台灣人的語氣,請在回答的最後標註【參考:(時):(分):(秒)】,(如果是反問學生,就只問一個問題,請幫助學生更好的理解資料,字數在100字以內,回答時請用數學符號代替文字(Latex 用 $ 字號 render, ex: $x^2$)"
|
1846 |
)
|
1847 |
|
1848 |
# 运行助手,生成响应
|
|
|
2332 |
ai_msg = gr.Textbox(label="訊息輸入",scale=3)
|
2333 |
ai_send_button = gr.Button("送出", variant="primary",scale=1)
|
2334 |
with gr.Tab("文章模式"):
|
|
|
|
|
|
|
|
|
|
|
|
|
2335 |
with gr.Row():
|
2336 |
reading_passage = gr.Markdown(show_label=False, latex_delimiters = [{"left": "$", "right": "$", "display": False}])
|
2337 |
reading_passage_speak_button = gr.Button("Speak", visible=False)
|
2338 |
reading_passage_audio_output = gr.Audio(label="Audio Output", visible=False)
|
2339 |
with gr.Tab("重點摘要"):
|
|
|
|
|
|
|
|
|
|
|
|
|
2340 |
with gr.Row():
|
2341 |
df_summarise = gr.Markdown(show_label=False, latex_delimiters = [{"left": "$", "right": "$", "display": False}])
|
2342 |
with gr.Tab("關鍵時刻"):
|
|
|
2438 |
transcript_create_button = gr.Button("建立", size="sm", variant="primary")
|
2439 |
with gr.Row():
|
2440 |
df_string_output = gr.Textbox(lines=40, label="Data Text", interactive=False, show_copy_button=True)
|
2441 |
+
with gr.Tab("文章本文"):
|
2442 |
+
with gr.Row() as reading_passage_admin:
|
2443 |
+
reading_passage_kind = gr.Textbox(value="reading_passage", show_label=False)
|
2444 |
+
reading_passage_get_button = gr.Button("取得", size="sm", variant="primary")
|
2445 |
+
reading_passage_edit_button = gr.Button("編輯", size="sm", variant="primary")
|
2446 |
+
reading_passage_update_button = gr.Button("更新", size="sm", variant="primary")
|
2447 |
+
reading_passage_delete_button = gr.Button("刪除", size="sm", variant="primary")
|
2448 |
+
reading_passage_create_button = gr.Button("建立", size="sm", variant="primary")
|
2449 |
+
with gr.Row():
|
2450 |
+
reading_passage_text = gr.Textbox(label="reading_passage", lines=40, interactive=False, show_copy_button=True)
|
2451 |
+
with gr.Tab("重點摘要本文"):
|
2452 |
+
with gr.Row() as summary_admmin:
|
2453 |
+
summary_kind = gr.Textbox(value="summary", show_label=False)
|
2454 |
+
summary_get_button = gr.Button("取得", size="sm", variant="primary")
|
2455 |
+
summary_edit_button = gr.Button("編輯", size="sm", variant="primary")
|
2456 |
+
summary_update_button = gr.Button("更新", size="sm", variant="primary")
|
2457 |
+
summary_delete_button = gr.Button("刪除", size="sm", variant="primary")
|
2458 |
+
summary_create_button = gr.Button("建立", size="sm", variant="primary")
|
2459 |
+
with gr.Row():
|
2460 |
+
summary_text = gr.Textbox(label="Summary", lines=40, interactive=False, show_copy_button=True)
|
2461 |
with gr.Tab("關鍵時刻本文"):
|
2462 |
with gr.Row() as key_moments_admin:
|
2463 |
key_moments_kind = gr.Textbox(value="key_moments", show_label=False)
|
|
|
2596 |
btn_2,
|
2597 |
btn_3,
|
2598 |
df_string_output,
|
2599 |
+
summary_text,
|
2600 |
df_summarise,
|
2601 |
key_moments,
|
2602 |
key_moments_html,
|
|
|
2606 |
simple_html_content,
|
2607 |
slide_image,
|
2608 |
slide_text,
|
2609 |
+
reading_passage_text,
|
2610 |
reading_passage,
|
2611 |
content_subject,
|
2612 |
content_grade,
|
|
|
2656 |
# web_link.change(process_web_link, inputs=web_link, outputs=[btn_1, btn_2, btn_3, df_summarise, df_string_output])
|
2657 |
|
2658 |
# reading_passage event
|
2659 |
+
reading_passage_get_button.click(
|
2660 |
+
get_LLM_content,
|
2661 |
+
inputs=[video_id, reading_passage_kind],
|
2662 |
+
outputs=[reading_passage_text]
|
2663 |
+
)
|
2664 |
reading_passage_create_button.click(
|
2665 |
create_LLM_content,
|
2666 |
inputs=[video_id, df_string_output, reading_passage_kind],
|
2667 |
+
outputs=[reading_passage_text]
|
2668 |
)
|
2669 |
reading_passage_delete_button.click(
|
2670 |
delete_LLM_content,
|
2671 |
inputs=[video_id, reading_passage_kind],
|
2672 |
+
outputs=[reading_passage_text]
|
2673 |
)
|
2674 |
reading_passage_edit_button.click(
|
2675 |
enable_edit_mode,
|
2676 |
inputs=[],
|
2677 |
+
outputs=[reading_passage_text]
|
2678 |
)
|
2679 |
reading_passage_update_button.click(
|
2680 |
update_LLM_content,
|
2681 |
+
inputs=[video_id, reading_passage_text, reading_passage_kind],
|
2682 |
+
outputs=[reading_passage_text]
|
2683 |
)
|
2684 |
|
2685 |
# summary event
|
2686 |
+
summary_get_button.click(
|
2687 |
+
get_LLM_content,
|
2688 |
+
inputs=[video_id, summary_kind],
|
2689 |
+
outputs=[summary_text]
|
2690 |
+
)
|
2691 |
summary_create_button.click(
|
2692 |
create_LLM_content,
|
2693 |
inputs=[video_id, df_string_output, summary_kind],
|
2694 |
+
outputs=[summary_text]
|
2695 |
)
|
2696 |
summary_delete_button.click(
|
2697 |
delete_LLM_content,
|
2698 |
inputs=[video_id, summary_kind],
|
2699 |
+
outputs=[summary_text]
|
2700 |
)
|
2701 |
summary_edit_button.click(
|
2702 |
enable_edit_mode,
|
2703 |
inputs=[],
|
2704 |
+
outputs=[summary_text]
|
2705 |
)
|
2706 |
summary_update_button.click(
|
2707 |
update_LLM_content,
|
2708 |
+
inputs=[video_id, summary_text, summary_kind],
|
2709 |
+
outputs=[summary_text]
|
2710 |
)
|
2711 |
|
2712 |
# transcript event
|