-
Notifications
You must be signed in to change notification settings - Fork 255
Claude/evaluate local deployment 01 md6 gw7 g4xa azqwd7qm ts we #67
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
leoleo112s
wants to merge
20
commits into
1517005260:master
Choose a base branch
from
leoleo112s:claude/evaluate-local-deployment-01MD6Gw7G4xaAZQWD7qmTsWE
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Claude/evaluate local deployment 01 md6 gw7 g4xa azqwd7qm ts we #67
leoleo112s
wants to merge
20
commits into
1517005260:master
from
leoleo112s:claude/evaluate-local-deployment-01MD6Gw7G4xaAZQWD7qmTsWE
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
新增内容: - 日常启动流程(快速启动脚本和手动启动) - 代码更新流程(自动检查脚本和快速更新步骤) - 根据更新类型的详细操作表格 - 知识图谱重建判断指南 - 系统关闭、配置备份和 Docker 自动启动说明 便于用户在 git pull 后了解如何正确更新和维护项目
新增功能: - 添加 OPENAI_LLM_API_KEY 和 OPENAI_LLM_BASE_URL 配置项 - 添加 OPENAI_EMBEDDING_API_KEY 和 OPENAI_EMBEDDING_BASE_URL 配置项 - 保持向后兼容:如果不设置专用配置,则使用通用配置 - 更新 .env.example 添加混合使用说明 使用场景: - LLM 使用 DeepSeek(性价比高) - 嵌入模型使用 OpenAI(质量稳定)
新增内容: - Dockerfile: 使用 x86 架构避免 M2 Mac 兼容性问题 - docker-compose.yaml: 添加 backend 和 frontend 服务 - .dockerignore: 优化镜像大小 - build_graph_docker.sh: Docker 环境下的知识图谱构建脚本 特性: - 完全容器化部署,避免本地依赖问题 - 使用 linux/amd64 平台,解决 ARM 架构兼容性 - 数据持久化(volumes) - 自动重启(restart: unless-stopped) 使用方法: 1. docker compose up -d # 启动所有服务 2. chmod +x build_graph_docker.sh && ./build_graph_docker.sh # 构建知识图谱 3. 访问 http://localhost:8501
修复问题: - M2 Mac 上 HanLP 不兼容导致段错误和 'NoneType' 错误 - 知识图谱构建在初始化阶段失败 改进: - 使用 try/except 导入 HanLP,导入失败时优雅降级 - 添加简单的正则分词器作为后备方案 - 在 _safe_tokenize 中检查 HanLP 是否可用 - 添加 _simple_tokenize 方法处理基本的中英文分词 这使得项目可以在不支持 HanLP 的环境(如 M2 Mac)上运行。
新增功能: 1. 📚 文档管理页面 - 支持多文件上传(PDF, TXT, MD, DOCX, DOC, CSV, JSON, YAML) - 文档列表展示与搜索 - 文件删除与批量清空 - 上传后自动触发增量构建 2. ⚙️ 配置管理页面 - 可视化编辑实体类型和关系类型 - 主题配置管理 - 预设模板快速应用 - 配置文件备份与下载 - 实时配置验证 3. 🏗️ 构建管理页面 - 完整构建与增量构建 - 实时构建进度显示 - 构建日志查看 - 知识图谱统计(实体、关系、社区数量) - 实体/关系类型分布可视化 - 构建参数配置 4. 后端 API 支持 - /admin/build/full - 触发完整构建 - /admin/build/incremental - 触发增量构建 - /admin/build/status - 获取构建状态 - /admin/build/stop - 停止构建 - /admin/graph/stats - 获取图谱统计 - /admin/health - 健康检查 5. 主应用改进 - 多页面导航系统 - 统一的侧边栏导航 - 更友好的用户界面 技术实现: - 使用 Streamlit 页面组件实现模块化 UI - FastAPI 后台任务支持异步构建 - 线程安全的构建状态管理 - Neo4j 查询优化的图谱统计 使用影响: 用户无需通过命令行即可完成所有管理操作,大大降低使用门槛。
修复: - frontend_config/settings.py: 添加 FILES_DIR 导入,修复文档管理页面导入错误 新增启动脚本: - start_backend.sh: 后端启动脚本,自动处理端口占用 - start_system.sh: 完整系统启动脚本,一键启动 Neo4j + 后端 + 前端 使用方法: 1. conda activate graphrag 2. ./start_system.sh # 启动完整系统 或 ./start_backend.sh # 仅启动后端 streamlit run frontend/app.py # 手动启动前端
问题: 前端导入 graphrag_agent.config.settings 时会触发全局 Neo4j 连接初始化, 导致在 Neo4j 未启动时前端无法启动。 解决方案: - 在前端配置文件中直接定义 FILES_DIR 和 examples - 移除对后端模块的导入依赖 - 前端现在可以独立于 Neo4j 状态启动 影响: 前端可以在 Neo4j 启动前启动,提升用户体验。 管理页面(文档管理、配置管理)可以在没有 Neo4j 的情况下使用。
修复: - docker-compose.yaml: 移除过时的 version 字段 - start_system.sh: 添加 Docker 运行状态检查和自动启动提示 - 新增 start_neo4j.sh: 专门用于启动 Neo4j 的独立脚本 改进: - 自动检测 Docker 是否运行 - 提供多种 Docker 启动方法的提示 - 支持自动启动 Docker Desktop (macOS) - 等待 Docker 完全启动后再继续 - 更友好的错误提示和用户引导 使用方法: ./start_neo4j.sh # 仅启动 Neo4j (自动处理 Docker) ./start_system.sh # 启动完整系统
新增 start_neo4j_only.sh 脚本,专门用于只启动 Neo4j 容器。 这样可以避免在 M2 Mac 上构建 x86 Docker 镜像的兼容性问题。 推荐使用方式: 1. ./start_neo4j_only.sh # 启动 Neo4j 2. ./start_backend.sh # 本地启动后端 3. streamlit run frontend/app.py # 本地启动前端
问题修复: 1. **隐藏 Streamlit 自动生成的页面链接** - 将 frontend/pages/ 重命名为 frontend/page_components/ - 避免 Streamlit 自动将目录下的文件识别为独立页面 - 用户只能通过左侧导航菜单切换页面,不会看到多余的链接 2. **添加 file_registry.json 修复脚本** - 新增 fix_file_registry.sh 脚本 - 自动检测并修复 file_registry.json 目录/文件问题 - 解决增量构建失败的根本原因 3. **改进构建状态显示** - 增强错误处理,区分连接错误、超时、API错误 - 添加详细的错误提示和诊断建议 - 当无法连接后端时,提供诊断命令 - 改善用户体验,让错误信息更清晰 使用说明: - 如果增量构建失败,在项目根目录执行 ./fix_file_registry.sh - 前端页面通过左侧导航切换,不要直接访问 /build_manager 等路径
改进内容: 1. **文档删除二次确认** - 点击删除按钮后显示确认/取消按钮 - 防止误删除重要文档 - 更安全的用户操作流程 2. **自动构建状态反馈** - 上传文档后显示构建触发状态 - 提供"前往构建管理页面"按钮 - 让用户清楚了解构建是否成功启动 3. **后端日志增强** - 添加详细的操作日志记录 - 记录API请求和数据库查询 - 便于调试和问题追踪 4. **图谱统计页面优化** - 区分"无法连接"和"数据为空"两种情况 - 提供连接测试功能 - 添加引导性提示信息 - 空数据时提供操作指引 技术改进: - 使用 logging 模块记录后端操作 - 改进错误处理和用户提示 - 添加更详细的诊断信息
### 主要变更
#### 1. 核心数据模型 (graphrag_agent/config/graph_config_model.py)
- 添加 BridgeDefinition: 定义跨领域连接的公共概念
- 添加 DomainDefinition: 定义业务子图及其 Schema
- 添加 GraphConfig: 完整的多领域配置容器
- 添加 IndustryTemplate: 预置三个行业模板(法务、电商、医疗)
#### 2. 配置存储 (graphrag_agent/config/graph_config_storage.py)
- 实现 GraphConfigStorage: JSON 文件持久化
- 支持配置的保存、加载、删除
- 支持从行业模板创建配置
- 提供全局单例访问
#### 3. 动态提示词生成 (graphrag_agent/prompts/dynamic_prompt_builder.py)
- 实现 DynamicPromptBuilder: 根据 GraphConfig 动态生成提示词
- build_system_prompt(): 生成完整的系统提示词,包含桥接点和领域定义
- build_extraction_prompt(): 生成文档抽取提示词
- build_domain_classifier_prompt(): 生成领域分类提示词
- 支持获取所有实体类型、关系类型等辅助方法
#### 4. 实体提取器工厂 (graphrag_agent/graph/extraction/extractor_factory.py)
- create_entity_extractor(): 工厂函数,自动检测并使用动态配置
- 优先使用 GraphConfig(如果存在),否则回退到传统模板
- 保持向后兼容性
#### 5. API 端点扩展 (server/routers/admin.py)
- GET /admin/graph/config: 获取当前图谱配置
- POST /admin/graph/config: 保存图谱配置
- DELETE /admin/graph/config: 删除图谱配置
- GET /admin/graph/templates: 列出所有行业模板
- GET /admin/graph/templates/{name}: 获取指定模板详情
- POST /admin/graph/config/from-template: 从模板创建配置
- 所有端点均添加详细日志记录
#### 6. 前端配置管理页面重构 (frontend/page_components/config_manager.py)
- 完全重写,支持 Domain/Bridge 可视化编辑
- 模板选择器:展示三个行业模板并支持预览
- 桥接点编辑器:添加、查看、删除桥接点
- 领域编辑器:定义领域及其 Schema、桥接点映射
- 配置概览:显示项目基本信息和统计数据
- 支持配置导出为 JSON
#### 7. 图谱构建流程集成 (graphrag_agent/integrations/build/build_graph.py)
- 更新实体提取器初始化,使用 create_entity_extractor()
- 自动检测并应用动态配置
- 保持与传统配置模式的兼容性
### 功能特性
1. **通用性**: 不再限定于特定领域,用户可自定义任何行业的知识图谱
2. **桥接点机制**: 支持定义跨领域的公共概念,实现领域间连接
3. **领域隔离**: 每个领域有独立的实体类型和关系类型
4. **行业模板**: 提供法务、电商、医疗三个开箱即用的模板
5. **向后兼容**: 完全兼容传统的 settings.py 配置模式
6. **用户友好**: 前端可视化编辑,无需修改代码
### 设计理念
基于用户提供的设计文档实现:
- 桥接点 (Bridge): 全局公共概念,如"问题类型"、"风险等级"
- 领域 (Domain): 业务子图,如"规则库"、"案件库"、"经验库"
- 动态提示词: AI 提取时根据配置生成针对性提示
- 未来扩展: 预留 AI Copilot 引导配置的接口
### 测试建议
1. 启动系统,访问「⚙️ 配置管理」页面
2. 尝试加载不同的行业模板
3. 自定义添加桥接点和领域
4. 保存配置后,触发知识图谱构建
5. 验证实体提取是否使用了动态配置
### 主要功能
#### 1. 文档分析器 (graphrag_agent/ai_copilot/document_analyzer.py)
- **DocumentAnalyzer 类**:分析文档集合并提取关键信息
- `analyze_documents()`: 文档聚类和关键概念提取
- `_cluster_documents()`: 使用 TF-IDF + K-Means 聚类
- `_extract_key_concepts()`: TF-IDF 关键词提取
- `recommend_domains_and_bridges()`: 基于分析结果生成 AI 推荐
- `refine_recommendations()`: 根据用户反馈优化推荐
- **技术栈**:
- scikit-learn: TF-IDF 向量化、K-Means 聚类
- LLM: 推荐生成和配置优化
#### 2. API 端点扩展 (server/routers/admin.py)
新增 3 个 AI Copilot API 端点:
- **POST /admin/ai-copilot/analyze-documents**
- 分析已上传的文档
- 自动聚类和关键概念提取
- 生成领域和桥接点推荐
- 参数:industry_hint(行业提示), num_clusters(聚类数量)
- **POST /admin/ai-copilot/refine-config**
- 基于用户反馈优化配置
- 参数:user_feedback, current_config
- **POST /admin/ai-copilot/apply-recommendations**
- 将 AI 推荐应用为新配置
- 参数:recommendations, project_name, industry, description
#### 3. 前端 AI 向导页面 (frontend/page_components/ai_config_wizard.py)
完整的4步向导流程:
**步骤 1: 上传文档**
- 检测已上传文档数量
- 提供导航到文档管理页面
**步骤 2: AI 分析**
- 输入行业提示(可选)
- 触发 AI 文档分析
- 显示分析进度
**步骤 3: 查看推荐**
- 双标签页展示:
- 📊 文档分析:聚类结果、关键概念、统计信息
- 🤖 AI 推荐:桥接点推荐、领域推荐、推荐理由
- 支持重新分析
**步骤 4: 应用配置**
- 输入项目信息(名称、行业、描述)
- 一键应用 AI 推荐创建配置
- 提供导航到配置管理/构建管理
#### 4. 前端导航更新 (frontend/app.py)
- 新增「🤖 AI 配置向导」导航入口
- 支持页面切换 (st.session_state.page_switch)
- 导入并路由 ai_config_wizard_page
### 核心工作流程
1. **用户上传文档** → 「📚 文档管理」
2. **启动 AI 分析** → 「🤖 AI 配置向导」
3. **AI 自动分析**:
- TF-IDF 向量化
- K-Means 聚类(自动确定聚类数)
- 提取关键概念
- LLM 推荐桥接点和领域
4. **用户查看推荐**:
- 文档聚类可视化
- 关键概念标签云
- 推荐的桥接点和领域详情
5. **应用配置** → 创建新 GraphConfig
### 技术亮点
1. **无监督学习**:自动确定聚类数量(启发式:sqrt(n/2))
2. **混合方法**:TF-IDF(统计)+ LLM(语义理解)
3. **流式体验**:4步向导,每步都有明确反馈
4. **可优化**:支持根据用户反馈迭代优化
5. **向后兼容**:不影响现有配置方式
### 使用场景
- **新用户**:不知道如何定义领域和桥接点 → AI 向导自动推荐
- **快速原型**:快速生成初始配置,后续手动优化
- **文档分析**:了解文档集合的主题和结构
### 配置示例
AI 可能推荐:
```json
{
"recommended_bridges": [
{
"name": "问题类型",
"key": "bridge_issue_type",
"examples": ["投诉", "咨询", "建议"],
"reasoning": "从所有文档中检测到高频的问题分类模式"
}
],
"recommended_domains": [
{
"domain_name": "政策库",
"schema": {
"entities": ["政策", "法条", "部门"],
"relations": ["规定", "依据", "负责"]
},
"reasoning": "聚类1主要包含政策性文档"
}
]
}
```
### 依赖说明
- scikit-learn: 已在 requirements.txt (1.6.1)
- 其他依赖均为现有
### 测试建议
1. 上传多个不同主题的文档
2. 启动 AI 配置向导
3. 查看 AI 推荐是否合理
4. 应用推荐并构建图谱
5. 验证实体抽取效果
### 主要更新 #### 新增章节 - **🆕 最新特性(v2.0)**:重点介绍新功能 - 通用图谱构建器 - AI Copilot 智能配置向导 - 全新前端管理界面 - 动态提示词生成 - **快速开始 - 方式二**:AI 向导模式(推荐新用户) - 4步引导式配置流程 - 零基础快速上手 - **快速开始 - 方式三**:使用行业模板 - 法务、电商、医疗三个模板 - 一键加载立即使用 #### 更新的章节 - **项目结构**: - 新增 `ai_copilot/` 模块 - 新增 `prompts/` 模块 - 新增 `config/graph_config_model.py` 和 `graph_config_storage.py` - 新增 `page_components/` 前端页面组件 - 更新 `admin.py` 和 `app.py` 说明 - **项目亮点**: - 新增"最新特性"小节 - 详细说明通用图谱构建器、AI Copilot、前端管理界面、动态提示词功能 - **功能模块**: - 新增"通用图谱构建器"模块说明 - 新增"AI Copilot 智能向导"模块说明 - 更新"图谱构建与管理"模块(动态实体关系提取) - 更新"前后端实现"模块(新的 Web 管理界面) - **简单演示**: - 新增前端界面截图占位符(待添加实际截图) - AI 配置向导、配置管理、文档管理、构建管理 - **代码更新与维护**: - 新增配置文件管理说明 - 更新"何时需要重建知识图谱"规则 - 新增配置模式切换场景 - 新增动态配置相关的更新流程 - **未来规划**: - 新增 AI Copilot 增强计划 ### 文档改进 - 更清晰的结构层次 - 添加更多使用场景说明 - 提供三种配置方式对比 - 详细的更新和维护指南 - 强调新功能的易用性和灵活性 ### 视觉改进 - 使用更多 emoji 提升可读性 - 标注"New!"突出新功能 - 表格化复杂信息 - 步骤式流程说明 ### 注意 - 演示截图为占位符,需要后续添加实际截图 - 保持了原有文档的完整性 - 向后兼容,传统模式说明仍然保留
修复内容: 1. ✅ 修复首页示例问题点击无反应 - 将HTML div改为可交互的st.button 2. ✅ 修复graph_agent和hybrid_agent的TypeError错误 - 添加缓存结果类型检查,支持字典类型 3. ✅ 禁用LangSmith追踪避免403错误 - 将LANGSMITH_TRACING设置为false(.env本地修改,未提交) 4. ✅ 实现对话历史持久化 - 自动保存/加载对话记录到本地文件 5. ✅ 修复配置管理页面text_area高度错误 - 将height从60px改为80px 6. ✅ 修复图谱统计白屏问题 - 修正代码缩进错误,使统计数据正确显示 技术细节: - base.py: 在ask_stream中对global_result、fast_result、cached_response添加类型检查 - sidebar.py: 示例问题改用st.button实现,通过session_state传递 - chat.py: 添加example_question处理逻辑和对话历史自动保存 - state.py: 新增save_chat_history/load_chat_history函数实现持久化 - api.py: clear_chat函数中添加删除持久化文件逻辑 - config_manager.py: 修复3处text_area高度参数 - build_manager.py: 修正图谱统计tab的缩进错误
修复内容: 1. ✅ 彻底修复 graph_agent/hybrid_agent 的 TypeError - 在 _stream_with_config 方法中也添加类型检查 2. ✅ 实现对话历史自动恢复 - 刷新页面后自动加载最近的会话 3. ✅ 添加 /files/list API 接口 - 支持 AI 配置向导的文档检查功能 技术细节: - base.py (line 143-151): 为 message.content 添加字典类型处理 - state.py: 实现 load_latest_session() 函数,保存到 current_session.json - state.py: init_session_state() 优先恢复最近会话而非创建新会话 - api.py: clear_chat() 同时删除会话文件和默认会话文件 - admin.py: 新增 GET /admin/files/list 接口,返回文件列表、大小、时间戳 待处理问题: - fusion_agent 循环运行问题(需要进一步调查日志) - 图谱统计内容为空(可能是数据库无数据或连接问题)
修复内容: 1. ✅ 修复 fusion_agent 缺少 check_fast_cache 方法 - FusionGraphRAGAgent 新增 check_fast_cache() 方法 - 与 BaseAgent 接口保持一致,避免 AttributeError 2. ✅ 修复 AI 配置向导 404 错误 - 前端调用路径从 /files/list 改为 /admin/files/list - 与后端路由定义匹配 3. ✅ 添加 tokenizers 警告配置 - .env.example 新增 TOKENIZERS_PARALLELISM=false - 消除 fork 进程警告 技术细节: - fusion_agent.py (line 72-74): 新增 check_fast_cache 方法,复用 _read_cache - ai_config_wizard.py (line 275): 更新 API 调用路径为 /admin/files/list - .env.example (line 274-276): 添加 TOKENIZERS_PARALLELISM 环境变量 用户操作: 如需消除 tokenizers 警告,请在本地 .env 文件末尾添加: TOKENIZERS_PARALLELISM=false
问题描述: 当用户未构建知识图谱就尝试查询时,会遇到 Neo4j 向量索引不存在的错误: "The specified vector index name does not exist" 解决方案: 1. ✅ 在 vector_search 方法中添加详细的错误提示 - 检测向量索引不存在的错误 - 打印构建知识图谱的步骤指引 - 自动fallback到文本搜索作为替代方案 2. ✅ 在 chat_service 中改进异常处理 - 非流式响应:返回400状态码 + 友好的错误消息 - 流式响应:返回error status + 友好的错误消息 - 提供明确的操作步骤指引 技术细节: - base.py (line 146-158): 增强向量搜索的错误处理和提示 - chat_service.py (line 196-207): 非流式响应的错误处理 - chat_service.py (line 391-402): 流式响应的错误处理 用户体验改进: - 从技术性错误消息改为操作指引 - 明确告知需要先构建知识图谱 - 提供详细的3步操作流程 - 添加预计时间提示 根本原因: 向量索引通过 Neo4jVector.from_existing_graph() 在构建流程中创建, 如果用户跳过构建步骤直接查询,就会遇到此错误。
问题: 用户点击"全量构建"后缺少明确的反馈,不知道构建是否已启动 改进: 1. ✅ 增强成功提示 - 添加"请切换到构建状态标签查看进度"的提示 - 显示2秒确认消息 - 保持气球动画效果 2. ✅ 在构建操作tab显示当前状态 - 实时显示是否有构建正在进行 - 显示当前阶段和进度百分比 - 引导用户查看详细进度 3. ✅ 在构建状态tab添加启动确认 - 显示"构建已成功启动"的绿色提示 - 添加耐心等待的友好提示 - 自动清除标记避免重复显示 4. ✅ 改进确认按钮样式 - "确认构建"按钮使用primary类型(蓝色高亮) - 更容易识别和点击 5. ✅ 增量构建同步改进 - 与全量构建保持一致的反馈体验 - 统一的提示信息格式 技术细节: - 使用 st.session_state.build_just_started 标记 - 在构建操作tab调用 get_build_status() 显示实时状态 - 使用 time.sleep(2) 给用户充足时间阅读确认消息 - 构建状态tab检测标记并显示提示后自动清除 用户体验改进: - 明确告知构建已启动 - 清晰指引下一步操作 - 减少用户困惑和焦虑
问题: 用户启动构建后不知道何时完成,需要手动刷新查看进度 新增功能: 1. ✅ 构建完成自动检测 - 检测状态从 running 变为 completed - 自动显示气球动画庆祝 - 语音播报"构建已完成"(浏览器TTS) 2. ✅ 醒目的完成提示 - 绿色成功消息:"🎉 构建已完成!知识图谱构建成功!" - 操作指引:"💡 现在可以在智能问答中开始提问了" - 快速跳转按钮:"💬 去提问" 3. ✅ 改进的自动刷新 - 显示倒计时:"⏱️ 构建进行中... X 秒后自动刷新" - 构建完成自动停止刷新(避免浪费资源) - 添加"立即刷新"按钮供手动刷新 4. ✅ 完善的状态提示 - 构建中:显示"可以勾选自动刷新来实时监控进度" - 已完成:显示"知识图谱已成功构建" + 跳转按钮 - 失败:显示错误详情(可展开查看) 5. ✅ 快速操作 - "💬 去提问"按钮直接跳转到智能问答页面 - 一键开始使用新构建的知识图谱 技术实现: - 使用 st.session_state.previous_build_status 保存上次状态 - 比较前后状态变化检测构建完成 - 使用浏览器 SpeechSynthesis API 播放语音 - 通过 st.session_state.page_switch 实现页面跳转 - 自动刷新时检测状态,完成后停止 用户体验改进: - 不再需要盯着屏幕等待 - 完成时有明确的视觉+听觉提示 - 一键跳转到下一步操作 - 实时进度跟踪更直观
Owner
|
都是claude写的有自己审查过吗,或者至少用codex互相验证一下 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
No description provided.