talkshow


Nametalkshow JSON
Version 0.1.3 PyPI version JSON
download
home_pagehttps://github.com/cjhgo/talkshow
SummaryChat History Analysis and Visualization Tool
upload_time2025-08-01 13:02:19
maintainerNone
docs_urlNone
authorTalkShow Team
requires_python>=3.8
licenseMIT
keywords chat history analysis visualization markdown llm
VCS
bugtrack_url
requirements pytest pytest-cov litellm pyyaml click rich psutil fastapi uvicorn jinja2
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 🎭 TalkShow - Chat History Analysis and Visualization Tool

TalkShow 是一个专门用于分析和可视化 SpecStory 插件生成的聊天历史记录的工具。在 LLM 辅助编程的时代,聊天历史比代码更重要 —— 它记录了代码背后的"为什么"。

## 🌟 项目特色

- **智能解析**:自动解析 SpecStory 生成的 Markdown 聊天记录
- **内容摘要**:支持基于规则和 LLM 的智能摘要生成
- **可视化界面**:现代化 Web 时间轴 + 命令行工具双重体验
- **灵活配置**:多种配置方式,环境变量、配置文件或混合模式
- **优雅降级**:无 API 配置时自动使用规则摘要
- **灵活存储**:支持 JSON 和 SQLite 存储
- **渐进式架构**:模块化设计,支持逐步扩展功能

## 🚀 快速开始

### 安装

```bash
# 从源码安装(开发模式)
git clone <repository-url>
cd talkshow
pip install -r requirements.txt
pip install -e .

# 或从 PyPI 安装(发布后)
pip install talkshow
```

### 基础使用

1. **初始化配置**(在包含 `.specstory` 目录的项目中):

```bash
talkshow init
```

2. **解析聊天历史**:

```bash
talkshow parse
```

3. **启动 Web 服务器**:

```bash
talkshow server
```

4. **运行测试验证功能**:

```bash
python -m pytest tests/ -v
```

## 📊 当前实现状态

### ✅ Phase 1: 数据分析核心 (MVP) - 已完成

- [x] **数据模型** (`talkshow/models/`)
  - `ChatSession`: 完整聊天会话表示
  - `QAPair`: 问答对数据结构  
  - `SessionMeta`: 会话元数据管理

- [x] **MD 文件解析器** (`talkshow/parser/`)
  - 智能解析 SpecStory 格式的 MD 文件
  - 提取 User/Assistant 对话内容
  - 自动提取时间戳信息
  - 从文件名提取主题

- [x] **存储层** (`talkshow/storage/`)
  - JSON 文件存储实现
  - 完整的 CRUD 操作支持
  - 数据备份和恢复功能

- [x] **摘要器** (`talkshow/summarizer/`)
  - 基于规则的文本摘要
  - 智能长度控制
  - 支持中英文内容

- [x] **测试套件** (`tests/`)
  - 35 个测试用例,97% 通过率
  - 覆盖解析、存储、摘要等核心功能

### 📈 实际效果展示

通过对当前 history 目录的分析,TalkShow 成功:

- 📁 **解析了 127 个有效聊天会话**
- 💬 **提取了 461 个 Q&A 对话**
- 📝 **生成了 11 个智能摘要**
- 💾 **数据文件大小:2.2MB**
- 📅 **时间跨度:2025-06-03 到 2025-07-16**

## 🏗️ 项目架构

```
talkshow/
├── talkshow/                    # 核心库
│   ├── models/                  # 数据模型
│   │   ├── chat.py             # ChatSession, QAPair, SessionMeta
│   │   └── storage.py          # 存储接口定义
│   ├── parser/                  # MD 文件解析
│   │   ├── md_parser.py        # 主解析器
│   │   └── time_extractor.py   # 时间提取器
│   ├── summarizer/              # 摘要生成
│   │   ├── rule_summarizer.py  # 基于规则的摘要器
│   │   └── llm_summarizer.py   # LLM 智能摘要器
│   ├── storage/                 # 数据存储
│   │   └── json_storage.py     # JSON 存储实现
│   ├── config/                  # 配置管理
│   │   └── config_manager.py   # 统一配置管理
│   ├── cli/                     # CLI 工具
│   │   ├── main.py             # CLI 主入口
│   │   └── commands.py         # CLI 命令实现
│   └── web/                     # Web 前端
│       ├── app.py              # FastAPI 应用
│       ├── routers/            # API 路由
│       └── static/             # 前端资源
│           ├── index.html      # 主页面
│           ├── style.css       # 样式文件
│           └── script.js       # 前端逻辑
├── scripts/                     # 脚本工具
│   ├── demo_parser.py          # 解析演示脚本
│   ├── simple_cli.py           # CLI 工具
│   ├── web_server.py           # Web 服务器启动
│   ├── daily_insights.py       # 每日洞察生成
│   ├── advanced_demo.py        # 高级演示脚本
│   └── final_demo.py           # 最终演示脚本
├── tests/                       # 测试套件
│   ├── test_parser.py          # 解析器测试
│   ├── test_storage.py         # 存储测试
│   ├── test_summarizer.py      # 摘要器测试
│   ├── test_llm_summarizer.py  # LLM 摘要器测试
│   └── test_moon.py            # Moonshot API 测试
├── config/                      # 配置文件
│   └── default.yaml            # 默认配置
└── data/                        # 生成的数据
    ├── web_sessions.json       # Web 端数据
    ├── parsed_sessions.json    # 解析数据
    ├── daily_insights.json     # 每日洞察
    └── *.html                  # 生成的报告
```

## 📅 开发阶段完成情况

### ✅ Phase 1: 数据分析核心 (MVP) - 已完成
- [x] 数据模型定义 (ChatSession, QAPair, SessionMeta)
- [x] MD 文件解析器 (支持 SpecStory 格式)
- [x] JSON 存储层 (完整 CRUD 操作)
- [x] 基于规则的摘要器 (智能长度控制)
- [x] 完整测试套件 (35个测试,97% 通过率)

### ✅ Phase 2: CLI 工具 - 已完成  
- [x] 命令行界面 (`init`, `parse`, `server`)
- [x] 支持摘要生成选项 (`--summarize`)
- [x] 支持 LLM 摘要选项 (`--use-llm`)
- [x] 交互式查询和统计功能

### ✅ Phase 3: LLM 集成 - 已完成
- [x] 集成 LiteLLM 支持 Moonshot AI
- [x] 配置管理系统 (环境变量和配置文件)
- [x] 智能摘要生成 (中英文支持)
- [x] 错误处理和降级机制

### ✅ Phase 4: Web 前端 - 已完成
- [x] FastAPI 后端 API (完整 RESTful 接口)
- [x] 时间轴表格可视化界面 (滑动展示设计)
- [x] 交互式聊天记录浏览 (搜索、筛选、实时加载)

### 🚧 Phase 5: 高级功能 - 待开发
- [ ] SQLite 存储支持
- [ ] 全文搜索功能
- [ ] 标签和分类系统
- [ ] 数据导出功能

## 🛠️ 技术栈

- **核心语言**: Python 3.8+
- **测试框架**: pytest (35个测试,97% 通过率)
- **LLM 集成**: LiteLLM + Moonshot AI
- **Web 后端**: FastAPI + Uvicorn (异步高性能)
- **Web 前端**: 原生 HTML/CSS/JS (轻量响应式)
- **数据存储**: JSON (当前), SQLite (计划) 
- **配置管理**: YAML + 环境变量
- **CLI 工具**: Click + Rich (增强体验)

## 📖 使用示例

### CLI 工具使用

```bash
# 初始化配置
talkshow init

# 基础解析(仅解析,不生成摘要)
talkshow parse

# 使用 LLM 智能摘要
talkshow parse --use-llm

# 启动 Web 服务器
talkshow server

# 停止 Web 服务器
talkshow stop

# 强制停止服务器(无需确认)
talkshow stop --force

# 指定端口启动服务器
talkshow server --port 8080

# 指定端口停止服务器
talkshow stop --port 8080

# 查看帮助
talkshow --help
talkshow parse --help
talkshow server --help
talkshow stop --help
```

### Web 前端使用

```bash
# 1. 初始化配置
talkshow init

# 2. 解析聊天历史
talkshow parse

# 3. 启动 Web 服务器
talkshow server

# 4. 访问浏览器
# 打开 http://localhost:8000 查看时间轴界面
# API 文档:http://localhost:8000/docs
```

**Web 功能特性:**
- 📊 **统计面板**:显示会话数、Q&A对话、摘要等统计信息
- 🔍 **实时搜索**:根据主题或内容筛选会话
- ⏰ **时间筛选**:按时间范围过滤会话
- 📋 **时间轴表格**:按计划设计的滑动展示界面
- 💬 **Q&A 浏览**:查看每个会话的详细对话内容
- 📤 **数据导出**:支持导出 JSON 格式数据

### Python API 使用

```python
from talkshow import MDParser, JSONStorage, RuleSummarizer, LLMSummarizer, ConfigManager

# 初始化组件
parser = MDParser()
storage = JSONStorage("data/sessions.json")
rule_summarizer = RuleSummarizer()

# LLM 摘要器(需要配置 API 密钥)
config_manager = ConfigManager()
llm_summarizer = LLMSummarizer(config_manager)

# 解析目录中的所有文件
sessions = parser.parse_directory("history")

# 生成智能摘要
for session in sessions:
    for qa_pair in session.qa_pairs:
        # 优先使用 LLM,失败时降级到规则摘要
        try:
            q_summary, a_summary = llm_summarizer.summarize_both(
                qa_pair.question, qa_pair.answer
            )
        except:
            q_summary, a_summary = rule_summarizer.summarize_both(
                qa_pair.question, qa_pair.answer
            )
        
        qa_pair.question_summary = q_summary
        qa_pair.answer_summary = a_summary

# 保存到存储
storage.save_sessions(sessions)
print(f"处理了 {len(sessions)} 个会话")
```

## ⚙️ 配置管理

TalkShow 支持多种灵活的配置方式,**不强制要求环境变量**:

### 🔒 方式一:环境变量(推荐)
```bash
export MOONSHOT_API_KEY="your_moonshot_api_key"
export LLM_MODEL="moonshot/kimi-k2-0711-preview"  # 可选
```

### 📄 方式二:配置文件
```yaml
# .specstory/talkshow.yaml
summarizer:
  llm:
    api_key: "your_moonshot_api_key"
    model: "moonshot/kimi-k2-0711-preview"
    max_tokens: 150
    temperature: 0.3
```

### 🔄 方式三:混合模式(推荐生产环境)
```yaml
# .specstory/talkshow.yaml - 通用配置
summarizer:
  llm:
    model: "moonshot/kimi-k2-0711-preview"
    max_tokens: 150
```
```bash
# 环境变量 - 敏感信息
export MOONSHOT_API_KEY="your_secret_key"
```

### 🚫 方式四:无配置(自动降级)
无需任何配置,自动使用规则摘要器,适合测试环境。

> **配置优先级**:环境变量 > 配置文件 > 默认值

## 🤝 贡献指南

1. Fork 项目
2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送分支 (`git push origin feature/AmazingFeature`)
5. 开启 Pull Request

## 📄 许可证

本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件

## 🎯 核心理念

> 在 LLM 生成代码的时代,chat history 比代码更重要 —— 它记录了代码产生过程中的动态决策和思路。就像 Git 记录代码版本一样,chat history 记录了代码写成这样背后的"为什么"。

TalkShow 的使命就是让这些珍贵的思维过程可见、可分析、可传承。

---

## 🏆 项目成果总结

### 📈 数据处理能力
- **解析了 127 个有效聊天会话**
- **提取了 461 个 Q&A 对话**  
- **生成了 11 个智能摘要**
- **支持 LLM 智能摘要生成**
- **数据文件大小:2.2MB**
- **时间跨度:2025-06-03 到 2025-07-16**

### 🧪 测试覆盖率
- **35 个测试用例,97% 通过率**
- **覆盖解析、存储、摘要、LLM集成等所有核心功能**
- **Mock 测试确保组件独立性**
- **集成测试验证端到端功能**

### 🎛️ 功能特性
- **智能 MD 文件解析**:支持 SpecStory 格式,自动提取对话结构
- **双模式摘要**:规则摘要 + LLM 智能摘要,支持降级机制
- **灵活配置**:环境变量 + YAML 配置文件,支持多种 LLM 提供商
- **完整 CLI 工具**:解析、列表、查看、统计等全套命令
- **错误处理**:优雅的错误处理和用户反馈

### 🔧 技术架构
- **模块化设计**:清晰的组件分离,易于扩展
- **配置管理**:统一的配置系统,支持多环境部署  
- **存储抽象**:可插拔的存储后端(JSON → SQLite)
- **摘要抽象**:可扩展的摘要引擎(规则 → LLM → 更多AI模型)

### 🎯 已实现阶段
✅ **Phase 1**: 核心数据分析 (MVP)  
✅ **Phase 2**: CLI 工具增强  
✅ **Phase 3**: LLM 智能集成  
✅ **Phase 4**: Web 前端可视化 🆕  
🚧 **Phase 5**: 高级功能 (待开发)

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/cjhgo/talkshow",
    "name": "talkshow",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "chat, history, analysis, visualization, markdown, llm",
    "author": "TalkShow Team",
    "author_email": "team@talkshow.dev",
    "download_url": "https://files.pythonhosted.org/packages/b2/60/6adc710308bd1ab948ed3e12440577370d7413d76614e2f1e87cc9ba10f1/talkshow-0.1.3.tar.gz",
    "platform": null,
    "description": "# \ud83c\udfad TalkShow - Chat History Analysis and Visualization Tool\n\nTalkShow \u662f\u4e00\u4e2a\u4e13\u95e8\u7528\u4e8e\u5206\u6790\u548c\u53ef\u89c6\u5316 SpecStory \u63d2\u4ef6\u751f\u6210\u7684\u804a\u5929\u5386\u53f2\u8bb0\u5f55\u7684\u5de5\u5177\u3002\u5728 LLM \u8f85\u52a9\u7f16\u7a0b\u7684\u65f6\u4ee3\uff0c\u804a\u5929\u5386\u53f2\u6bd4\u4ee3\u7801\u66f4\u91cd\u8981 \u2014\u2014 \u5b83\u8bb0\u5f55\u4e86\u4ee3\u7801\u80cc\u540e\u7684\"\u4e3a\u4ec0\u4e48\"\u3002\n\n## \ud83c\udf1f \u9879\u76ee\u7279\u8272\n\n- **\u667a\u80fd\u89e3\u6790**\uff1a\u81ea\u52a8\u89e3\u6790 SpecStory \u751f\u6210\u7684 Markdown \u804a\u5929\u8bb0\u5f55\n- **\u5185\u5bb9\u6458\u8981**\uff1a\u652f\u6301\u57fa\u4e8e\u89c4\u5219\u548c LLM \u7684\u667a\u80fd\u6458\u8981\u751f\u6210\n- **\u53ef\u89c6\u5316\u754c\u9762**\uff1a\u73b0\u4ee3\u5316 Web \u65f6\u95f4\u8f74 + \u547d\u4ee4\u884c\u5de5\u5177\u53cc\u91cd\u4f53\u9a8c\n- **\u7075\u6d3b\u914d\u7f6e**\uff1a\u591a\u79cd\u914d\u7f6e\u65b9\u5f0f\uff0c\u73af\u5883\u53d8\u91cf\u3001\u914d\u7f6e\u6587\u4ef6\u6216\u6df7\u5408\u6a21\u5f0f\n- **\u4f18\u96c5\u964d\u7ea7**\uff1a\u65e0 API \u914d\u7f6e\u65f6\u81ea\u52a8\u4f7f\u7528\u89c4\u5219\u6458\u8981\n- **\u7075\u6d3b\u5b58\u50a8**\uff1a\u652f\u6301 JSON \u548c SQLite \u5b58\u50a8\n- **\u6e10\u8fdb\u5f0f\u67b6\u6784**\uff1a\u6a21\u5757\u5316\u8bbe\u8ba1\uff0c\u652f\u6301\u9010\u6b65\u6269\u5c55\u529f\u80fd\n\n## \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\n\n### \u5b89\u88c5\n\n```bash\n# \u4ece\u6e90\u7801\u5b89\u88c5\uff08\u5f00\u53d1\u6a21\u5f0f\uff09\ngit clone <repository-url>\ncd talkshow\npip install -r requirements.txt\npip install -e .\n\n# \u6216\u4ece PyPI \u5b89\u88c5\uff08\u53d1\u5e03\u540e\uff09\npip install talkshow\n```\n\n### \u57fa\u7840\u4f7f\u7528\n\n1. **\u521d\u59cb\u5316\u914d\u7f6e**\uff08\u5728\u5305\u542b `.specstory` \u76ee\u5f55\u7684\u9879\u76ee\u4e2d\uff09\uff1a\n\n```bash\ntalkshow init\n```\n\n2. **\u89e3\u6790\u804a\u5929\u5386\u53f2**\uff1a\n\n```bash\ntalkshow parse\n```\n\n3. **\u542f\u52a8 Web \u670d\u52a1\u5668**\uff1a\n\n```bash\ntalkshow server\n```\n\n4. **\u8fd0\u884c\u6d4b\u8bd5\u9a8c\u8bc1\u529f\u80fd**\uff1a\n\n```bash\npython -m pytest tests/ -v\n```\n\n## \ud83d\udcca \u5f53\u524d\u5b9e\u73b0\u72b6\u6001\n\n### \u2705 Phase 1: \u6570\u636e\u5206\u6790\u6838\u5fc3 (MVP) - \u5df2\u5b8c\u6210\n\n- [x] **\u6570\u636e\u6a21\u578b** (`talkshow/models/`)\n  - `ChatSession`: \u5b8c\u6574\u804a\u5929\u4f1a\u8bdd\u8868\u793a\n  - `QAPair`: \u95ee\u7b54\u5bf9\u6570\u636e\u7ed3\u6784  \n  - `SessionMeta`: \u4f1a\u8bdd\u5143\u6570\u636e\u7ba1\u7406\n\n- [x] **MD \u6587\u4ef6\u89e3\u6790\u5668** (`talkshow/parser/`)\n  - \u667a\u80fd\u89e3\u6790 SpecStory \u683c\u5f0f\u7684 MD \u6587\u4ef6\n  - \u63d0\u53d6 User/Assistant \u5bf9\u8bdd\u5185\u5bb9\n  - \u81ea\u52a8\u63d0\u53d6\u65f6\u95f4\u6233\u4fe1\u606f\n  - \u4ece\u6587\u4ef6\u540d\u63d0\u53d6\u4e3b\u9898\n\n- [x] **\u5b58\u50a8\u5c42** (`talkshow/storage/`)\n  - JSON \u6587\u4ef6\u5b58\u50a8\u5b9e\u73b0\n  - \u5b8c\u6574\u7684 CRUD \u64cd\u4f5c\u652f\u6301\n  - \u6570\u636e\u5907\u4efd\u548c\u6062\u590d\u529f\u80fd\n\n- [x] **\u6458\u8981\u5668** (`talkshow/summarizer/`)\n  - \u57fa\u4e8e\u89c4\u5219\u7684\u6587\u672c\u6458\u8981\n  - \u667a\u80fd\u957f\u5ea6\u63a7\u5236\n  - \u652f\u6301\u4e2d\u82f1\u6587\u5185\u5bb9\n\n- [x] **\u6d4b\u8bd5\u5957\u4ef6** (`tests/`)\n  - 35 \u4e2a\u6d4b\u8bd5\u7528\u4f8b\uff0c97% \u901a\u8fc7\u7387\n  - \u8986\u76d6\u89e3\u6790\u3001\u5b58\u50a8\u3001\u6458\u8981\u7b49\u6838\u5fc3\u529f\u80fd\n\n### \ud83d\udcc8 \u5b9e\u9645\u6548\u679c\u5c55\u793a\n\n\u901a\u8fc7\u5bf9\u5f53\u524d history \u76ee\u5f55\u7684\u5206\u6790\uff0cTalkShow \u6210\u529f\uff1a\n\n- \ud83d\udcc1 **\u89e3\u6790\u4e86 127 \u4e2a\u6709\u6548\u804a\u5929\u4f1a\u8bdd**\n- \ud83d\udcac **\u63d0\u53d6\u4e86 461 \u4e2a Q&A \u5bf9\u8bdd**\n- \ud83d\udcdd **\u751f\u6210\u4e86 11 \u4e2a\u667a\u80fd\u6458\u8981**\n- \ud83d\udcbe **\u6570\u636e\u6587\u4ef6\u5927\u5c0f\uff1a2.2MB**\n- \ud83d\udcc5 **\u65f6\u95f4\u8de8\u5ea6\uff1a2025-06-03 \u5230 2025-07-16**\n\n## \ud83c\udfd7\ufe0f \u9879\u76ee\u67b6\u6784\n\n```\ntalkshow/\n\u251c\u2500\u2500 talkshow/                    # \u6838\u5fc3\u5e93\n\u2502   \u251c\u2500\u2500 models/                  # \u6570\u636e\u6a21\u578b\n\u2502   \u2502   \u251c\u2500\u2500 chat.py             # ChatSession, QAPair, SessionMeta\n\u2502   \u2502   \u2514\u2500\u2500 storage.py          # \u5b58\u50a8\u63a5\u53e3\u5b9a\u4e49\n\u2502   \u251c\u2500\u2500 parser/                  # MD \u6587\u4ef6\u89e3\u6790\n\u2502   \u2502   \u251c\u2500\u2500 md_parser.py        # \u4e3b\u89e3\u6790\u5668\n\u2502   \u2502   \u2514\u2500\u2500 time_extractor.py   # \u65f6\u95f4\u63d0\u53d6\u5668\n\u2502   \u251c\u2500\u2500 summarizer/              # \u6458\u8981\u751f\u6210\n\u2502   \u2502   \u251c\u2500\u2500 rule_summarizer.py  # \u57fa\u4e8e\u89c4\u5219\u7684\u6458\u8981\u5668\n\u2502   \u2502   \u2514\u2500\u2500 llm_summarizer.py   # LLM \u667a\u80fd\u6458\u8981\u5668\n\u2502   \u251c\u2500\u2500 storage/                 # \u6570\u636e\u5b58\u50a8\n\u2502   \u2502   \u2514\u2500\u2500 json_storage.py     # JSON \u5b58\u50a8\u5b9e\u73b0\n\u2502   \u251c\u2500\u2500 config/                  # \u914d\u7f6e\u7ba1\u7406\n\u2502   \u2502   \u2514\u2500\u2500 config_manager.py   # \u7edf\u4e00\u914d\u7f6e\u7ba1\u7406\n\u2502   \u251c\u2500\u2500 cli/                     # CLI \u5de5\u5177\n\u2502   \u2502   \u251c\u2500\u2500 main.py             # CLI \u4e3b\u5165\u53e3\n\u2502   \u2502   \u2514\u2500\u2500 commands.py         # CLI \u547d\u4ee4\u5b9e\u73b0\n\u2502   \u2514\u2500\u2500 web/                     # Web \u524d\u7aef\n\u2502       \u251c\u2500\u2500 app.py              # FastAPI \u5e94\u7528\n\u2502       \u251c\u2500\u2500 routers/            # API \u8def\u7531\n\u2502       \u2514\u2500\u2500 static/             # \u524d\u7aef\u8d44\u6e90\n\u2502           \u251c\u2500\u2500 index.html      # \u4e3b\u9875\u9762\n\u2502           \u251c\u2500\u2500 style.css       # \u6837\u5f0f\u6587\u4ef6\n\u2502           \u2514\u2500\u2500 script.js       # \u524d\u7aef\u903b\u8f91\n\u251c\u2500\u2500 scripts/                     # \u811a\u672c\u5de5\u5177\n\u2502   \u251c\u2500\u2500 demo_parser.py          # \u89e3\u6790\u6f14\u793a\u811a\u672c\n\u2502   \u251c\u2500\u2500 simple_cli.py           # CLI \u5de5\u5177\n\u2502   \u251c\u2500\u2500 web_server.py           # Web \u670d\u52a1\u5668\u542f\u52a8\n\u2502   \u251c\u2500\u2500 daily_insights.py       # \u6bcf\u65e5\u6d1e\u5bdf\u751f\u6210\n\u2502   \u251c\u2500\u2500 advanced_demo.py        # \u9ad8\u7ea7\u6f14\u793a\u811a\u672c\n\u2502   \u2514\u2500\u2500 final_demo.py           # \u6700\u7ec8\u6f14\u793a\u811a\u672c\n\u251c\u2500\u2500 tests/                       # \u6d4b\u8bd5\u5957\u4ef6\n\u2502   \u251c\u2500\u2500 test_parser.py          # \u89e3\u6790\u5668\u6d4b\u8bd5\n\u2502   \u251c\u2500\u2500 test_storage.py         # \u5b58\u50a8\u6d4b\u8bd5\n\u2502   \u251c\u2500\u2500 test_summarizer.py      # \u6458\u8981\u5668\u6d4b\u8bd5\n\u2502   \u251c\u2500\u2500 test_llm_summarizer.py  # LLM \u6458\u8981\u5668\u6d4b\u8bd5\n\u2502   \u2514\u2500\u2500 test_moon.py            # Moonshot API \u6d4b\u8bd5\n\u251c\u2500\u2500 config/                      # \u914d\u7f6e\u6587\u4ef6\n\u2502   \u2514\u2500\u2500 default.yaml            # \u9ed8\u8ba4\u914d\u7f6e\n\u2514\u2500\u2500 data/                        # \u751f\u6210\u7684\u6570\u636e\n    \u251c\u2500\u2500 web_sessions.json       # Web \u7aef\u6570\u636e\n    \u251c\u2500\u2500 parsed_sessions.json    # \u89e3\u6790\u6570\u636e\n    \u251c\u2500\u2500 daily_insights.json     # \u6bcf\u65e5\u6d1e\u5bdf\n    \u2514\u2500\u2500 *.html                  # \u751f\u6210\u7684\u62a5\u544a\n```\n\n## \ud83d\udcc5 \u5f00\u53d1\u9636\u6bb5\u5b8c\u6210\u60c5\u51b5\n\n### \u2705 Phase 1: \u6570\u636e\u5206\u6790\u6838\u5fc3 (MVP) - \u5df2\u5b8c\u6210\n- [x] \u6570\u636e\u6a21\u578b\u5b9a\u4e49 (ChatSession, QAPair, SessionMeta)\n- [x] MD \u6587\u4ef6\u89e3\u6790\u5668 (\u652f\u6301 SpecStory \u683c\u5f0f)\n- [x] JSON \u5b58\u50a8\u5c42 (\u5b8c\u6574 CRUD \u64cd\u4f5c)\n- [x] \u57fa\u4e8e\u89c4\u5219\u7684\u6458\u8981\u5668 (\u667a\u80fd\u957f\u5ea6\u63a7\u5236)\n- [x] \u5b8c\u6574\u6d4b\u8bd5\u5957\u4ef6 (35\u4e2a\u6d4b\u8bd5\uff0c97% \u901a\u8fc7\u7387)\n\n### \u2705 Phase 2: CLI \u5de5\u5177 - \u5df2\u5b8c\u6210  \n- [x] \u547d\u4ee4\u884c\u754c\u9762 (`init`, `parse`, `server`)\n- [x] \u652f\u6301\u6458\u8981\u751f\u6210\u9009\u9879 (`--summarize`)\n- [x] \u652f\u6301 LLM \u6458\u8981\u9009\u9879 (`--use-llm`)\n- [x] \u4ea4\u4e92\u5f0f\u67e5\u8be2\u548c\u7edf\u8ba1\u529f\u80fd\n\n### \u2705 Phase 3: LLM \u96c6\u6210 - \u5df2\u5b8c\u6210\n- [x] \u96c6\u6210 LiteLLM \u652f\u6301 Moonshot AI\n- [x] \u914d\u7f6e\u7ba1\u7406\u7cfb\u7edf (\u73af\u5883\u53d8\u91cf\u548c\u914d\u7f6e\u6587\u4ef6)\n- [x] \u667a\u80fd\u6458\u8981\u751f\u6210 (\u4e2d\u82f1\u6587\u652f\u6301)\n- [x] \u9519\u8bef\u5904\u7406\u548c\u964d\u7ea7\u673a\u5236\n\n### \u2705 Phase 4: Web \u524d\u7aef - \u5df2\u5b8c\u6210\n- [x] FastAPI \u540e\u7aef API (\u5b8c\u6574 RESTful \u63a5\u53e3)\n- [x] \u65f6\u95f4\u8f74\u8868\u683c\u53ef\u89c6\u5316\u754c\u9762 (\u6ed1\u52a8\u5c55\u793a\u8bbe\u8ba1)\n- [x] \u4ea4\u4e92\u5f0f\u804a\u5929\u8bb0\u5f55\u6d4f\u89c8 (\u641c\u7d22\u3001\u7b5b\u9009\u3001\u5b9e\u65f6\u52a0\u8f7d)\n\n### \ud83d\udea7 Phase 5: \u9ad8\u7ea7\u529f\u80fd - \u5f85\u5f00\u53d1\n- [ ] SQLite \u5b58\u50a8\u652f\u6301\n- [ ] \u5168\u6587\u641c\u7d22\u529f\u80fd\n- [ ] \u6807\u7b7e\u548c\u5206\u7c7b\u7cfb\u7edf\n- [ ] \u6570\u636e\u5bfc\u51fa\u529f\u80fd\n\n## \ud83d\udee0\ufe0f \u6280\u672f\u6808\n\n- **\u6838\u5fc3\u8bed\u8a00**: Python 3.8+\n- **\u6d4b\u8bd5\u6846\u67b6**: pytest (35\u4e2a\u6d4b\u8bd5\uff0c97% \u901a\u8fc7\u7387)\n- **LLM \u96c6\u6210**: LiteLLM + Moonshot AI\n- **Web \u540e\u7aef**: FastAPI + Uvicorn (\u5f02\u6b65\u9ad8\u6027\u80fd)\n- **Web \u524d\u7aef**: \u539f\u751f HTML/CSS/JS (\u8f7b\u91cf\u54cd\u5e94\u5f0f)\n- **\u6570\u636e\u5b58\u50a8**: JSON (\u5f53\u524d), SQLite (\u8ba1\u5212) \n- **\u914d\u7f6e\u7ba1\u7406**: YAML + \u73af\u5883\u53d8\u91cf\n- **CLI \u5de5\u5177**: Click + Rich (\u589e\u5f3a\u4f53\u9a8c)\n\n## \ud83d\udcd6 \u4f7f\u7528\u793a\u4f8b\n\n### CLI \u5de5\u5177\u4f7f\u7528\n\n```bash\n# \u521d\u59cb\u5316\u914d\u7f6e\ntalkshow init\n\n# \u57fa\u7840\u89e3\u6790\uff08\u4ec5\u89e3\u6790\uff0c\u4e0d\u751f\u6210\u6458\u8981\uff09\ntalkshow parse\n\n# \u4f7f\u7528 LLM \u667a\u80fd\u6458\u8981\ntalkshow parse --use-llm\n\n# \u542f\u52a8 Web \u670d\u52a1\u5668\ntalkshow server\n\n# \u505c\u6b62 Web \u670d\u52a1\u5668\ntalkshow stop\n\n# \u5f3a\u5236\u505c\u6b62\u670d\u52a1\u5668\uff08\u65e0\u9700\u786e\u8ba4\uff09\ntalkshow stop --force\n\n# \u6307\u5b9a\u7aef\u53e3\u542f\u52a8\u670d\u52a1\u5668\ntalkshow server --port 8080\n\n# \u6307\u5b9a\u7aef\u53e3\u505c\u6b62\u670d\u52a1\u5668\ntalkshow stop --port 8080\n\n# \u67e5\u770b\u5e2e\u52a9\ntalkshow --help\ntalkshow parse --help\ntalkshow server --help\ntalkshow stop --help\n```\n\n### Web \u524d\u7aef\u4f7f\u7528\n\n```bash\n# 1. \u521d\u59cb\u5316\u914d\u7f6e\ntalkshow init\n\n# 2. \u89e3\u6790\u804a\u5929\u5386\u53f2\ntalkshow parse\n\n# 3. \u542f\u52a8 Web \u670d\u52a1\u5668\ntalkshow server\n\n# 4. \u8bbf\u95ee\u6d4f\u89c8\u5668\n# \u6253\u5f00 http://localhost:8000 \u67e5\u770b\u65f6\u95f4\u8f74\u754c\u9762\n# API \u6587\u6863\uff1ahttp://localhost:8000/docs\n```\n\n**Web \u529f\u80fd\u7279\u6027\uff1a**\n- \ud83d\udcca **\u7edf\u8ba1\u9762\u677f**\uff1a\u663e\u793a\u4f1a\u8bdd\u6570\u3001Q&A\u5bf9\u8bdd\u3001\u6458\u8981\u7b49\u7edf\u8ba1\u4fe1\u606f\n- \ud83d\udd0d **\u5b9e\u65f6\u641c\u7d22**\uff1a\u6839\u636e\u4e3b\u9898\u6216\u5185\u5bb9\u7b5b\u9009\u4f1a\u8bdd\n- \u23f0 **\u65f6\u95f4\u7b5b\u9009**\uff1a\u6309\u65f6\u95f4\u8303\u56f4\u8fc7\u6ee4\u4f1a\u8bdd\n- \ud83d\udccb **\u65f6\u95f4\u8f74\u8868\u683c**\uff1a\u6309\u8ba1\u5212\u8bbe\u8ba1\u7684\u6ed1\u52a8\u5c55\u793a\u754c\u9762\n- \ud83d\udcac **Q&A \u6d4f\u89c8**\uff1a\u67e5\u770b\u6bcf\u4e2a\u4f1a\u8bdd\u7684\u8be6\u7ec6\u5bf9\u8bdd\u5185\u5bb9\n- \ud83d\udce4 **\u6570\u636e\u5bfc\u51fa**\uff1a\u652f\u6301\u5bfc\u51fa JSON \u683c\u5f0f\u6570\u636e\n\n### Python API \u4f7f\u7528\n\n```python\nfrom talkshow import MDParser, JSONStorage, RuleSummarizer, LLMSummarizer, ConfigManager\n\n# \u521d\u59cb\u5316\u7ec4\u4ef6\nparser = MDParser()\nstorage = JSONStorage(\"data/sessions.json\")\nrule_summarizer = RuleSummarizer()\n\n# LLM \u6458\u8981\u5668\uff08\u9700\u8981\u914d\u7f6e API \u5bc6\u94a5\uff09\nconfig_manager = ConfigManager()\nllm_summarizer = LLMSummarizer(config_manager)\n\n# \u89e3\u6790\u76ee\u5f55\u4e2d\u7684\u6240\u6709\u6587\u4ef6\nsessions = parser.parse_directory(\"history\")\n\n# \u751f\u6210\u667a\u80fd\u6458\u8981\nfor session in sessions:\n    for qa_pair in session.qa_pairs:\n        # \u4f18\u5148\u4f7f\u7528 LLM\uff0c\u5931\u8d25\u65f6\u964d\u7ea7\u5230\u89c4\u5219\u6458\u8981\n        try:\n            q_summary, a_summary = llm_summarizer.summarize_both(\n                qa_pair.question, qa_pair.answer\n            )\n        except:\n            q_summary, a_summary = rule_summarizer.summarize_both(\n                qa_pair.question, qa_pair.answer\n            )\n        \n        qa_pair.question_summary = q_summary\n        qa_pair.answer_summary = a_summary\n\n# \u4fdd\u5b58\u5230\u5b58\u50a8\nstorage.save_sessions(sessions)\nprint(f\"\u5904\u7406\u4e86 {len(sessions)} \u4e2a\u4f1a\u8bdd\")\n```\n\n## \u2699\ufe0f \u914d\u7f6e\u7ba1\u7406\n\nTalkShow \u652f\u6301\u591a\u79cd\u7075\u6d3b\u7684\u914d\u7f6e\u65b9\u5f0f\uff0c**\u4e0d\u5f3a\u5236\u8981\u6c42\u73af\u5883\u53d8\u91cf**\uff1a\n\n### \ud83d\udd12 \u65b9\u5f0f\u4e00\uff1a\u73af\u5883\u53d8\u91cf\uff08\u63a8\u8350\uff09\n```bash\nexport MOONSHOT_API_KEY=\"your_moonshot_api_key\"\nexport LLM_MODEL=\"moonshot/kimi-k2-0711-preview\"  # \u53ef\u9009\n```\n\n### \ud83d\udcc4 \u65b9\u5f0f\u4e8c\uff1a\u914d\u7f6e\u6587\u4ef6\n```yaml\n# .specstory/talkshow.yaml\nsummarizer:\n  llm:\n    api_key: \"your_moonshot_api_key\"\n    model: \"moonshot/kimi-k2-0711-preview\"\n    max_tokens: 150\n    temperature: 0.3\n```\n\n### \ud83d\udd04 \u65b9\u5f0f\u4e09\uff1a\u6df7\u5408\u6a21\u5f0f\uff08\u63a8\u8350\u751f\u4ea7\u73af\u5883\uff09\n```yaml\n# .specstory/talkshow.yaml - \u901a\u7528\u914d\u7f6e\nsummarizer:\n  llm:\n    model: \"moonshot/kimi-k2-0711-preview\"\n    max_tokens: 150\n```\n```bash\n# \u73af\u5883\u53d8\u91cf - \u654f\u611f\u4fe1\u606f\nexport MOONSHOT_API_KEY=\"your_secret_key\"\n```\n\n### \ud83d\udeab \u65b9\u5f0f\u56db\uff1a\u65e0\u914d\u7f6e\uff08\u81ea\u52a8\u964d\u7ea7\uff09\n\u65e0\u9700\u4efb\u4f55\u914d\u7f6e\uff0c\u81ea\u52a8\u4f7f\u7528\u89c4\u5219\u6458\u8981\u5668\uff0c\u9002\u5408\u6d4b\u8bd5\u73af\u5883\u3002\n\n> **\u914d\u7f6e\u4f18\u5148\u7ea7**\uff1a\u73af\u5883\u53d8\u91cf > \u914d\u7f6e\u6587\u4ef6 > \u9ed8\u8ba4\u503c\n\n## \ud83e\udd1d \u8d21\u732e\u6307\u5357\n\n1. Fork \u9879\u76ee\n2. \u521b\u5efa\u529f\u80fd\u5206\u652f (`git checkout -b feature/AmazingFeature`)\n3. \u63d0\u4ea4\u66f4\u6539 (`git commit -m 'Add some AmazingFeature'`)\n4. \u63a8\u9001\u5206\u652f (`git push origin feature/AmazingFeature`)\n5. \u5f00\u542f Pull Request\n\n## \ud83d\udcc4 \u8bb8\u53ef\u8bc1\n\n\u672c\u9879\u76ee\u91c7\u7528 MIT \u8bb8\u53ef\u8bc1 - \u8be6\u89c1 [LICENSE](LICENSE) \u6587\u4ef6\n\n## \ud83c\udfaf \u6838\u5fc3\u7406\u5ff5\n\n> \u5728 LLM \u751f\u6210\u4ee3\u7801\u7684\u65f6\u4ee3\uff0cchat history \u6bd4\u4ee3\u7801\u66f4\u91cd\u8981 \u2014\u2014 \u5b83\u8bb0\u5f55\u4e86\u4ee3\u7801\u4ea7\u751f\u8fc7\u7a0b\u4e2d\u7684\u52a8\u6001\u51b3\u7b56\u548c\u601d\u8def\u3002\u5c31\u50cf Git \u8bb0\u5f55\u4ee3\u7801\u7248\u672c\u4e00\u6837\uff0cchat history \u8bb0\u5f55\u4e86\u4ee3\u7801\u5199\u6210\u8fd9\u6837\u80cc\u540e\u7684\"\u4e3a\u4ec0\u4e48\"\u3002\n\nTalkShow \u7684\u4f7f\u547d\u5c31\u662f\u8ba9\u8fd9\u4e9b\u73cd\u8d35\u7684\u601d\u7ef4\u8fc7\u7a0b\u53ef\u89c1\u3001\u53ef\u5206\u6790\u3001\u53ef\u4f20\u627f\u3002\n\n---\n\n## \ud83c\udfc6 \u9879\u76ee\u6210\u679c\u603b\u7ed3\n\n### \ud83d\udcc8 \u6570\u636e\u5904\u7406\u80fd\u529b\n- **\u89e3\u6790\u4e86 127 \u4e2a\u6709\u6548\u804a\u5929\u4f1a\u8bdd**\n- **\u63d0\u53d6\u4e86 461 \u4e2a Q&A \u5bf9\u8bdd**  \n- **\u751f\u6210\u4e86 11 \u4e2a\u667a\u80fd\u6458\u8981**\n- **\u652f\u6301 LLM \u667a\u80fd\u6458\u8981\u751f\u6210**\n- **\u6570\u636e\u6587\u4ef6\u5927\u5c0f\uff1a2.2MB**\n- **\u65f6\u95f4\u8de8\u5ea6\uff1a2025-06-03 \u5230 2025-07-16**\n\n### \ud83e\uddea \u6d4b\u8bd5\u8986\u76d6\u7387\n- **35 \u4e2a\u6d4b\u8bd5\u7528\u4f8b\uff0c97% \u901a\u8fc7\u7387**\n- **\u8986\u76d6\u89e3\u6790\u3001\u5b58\u50a8\u3001\u6458\u8981\u3001LLM\u96c6\u6210\u7b49\u6240\u6709\u6838\u5fc3\u529f\u80fd**\n- **Mock \u6d4b\u8bd5\u786e\u4fdd\u7ec4\u4ef6\u72ec\u7acb\u6027**\n- **\u96c6\u6210\u6d4b\u8bd5\u9a8c\u8bc1\u7aef\u5230\u7aef\u529f\u80fd**\n\n### \ud83c\udf9b\ufe0f \u529f\u80fd\u7279\u6027\n- **\u667a\u80fd MD \u6587\u4ef6\u89e3\u6790**\uff1a\u652f\u6301 SpecStory \u683c\u5f0f\uff0c\u81ea\u52a8\u63d0\u53d6\u5bf9\u8bdd\u7ed3\u6784\n- **\u53cc\u6a21\u5f0f\u6458\u8981**\uff1a\u89c4\u5219\u6458\u8981 + LLM \u667a\u80fd\u6458\u8981\uff0c\u652f\u6301\u964d\u7ea7\u673a\u5236\n- **\u7075\u6d3b\u914d\u7f6e**\uff1a\u73af\u5883\u53d8\u91cf + YAML \u914d\u7f6e\u6587\u4ef6\uff0c\u652f\u6301\u591a\u79cd LLM \u63d0\u4f9b\u5546\n- **\u5b8c\u6574 CLI \u5de5\u5177**\uff1a\u89e3\u6790\u3001\u5217\u8868\u3001\u67e5\u770b\u3001\u7edf\u8ba1\u7b49\u5168\u5957\u547d\u4ee4\n- **\u9519\u8bef\u5904\u7406**\uff1a\u4f18\u96c5\u7684\u9519\u8bef\u5904\u7406\u548c\u7528\u6237\u53cd\u9988\n\n### \ud83d\udd27 \u6280\u672f\u67b6\u6784\n- **\u6a21\u5757\u5316\u8bbe\u8ba1**\uff1a\u6e05\u6670\u7684\u7ec4\u4ef6\u5206\u79bb\uff0c\u6613\u4e8e\u6269\u5c55\n- **\u914d\u7f6e\u7ba1\u7406**\uff1a\u7edf\u4e00\u7684\u914d\u7f6e\u7cfb\u7edf\uff0c\u652f\u6301\u591a\u73af\u5883\u90e8\u7f72  \n- **\u5b58\u50a8\u62bd\u8c61**\uff1a\u53ef\u63d2\u62d4\u7684\u5b58\u50a8\u540e\u7aef\uff08JSON \u2192 SQLite\uff09\n- **\u6458\u8981\u62bd\u8c61**\uff1a\u53ef\u6269\u5c55\u7684\u6458\u8981\u5f15\u64ce\uff08\u89c4\u5219 \u2192 LLM \u2192 \u66f4\u591aAI\u6a21\u578b\uff09\n\n### \ud83c\udfaf \u5df2\u5b9e\u73b0\u9636\u6bb5\n\u2705 **Phase 1**: \u6838\u5fc3\u6570\u636e\u5206\u6790 (MVP)  \n\u2705 **Phase 2**: CLI \u5de5\u5177\u589e\u5f3a  \n\u2705 **Phase 3**: LLM \u667a\u80fd\u96c6\u6210  \n\u2705 **Phase 4**: Web \u524d\u7aef\u53ef\u89c6\u5316 \ud83c\udd95  \n\ud83d\udea7 **Phase 5**: \u9ad8\u7ea7\u529f\u80fd (\u5f85\u5f00\u53d1)\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Chat History Analysis and Visualization Tool",
    "version": "0.1.3",
    "project_urls": {
        "Bug Reports": "https://github.com/cjhgo/talkshow/issues",
        "Documentation": "https://github.com/cjhgo/talkshow#readme",
        "Homepage": "https://github.com/cjhgo/talkshow",
        "Source": "https://github.com/cjhgo/talkshow"
    },
    "split_keywords": [
        "chat",
        " history",
        " analysis",
        " visualization",
        " markdown",
        " llm"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "bc4af1e487687766da80934480d3eda9d26d51992a146a0a85f13a8cfe7b9136",
                "md5": "d10bedc83eb0714e247f4764ee59024c",
                "sha256": "e4bb2c76e360384fdc2b05aff2dcb6c87e2d4539d67420052b66397b851b5c5c"
            },
            "downloads": -1,
            "filename": "talkshow-0.1.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "d10bedc83eb0714e247f4764ee59024c",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 47635,
            "upload_time": "2025-08-01T13:02:18",
            "upload_time_iso_8601": "2025-08-01T13:02:18.397966Z",
            "url": "https://files.pythonhosted.org/packages/bc/4a/f1e487687766da80934480d3eda9d26d51992a146a0a85f13a8cfe7b9136/talkshow-0.1.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b2606adc710308bd1ab948ed3e12440577370d7413d76614e2f1e87cc9ba10f1",
                "md5": "79a53621415c9f871a2f86fe050dd9ee",
                "sha256": "13f69764a516ab57ca012a555531362288a6b9697c1efdf9cf6c1cfeb26a270d"
            },
            "downloads": -1,
            "filename": "talkshow-0.1.3.tar.gz",
            "has_sig": false,
            "md5_digest": "79a53621415c9f871a2f86fe050dd9ee",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 45008,
            "upload_time": "2025-08-01T13:02:19",
            "upload_time_iso_8601": "2025-08-01T13:02:19.745980Z",
            "url": "https://files.pythonhosted.org/packages/b2/60/6adc710308bd1ab948ed3e12440577370d7413d76614e2f1e87cc9ba10f1/talkshow-0.1.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-01 13:02:19",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "cjhgo",
    "github_project": "talkshow",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [
        {
            "name": "pytest",
            "specs": [
                [
                    ">=",
                    "7.0.0"
                ]
            ]
        },
        {
            "name": "pytest-cov",
            "specs": [
                [
                    ">=",
                    "4.0.0"
                ]
            ]
        },
        {
            "name": "litellm",
            "specs": [
                [
                    ">=",
                    "1.0.0"
                ]
            ]
        },
        {
            "name": "pyyaml",
            "specs": [
                [
                    ">=",
                    "6.0.0"
                ]
            ]
        },
        {
            "name": "click",
            "specs": [
                [
                    ">=",
                    "8.0.0"
                ]
            ]
        },
        {
            "name": "rich",
            "specs": [
                [
                    ">=",
                    "13.0.0"
                ]
            ]
        },
        {
            "name": "psutil",
            "specs": [
                [
                    ">=",
                    "5.9.0"
                ]
            ]
        },
        {
            "name": "fastapi",
            "specs": [
                [
                    ">=",
                    "0.100.0"
                ]
            ]
        },
        {
            "name": "uvicorn",
            "specs": [
                [
                    ">=",
                    "0.20.0"
                ]
            ]
        },
        {
            "name": "jinja2",
            "specs": [
                [
                    ">=",
                    "3.1.0"
                ]
            ]
        }
    ],
    "lcname": "talkshow"
}
        
Elapsed time: 0.89884s