taishi-i's picture
update app.py
b5f5790
Raw
History Blame
7.78 kB
import json
import random
import gradio as gr
import pandas as pd
def read_json(file_name):
with open(file_name, "r", encoding="utf-8") as f:
json_data = json.load(f)
return json_data
# Load data
json_file = "awesome-ChatGPT-repositories.json"
json_data = read_json(json_file)
candidate_words_file = "candidate_words.json"
candidate_words_data = read_json(candidate_words_file)
candidate_words = candidate_words_data.get("candidate_words", [])
# Build repository data with categories
repos_data = []
categories = set()
for category, repos in json_data["contents"].items():
categories.add(category)
for url, repo in repos.items():
repos_data.append({
"url": url,
"name": repo["repository_name"],
"user": repo.get("user_name", ""),
"language": repo.get("language") or "N/A",
"license": repo.get("license") or "N/A",
"description_en": repo["multilingual_descriptions"].get("en", ""),
"description_ja": repo["multilingual_descriptions"].get("ja", ""),
"description_zh_hans": repo["multilingual_descriptions"].get("zh-hans", ""),
"description_zh_hant": repo["multilingual_descriptions"].get("zh-hant", ""),
"topics": repo.get("topics", []),
"category": category,
})
categories = sorted(list(categories))
total_repos = len(repos_data)
def get_description(repo, lang):
"""Get description based on language selection"""
if lang == "English":
return repo["description_en"]
elif lang == "Japanese":
return repo["description_ja"]
elif lang == "Chinese (Simplified)":
return repo["description_zh_hans"]
elif lang == "Chinese (Traditional)":
return repo["description_zh_hant"]
return repo["description_en"]
def search_repos(query, selected_categories, selected_language, lang):
"""Search repositories based on query and filters"""
results = []
query_lower = query.lower().strip()
queries = query_lower.split() if query_lower else []
for repo in repos_data:
# Category filter
if selected_categories and repo["category"] not in selected_categories:
continue
# Language filter
if selected_language and selected_language != "All" and repo["language"] != selected_language:
continue
# Text search
if queries:
description = get_description(repo, lang).lower()
name_lower = repo["name"].lower()
topics_str = " ".join(repo["topics"]).lower()
search_text = f"{name_lower} {description} {topics_str}"
if not all(q in search_text for q in queries):
continue
results.append(repo)
return results
def format_results(results, lang):
"""Format results for display"""
if not results:
return pd.DataFrame(columns=["Repository", "Category", "Language", "Description"])
data = {
"Repository": [],
"Category": [],
"Language": [],
"Description": [],
}
for repo in results:
repo_link = f"[{repo['name']}]({repo['url']})"
description = get_description(repo, lang)
# Truncate long descriptions
if len(description) > 150:
description = description[:147] + "..."
data["Repository"].append(repo_link)
data["Category"].append(repo["category"])
data["Language"].append(repo["language"])
data["Description"].append(description)
return pd.DataFrame(data)
def do_search(query, selected_categories, selected_language, lang):
"""Main search function"""
results = search_repos(query, selected_categories, selected_language, lang)
df = format_results(results, lang)
count_text = f"Found **{len(results)}** repositories"
return df, count_text
def get_random_suggestion():
"""Get random search suggestion from candidate words"""
if candidate_words:
suggestions = random.sample(candidate_words, min(5, len(candidate_words)))
return ", ".join(suggestions)
return "prompt, langchain, agent, chatbot, api"
def get_languages():
"""Get unique programming languages"""
languages = set()
for repo in repos_data:
if repo["language"] and repo["language"] != "N/A":
languages.add(repo["language"])
return ["All"] + sorted(list(languages))
# Build the Gradio interface
with gr.Blocks(
title="Awesome ChatGPT Repositories Search",
theme=gr.themes.Soft(),
) as demo:
gr.Markdown(
"""
# Awesome ChatGPT Repositories Search
Discover and explore **{total}** open-source repositories from the [awesome-ChatGPT-repositories](https://github.com/taishi-i/awesome-ChatGPT-repositories) collection.
Find tools, libraries, and projects related to ChatGPT, LLMs, and AI.
""".format(total=total_repos)
)
with gr.Row():
with gr.Column(scale=3):
query_input = gr.Textbox(
label="Search",
placeholder="Enter keywords to search (e.g., prompt, langchain, agent)",
)
suggestion = gr.Markdown(
f"*Try searching:* {get_random_suggestion()}",
)
with gr.Column(scale=1):
display_lang = gr.Dropdown(
choices=["English", "Japanese", "Chinese (Simplified)", "Chinese (Traditional)"],
value="English",
label="Description Language",
)
with gr.Accordion("Filters", open=False):
with gr.Row():
with gr.Column():
category_filter = gr.CheckboxGroup(
choices=categories,
label="Categories",
)
with gr.Column():
language_filter = gr.Dropdown(
choices=get_languages(),
value="All",
label="Programming Language",
)
result_count = gr.Markdown("")
results_table = gr.DataFrame(
value=format_results(repos_data[:100], "English"),
datatype=["markdown", "str", "str", "str"],
interactive=False,
wrap=True,
)
gr.Markdown(
"""
---
**Tips:**
- Use multiple keywords separated by spaces for AND search
- Use filters to narrow down results by category or programming language
- Click on repository names to visit their GitHub pages
Made with Gradio | Data from [awesome-ChatGPT-repositories](https://github.com/taishi-i/awesome-ChatGPT-repositories)
"""
)
# Event handlers
def on_search_change(query, categories, language, lang):
return do_search(query, categories, language, lang)
query_input.change(
fn=on_search_change,
inputs=[query_input, category_filter, language_filter, display_lang],
outputs=[results_table, result_count],
)
category_filter.change(
fn=on_search_change,
inputs=[query_input, category_filter, language_filter, display_lang],
outputs=[results_table, result_count],
)
language_filter.change(
fn=on_search_change,
inputs=[query_input, category_filter, language_filter, display_lang],
outputs=[results_table, result_count],
)
display_lang.change(
fn=on_search_change,
inputs=[query_input, category_filter, language_filter, display_lang],
outputs=[results_table, result_count],
)
# Initialize with all results
demo.load(
fn=lambda: do_search("", [], "All", "English"),
outputs=[results_table, result_count],
)
if __name__ == "__main__":
demo.launch()