[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-yacineMTB--dingllm.nvim":3,"tool-yacineMTB--dingllm.nvim":65},[4,17,26,36,44,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":16},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",147882,2,"2026-04-09T11:32:47",[13,14,15],"开发框架","Agent","语言模型","ready",{"id":18,"name":19,"github_repo":20,"description_zh":21,"stars":22,"difficulty_score":10,"last_commit_at":23,"category_tags":24,"status":16},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[25,13],"插件",{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":16},4487,"LLMs-from-scratch","rasbt\u002FLLMs-from-scratch","LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目，旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型（LLM）。它不仅是同名技术著作的官方代码库，更提供了一套完整的实践方案，涵盖模型开发、预训练及微调的全过程。\n\n该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型，却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码，用户能够透彻掌握 Transformer 架构、注意力机制等关键原理，从而真正理解大模型是如何“思考”的。此外，项目还包含了加载大型预训练权重进行微调的代码，帮助用户将理论知识延伸至实际应用。\n\nLLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API，而是渴望探究模型构建细节的技术人员而言，这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计：将复杂的系统工程拆解为清晰的步骤，配合详细的图表与示例，让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础，还是为未来研发更大规模的模型做准备",90106,3,"2026-04-06T11:19:32",[15,35,14,13],"图像",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":10,"last_commit_at":42,"category_tags":43,"status":16},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[13,15],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":10,"last_commit_at":50,"category_tags":51,"status":16},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",85052,"2026-04-08T11:03:08",[35,52,53,25,14,54,15,13,55],"数据工具","视频","其他","音频",{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":62,"last_commit_at":63,"category_tags":64,"status":16},5784,"funNLP","fighting41love\u002FfunNLP","funNLP 是一个专为中文自然语言处理（NLP）打造的超级资源库，被誉为\"NLP 民工的乐园”。它并非单一的软件工具，而是一个汇集了海量开源项目、数据集、预训练模型和实用代码的综合性平台。\n\n面对中文 NLP 领域资源分散、入门门槛高以及特定场景数据匮乏的痛点，funNLP 提供了“一站式”解决方案。这里不仅涵盖了分词、命名实体识别、情感分析、文本摘要等基础任务的标准工具，还独特地收录了丰富的垂直领域资源，如法律、医疗、金融行业的专用词库与数据集，甚至包含古诗词生成、歌词创作等趣味应用。其核心亮点在于极高的全面性与实用性，从基础的字典词典到前沿的 BERT、GPT-2 模型代码，再到高质量的标注数据和竞赛方案，应有尽有。\n\n无论是刚刚踏入 NLP 领域的学生、需要快速验证想法的算法工程师，还是从事人工智能研究的学者，都能在这里找到急需的“武器弹药”。对于开发者而言，它能大幅减少寻找数据和复现模型的时间；对于研究者，它提供了丰富的基准测试资源和前沿技术参考。funNLP 以开放共享的精神，极大地降低了中文自然语言处理的开发与研究成本，是中文 AI 社区不可或缺的宝藏仓库。",79857,1,"2026-04-08T20:11:31",[15,52,54],{"id":66,"github_repo":67,"name":68,"description_en":69,"description_zh":70,"ai_summary_zh":70,"readme_en":71,"readme_zh":72,"quickstart_zh":73,"use_case_zh":74,"hero_image_url":75,"owner_login":76,"owner_name":77,"owner_avatar_url":78,"owner_bio":79,"owner_company":80,"owner_location":81,"owner_email":82,"owner_twitter":76,"owner_website":83,"owner_url":84,"languages":85,"stars":90,"forks":91,"last_commit_at":92,"license":93,"difficulty_score":10,"env_os":94,"env_gpu":95,"env_ram":96,"env_deps":97,"category_tags":103,"github_topics":82,"view_count":10,"oss_zip_url":82,"oss_zip_packed_at":82,"status":16,"created_at":104,"updated_at":105,"faqs":106,"releases":107},5963,"yacineMTB\u002Fdingllm.nvim","dingllm.nvim","Yacine's LLM nvim scripts","dingllm.nvim 是一款专为 Neovim 用户打造的轻量级大语言模型（LLM）交互插件。它允许开发者直接在编辑器内调用各类 AI 模型，实现代码生成、自动补全或获取编程建议，无需切换窗口即可享受智能辅助。\n\n该工具主要解决了现有同类插件在部分 Neovim 版本中可能引发编辑器死锁的问题，同时摒弃了繁琐的配置和冗余功能，回归极简主义。作者重构了底层逻辑，不再依赖定时异步循环，而是采用 plenary 库的事件驱动机制，显著提升了运行的稳定性与响应速度。此外，它支持流式输出，让 AI 生成的内容能实时呈现在光标处，体验更加流畅。\n\ndingllm.nvim 非常适合追求高效、喜欢深度定制配置文件的资深开发者及 Neovim 重度用户。由于项目明确提示可能会频繁推出破坏性更新，且鼓励用户直接阅读并复制源码进行个性化修改，因此它更适合具备一定 Lua 编程基础、愿意掌控工具细节的技术人群，而非寻求“开箱即用”普通用户。通过简单的环境变量配置，用户即可灵活接入 OpenRouter、Groq 等多种主流 AI 服务，打造专属的智能编码环境。","\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FyacineMTB_dingllm.nvim_readme_04d7d6ac0611.png\" alt=\"wordart (6)\" style=\"width:200px;height:100px;\">\n\n### dingllm.nvim\nYacine's no frills LLM nvim scripts. free yourself, brothers and sisters\n\nThis is a really light config. I *will* be pushing breaking changes. I recommend reading the code and copying it over - it's really simple.\n\nhttps:\u002F\u002Fgithub.com\u002FyacineMTB\u002Fdingllm.nvim\u002Fassets\u002F10282244\u002F07cf5ace-7e01-46e3-bd2f-5bec3bb019cc\n\n\n### Credits\nThis extension woudln't exist if it weren't for https:\u002F\u002Fgithub.com\u002Fmelbaldove\u002Fllm.nvim\n\nI diff'd on a fork of it until it was basically a rewrite. Thanks @melbaldove!\n\nThe main difference is that this uses events from plenary, rather than a timed async loop. I noticed that on some versions of nvim, melbaldove's extension would deadlock my editor. I suspected nio, so i just rewrote the extension. \n\n### lazy config\nAdd your API keys to your env (export it in zshrc or bashrc) \n\n```lua\n  {\n    'yacineMTB\u002Fdingllm.nvim',\n    dependencies = { 'nvim-lua\u002Fplenary.nvim' },\n    config = function()\n      local system_prompt =\n        'You should replace the code that you are sent, only following the comments. Do not talk at all. Only output valid code. Do not provide any backticks that surround the code. Never ever output backticks like this ```. Any comment that is asking you for something should be removed after you satisfy them. Other comments should left alone. Do not output backticks'\n      local helpful_prompt = 'You are a helpful assistant. What I have sent are my notes so far.'\n      local dingllm = require 'dingllm'\n\n\n      local function handle_open_router_spec_data(data_stream)\n        local success, json = pcall(vim.json.decode, data_stream)\n        if success then\n          if json.choices and json.choices[1] and json.choices[1].text then\n            local content = json.choices[1].text\n            if content then\n              dingllm.write_string_at_cursor(content)\n            end\n          end\n        else\n          print(\"non json \" .. data_stream)\n        end\n      end\n\n      local function custom_make_openai_spec_curl_args(opts, prompt)\n        local url = opts.url\n        local api_key = opts.api_key_name and os.getenv(opts.api_key_name)\n        local data = {\n          prompt = prompt,\n          model = opts.model,\n          temperature = 0.7,\n          stream = true,\n        }\n        local args = { '-N', '-X', 'POST', '-H', 'Content-Type: application\u002Fjson', '-d', vim.json.encode(data) }\n        if api_key then\n          table.insert(args, '-H')\n          table.insert(args, 'Authorization: Bearer ' .. api_key)\n        end\n        table.insert(args, url)\n        return args\n      end\n\n\n      local function llama_405b_base()\n        dingllm.invoke_llm_and_stream_into_editor({\n          url = 'https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\u002Fchat\u002Fcompletions',\n          model = 'meta-llama\u002Fllama-3.1-405b',\n          api_key_name = 'OPEN_ROUTER_API_KEY',\n          max_tokens = '128',\n          replace = false,\n        }, custom_make_openai_spec_curl_args, handle_open_router_spec_data)\n      end\n\n      local function groq_replace()\n        dingllm.invoke_llm_and_stream_into_editor({\n          url = 'https:\u002F\u002Fapi.groq.com\u002Fopenai\u002Fv1\u002Fchat\u002Fcompletions',\n          model = 'llama-3.1-70b-versatile',\n          api_key_name = 'GROQ_API_KEY',\n          system_prompt = system_prompt,\n          replace = true,\n        }, dingllm.make_openai_spec_curl_args, dingllm.handle_openai_spec_data)\n      end\n\n      local function groq_help()\n        dingllm.invoke_llm_and_stream_into_editor({\n          url = 'https:\u002F\u002Fapi.groq.com\u002Fopenai\u002Fv1\u002Fchat\u002Fcompletions',\n          model = 'llama-3.1-70b-versatile',\n          api_key_name = 'GROQ_API_KEY',\n          system_prompt = helpful_prompt,\n          replace = false,\n        }, dingllm.make_openai_spec_curl_args, dingllm.handle_openai_spec_data)\n      end\n\n      local function llama405b_replace()\n        dingllm.invoke_llm_and_stream_into_editor({\n          url = 'https:\u002F\u002Fapi.lambdalabs.com\u002Fv1\u002Fchat\u002Fcompletions',\n          model = 'hermes-3-llama-3.1-405b-fp8',\n          api_key_name = 'LAMBDA_API_KEY',\n          system_prompt = system_prompt,\n          replace = true,\n        }, dingllm.make_openai_spec_curl_args, dingllm.handle_openai_spec_data)\n      end\n\n      local function llama405b_help()\n        dingllm.invoke_llm_and_stream_into_editor({\n          url = 'https:\u002F\u002Fapi.lambdalabs.com\u002Fv1\u002Fchat\u002Fcompletions',\n          model = 'hermes-3-llama-3.1-405b-fp8',\n          api_key_name = 'LAMBDA_API_KEY',\n          system_prompt = helpful_prompt,\n          replace = false,\n        }, dingllm.make_openai_spec_curl_args, dingllm.handle_openai_spec_data)\n      end\n\n      local function anthropic_help()\n        dingllm.invoke_llm_and_stream_into_editor({\n          url = 'https:\u002F\u002Fapi.anthropic.com\u002Fv1\u002Fmessages',\n          model = 'claude-3-5-sonnet-20241022',\n          api_key_name = 'ANTHROPIC_API_KEY',\n          system_prompt = helpful_prompt,\n          replace = false,\n        }, dingllm.make_anthropic_spec_curl_args, dingllm.handle_anthropic_spec_data)\n      end\n\n      local function anthropic_replace()\n        dingllm.invoke_llm_and_stream_into_editor({\n          url = 'https:\u002F\u002Fapi.anthropic.com\u002Fv1\u002Fmessages',\n          model = 'claude-3-5-sonnet-20241022',\n          api_key_name = 'ANTHROPIC_API_KEY',\n          system_prompt = system_prompt,\n          replace = true,\n        }, dingllm.make_anthropic_spec_curl_args, dingllm.handle_anthropic_spec_data)\n      end\n\n      vim.keymap.set({ 'n', 'v' }, '\u003Cleader>k', groq_replace, { desc = 'llm groq' })\n      vim.keymap.set({ 'n', 'v' }, '\u003Cleader>K', groq_help, { desc = 'llm groq_help' })\n      vim.keymap.set({ 'n', 'v' }, '\u003Cleader>L', llama405b_help, { desc = 'llm llama405b_help' })\n      vim.keymap.set({ 'n', 'v' }, '\u003Cleader>l', llama405b_replace, { desc = 'llm llama405b_replace' })\n      vim.keymap.set({ 'n', 'v' }, '\u003Cleader>I', anthropic_help, { desc = 'llm anthropic_help' })\n      vim.keymap.set({ 'n', 'v' }, '\u003Cleader>i', anthropic_replace, { desc = 'llm anthropic' })\n      vim.keymap.set({ 'n', 'v' }, '\u003Cleader>o', llama_405b_base, { desc = 'llama base' })\n    end,\n  },\n\n```\n\n### Documentation\n\nread the code dummy\n","\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FyacineMTB_dingllm.nvim_readme_04d7d6ac0611.png\" alt=\"wordart (6)\" style=\"width:200px;height:100px;\">\n\n### dingllm.nvim\nYacine 的简约 LLM Neovim 脚本。兄弟姐妹们，解放自己吧！\n\n这是一个非常轻量级的配置。我确实会推送破坏性更新。建议你阅读代码并将其复制过去——它真的很简单。\n\nhttps:\u002F\u002Fgithub.com\u002FyacineMTB\u002Fdingllm.nvim\u002Fassets\u002F10282244\u002F07cf5ace-7e01-46e3-bd2f-5bec3bb019cc\n\n\n### 致谢\n如果没有 https:\u002F\u002Fgithub.com\u002Fmelbaldove\u002Fllm.nvim，这个插件根本不会存在。\n\n我在它的分支上进行了大量修改，直到几乎完全重写。感谢 @melbaldove！\n\n主要区别在于，这个插件使用 plenary 提供的事件机制，而不是基于定时器的异步循环。我发现，在某些版本的 Neovim 上，melbaldove 的插件会导致编辑器死锁。我怀疑是 NIO 问题，于是直接重写了插件。\n\n### lazy 配置\n将你的 API 密钥添加到环境变量中（在 zshrc 或 bashrc 中导出）。\n\n```lua\n  {\n    'yacineMTB\u002Fdingllm.nvim',\n    dependencies = { 'nvim-lua\u002Fplenary.nvim' },\n    config = function()\n      local system_prompt =\n        'You should replace the code that you are sent, only following the comments. Do not talk at all. Only output valid code. Do not provide any backticks that surround the code. Never ever output backticks like this ```. Any comment that is asking you for something should be removed after you satisfy them. Other comments should left alone. Do not output backticks'\n      local helpful_prompt = 'You are a helpful assistant. What I have sent are my notes so far.'\n      local dingllm = require 'dingll'\n\n\n      local function handle_open_router_spec_data(data_stream)\n        local success, json = pcall(vim.json.decode, data_stream)\n        if success then\n          if json.choices and json.choices[1] and json.choices[1].text then\n            local content = json.choices[1].text\n            if content then\n              dingllm.write_string_at_cursor(content)\n            end\n          end\n        else\n          print(\"non json \" .. data_stream)\n        end\n      end\n\n      local function custom_make_openai_spec_curl_args(opts, prompt)\n        local url = opts.url\n        local api_key = opts.api_key_name and os.getenv(opts.api_key_name)\n        local data = {\n          prompt = prompt,\n          model = opts.model,\n          temperature = 0.7,\n          stream = true,\n        }\n        local args = { '-N', '-X', 'POST', '-H', 'Content-Type: application\u002Fjson', '-d', vim.json.encode(data) }\n        if api_key then\n          table.insert(args, '-H')\n          table.insert(args, 'Authorization: Bearer ' .. api_key)\n        end\n        table.insert(args, url)\n        return args\n      end\n\n\n      local function llama_405b_base()\n        dingllm.invoke_llm_and_stream_into_editor({\n          url = 'https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\u002Fchat\u002Fcompletions',\n          model = 'meta-llama\u002Fllama-3.1-405b',\n          api_key_name = 'OPEN_ROUTER_API_KEY',\n          max_tokens = '128',\n          replace = false,\n        }, custom_make_openai_spec_curl_args, handle_open_router_spec_data)\n      end\n\n      local function groq_replace()\n        dingllm.invoke_llm_and_stream_into_editor({\n          url = 'https:\u002F\u002Fapi.groq.com\u002Fopenai\u002Fv1\u002Fchat\u002Fcompletions',\n          model = 'llama-3.1-70b-versatile',\n          api_key_name = 'GROQ_API_KEY',\n          system_prompt = system_prompt,\n          replace = true,\n        }, dingllm.make_openai_spec_curl_args, dingllm.handle_openai_spec_data)\n      end\n\n      local function groq_help()\n        dingllm.invoke_llm_and_stream_into_editor({\n          url = 'https:\u002F\u002Fapi.groq.com\u002Fopenai\u002Fv1\u002Fchat\u002Fcompletions',\n          model = 'llama-3.1-70b-versatile',\n          api_key_name = 'GROQ_API_KEY',\n          system_prompt = helpful_prompt,\n          replace = false,\n        }, dingllm.make_openai_spec_curl_args, dingllm.handle_openai_spec_data)\n      end\n\n      local function llama405b_replace()\n        dingllm.invoke_llm_and_stream_into_editor({\n          url = 'https:\u002F\u002Fapi.lambdalabs.com\u002Fv1\u002Fchat\u002Fcompletions',\n          model = 'hermes-3-llama-3.1-405b-fp8',\n          api_key_name = 'LAMBDA_API_KEY',\n          system_prompt = system_prompt,\n          replace = true,\n        }, dingllm.make_openai_spec_curl_args, dingllm.handle_openai_spec_data)\n      end\n\n      local function llama405b_help()\n        dingllm.invoke_llm_and_stream_into_editor({\n          url = 'https:\u002F\u002Fapi.lambdalabs.com\u002Fv1\u002Fchat\u002Fcompletions',\n          model = 'hermes-3-llama-3.1-405b-fp8',\n          api_key_name = 'LAMBDA_API_KEY',\n          system_prompt = helpful_prompt,\n          replace = false,\n        }, dingllm.make_openai_spec_curl_args, dingllm.handle_openai_spec_data)\n      end\n\n      local function anthropic_help()\n        dingllm.invoke_llm_and_stream_into_editor({\n          url = 'https:\u002F\u002Fapi.anthropic.com\u002Fv1\u002Fmessages',\n          model = 'claude-3-5-sonnet-20241022',\n          api_key_name = 'ANTHROPIC_API_KEY',\n          system_prompt = helpful_prompt,\n          replace = false,\n        }, dingllm.make_anthropic_spec_curl_args, dingllm.handle_anthropic_spec_data)\n      end\n\n      local function anthropic_replace()\n        dingllm.invoke_llm_and_stream_into_editor({\n          url = 'https:\u002F\u002Fapi.anthropic.com\u002Fv1\u002Fmessages',\n          model = 'claude-3-5-sonnet-20241022',\n          api_key_name = 'ANTHROPIC_API_KEY',\n          system_prompt = system_prompt,\n          replace = true,\n        }, dingllm.make_anthropic_spec_curl_args, dingllm.handle_anthropic_spec_data)\n      end\n\n      vim.keymap.set({ 'n', 'v' }, '\u003Cleader>k', groq_replace, { desc = 'llm groq' })\n      vim.keymap.set({ 'n', 'v' }, '\u003Cleader>K', groq_help, { desc = 'llm groq_help' })\n      vim.keymap.set({ 'n', 'v' }, '\u003Cleader>L', llama405b_help, { desc = 'llm llama405b_help' })\n      vim.keymap.set({ 'n', 'v' }, '\u003Cleader>l', llama405b_replace, { desc = 'llm llama405b_replace' })\n      vim.keymap.set({ 'n', 'v' }, '\u003Cleader>I', anthropic_help, { desc = 'llm anthropic_help' })\n      vim.keymap.set({ 'n', 'v' }, '\u003Cleader>i', anthropic_replace, { desc = 'llm anthropic' })\n      vim.keymap.set({ 'n', 'v' }, '\u003Cleader>o', llama_405b_base, { desc = 'llama base' })\n    end,\n  },\n\n```\n\n### 文档\n\n去读代码吧，傻瓜！","# dingllm.nvim 快速上手指南\n\ndingllm.nvim 是一个极简的 Neovim LLM（大语言模型）插件，旨在通过流式输出将 AI 生成的代码直接写入编辑器。该插件不依赖复杂的异步循环，而是使用 `plenary` 的事件机制，避免了部分 Neovim 版本下的死锁问题。\n\n> **注意**：作者明确表示该配置非常轻量且可能会推送破坏性更新（breaking changes）。最佳实践是直接阅读源码并根据需求复制修改，而非将其作为黑盒依赖长期使用。\n\n## 环境准备\n\n### 系统要求\n- **Neovim**: 建议使用较新版本（0.8+），以确保 `vim.json` 和异步功能正常运作。\n- **操作系统**: Linux, macOS, Windows (需支持 curl)。\n\n### 前置依赖\n1. **curl**: 插件底层使用 `curl` 发送 HTTP 请求，请确保系统已安装。\n2. **plenary.nvim**: 核心依赖库，用于处理异步事件。\n3. **API Key**: 你需要拥有至少一个大模型服务商的 API Key（如 Groq, OpenRouter, Lambda Labs, Anthropic 等）。\n\n### 环境变量配置\n在使用前，请将你的 API Key 导出到 shell 环境变量中（添加到 `~\u002F.zshrc` 或 `~\u002F.bashrc`）：\n\n```bash\nexport GROQ_API_KEY=\"your_groq_api_key\"\nexport OPEN_ROUTER_API_KEY=\"your_openrouter_api_key\"\nexport LAMBDA_API_KEY=\"your_lambda_api_key\"\nexport ANTHROPIC_API_KEY=\"your_anthropic_api_key\"\n```\n\n## 安装步骤\n\n推荐使用 **lazy.nvim** 进行包管理。由于该插件设计为“复制即用”的风格，建议将其配置直接嵌入你的 `init.lua` 或专门的配置文件中。\n\n在 `lazy.nvim` 的配置表中添加以下内容：\n\n```lua\n{\n  'yacineMTB\u002Fdingllm.nvim',\n  dependencies = { 'nvim-lua\u002Fplenary.nvim' },\n  config = function()\n    -- 定义系统提示词：仅输出代码，不包含 Markdown 反引号，自动移除需求类注释\n    local system_prompt =\n      'You should replace the code that you are sent, only following the comments. Do not talk at all. Only output valid code. Do not provide any backticks that surround the code. Never ever output backticks like this ```. Any comment that is asking you for something should be removed after you satisfy them. Other comments should left alone. Do not output backticks'\n    \n    -- 定义帮助类提示词\n    local helpful_prompt = 'You are a helpful assistant. What I have sent are my notes so far.'\n    \n    local dingllm = require 'dingllm'\n\n    -- 自定义 OpenRouter 数据流处理函数\n    local function handle_open_router_spec_data(data_stream)\n      local success, json = pcall(vim.json.decode, data_stream)\n      if success then\n        if json.choices and json.choices[1] and json.choices[1].text then\n          local content = json.choices[1].text\n          if content then\n            dingllm.write_string_at_cursor(content)\n          end\n        end\n      else\n        print(\"non json \" .. data_stream)\n      end\n    end\n\n    -- 自定义 OpenAI 规格 Curl 参数构建函数\n    local function custom_make_openai_spec_curl_args(opts, prompt)\n      local url = opts.url\n      local api_key = opts.api_key_name and os.getenv(opts.api_key_name)\n      local data = {\n        prompt = prompt,\n        model = opts.model,\n        temperature = 0.7,\n        stream = true,\n      }\n      local args = { '-N', '-X', 'POST', '-H', 'Content-Type: application\u002Fjson', '-d', vim.json.encode(data) }\n      if api_key then\n        table.insert(args, '-H')\n        table.insert(args, 'Authorization: Bearer ' .. api_key)\n      end\n      table.insert(args, url)\n      return args\n    end\n\n    -- 定义不同模型和功能的调用函数\n    \n    -- OpenRouter: Llama 3.1 405B (基础模式)\n    local function llama_405b_base()\n      dingllm.invoke_llm_and_stream_into_editor({\n        url = 'https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\u002Fchat\u002Fcompletions',\n        model = 'meta-llama\u002Fllama-3.1-405b',\n        api_key_name = 'OPEN_ROUTER_API_KEY',\n        max_tokens = '128',\n        replace = false,\n      }, custom_make_openai_spec_curl_args, handle_open_router_spec_data)\n    end\n\n    -- Groq: Llama 3.1 70B (替换代码模式)\n    local function groq_replace()\n      dingllm.invoke_llm_and_stream_into_editor({\n        url = 'https:\u002F\u002Fapi.groq.com\u002Fopenai\u002Fv1\u002Fchat\u002Fcompletions',\n        model = 'llama-3.1-70b-versatile',\n        api_key_name = 'GROQ_API_KEY',\n        system_prompt = system_prompt,\n        replace = true,\n      }, dingllm.make_openai_spec_curl_args, dingllm.handle_openai_spec_data)\n    end\n\n    -- Groq: Llama 3.1 70B (辅助对话模式)\n    local function groq_help()\n      dingllm.invoke_llm_and_stream_into_editor({\n        url = 'https:\u002F\u002Fapi.groq.com\u002Fopenai\u002Fv1\u002Fchat\u002Fcompletions',\n        model = 'llama-3.1-70b-versatile',\n        api_key_name = 'GROQ_API_KEY',\n        system_prompt = helpful_prompt,\n        replace = false,\n      }, dingllm.make_openai_spec_curl_args, dingllm.handle_openai_spec_data)\n    end\n\n    -- Lambda Labs: Hermes 3 Llama 3.1 405B (替换代码模式)\n    local function llama405b_replace()\n      dingllm.invoke_llm_and_stream_into_editor({\n        url = 'https:\u002F\u002Fapi.lambdalabs.com\u002Fv1\u002Fchat\u002Fcompletions',\n        model = 'hermes-3-llama-3.1-405b-fp8',\n        api_key_name = 'LAMBDA_API_KEY',\n        system_prompt = system_prompt,\n        replace = true,\n      }, dingllm.make_openai_spec_curl_args, dingllm.handle_openai_spec_data)\n    end\n\n    -- Lambda Labs: Hermes 3 Llama 3.1 405B (辅助对话模式)\n    local function llama405b_help()\n      dingllm.invoke_llm_and_stream_into_editor({\n        url = 'https:\u002F\u002Fapi.lambdalabs.com\u002Fv1\u002Fchat\u002Fcompletions',\n        model = 'hermes-3-llama-3.1-405b-fp8',\n        api_key_name = 'LAMBDA_API_KEY',\n        system_prompt = helpful_prompt,\n        replace = false,\n      }, dingllm.make_openai_spec_curl_args, dingllm.handle_openai_spec_data)\n    end\n\n    -- Anthropic: Claude 3.5 Sonnet (辅助对话模式)\n    local function anthropic_help()\n      dingllm.invoke_llm_and_stream_into_editor({\n        url = 'https:\u002F\u002Fapi.anthropic.com\u002Fv1\u002Fmessages',\n        model = 'claude-3-5-sonnet-20241022',\n        api_key_name = 'ANTHROPIC_API_KEY',\n        system_prompt = helpful_prompt,\n        replace = false,\n      }, dingllm.make_anthropic_spec_curl_args, dingllm.handle_anthropic_spec_data)\n    end\n\n    -- Anthropic: Claude 3.5 Sonnet (替换代码模式)\n    local function anthropic_replace()\n      dingllm.invoke_llm_and_stream_into_editor({\n        url = 'https:\u002F\u002Fapi.anthropic.com\u002Fv1\u002Fmessages',\n        model = 'claude-3-5-sonnet-20241022',\n        api_key_name = 'ANTHROPIC_API_KEY',\n        system_prompt = system_prompt,\n        replace = true,\n      }, dingllm.make_anthropic_spec_curl_args, dingllm.handle_anthropic_spec_data)\n    end\n\n    -- 绑定快捷键\n    vim.keymap.set({ 'n', 'v' }, '\u003Cleader>k', groq_replace, { desc = 'llm groq replace' })\n    vim.keymap.set({ 'n', 'v' }, '\u003Cleader>K', groq_help, { desc = 'llm groq help' })\n    vim.keymap.set({ 'n', 'v' }, '\u003Cleader>L', llama405b_help, { desc = 'llm llama405b help' })\n    vim.keymap.set({ 'n', 'v' }, '\u003Cleader>l', llama405b_replace, { desc = 'llm llama405b replace' })\n    vim.keymap.set({ 'n', 'v' }, '\u003Cleader>I', anthropic_help, { desc = 'llm anthropic help' })\n    vim.keymap.set({ 'n', 'v' }, '\u003Cleader>i', anthropic_replace, { desc = 'llm anthropic replace' })\n    vim.keymap.set({ 'n', 'v' }, '\u003Cleader>o', llama_405b_base, { desc = 'llama base' })\n  end,\n}\n```\n\n## 基本使用\n\n安装并重启 Neovim 后，插件即可通过快捷键调用。\n\n### 核心功能模式\n插件主要提供两种工作模式，通过 `replace` 参数控制：\n1. **替换模式 (`replace = true`)**: AI 生成的代码将直接**覆盖**当前选中的代码块。适用于重构、修复 bug 或根据注释生成具体实现。\n   - 默认系统提示词会强制 AI 只输出纯代码，不包含 Markdown 标记（```）或多余的解释。\n2. **辅助模式 (`replace = false`)**: AI 生成的内容将**插入**到光标当前位置。适用于获取建议、解释代码或续写笔记。\n\n### 常用快捷键示例\n\n假设你的 `\u003Cleader>` 键设置为空格键：\n\n| 快捷键 | 功能描述 | 适用场景 |\n| :--- | :--- | :--- |\n| `\u003Cleader>k` | **Groq 替换** | 选中一段代码，按下此键，AI 将根据上下文或注释重写该代码。 |\n| `\u003Cleader>K` | **Groq 助手** | 在光标处插入 Groq 模型的回复，适合询问逻辑或获取建议。 |\n| `\u003Cleader>i` | **Claude 替换** | 使用 Claude 3.5 Sonnet 进行高质量的代码重写。 |\n| `\u003Cleader>I` | **Claude 助手** | 使用 Claude 3.5 Sonnet 进行对话或代码解释。 |\n| `\u003Cleader>l` | **Lambda 替换** | 使用 Llama 3.1 405B 进行代码替换。 |\n| `\u003Cleader>o` | **OpenRouter 基础** | 简单的流式输出测试。 |\n\n### 使用流程示例\n\n1. **编写注释**：在代码中写下你的需求，例如：\n   ```python\n   # TODO: 写一个函数计算斐波那契数列的第 n 项，使用递归\n   ```\n2. **选中代码**：进入可视模式（`v`），选中包含注释的行或代码块。\n3. **触发替换**：按下 `\u003Cleader>k` (或其他你配置的替换快捷键)。\n4. **观察结果**：AI 的回复将流式地直接替换掉你选中的内容，生成最终的 Python 函数代码，且不带任何 Markdown 格式符号。\n\n> **提示**：由于该插件极度依赖配置文件中的函数定义，若需切换模型或调整 Prompt，请直接修改 `config` 函数内的对应 Lua 代码。","资深后端工程师正在 Neovim 中重构一段遗留的 Python 数据处理脚本，需要快速清理冗余注释并优化核心算法逻辑。\n\n### 没有 dingllm.nvim 时\n- **工作流频繁中断**：必须手动复制代码片段切换到浏览器，在多个标签页间粘贴到不同的大模型网页版，严重打断编码心流。\n- **上下文切换成本高**：每次获取建议后，需再次手动复制回编辑器，并小心翼翼地剔除模型生成的 Markdown 代码块标记（如 \\`\\`\\`python），极易出错。\n- **响应延迟与卡顿**：依赖外部网页加载速度，且无法像本地插件那样利用事件驱动机制流畅地流式输出，遇到网络波动时编辑器甚至可能假死。\n- **定制化困难**：难以针对不同任务（如“仅替换代码”或“补充笔记”）快速切换系统提示词（System Prompt），导致模型经常输出多余的寒暄语。\n\n### 使用 dingllm.nvim 后\n- **原地智能交互**：直接在编辑器内选中代码调用 `groq_replace` 或 `llama405b_base` 函数，基于预设的 API 配置即时获取流式反馈，无需离开当前缓冲区。\n- **纯净代码注入**：借助精心设计的 `system_prompt`，dingllm.nvim 自动过滤所有闲聊和 Markdown 格式标记，只将纯粹的可执行代码写入光标位置，实现“所即所得”。\n- **高性能异步处理**：利用 Plenary 的事件机制替代传统轮询，即使在处理长上下文时也能保持编辑器丝滑流畅，彻底杜绝了死锁风险。\n- **场景化指令复用**：通过简单的 Lua 配置即可定义“帮助模式”与“重构模式”，一键切换模型行为，完美适配从整理笔记到硬核重构的不同需求。\n\ndingllm.nvim 通过将大模型能力无缝嵌入 Neovim 原生工作流，让开发者在零摩擦的体验中实现了代码编写与 AI 辅助的完美融合。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FyacineMTB_dingllm.nvim_5f71e696.png","yacineMTB","yacine","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002FyacineMTB_9a037840.jpg","https:\u002F\u002Fyacine.ca\u002Fpractice.mp4 ","canadian startup","Ottawa, Canada",null,"yacine.ca","https:\u002F\u002Fgithub.com\u002FyacineMTB",[86],{"name":87,"color":88,"percentage":89},"Lua","#000080",100,862,83,"2026-04-09T10:37:11","Apache-2.0","Linux, macOS, Windows","不需要本地 GPU（基于云端 API 调用）","未说明",{"notes":98,"python":96,"dependencies":99},"该工具是 Neovim 插件，无需本地运行大模型。需配置环境变量存储 API Key（如 OPEN_ROUTER_API_KEY, GROQ_API_KEY, ANTHROPIC_API_KEY 等）。依赖系统安装 curl 命令用于发送 HTTP 请求。作者建议直接阅读并复制代码配置，因为可能会有破坏性更新。",[100,101,102],"Neovim","plenary.nvim","curl",[15,25],"2026-03-27T02:49:30.150509","2026-04-10T02:43:29.313133",[],[]]