fix: resolve type error in gist sync and implement full English localization for charts
This commit is contained in:
@@ -7,7 +7,7 @@ A collection of enhancements, plugins, and prompts for [OpenWebUI](https://githu
|
|||||||
|
|
||||||
<!-- STATS_START -->
|
<!-- STATS_START -->
|
||||||
## 📊 Community Stats
|
## 📊 Community Stats
|
||||||
> 🕐 Auto-updated: 2026-02-11 12:29
|
> 🕐 Auto-updated: 2026-02-11 12:35
|
||||||
|
|
||||||
| 👤 Author | 👥 Followers | ⭐ Points | 🏆 Contributions |
|
| 👤 Author | 👥 Followers | ⭐ Points | 🏆 Contributions |
|
||||||
| :---: | :---: | :---: | :---: |
|
| :---: | :---: | :---: | :---: |
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ OpenWebUI 增强功能集合。包含个人开发与收集的插件、提示词
|
|||||||
|
|
||||||
<!-- STATS_START -->
|
<!-- STATS_START -->
|
||||||
## 📊 社区统计
|
## 📊 社区统计
|
||||||
> 🕐 自动更新于 2026-02-11 12:29
|
> 🕐 自动更新于 2026-02-11 12:35
|
||||||
|
|
||||||
| 👤 作者 | 👥 粉丝 | ⭐ 积分 | 🏆 贡献 |
|
| 👤 作者 | 👥 粉丝 | ⭐ 积分 | 🏆 贡献 |
|
||||||
| :---: | :---: | :---: | :---: |
|
| :---: | :---: | :---: | :---: |
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"total_posts": 22,
|
"total_posts": 22,
|
||||||
"total_downloads": 4156,
|
"total_downloads": 4160,
|
||||||
"total_views": 45923,
|
"total_views": 45940,
|
||||||
"total_upvotes": 231,
|
"total_upvotes": 231,
|
||||||
"total_downvotes": 2,
|
"total_downvotes": 2,
|
||||||
"total_saves": 274,
|
"total_saves": 274,
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
"author": "Fu-Jie",
|
"author": "Fu-Jie",
|
||||||
"description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.",
|
"description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.",
|
||||||
"downloads": 954,
|
"downloads": 954,
|
||||||
"views": 8387,
|
"views": 8389,
|
||||||
"upvotes": 22,
|
"upvotes": 22,
|
||||||
"saves": 50,
|
"saves": 50,
|
||||||
"comments": 13,
|
"comments": 13,
|
||||||
@@ -38,8 +38,8 @@
|
|||||||
"version": "1.5.0",
|
"version": "1.5.0",
|
||||||
"author": "Fu-Jie",
|
"author": "Fu-Jie",
|
||||||
"description": "AI-powered infographic generator based on AntV Infographic. Supports professional templates, auto-icon matching, and SVG/PNG downloads.",
|
"description": "AI-powered infographic generator based on AntV Infographic. Supports professional templates, auto-icon matching, and SVG/PNG downloads.",
|
||||||
"downloads": 707,
|
"downloads": 710,
|
||||||
"views": 6702,
|
"views": 6712,
|
||||||
"upvotes": 24,
|
"upvotes": 24,
|
||||||
"saves": 34,
|
"saves": 34,
|
||||||
"comments": 10,
|
"comments": 10,
|
||||||
@@ -134,8 +134,8 @@
|
|||||||
"version": "",
|
"version": "",
|
||||||
"author": "",
|
"author": "",
|
||||||
"description": "",
|
"description": "",
|
||||||
"downloads": 200,
|
"downloads": 201,
|
||||||
"views": 2778,
|
"views": 2781,
|
||||||
"upvotes": 9,
|
"upvotes": 9,
|
||||||
"saves": 6,
|
"saves": 6,
|
||||||
"comments": 0,
|
"comments": 0,
|
||||||
@@ -295,7 +295,7 @@
|
|||||||
"author": "Fu-Jie",
|
"author": "Fu-Jie",
|
||||||
"description": "A specialized filter to bypass OpenWebUI's default RAG for GitHub Copilot SDK models. It moves uploaded files to a safe location ('copilot_files') so the Copilot Pipe can process them natively without interference.",
|
"description": "A specialized filter to bypass OpenWebUI's default RAG for GitHub Copilot SDK models. It moves uploaded files to a safe location ('copilot_files') so the Copilot Pipe can process them natively without interference.",
|
||||||
"downloads": 16,
|
"downloads": 16,
|
||||||
"views": 856,
|
"views": 858,
|
||||||
"upvotes": 3,
|
"upvotes": 3,
|
||||||
"saves": 0,
|
"saves": 0,
|
||||||
"comments": 0,
|
"comments": 0,
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
# 📊 OpenWebUI Community Stats Report
|
# 📊 OpenWebUI Community Stats Report
|
||||||
|
|
||||||
> 📅 Updated: 2026-02-11 12:29
|
> 📅 Updated: 2026-02-11 12:35
|
||||||
|
|
||||||
### 📈 增长与趋势 (Last 14 Days)
|
### 📈 Growth & Trends (Last 14 Days)
|
||||||

|

|
||||||
|
|
||||||
> *蓝色: 总下载量 | 紫色: 总浏览量 (实时动态生成)*
|
> *Blue: Downloads | Purple: Views (Real-time dynamic)*
|
||||||
|
|
||||||
### 📂 内容分类占比 (Distribution)
|
### 📂 Content Distribution
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
## 📈 Overview
|
## 📈 Overview
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
# 📊 OpenWebUI 社区统计报告
|
# 📊 OpenWebUI 社区统计报告
|
||||||
|
|
||||||
> 📅 更新时间: 2026-02-11 12:29
|
> 📅 更新时间: 2026-02-11 12:35
|
||||||
|
|
||||||
### 📈 增长与趋势 (Last 14 Days)
|
### 📈 增长与趋势 (Last 14 Days)
|
||||||

|

|
||||||
|
|
||||||
> *蓝色: 总下载量 | 紫色: 总浏览量 (实时动态生成)*
|
> *蓝色: 总下载量 | 紫色: 总浏览量 (实时动态生成)*
|
||||||
|
|
||||||
### 📂 内容分类占比 (Distribution)
|
### 📂 内容分类占比 (Distribution)
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
## 📈 总览
|
## 📈 总览
|
||||||
|
|||||||
@@ -272,22 +272,34 @@ class OpenWebUIStats:
|
|||||||
print(f"⚠️ 无法从 Token 解析用户 ID: {e}")
|
print(f"⚠️ 无法从 Token 解析用户 ID: {e}")
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
def generate_mermaid_chart(self, stats: dict = None) -> str:
|
def generate_mermaid_chart(self, stats: dict = None, lang: str = "zh") -> str:
|
||||||
"""生成支持 Kroki 服务端渲染的动态 Mermaid 图表链接 (零 Commit)"""
|
"""生成支持 Kroki 服务端渲染的动态 Mermaid 图表链接 (零 Commit)"""
|
||||||
history = self.load_history()
|
history = self.load_history()
|
||||||
if not history:
|
if not history:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
# 多语言标签
|
||||||
|
labels = {
|
||||||
|
"zh": {
|
||||||
|
"trend_title": "增长与趋势 (Last 14 Days)",
|
||||||
|
"trend_subtitle": "Engagement & Downloads Trend",
|
||||||
|
"legend": "蓝色: 总下载量 | 紫色: 总浏览量 (实时动态生成)",
|
||||||
|
"dist_title": "内容分类占比 (Distribution)",
|
||||||
|
"dist_subtitle": "Plugin Types Distribution",
|
||||||
|
},
|
||||||
|
"en": {
|
||||||
|
"trend_title": "Growth & Trends (Last 14 Days)",
|
||||||
|
"trend_subtitle": "Engagement & Downloads Trend",
|
||||||
|
"legend": "Blue: Downloads | Purple: Views (Real-time dynamic)",
|
||||||
|
"dist_title": "Content Distribution",
|
||||||
|
"dist_subtitle": "Plugin Types Distribution",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
l = labels.get(lang, labels["en"])
|
||||||
|
|
||||||
def kroki_render(mermaid_code: str) -> str:
|
def kroki_render(mermaid_code: str) -> str:
|
||||||
"""将 Mermaid 代码压缩并编码为 Kroki 链接"""
|
"""将 Mermaid 代码压缩并编码为 Kroki 链接"""
|
||||||
try:
|
try:
|
||||||
# 实际上由于我们要实现零 Commit,Markdown 文件里的链接必须是固定的
|
|
||||||
# 但 Mermaid 数据是动态的。为了完全不改动 md 文件就能变,
|
|
||||||
# 只有一种办法:使用外部服务读取 Gist 原始数据并生成图片。
|
|
||||||
# 由于 Mermaid 本身不支持这种外部数据引用,我们采取折中方案:
|
|
||||||
# 在 generate_markdown 时生成最新的 Kroki 链接。
|
|
||||||
# 只要这个方法被调用并写回 md,它本质上还是改了 md。
|
|
||||||
# 如果要完全不改 md,只能在 md 里放一个固定链接,比如指向一个会自动更新图片的 API。
|
|
||||||
compressed = zlib.compress(mermaid_code.encode("utf-8"), level=9)
|
compressed = zlib.compress(mermaid_code.encode("utf-8"), level=9)
|
||||||
encoded = base64.urlsafe_b64encode(compressed).decode("utf-8")
|
encoded = base64.urlsafe_b64encode(compressed).decode("utf-8")
|
||||||
return f"https://kroki.io/mermaid/svg/{encoded}"
|
return f"https://kroki.io/mermaid/svg/{encoded}"
|
||||||
@@ -305,15 +317,15 @@ class OpenWebUIStats:
|
|||||||
vws = [str(item["total_views"]) for item in data]
|
vws = [str(item["total_views"]) for item in data]
|
||||||
|
|
||||||
mm = f"""xychart-beta
|
mm = f"""xychart-beta
|
||||||
title "Engagement & Downloads Trend"
|
title "{l['trend_subtitle']}"
|
||||||
x-axis [{dates_str}]
|
x-axis [{dates_str}]
|
||||||
y-axis "Total Counts"
|
y-axis "Total Counts"
|
||||||
line [{', '.join(dls)}]
|
line [{', '.join(dls)}]
|
||||||
line [{', '.join(vws)}]"""
|
line [{', '.join(vws)}]"""
|
||||||
|
|
||||||
charts.append("### 📈 增长与趋势 (Last 14 Days)")
|
charts.append(f"### 📈 {l['trend_title']}")
|
||||||
charts.append(f"})")
|
charts.append(f"})")
|
||||||
charts.append("\n> *蓝色: 总下载量 | 紫色: 总浏览量 (实时动态生成)*")
|
charts.append(f"\n> *{l['legend']}*")
|
||||||
charts.append("")
|
charts.append("")
|
||||||
|
|
||||||
# 2. 插件类型分布 (Pie Chart)
|
# 2. 插件类型分布 (Pie Chart)
|
||||||
@@ -324,8 +336,8 @@ class OpenWebUIStats:
|
|||||||
for p_type, count in stats["by_type"].items()
|
for p_type, count in stats["by_type"].items()
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
mm = f"pie title Plugin Types\n{pie_data}"
|
mm = f"pie title \"{l['dist_subtitle']}\"\n{pie_data}"
|
||||||
charts.append("### 📂 内容分类占比 (Distribution)")
|
charts.append(f"### 📂 {l['dist_title']}")
|
||||||
charts.append(f"})")
|
charts.append(f"})")
|
||||||
charts.append("")
|
charts.append("")
|
||||||
|
|
||||||
@@ -550,8 +562,8 @@ class OpenWebUIStats:
|
|||||||
md.append(t["updated"])
|
md.append(t["updated"])
|
||||||
md.append("")
|
md.append("")
|
||||||
|
|
||||||
# 插入趋势图 (使用 Kroki SVG 链接,理论上每次生成内容都随数据变)
|
# 插入趋势图 (使用 Kroki SVG 链接)
|
||||||
chart = self.generate_mermaid_chart(stats)
|
chart = self.generate_mermaid_chart(stats, lang=lang)
|
||||||
if chart:
|
if chart:
|
||||||
md.append(chart)
|
md.append(chart)
|
||||||
md.append("")
|
md.append("")
|
||||||
@@ -725,6 +737,8 @@ class OpenWebUIStats:
|
|||||||
files_payload = {}
|
files_payload = {}
|
||||||
for key, (label, val, color) in badges_config.items():
|
for key, (label, val, color) in badges_config.items():
|
||||||
diff = delta.get(key, 0)
|
diff = delta.get(key, 0)
|
||||||
|
if isinstance(diff, dict):
|
||||||
|
diff = 0 # 避免 'posts' key 导致的 dict vs int 比较错误
|
||||||
|
|
||||||
message = f"{val}"
|
message = f"{val}"
|
||||||
if diff > 0:
|
if diff > 0:
|
||||||
|
|||||||
Reference in New Issue
Block a user