Spaces:
Sleeping
Sleeping
# import gradio as gr | |
# import json, os | |
# import urllib.request | |
# # Replace 'YOUR_API_KEY' with your actual YouTube Data API key | |
# API_KEY = os.getenv('api_key') | |
# def get_youtube_id(youtube_url): | |
# if 'youtube.com' in youtube_url: | |
# video_id = youtube_url.split('v=')[-1] | |
# elif 'youtu.be' in youtube_url: | |
# video_id = youtube_url.split('/')[-1].split('?')[0] | |
# return video_id | |
# def check_cc_license(youtube_url): | |
# # Extract video ID from the URL | |
# video_id = get_youtube_id(youtube_url) | |
# # YouTube Data API URL to get video details | |
# api_url = f'https://www.googleapis.com/youtube/v3/videos?id={video_id}&part=status&key={API_KEY}' | |
# try: | |
# # Fetch video details | |
# response = urllib.request.urlopen(api_url) | |
# data = json.load(response) | |
# # Check the license status | |
# for item in data['items']: | |
# if item['status']['license'] == 'creativeCommon': | |
# return f"Yes." | |
# else: | |
# return f"No." | |
# except Exception as e: | |
# return f"An error occurred: {str(e)}" | |
# # Gradio interface | |
# interface = gr.Interface( | |
# fn=check_cc_license, | |
# inputs=gr.Textbox(label="YouTube Video URL"), | |
# outputs=gr.Textbox(label="Creative Commons license?") | |
# ) | |
# if __name__ == "__main__": | |
# interface.launch() | |
# import gradio as gr | |
# import asyncio | |
# import os | |
# from openai import AsyncOpenAI | |
# # 从您的模块中导入必要的函数 | |
# from utils.generate_distractors import prepare_q_inputs, construct_prompt_textonly, generate_distractors | |
# from utils.api_utils import generate_from_openai_chat_completion | |
# # 修改generate_distractors函数,使其成为异步函数 | |
# # 假设generate_distractors函数定义在您的模块中,我们需要修改它 | |
# # 如果无法修改原始模块,请在此处重新定义 | |
# 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): | |
# 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-mini", | |
# 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', '') | |
# } | |
# distractor_analysis = result.get('distractor_analysis', '') | |
# # 返回新的干扰项和分析 | |
# return new_options, distractor_analysis | |
# # 创建Gradio界面 | |
# with gr.Blocks() as demo: | |
# 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") | |
# with gr.Row(): | |
# option3_input = gr.Textbox(label="选项C") | |
# option4_input = gr.Textbox(label="选项D") | |
# with gr.Row(): | |
# answer_input = gr.Textbox(label="正确答案") | |
# with gr.Row(): | |
# answer_analysis_input = gr.Textbox(label="答案解析", lines=3) | |
# with gr.Row(): | |
# generate_button = gr.Button("生成干扰项") | |
# with gr.Row(): | |
# output_options = gr.JSON(label="生成的干扰选项") | |
# with gr.Row(): | |
# output_analysis = gr.Textbox(label="干扰项解析", lines=5) | |
# # 定义按钮点击事件,注意这里不需要修改,Gradio会自动处理异步函数 | |
# 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() | |
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" | |
os.environ["OPENAI_API_KEY"] = "sk-h8rybT55JORrT40y2397A06c8f2444F8Ad49407fE85eBf76" | |
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 | |
# 修改generate_distractors函数,使其成为异步函数 | |
# 假设generate_distractors函数定义在您的模块中,我们需要修改它 | |
# 如果无法修改原始模块,请在此处重新定义 | |
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): | |
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-mini", | |
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', '') | |
} | |
distractor_analysis = result.get('distractor_analysis', '') | |
# 返回新的干扰项和分析 | |
return new_options, distractor_analysis | |
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") | |
with gr.Row(): | |
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.JSON(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() | |