CC / app.py
yilunzhao's picture
Update app.py
4fa8658 verified
raw
history blame
6.9 kB
import gradio as gr
import asyncio
import os
import json
import urllib.request
from openai import AsyncOpenAI
# 第一个功能:检查YouTube视频是否具有Creative Commons许可证
# 请确保在环境变量中设置了您的YouTube Data API密钥
API_KEY = "AIzaSyDyPpkFRUpUuSMQbhxwTFxCBLK5qTHU-ms"
def get_youtube_id(youtube_url):
if 'youtube.com' in youtube_url:
video_id = youtube_url.split('v=')[-1]
video_id = video_id.split('&')[0] # 移除可能的额外参数
elif 'youtu.be' in youtube_url:
video_id = youtube_url.split('/')[-1].split('?')[0]
else:
video_id = ''
return video_id
def check_cc_license(youtube_url):
# 从URL中提取视频ID
video_id = get_youtube_id(youtube_url)
if not video_id:
return "Invalid YouTube URL."
# YouTube Data API URL,用于获取视频详情
api_url = f'https://www.googleapis.com/youtube/v3/videos?id={video_id}&part=status&key={API_KEY}'
try:
# 获取视频详情
response = urllib.request.urlopen(api_url)
data = json.load(response)
# 检查许可证状态
if 'items' in data and len(data['items']) > 0:
item = data['items'][0]
if item['status']['license'] == 'creativeCommon':
return "Yes."
else:
return "No."
else:
return "Video not found."
except Exception as e:
return f"An error occurred: {str(e)}"
# 第二个功能:为多项选择题生成干扰项
# 从您的模块中导入必要的函数
from utils.generate_distractors import prepare_q_inputs, construct_prompt_textonly, generate_distractors
from utils.api_utils import generate_from_openai_chat_completion
async def generate_distractors_async(model_name: str,
queries: list,
n: int=1,
max_tokens: int=4096):
assert model_name in ["gpt-4o-mini", "gpt-4-turbo", "gpt-4o", "gpt-4o-2024-08-06"], "Invalid model name"
client = AsyncOpenAI(api_key=os.environ.get("OPENAI_API_KEY"), base_url="https://yanlp.zeabur.app/v1")
messages = prepare_q_inputs(queries)
# 直接等待协程而不是使用asyncio.run()
responses = await generate_from_openai_chat_completion(
client,
messages=messages,
engine_name=model_name,
n=n,
max_tokens=max_tokens,
requests_per_minute=30,
json_format=True
)
for query, response in zip(queries, responses):
new_options = response
if new_options and "distractors" in new_options:
query["option_5"] = new_options["distractors"].get("E", "")
query["option_6"] = new_options["distractors"].get("F", "")
query["option_7"] = new_options["distractors"].get("G", "")
query["distractor_analysis"] = new_options["distractors"].get("analysis_of_distractors", "")
else:
query["option_5"] = ""
query["option_6"] = ""
query["option_7"] = ""
query["distractor_analysis"] = ""
return queries
# 定义异步处理函数
async def generate_distractors_gradio(question, option1, option2, option3, option4, answer, answer_analysis):
is_valid, message = validate_inputs(question, option1, option2, option3, option4, answer, answer_analysis)
if not is_valid:
return {"error": message}, "" # Output error message
query = {
'question': question,
'option_1': option1,
'option_2': option2,
'option_3': option3,
'option_4': option4,
'answer': answer,
'answer_analysis': answer_analysis
}
queries = [query] # 因为函数期望的是一个列表
# 调用异步生成干扰项的函数
results = await generate_distractors_async(
model_name="gpt-4o",
queries=queries,
n=1,
max_tokens=4096
)
# 提取结果
result = results[0]
new_options = {
'E': result.get('option_5', ''),
'F': result.get('option_6', ''),
'G': result.get('option_7', '')
}
new_option_str = f"E: {new_options['E']}\nF:{new_options['F']}\nG:{new_options['G']}"
distractor_analysis = result.get('distractor_analysis', '')
# 返回新的干扰项和分析
return new_option_str, distractor_analysis
def validate_inputs(question, option1, option2, option3, option4, answer, analysis):
if not question:
return False, "问题不能为空"
if not option1:
return False, "选项A不能为空"
if not option2:
return False, "选项B不能为空"
if not option3:
return False, "选项C不能为空"
if not option4:
return False, "选项D不能为空"
if not answer:
return False, "正确答案不能为空"
if not analysis:
return False, "答案解析不能为空"
return True, ""
with gr.Blocks() as demo:
gr.Markdown("# CC检查器和干扰项生成器")
with gr.Tabs():
with gr.TabItem("YouTube Creative Commons检查器"):
gr.Markdown("## 检查YouTube视频是否具有Creative Commons许可证")
youtube_url_input = gr.Textbox(label="YouTube视频URL")
cc_license_output = gr.Textbox(label="是否为Creative Commons许可证?")
check_button = gr.Button("检查许可证")
check_button.click(
fn=check_cc_license,
inputs=youtube_url_input,
outputs=cc_license_output
)
with gr.TabItem("多项选择题干扰项生成器"):
gr.Markdown("## 为多项选择题生成干扰项")
with gr.Row():
question_input = gr.Textbox(label="问题", lines=2)
with gr.Row():
option1_input = gr.Textbox(label="选项A")
option2_input = gr.Textbox(label="选项B")
option3_input = gr.Textbox(label="选项C")
option4_input = gr.Textbox(label="选项D")
with gr.Row():
answer_input = gr.Textbox(label="正确答案(A/B/C/D)")
with gr.Row():
answer_analysis_input = gr.Textbox(label="答案解析", lines=3)
generate_button = gr.Button("生成干扰项")
output_options = gr.Textbox(label="生成的干扰选项")
output_analysis = gr.Textbox(label="干扰项解析", lines=5)
generate_button.click(
fn=generate_distractors_gradio,
inputs=[question_input, option1_input, option2_input, option3_input, option4_input, answer_input, answer_analysis_input],
outputs=[output_options, output_analysis]
)
# 运行Gradio应用
demo.launch()