为豪华汽车修理店构建 AI 接待员一、概述1. 简介A. 是什么这是一个为豪华汽车修理店定制的 AI 语音接待员系统，名为 Axle。它能够接听电话、回答价格和服务相关问题、记录回访请求，帮助店主挽回因漏接电话造成的业务损失。B. 为什么学展示 RAG（检索增强生成）在实际业务中的应用演示如何将 LLM 与语音通信集成了解 AI Agent 的完整开发流程学习向量搜索和知识库构建的最佳实践C. 学完能做什么使用 MongoDB Atlas 构建向量知识库集成 Vapi 实现语音 AI 代理使用 Claude 构建基于知识库的问答系统设计企业级 AI 应用的升级路径二、项目背景1. 业务问题Dane 经营一家豪华汽车修理店，每天因在车底下工作而漏接数百个电话。每个未接电话都意味着潜在的收入损失：从 45 美元的刹车服务到 2000 美元的发动机维修。客户电话无人接听时，会转向其他服务商。2. 解决方案概述构建一个名为 Axle 的 AI 接待员，具备以下能力：24/7 接听电话准确回答价格和服务问题了解营业时间、政策等业务信息在无法回答时收集回访信息graph LR A[客户来电] --> B[Vapi 语音平台] B --> C[FastAPI Webhook] C --> D[MongoDB Atlas 向量搜索] D --> E[检索相关文档] E --> F[Anthropic Claude] F --> G[生成回复] G --> C C --> B B --> H[语音播放给客户]三、技术栈1. 核心组件组件用途说明Vapi语音平台电话号码、语音识别/合成、工具调用Deepgram语音转文字集成于 VapiElevenLabs文字转语音集成于 VapiFastAPI + UvicornWebhook 服务处理 Vapi 回调请求MongoDB Atlas数据存储知识库、向量搜索、通话记录Voyage AI文本嵌入voyage-3-large 模型Anthropic Claude响应生成claude-sonnet-4-6Ngrok隧道服务本地开发时暴露公网地址Copilot CLIAI 辅助开发代码生成工具2. 为什么选择这套技术栈Vapi：一站式语音解决方案，无需单独处理电信复杂性MongoDB Atlas：原生向量搜索，知识库和通话记录统一存储Voyage AI：高质量的语义嵌入，适合专业领域知识Claude：优秀的指令遵循能力，减少幻觉问题四、实施步骤1. 步骤一：构建大脑（RAG 管道）A. 知识库准备抓取修理店网站数据，提取以下信息：服务类型和定价（21+ 份文档）营业时间支付方式取消政策质保信息代步车服务擅长的汽车品牌B. 向量化存储使用 Voyage AI 将每个文档转换为 1024 维向量：# 示例：文档向量化 import voyageai voyage_client = voyageai.Client(api_key="your_key") document = "刹车服务：450美元，包含前后刹车片更换..." embedding = voyage_client.embed( [document], model="voyage-3-large" )C. 检索流程graph TD A[用户提问] --> B[使用 Voyage AI 嵌入查询] B --> C[MongoDB Atlas 向量搜索] C --> D[返回前3个最相关文档] D --> E[传递给 Claude + 严格系统提示] E --> F{是否包含答案?} F -->|是| G[生成简洁对话回复] F -->|否| H[请求回访信息] G --> I[返回答案] H --> J[保存到 callbacks 集合]D. 系统提示设计关键原则：仅从知识库回答保持简短对话风格不知道时明确说明禁止幻觉五、步骤二：连接真实电话号码1. FastAPI Webhook 服务器from fastapi import FastAPI, Request from pymongo import MongoClient app = FastAPI() @app.post("/webhook") async def handle_call(request: Request): data = await request.json() # 提取用户查询 query = data.get("message", "") # 调用 RAG 管道 response = rag_pipeline(query) # 记录到 MongoDB client = MongoClient("mongodb+srv://...") db = client["mechanic_shop"] db["calls"].insert_one({ "caller_number": data.get("caller_number"), "query": query, "response": response, "timestamp": datetime.now() }) return {"response": response}2. Ngrok 隧道配置开发阶段使用 Ngrok 暴露本地服务：# 启动 Ngrok ngrok http 8000 # 将生成的 URL 配置到 Vapi Dashboard # https://abc123.ngrok.io/webhook3. Vapi 助手配置在 Vapi Dashboard 中设置：欢迎语："Hi, thanks for calling Dane's Motorsport, how can I help you today?"工具函数：answerQuestion：RAG 支持的问答saveCallback：收集回访信息Webhook URL：指向 FastAPI 服务器4. 对话记忆管理Vapi 在每次请求中发送完整对话历史，RAG 管道可以获取前文作为上下文：def rag_pipeline(query, conversation_history=[]): # 构建带历史记录的查询 context = "\n".join([f"Q: {h['query']}\nA: {h['response']}" for h in conversation_history]) # 结合历史和当前查询进行检索 enhanced_query = f"{context}\nCurrent question: {query}" # ... 执行检索和生成六、步骤三：语音优化1. 选择合适的声音作者测试了约 20 种 AI 声音，最终选择 Christopher：平静自然语速适中符合汽车修理店的专业氛围声音选择的重要性超预期：错误的语音会让完美的 AI 回复感觉不对。2. 语音专用系统提示文本回复和语音回复截然不同。针对语音优化：文本风格语音风格"Great question!"避免"$45.00""forty-five dollars"项目符号列表完整句子markdown 格式纯文本详细说明2-4 句话上限优化后的提示词示例：你是一家豪华汽车修理店的接待员。回答时： - 使用短句 - 语气友好专业 - 价格用完整单词表达 - 最多 2-4 句话 - 不知道时请求回访信息3. 升级流程设计当问题超出知识库范围时：明确告知客户不知道答案询问客户姓名和回访电话保存到 callbacks 集合店主可以批量跟进def handle_unknown_query(query, caller_info): # 保存回访请求 db["callbacks"].insert_one({ "caller_number": caller_info.get("number"), "name": caller_info.get("name"), "question": query, "timestamp": datetime.now(), "status": "pending" }) return "我不太确定这个问题的答案。方便留下您的姓名和电话吗？店主会尽快回电。"七、数据价值1. 通话日志记录每次交互存储到 calls 集合：来电号码查询内容AI 回复是否转人工时间戳2. 业务洞察店主可以分析：客户最常问的问题来电高峰时段AI 转人工的频率回访转化率这使电话系统成为数据资产，指导业务改进。八、测试策略1. 集成测试覆盖测试套件包含：RAG 管道测试Webhook 处理器测试端到端流程测试2. 边缘案例处理场景处理方式Vapi 发送格式错误的请求优雅降级或返回错误向量搜索无高置信度结果触发升级流程客户未留下回访电话请求提供或礼貌结束知识库信息过时定期更新机制九、未来计划1. 即将推出的功能日历集成：通话中直接预约短信通知：新回访请求即时通知管理仪表板：统一管理待回访列表安全加固：生产环境安全配置Railway 部署：持久化公网 URL2. 业务影响预期每周漏接电话：100+每个未接电话潜在价值：50-2000 美元系统优势：24/7 运行，永不占线，熟悉所有价格和政策十、核心经验1. 关键洞察不要将原始 LLM 用于特定业务的语音代理。原因：可能产生错误的价格信息破坏客户期望导致客户流失2. 最佳实践基于真实知识库：所有回答必须基于可验证的信息约束回答范围：仅从知识库回答优先设计升级路径：这不是边缘案例，是核心功能重视语音体验：声音和表达方式与内容同样重要持续监控和改进：通过通话日志优化系统3. 开发时间项目分三个冲刺阶段完成：第一阶段：RAG 管道第二阶段：电话集成第三阶段：语音优化最困难的部分不是代码，而是让语音听起来像是在汽车修理店工作的人，而不是硅谷创业公司的聊天机器人。参考资料How I Built an AI Receptionist for a Luxury Mechanic Shop - Part 1
构建可靠的本地化 Home Assistant 语音助手一、概述1. 简介A. 是什么本文介绍如何从 Google Home/Nest Mini 迁移到完全本地化的 Home Assistant 语音助手（Assist），使用 local-first 架构配合 llama.cpp（此前使用 Ollama）实现本地运行。B. 为什么学Google Assistant 逐渐变笨，无法满足日常需求隐私担忧：家中在线麦克风可能泄露隐私网络依赖：云服务宕机时无法控制家中设备完全本地化运行，无需依赖外部服务C. 学完能做什么搭建完全本地化的语音助手系统实现天气查询、地点搜索、音乐播放等功能自定义唤醒词和语音模型通过本地大模型实现自然对话二、硬件准备1. 语音设备1 台 HA Voice Preview Edition2 台 Satellite1 Small Squircle Enclosures1 台 Pixel 7a 作为卫星设备/Hub（搭配 View Assist）2. 语音服务器硬件Beelink MiniPC（支持 USB4）USB4 eGPU 外接显卡盒3. 显卡选择GPU模型类别响应时间（提示缓存后）备注RTX 3090 24GB20B-30B MoE, 9B Dense1 - 2 秒高效运行此架构最优模型RX 7900XTX 24GB20B-30B MoE, 9B Dense1 - 2 秒高效运行此架构最优模型RTX 5060Ti 16GB20B MoE, 9B Dense1.5 - 3 秒响应时间 < 3 秒RX 9060XT 16GB20B MoE, 9B Dense1.5 - 4 秒响应时间 < 4 秒RTX 3050 8GB4B Dense3 秒适合运行基础功能的小模型4. 模型选择模型多设备工具调用理解上下文线索解析误听指令忽略误激活文本GGML GPT-OSS:20B MXFP4支持支持支持支持Unsloth Qwen3.5-35B-A3B MXFP4_MOE支持一般一般支持Unsloth Qwen3-VL:8B-Instruct Q6_K_XL支持支持一般一般Unsloth Qwen3-30B-A3B-Instruct Q4_K_XL支持一般不支持一般Unsloth GLM 4.7 Flash (30B) Q4_K_XL一般支持不支持一般Unsloth Qwen3:4b-Instruct 2507 Q6_K_XL一般不支持不支持不支持功能说明：多设备工具调用：处理如打开风扇并关闭灯光的复合指令理解上下文线索：在特定区域时，若该区域只有一个设备则不询问，多个时正确询问解析误听指令：能够处理误听指令（如打开 pan）并正确执行意图指令忽略误激活文本：可靠忽略不需要的输入，不受误听文本负面影响三、系统架构1. 整体架构graph LR A[用户] --> B[Home Assistant Assist] B --> C[语音卫星设备] C -->|麦克风输入| B B --> D[语音转文本] B --> E[大模型推理] B --> F[文本转语音] D -->|转录文本| B E -->|对话生成| B B -->|音频输出| C2. 组件说明Home Assistant：核心控制平台语音卫星设备：麦克风和扬声器终端语音转文本：Wyoming ONNX ASR（Nvidia Parakeet V2）大模型推理：llama.cpp 运行本地模型文本转语音：Kokoro TTS 或 Piper四、软件配置1. 模型运行器推荐使用 llama.cpp 以获得最佳性能。2. 语音转文本软件模型备注Wyoming ONNX ASRNvidia Parakeet V2通过 OpenVINO 分支运行，CPU 推理时间优化至约 0.3 秒Rhasspy Faster WhisperNvidia Parakeet V2直接通过 ONNX CPU 运行，速度较慢3. 文本转语音软件备注Kokoro TTS可混合多种声音/语调，处理所有文本Piper (CPU 运行)有多种声音可选，处理一般文本，但处理货币、电话号码和地址有困难4. Home Assistant LLM 集成LLM Conversation：改进基础对话体验LLM Intents：提供额外工具（Web 搜索、地点搜索、天气预报）五、配置步骤1. 初始设置从 Ollama 内置模型开始测试，每隔几周连接 Ollama 到 Home Assistant。2. 模型选择从 HuggingFace 获取 GGUF 模型选择更高量化的模型（如 MXFP4）避免使用默认 Q4_K 低量化模型3. 提示词优化A. 提示词结构为每个服务使用专门的 # 章节使用项目符号列出详细说明和指令添加具体输出格式示例B. 解决常见问题天气服务调用：明确指示 LLM 调用天气服务响应格式化：避免额外评论，只返回必要信息表情符号处理：移除 TTS 不适合的表情符号工具调用指导：针对特定问题类型指示调用特定工具4. 自定义唤醒词使用 microWakeWord-Trainer-Nvidia-Docker 训练自定义唤醒词（如 Hey Robot），训练时间约 30 分钟。5. 网络优化为语音设备创建专用 IoT 网络使用流式 TTS 传输以减少延迟六、功能实现1. 音乐播放自动化使用句子自动化触发器配合 Music Assistant：alias: Music Shortcut description: "" triggers: - trigger: conversation command: - Play {music} id: play - trigger: conversation command: Stop playing id: stop conditions: [] actions: - choose: - conditions: - condition: trigger id: - play sequence: - action: music_assistant.play_media metadata: {} data: media_id: "{{ trigger.slots.music }}" target: entity_id: "{{ target_player }}" - set_conversation_response: Playing {{ trigger.slots.music }} - conditions: - condition: trigger id: - stop sequence: - action: media_player.media_stop metadata: {} data: {} target: entity_id: "{{ target_player }}" - set_conversation_response: Stopped playing music. variables: satellite_player_map: | {{ { "assist_satellite.home_assistant_voice_xyz123": "media_player.my_desired_speaker", } }} target_player: | {{ satellite_player_map.get(trigger.satellite_id, "media_player.default_speaker") }} mode: single七、常见问题1. WiFi 连接问题症状：语音输出卡顿、单词中间停顿解决：创建专用 IoT 网络、使用流式 TTS2. 工具调用失败原因：默认模型量化过低或缺乏指令解决：从 HuggingFace 获取更高量化的 GGUF 模型3. 误激活问题解决方案：训练自定义唤醒词、添加静音自动化4. 模型选择困惑建议：GGML GPT-OSS:20B MXFP4 在各项测试中表现最佳八、最终效果系统核心任务可靠运行，实现完全本地化语音助手，无隐私担忧。主要改进：响应时间：高端显卡 1-2 秒，中端显卡 3-4 秒功能完整：天气查询、地点搜索、音乐播放、通用问答隐私保护：所有数据本地处理参考资料My Journey to a reliable and enjoyable locally hosted voice assistant
CLI-Anything：让所有软件成为 AI Agent 原生工具一、概述1. 简介A. 是什么CLI-Anything 是一个 Claude Code 插件，能够将任何软件自动转换为 AI Agent 可控制的命令行工具。通过一条命令，它可以为 GIMP、Blender、LibreOffice 等应用生成功能完整的 CLI 接口，让 AI Agent 获得直接控制专业软件的能力。B. 为什么学解决 AI Agent 使用软件难题：当前 AI Agent 虽然推理能力强，但难以使用真实的专业软件统一接口范式：CLI 是 AI Agent 的理想接口，结构化、可组合、自描述自动化生成：无需手动编写代码，自动分析软件架构并生成 CLI生产级质量：1,508 个测试用例验证，覆盖 11 个主流应用C. 学完能做什么为任何软件自动生成 CLI，让 AI Agent 可以控制理解 7 阶段自动化流水线的工作原理部署和使用生成的 CLI 工具通过 refine 命令迭代改进 CLI 覆盖率2. 前置知识A. 必备技能Python 3.10+ 基础基本的命令行操作经验理解 AI Agent 的基本概念B. 推荐知识Click 框架（Python CLI 工具）pytest 测试框架Claude Code 使用经验二、环境准备1. 系统要求Python 3.10 或更高版本目标软件已安装（如 GIMP、Blender 等）Claude Code 或其他支持的 AI 编码代理2. 安装步骤Claude Code 平台安装：# 添加 CLI-Anything 市场 /plugin marketplace add HKUDS/CLI-Anything # 安装插件 /plugin install cli-anything手动安装（可选）：# 克隆仓库 git clone https://github.com/HKUDS/CLI-Anything.git # 复制插件到 Claude Code 插件目录 cp -r CLI-Anything/cli-anything-plugin ~/.claude/plugins/cli-anything # 重新加载插件 /reload-plugins3. 验证安装安装完成后，在 Claude Code 会话中输入：/cli-anything:cli-anything --help三、核心概念1. 基本术语Agent-Native（Agent 原生）：专为 AI Agent 设计的接口，支持结构化输入输出Harness（工具套件）：为特定软件生成的完整 CLI 包REPL（交互式解释器）：命令行交互模式，支持状态持久化7-Phase Pipeline：从分析到发布的自动化流程2. 工作原理CLI-Anything 通过自动化流程分析软件源码，理解其功能架构，然后生成标准的命令行接口。生成的 CLI 直接调用真实软件的后端，确保功能完整性。graph TB A[软件源码/仓库] --> B[分析阶段] B --> C[设计阶段] C --> D[实现阶段] D --> E[测试规划] E --> F[测试编写] F --> G[文档更新] G --> H[发布安装] subgraph 生成产物 I[Click CLI] J[REPL 界面] K[JSON 输出] L[测试套件] end D --> I D --> J D --> K F --> L3. 架构设计graph LR A[AI Agent] -->|命令| B[CLI-Anything 生成的 CLI] B -->|调用| C[真实软件后端] C -->|渲染/处理| D[输出文件] B -->|JSON 输出| A B -->|人类可读| E[终端输出] subgraph CLI-Anything 核心 F[分析引擎] G[代码生成器] H[测试框架] end F --> G G --> H四、快速上手1. Hello World 示例生成第一个 CLI 工具：# 为本地 GIMP 源码生成完整 CLI（所有 7 个阶段） /cli-anything:cli-anything ./gimp2. 核心功能演示# 从 GitHub 仓库生成 /cli-anything:cli-anything https://github.com/blender/blender3. 代码讲解上述命令会自动执行以下流程：第 1 阶段：分析扫描源代码，映射 GUI 操作到 API第 2 阶段：设计架构命令组、状态模型、输出格式第 3 阶段：实现构建 Click CLI，包含 REPL、JSON 输出、撤销/重做功能第 4 阶段：测试规划创建 TEST.md，包含单元测试和端到端测试计划第 5 阶段：测试编写实现全面的测试套件第 6 阶段：文档更新 TEST.md 包含测试结果第 7 阶段：发布创建 setup.py，安装到 PATH4. 使用生成的 CLI# 进入生成的 harness 目录 cd gimp/agent-harness # 安装到 PATH pip install -e . # 使用帮助 cli-anything-gimp --help # 创建新项目 cli-anything-gimp project new --width 1920 --height 1080 -o poster.json # 添加图层 cli-anything-gimp --json layer add -n "Background" --type solid --color "#1a1a2e" # 进入交互式 REPL cli-anything-gimp五、进阶内容1. 常用功能插件命令列表命令描述/cli-anything <path-or-repo>构建完整 CLI 工具套件/cli-anything:refine <path> [focus]改进现有工具套件，扩展覆盖率/cli-anything:test <path-or-repo>运行测试并更新 TEST.md/cli-anything:validate <path-or-repo>验证是否符合 HARNESS.md 标准refine 命令使用迭代改进 CLI 覆盖率：# 广泛改进 —— 分析所有功能的缺口 /cli-anything:refine ./gimp # 聚焦改进 —— 针对特定功能区域 /cli-anything:refine ./gimp "批量图像处理和滤镜功能"refine 命令会执行以下操作：分析软件完整能力与当前 CLI 覆盖之间的缺口为识别出的缺口实现新命令添加相关测试更新文档可以多次运行以稳步扩展覆盖率，每次运行都是增量且非破坏性的。2. 最佳实践真实软件集成原则CLI 必须调用实际软件进行渲染不使用简化替代品（如用 Pillow 替代 GIMP）生成有效的项目文件，然后调用真实后端测试策略# 运行特定 CLI 的测试 cd <software>/agent-harness python3 -m pytest cli_anything/<software>/tests/ -v # 强制已安装模式（推荐用于验证） CLI_ANYTHING_FORCE_INSTALLED=1 python3 -m pytest cli_anything/<software>/tests/ -v -sJSON 输出模式AI Agent 可以通过 --json 标志获取结构化输出：cli-anything-libreoffice --json document info --project report.json返回格式：{ "name": "Q1 Report", "type": "writer", "pages": 1, "elements": 2, "modified": true }3. 性能优化使用批量操作减少命令调用次数在 REPL 模式下工作，保持会话状态JSON 模式比人类可读输出更快，适合 Agent 解析六、实战案例1. 场景描述为 LibreOffice 生成 CLI，让 AI Agent 能够自动创建文档、添加内容并导出为 PDF。2. 实现步骤步骤 1：生成 CLI/cli-anything:cli-anything https://github.com/LibreOffice/core步骤 2：安装生成的 CLIcd libreoffice/agent-harness pip install -e .步骤 3：使用 CLI 创建文档# 创建新的 Writer 文档 cli-anything-libreoffice document new -o report.json --type writer # 添加标题 cli-anything-libreoffice --project report.json writer add-heading -t "季度报告" --level 1 # 添加表格 cli-anything-libreoffice --project report.json writer add-table --rows 4 --cols 3步骤 4：导出为 PDFcli-anything-libreoffice --project report.json export render output.pdf -p pdf --overwrite3. 完整 REPL 交互$ cli-anything-blender ╔══════════════════════════════════════════╗ ║ cli-anything-blender v1.0.0 ║ ║ Blender CLI for AI Agents ║ ╚══════════════════════════════════════════╝ blender> scene new --name ProductShot ✓ Created scene: ProductShot blender[ProductShot]> object add-mesh --type cube --location 0 0 1 ✓ Added mesh: Cube at (0, 0, 1) blender[ProductShot]*> render execute --output render.png --engine CYCLES ✓ Rendered: render.png (1920×1080, 2.3 MB) via blender --background blender[ProductShot]> exit Goodbye!七、常见问题1. 安装问题问题：插件安装后无法识别解决：确认 Claude Code 版本，使用 /reload-plugins 重新加载2. 生成问题问题：生成过程失败或输出不完整解决：确保源码可访问，检查 Python 依赖是否安装完整3. 运行问题问题：生成的 CLI 命令无法执行解决：确认已运行 pip install -e . 安装到 PATH八、应用场景CLI-Anything 可用于多种软件类型：GitHub 仓库将任何开源项目转换为 Agent 可控工具，如 VSCodium、WordPress、Calibre、Zotero 等AI/ML 平台自动化模型训练、推理管道和超参数调优，如 Stable Diffusion WebUI、ComfyUI、InvokeAI 等数据与分析工具支持程序化数据处理、可视化和统计分析，如 JupyterLab、Apache Superset、Metabase 等开发工具简化代码编辑、构建、测试和部署流程，如 Jenkins、Gitea、Portainer、SonarQube 等创意媒体工具控制内容创建、编辑和渲染工作流，如 Blender、GIMP、OBS Studio、Krita、Kdenlive 等科学计算自动化研究工作流、模拟和复杂计算，如 ImageJ、FreeCAD、QGIS、ParaView 等企业办公将商业应用和生产力工具转换为 Agent 可访问系统，如 NextCloud、GitLab、Grafana、Mattermost 等九、测试结果CLI-Anything 在 11 个不同的应用上进行了全面测试，总计 1,508 个测试用例，100% 通过率。软件领域CLI 命令后端测试数量GIMP图像编辑cli-anything-gimpPillow + GEGL/Script-Fu107Blender3D 建模与渲染cli-anything-blenderbpy (Python scripting)208Inkscape矢量图形cli-anything-inkscape直接 SVG/XML 操作202Audacity音频制作cli-anything-audacityPython wave + sox161LibreOffice办公套件cli-anything-libreofficeODF 生成 + 无头 LO158OBS Studio直播与录制cli-anything-obs-studioJSON 场景 + obs-websocket153Kdenlive视频编辑cli-anything-kdenliveMLT XML + melt 渲染器155Shotcut视频编辑cli-anything-shotcut直接 MLT XML + melt154Zoom视频会议cli-anything-zoomZoom REST API (OAuth2)22Draw.io绘图cli-anything-drawiomxGraph XML + draw.io CLI138AnyGenAI 内容生成cli-anything-anygenAnyGen REST API50总计 1,508测试层级包括：单元测试：隔离测试每个核心函数E2E 测试（原生）：项目文件生成管道E2E 测试（真实后端）：真实软件调用 + 输出验证CLI 子进程测试：通过 subprocess.run 验证已安装命令参考资料CLI-Anything GitHub RepositoryClaude Code Documentation
Debian 下 Node.js 安装指南一、概述1. 简介A. 是什么Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境，它使 JavaScript 可以在服务器端运行。npm (Node Package Manager) 是 Node.js 的默认包管理器，用于安装和管理 JavaScript 依赖包。B. 为什么学使用 JavaScript 进行全栈开发丰富的 npm 生态系统高性能的 I/O 处理能力适合构建实时应用和 API 服务C. 学完能做什么运行 Node.js 应用程序使用 npm 管理项目依赖开发 Web 服务器和 API使用 nvm 管理多个 Node.js 版本2. 前置知识A. 必备技能基本 Linux 命令行操作了解包管理器概念（apt、npm）B. 推荐知识JavaScript 基础语法终端环境变量配置二、环境准备1. 系统要求Linux：Debian 11+ / Ubuntu 18.04+ / CentOS 7+macOS：10.15+Windows：10/112. 安装方式对比安装方式优点缺点推荐场景nvm (Node Version Manager)版本管理灵活、无需 sudo、多版本共存需要额外工具✅ 推荐，开发环境NodeSource 仓库官方源、版本较新需要 sudo、权限限制生产环境系统自带仓库安装简单、版本稳定版本较旧测试环境3. 安装步骤检查当前状态node --version cat /etc/os-release使用 nvm 安装（推荐）安装 nvm：unset NVM_DIR && curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash加载 nvm 环境变量export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"安装 Node.js LTS 版本nvm install --lts3. 验证安装node --version npm --version预期输出：v24.14.0 11.9.0三、核心概念1. 基本术语Node.js：JavaScript 运行时环境npm：Node Package Manager，包管理器LTS：Long Term Support，长期支持版本nvm：Node Version Manager，版本管理工具2. 工作原理graph LR A[开发者] -->|编写 JS 代码| B[nvm] B -->|管理多个版本| C[Node.js] C -->|V8 引擎| D[执行 JS] B -->|npm| E[包管理] E -->|下载依赖| F[node_modules] F -->|导入使用| C3. 版本管理graph TB subgraph Node.js 版本 A[LTS - 稳定版] B[Current - 最新版] end subgraph nvm 管理 C[nvm install --lts] D[nvm install latest] E[nvm use <version>] end A -.推荐.-> C B -.尝鲜.-> D C --> E D --> E E --> F[切换成功]四、快速上手1. Hello World 示例创建 test.js：console.log('Hello, Node.js!');运行：node test.js2. 使用 npm 初始化项目mkdir myapp && cd myapp npm init -y npm install express3. 创建简单的 Web 服务器const http = require('http'); const server = http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello World\n'); }); server.listen(3000);五、nvm 高级用法1. 常用命令nvm ls # 列出已安装版本 nvm install 18.20.0 # 安装特定版本 nvm use 18.20.0 # 切换到指定版本 nvm alias default 18.20.0 # 设置默认版本 nvm uninstall 18.20.0 # 卸载版本 nvm current # 显示当前版本2. 版本切换场景不同项目可能需要不同 Node.js 版本，使用 nvm 可以轻松切换：cd project-a nvm use 18 cd project-b nvm use 203. 使用 .nvmrc 文件在项目根目录创建 .nvmrc 文件指定版本：18.20.0自动切换：nvm use六、常见问题1. 安装问题问题：NVM_DIR 环境变量冲突现象：You have $NVM_DIR set to "/home/user/.config/nvm", but that directory does not exist.解决：unset NVM_DIR && curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash问题：命令未找到现象：nvm: command not found解决：关闭终端重新打开，或手动加载：source ~/.bashrc2. 权限问题问题：apt 安装需要 sudo解决：使用 nvm 安装，无需 sudo 权限3. 网络问题问题：下载缓慢解决：使用国内镜像源设置 npm 镜像：npm config set registry https://registry.npmmirror.com七、最佳实践1. 版本选择开发环境：使用 Current 版本体验新特性生产环境：使用 LTS 版本保证稳定性2. 项目管理为每个项目指定 .nvmrc 文件使用 package.json 管理依赖版本定期更新依赖包3. 性能优化使用 nvm 缓存加速安装清理无用版本释放空间nvm uninstall <version>参考资料Node.js 官方文档nvm GitHub 仓库npm 官方文档
AI 时代 Vibe Coding 三大保命符一、概述1. 背景AI 编程工具（如 Claude Code、Cursor 等）的普及带来了开发效率的革命性提升，但也引入了新的风险。AI 可能一次性修改大量代码，如果缺乏正确的开发策略，可能导致难以挽回的损失。本文总结 AI 时代 Vibe Coding 的三大保命符：原子化、互解耦、可回滚。2. 核心原则步子迈小（原子化）各管各的（互解耦）随时后悔（可回滚）二、原子化 (Atomic)1. 定义事情一件一件做，别贪多。每次只完成一个最小的可验证单元。2. 形象比喻就像玩游戏"存盘"。非原子化（错误示范）你一口气玩了 10 个关卡，打赢了 3 个 BOSS，捡了一堆装备，中间一次都没存盘。结果在最后一步如果不小心死机了，你之前的努力全白费，得从头再来。原子化（正确做法）打完一个小怪，存个盘；捡到一个宝箱，存个盘。每次只做一个小动作就确认一下。这样就算出错了，你只损失最近这几分钟的进度，而不是一下午的心血。3. 代码实践graph LR A[开始] --> B[任务分解] B --> C1[子任务1] C1 --> D1[完成并提交] D1 --> C2[子任务2] C2 --> D2[完成并提交] D2 --> C3[子任务3] C3 --> D3[完成并提交] D3 --> E[结束] style D1 fill:#90EE90 style D2 fill:#90EE90 style D3 fill:#90EE90错误做法：让 AI 一次性"改登录功能 + 换背景颜色 + 优化数据库"正确做法：让 AI"改登录"，确认没问题后，git commit再让 AI"换背景"，确认没问题后，git commit最后让 AI"优化数据库"，确认没问题后，git commit4. Git 原子化提交# 每完成一个小功能就提交一次 git add src/auth/login.py git commit -m "fix: 修复登录密码验证逻辑" # 继续下一个功能 git add src/styles/background.css git commit -m "feat: 更新页面背景颜色"三、互解耦 (Decoupled)1. 定义各管各的，谁也别挨着谁。模块之间应该保持独立，互不影响。2. 形象比喻就像家里的电路系统。未解耦（错误示范）你家客厅的灯坏了，结果连着厨房的冰箱、厕所的马桶、卧室的空调全都断电罢工了。这就是"纠缠不清"。已解耦（正确做法）客厅灯坏了就只是客厅灯不亮，厨房依然能做饭，厕所依然能冲水。每个房间的电路是独立的，互不影响。3. 代码实践graph TB subgraph 未解耦系统 A[用户头像功能] <--> B[支付系统] B <--> C[评论功能] C <--> A end subgraph 已解耦系统 D[用户服务] -.独立.-> E[支付服务] E -.独立.-> F[评论服务] F -.独立.-> D end style A fill:#FFB6C6 style B fill:#FFB6C6 style C fill:#FFB6C6 style D fill:#90EE90 style E fill:#90EE90 style F fill:#90EE90错误场景：AI 修改了"用户头像"的功能，导致"支付系统"崩溃正确架构：用户服务：独立管理用户信息和头像支付服务：独立处理支付逻辑两个服务通过 API 通信，一个挂了不影响另一个4. 解耦实践要点模块化设计：每个功能模块职责单一接口隔离：通过明确的接口通信，避免直接依赖依赖注入：使用依赖注入降低耦合度事件驱动：使用消息队列实现异步解耦四、可回滚 (Rollback)1. 定义世上真有后悔药。当出现问题时，能够快速恢复到之前的工作状态。2. 形象比喻就像文档里的"撤销 (Ctrl+Z)"。不可回滚（错误示范）你在纸上用油性笔画画，画错了就是画错了，涂不掉，只能把纸撕了重画。可回滚（正确做法）你在电脑上画画，画错了一笔？点一下"撤销"，马上回到画错之前的样子，就像什么都没发生过。3. 代码实践graph LR A[当前版本 v1.3] -->|AI 改坏了| B[崩溃版本 v1.4-broken] B -->|git reset| A A -->|重新修改| C[修复版本 v1.4-fixed] style B fill:#FFB6C6 style A fill:#FFD700 style C fill:#90EE90核心工具：Git 版本管理# 查看提交历史 git log --oneline # 回滚到上一个稳定版本 git reset --hard HEAD~1 # 或者创建新分支回滚 git checkout -b hotfix git reset --hard HEAD~1 # 使用 revert 更安全（保留历史） git revert HEAD4. 回滚策略频繁提交：每个小功能完成后立即提交清晰的提交信息：提交信息要能看懂改了什么分支保护：主分支受保护，通过 PR 合并发布标签：给稳定版本打标签，便于快速定位五、综合案例：AlexZ 的教训1. 事件背景开发者 AlexZ 在使用 AI 编程工具时遇到问题：没有进行原子化 commitAI 把功能改坏了之前正常工作的代码被删除只能浪费时间重做2. 问题分析graph TB A[AlexZ 的操作] --> B[一次性修改多个功能] B --> C[功能之间互相牵连] C --> D[没有及时提交代码] D --> E[AI 改错导致崩溃] E --> F[无法回滚] F --> G[被迫重做] style A fill:#87CEEB style E fill:#FFB6C6 style G fill:#FFA500违反的三大原则：不原子：让 AI 一口气干了太多事不解耦：功能之间互相牵连难回滚：没有存好档，没法用时光机回去3. 正确做法graph TB A[开始任务] --> B[分解为小任务] B --> C[完成子任务 1] C --> D{测试通过?} D -->|否| C D -->|是| E[git commit] E --> F[完成子任务 2] F --> G{测试通过?} G -->|否| H[git 回滚到 E] H --> F G -->|是| I[git commit] I --> J[继续下一个任务] style E fill:#90EE90 style I fill:#90EE90 style H fill:#FFD700六、最佳实践总结1. 原子化检查清单[ ] 每次只修改一个功能[ ] 完成后立即测试[ ] 测试通过后立即 commit[ ] 提交信息清晰描述改动2. 解耦检查清单[ ] 模块职责单一[ ] 模块间通过接口通信[ ] 修改一个模块不影响其他模块[ ] 可以独立测试每个模块3. 可回滚检查清单[ ] 使用 Git 管理代码[ ] 频繁提交，不要积累[ ] 提交信息清晰可读[ ] 重要版本打 tag[ ] 熟练掌握回滚命令4. AI 编程工作流建议sequenceDiagram participant U as 用户 participant AI as AI 工具 participant Git as Git 仓库 participant Test as 测试环境 U->>AI: 请求修改功能 A AI->>U: 返回修改代码 U->>Test: 测试功能 A Test-->>U: 测试通过 U->>Git: git commit 功能 A U->>AI: 请求修改功能 B AI->>U: 返回修改代码 U->>Test: 测试功能 B Test-->>U: 测试失败 U->>Git: git reset 回滚 U->>AI: 重新请求修改功能 B七、常用 Git 命令参考1. 提交相关# 查看当前状态 git status # 添加文件到暂存区 git add <文件名> git add . # 添加所有修改 # 提交到本地仓库 git commit -m "清晰描述本次改动" # 查看提交历史 git log git log --oneline # 简洁显示2. 回滚相关# 撤销未提交的修改 git checkout -- <文件名> # 撤销暂存区的修改 git reset HEAD <文件名> # 回滚到指定提交（保留修改） git reset --soft HEAD~1 # 回滚到指定提交（不保留修改） git reset --hard HEAD~1 # 回滚到指定提交（安全方式，生成新提交） git revert HEAD3. 分支相关# 创建新分支 git checkout -b <分支名> # 切换分支 git checkout <分支名> # 合并分支 git merge <分支名> # 删除分支 git branch -d <分支名>参考资料Tz (@Tz_2022) on X
OpenClaw + CherryIN 零基础保姆级教程一、概述1. 简介A. 是什么OpenClaw 是一个开源的 AI Agent 框架，可以让 AI 模型控制电脑执行各种任务，包括写代码、操作文件、执行命令等。CherryIN 是一个 AI 模型聚合平台，提供多家大模型的统一接入服务。B. 为什么学OpenClaw 开源一周 Stars 数已超过 12 万，生态活跃CherryIN 聚合多家模型，包括 DeepSeek v3.2、Kimi K2.5 等最新模型打造专属 AI Agent，彻底解放生产力C. 学完能做什么独立配置 OpenClaw + CherryIN 环境使用 AI Agent 自动化执行电脑操作任务切换使用多种 AI 模型完成不同场景需求2. 前置知识A. 必备技能基本命令行操作能力了解 JSON 配置文件格式B. 推荐知识虚拟机基础概念（推荐在虚拟机中测试）Node.js 和 npm 基础二、环境准备1. 系统要求操作系统：Windows / macOS / Linux网络环境：稳定的互联网连接Node.js：22 以上版本（推荐 24）时间：约 20 分钟2. 安装 Node.jsmacOS / Linux 用户推荐使用 nvm 安装：# 下载并安装 nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash # 加载 nvm（避免重启终端） \. "$HOME/.nvm/nvm.sh" # 安装 Node.js 24 nvm install 24 # 验证安装 node -v npm -vWindows 用户推荐使用 WSL 环境，或直接下载 Node.js 安装包。3. 安装 OpenClawNode.js 装好后，一行命令搞定：npm install -g openclaw@latest或使用 pnpm：pnpm add -g openclaw@latest4. 验证安装node -v openclaw --version能正常显示版本号即说明安装成功。三、核心概念1. 基本术语OpenClaw：AI Agent 框架，提供模型调用和电脑控制能力CherryIN：AI 模型聚合平台，提供统一 API 接口Provider：模型供应商，CherryIN 是其中一个供应商Agent：智能代理，可以理解并执行用户指令2. 工作原理graph LR A[用户] --> B[OpenClaw] B --> C{模型路由} C --> D[CherryIN] D --> E[各大模型] E --> D D --> B B --> F[电脑操作] F --> G[文件/命令/应用]3. 架构图OpenClaw 采用插件化架构，支持多种模型供应商：配置文件：~/.openclaw/openclaw.jsonWebUI：浏览器界面交互Daemon：后台服务进程四、快速上手1. 初始化 OpenClaw执行初始化命令：openclaw onboard --install-daemon安装完成后会自动弹出配置页面。如果没有弹出，可手动执行：openclaw onboard2. 安全风险确认因为 OpenClaw 可以控制电脑，会有安全提示。接受即可。强烈建议：在虚拟机中使用，避免影响主力机。3. 配置向导步骤A. 跳过 Provider 设置暂时不设置 Provider，后续通过配置文件接入 CherryIN。B. 跳过通知设置IM 通知需要额外配置，先确保基础功能可用。C. 选择 WebUI 模式选择 WebUI 模式，方便在浏览器中操作。D. 成功标志控制台输出访问地址，如 http://localhost:30004. 注册 CherryIN访问 CherryIN 官网：https://open.cherryin.ai/建议：使用邮箱登录，比 GitHub 登录更稳定。充值后可体验全部模型，包括免费的 DeepSeek v3.2 和各家最新模型。5. 获取 API 令牌A. 创建令牌进入「令牌管理」，创建新令牌，如 Openclaw-AgentB. 复制令牌保存 sk- 开头的令牌，后续配置需要使用五、配置模型接入1. 找到配置文件OpenClaw 配置文件路径：~/.openclaw/openclaw.json~ 表示用户主目录：Linux：/home/用户名macOS：/Users/用户名Windows：C:\Users\用户名2. 添加 CherryIN 配置打开配置文件，添加以下内容（替换 sk-xxxxx 为自己的令牌）：{ "models": { "mode": "merge", "providers": { "cherryin": { "baseUrl": "https://open.cherryin.cc/v1/", "apiKey": "sk-xxxxx", "auth": "api-key", "api": "openai-completions", "headers": {}, "models": [ { "id": "agent/kimi-k2.5", "name": "Kimi K2.5", "api": "openai-completions" }, { "id": "anthropic/claude-opus-4.5", "name": "Claude Opus 4.5", "api": "openai-completions" }, { "id": "anthropic/claude-sonnet-4.5", "name": "Claude Sonnet 4.5", "api": "openai-completions" } ] } } }, "agents": { "defaults": { "model": { "primary": "cherryin/agent/kimi-k2.5" }, "models": { "cherryin/agent/kimi-k2.5": {}, "cherryin/anthropic/claude-opus-4.5": {}, "cherryin/anthropic/claude-sonnet-4.5": {} }, "compaction": { "mode": "safeguard" }, "maxConcurrent": 4, "subagents": { "maxConcurrent": 8 } } } }模型 ID 说明：可访问 CherryIN 价格页面查看所有可用模型。3. 保存并验证保存文件后无需重启服务，配置即时生效。六、开始使用1. 创建新对话在 WebUI 中执行：/new2. 切换模型使用 /model 命令切换模型：/model cherryin/agent/kimi-k2.5模型路径格式：Provider/ModelID供应商 ID：cherryin模型 ID：agent/kimi-k2.5完整路径：cherryin/agent/kimi-k2.53. 发送消息测试发送测试消息，如「你好，介绍一下你自己」。4. 成功标志AI 正常回复消息，说明配置成功。七、进阶内容1. 通过 WebUI 配置如果不习惯编辑配置文件，可通过 WebUI 配置：A. 进入配置页面在 WebUI 中找到 Config 配置入口B. 添加 Provider配置供应商信息，包括端点和 API KeyC. 添加模型新建模型，填写模型 ID（从 CherryIN 价格页获取）D. 保存重载重要：点击 Save + Reload 使配置生效2. 支持的模型CherryIN 支持的模型包括但不限于：DeepSeek v3.2（免费）Kimi K2.5Claude Opus 4.5Claude Sonnet 4.5GPT-4 系列其他各家最新模型3. 注意事项A. 模型兼容性确保选择支持 openai-completions 的模型B. 配置重载修改配置后必须保存重载才能生效C. 安全建议在虚拟机中测试，避免影响主力机八、常见问题1. 安装问题Node.js 版本过低：使用 nvm 安装 22 以上版本npm 权限问题：Linux/macOS 使用 sudo 或配置 npm 全局路径2. 配置问题JSON 格式错误：使用 JSON 验证工具检查语法模型路径错误：确认 Provider 和 Model ID 正确3. 使用问题模型无响应：检查 API Key 是否有效配置未生效：确认已点击 Save + Reload参考资料OpenClaw + CherryIN 零基础保姆级教程 - Cherry StudioCherryIN 官网
Linux 用户活动监控工具 psacct 与 acct 使用教程一、概述1. 简介A. 是什么psacct 和 acct 是 Linux 系统中用于监控用户活动的开源工具。这些工具在后台运行，持续跟踪系统中每个用户的活动以及所消耗的资源。B. 为什么学多用户服务器管理需要了解用户行为安全审计和问题排查的基础工具资源管理和容量规划的数据来源系统管理员必备的监控技能C. 学完能做什么查看用户登录时长和连接时间统计追踪用户执行的所有命令监控系统资源消耗情况生成用户活动报告用于审计2. 前置知识A. 必备技能基本 Linux 命令操作了解 Linux 用户和权限概念熟悉 systemctl 服务管理命令B. 推荐知识Linux 进程管理基础系统日志和日志轮转概念二、环境准备1. 系统要求Linux 发行版：RHEL/CentOS/Fedora 或 Ubuntu/Debianroot 或 sudo 权限磁盘空间：至少 500MB 用于日志存储2. 安装步骤RHEL/CentOS/Fedora 系统：sudo yum install psacct # 或在新系统上使用 dnf sudo dnf install psacctUbuntu/Debian 系统：sudo apt install acct其他发行版：# Alpine Linux sudo apk add psacct # Arch Linux sudo pacman -S acct # OpenSUSE sudo zypper install acct3. 启动服务RHEL 系统需要手动启动：# 查看服务状态 sudo systemctl status psacct # 启动服务 sudo systemctl start psacct # 设置开机自启 sudo systemctl enable psacct # 再次查看状态确认 sudo systemctl status psacctDebian 系统会自动启动服务。4. 验证安装# 检查进程日志文件是否创建 ls -lh /var/account/pacct # 查看当前登录统计 ac三、核心概念1. 基本术语psacct/acct：进程 accounting 工具包pacct：进程 accounting 数据文件wtmp：用户登录登出记录文件连接时间：用户登录系统的累计时长2. 工作原理graph TB A[用户登录] --> B[系统记录 wtmp] A --> C[用户执行命令] C --> D[acct 记录进程信息] D --> E[写入 pacct 文件] B --> F[ac 命令读取] E --> G[sa 命令读取] E --> H[lastcomm 命令读取] F --> I[生成统计报告] G --> I H --> I3. 核心命令功能命令功能说明ac显示用户登录/登出统计（连接时间）lastcomm显示用户之前执行的命令accton开启或关闭进程 accountingsa汇总已执行命令的信息last/lastb显示最后登录的用户列表四、快速上手1. 查看总连接时间ac输出示例：total 11299.15这个数字表示所有用户累计连接小时数。2. 按日期查看连接时间ac -d输出示例：Oct 28 total 234.50 Oct 29 total 189.23 Oct 30 total 198.67 Oct 31 total 456.12 Nov 1 total 267.45 Nov 2 total 201.34 Nov 3 total 423.45注意某些日期的异常峰值，需要调查原因。3. 按用户查看连接时间ac -p输出示例：rockylinux 425.61 tecmint 702.29 root 10171.54 total 11299.44可以看到 root 用户的登录时间远超其他用户。4. 查看特定用户连接时间ac ravi输出示例：total 110.31五、进阶内容1. 命令执行统计A. 查看所有命令摘要sa输出包含以下列：第一列：实际执行时间（挂钟时间，分钟）第二列：CPU 时间（系统+用户时间，分钟）第三列：平均 CPU 使用量（以 1k 为单位）第四列：命令名称带星号（*）的命令表示以超级用户权限运行。B. 查看特定用户信息sa -u显示每个用户执行的命令及资源消耗。C. 查看进程统计sa -m显示总进程数和 CPU 分钟数。如果这些数字持续增长，需要调查系统状况。D. 按使用率排序sa -c按百分比显示资源使用情况，帮助识别消耗最多资源的命令。2. 命令历史查询A. 查看用户最后执行的命令lastcomm ravi输出显示用户 ravi 执行的最后命令。B. 限制输出行数lastcomm tecmint | head -n 20只显示最近 20 条命令。C. 搜索特定命令lastcomm ls查看所有 ls 命令的执行记录。D. 安全审计示例lastcomm cat | grep -i "shadow\|passwd"查看谁访问过敏感文件。3. 实战应用场景A. 追踪资源消耗当服务器运行缓慢时，使用 sa -c 识别哪些命令消耗最多 CPU 时间。B. 安全审计使用 lastcomm 审查安全事件前执行的命令，创建比 shell history 更难篡改的审计跟踪。C. 计费和统计报告对于共享主机环境，ac -p 提供用户活动的具体数据用于计费。D. 问题排查当用户声称"我什么都没做"时，可以验证实际执行的命令。六、日志管理1. 日志文件位置主要的 accounting 文件位于 /var/account/pacct2. 日志轮转配置创建 logrotate 配置文件 /etc/logrotate.d/psacct：sudo nano /etc/logrotate.d/psacct添加以下内容：/var/account/pacct { monthly rotate 12 compress notifempty create 0600 root root }配置说明：monthly：每月轮转一次rotate 12：保留 12 个历史文件compress：压缩旧日志notifempty：空文件不轮转create 0600 root root：创建新文件并设置权限七、最佳实践1. 定期检查报告每周查看用户连接时间统计关注异常登录模式监控资源消耗趋势2. 日志保留策略根据合规要求确定保留时间定期备份日志文件确保磁盘空间充足3. 安全建议限制日志文件访问权限（0600）定期审计管理员活动将日志发送到远程日志服务器4. 性能考虑accounting 会带来轻微性能开销高负载系统需要评估影响可以使用 accton 命令临时关闭八、常见问题1. 安装问题Q：psacct 服务无法启动A：检查 /var/account 目录是否存在，权限是否正确2. 配置问题Q：ac 命令没有输出A：确认 psacct 服务已启动，且用户登录过系统3. 运行问题Q：日志文件过大A：配置 logrotate 自动轮转日志九、参考资料ac 命令手册：man acsa 命令手册：man salastcomm 命令手册：man lastcommaccton 命令手册：man accton参考资料How to Monitor Linux User Activity with psacct and acct Tools
Clawdbot 在 DigitalOcean 部署指南一、概述1. 简介A. 是什么Clawdbot 是一个自托管 AI 助手，可部署在云服务器上，提供 AI 交互能力。本文介绍如何在 DigitalOcean 平台快速部署 Clawdbot 服务。B. 为什么学快速搭建个人 AI 助手服务学习云服务器部署基础流程了解 AI 应用的服务器配置要求C. 学完能做什么在 DigitalOcean 创建服务器并部署 Clawdbot通过 SSH 隧道安全访问 Web 管理界面独立维护和更新 Clawdbot 服务2. 前置知识A. 必备技能基本 SSH 连接操作Linux 终端命令基础B. 推荐知识DigitalOcean 账号基本的服务器概念二、环境准备1. 服务器要求A. 系统版本Ubuntu 24.04 LTSB. 硬件配置推荐：2 GB RAM / 1 AMD CPU / 50 GB NVMe最低：1 GB RAM（需配置交换空间）C. 区域选择选择距离用户最近的区域以降低延迟2. 准备工作注册 DigitalOcean 账号并充值三、部署步骤1. 创建 Droplet（云服务器）在 DigitalOcean 控制台创建新的 Droplet：操作系统：Ubuntu 24.04 LTS区域：选择最近的区域CPU 类型：Premium AMD规格：2 GB RAM / 1 AMD CPU / 50 GB NVMe2. SSH 连接服务器graph LR A[本地终端] -->|ssh root@IP| B[Droplet 服务器] B -->|连接成功| C[执行部署命令]获取服务器 IP 后，执行：ssh root@YOUR_IP将 YOUR_IP 替换为实际的服务器 IP 地址。3. 创建 sudo 用户出于安全考虑，不建议直接使用 root 用户操作。adduser clawd && usermod -aG sudo clawd && su - clawd此命令会：创建名为 clawd 的新用户将其添加到 sudo 组切换到新用户4. 安装 ClawdbotClawdbot 提供了一键安装脚本：curl -fsSL https://clawd.bot/install.sh | bash安装完成后运行：exec bash5. 配置 API 密钥使用向导模式配置：clawdbot setup --wizard按照提示输入必要的 API 密钥和配置信息。6. 启动网关服务clawdbot gateway --bind lan --port 18789参数说明：bind lan：绑定到局域网接口port 18789：监听 18789 端口四、访问管理界面1. 建立 SSH 隧道由于安全考虑，服务仅监听本地。通过 SSH 隧道转发端口：ssh -L 18789:127.0.0.1:18789 clawd@YOUR_IP此命令将本地 18789 端口映射到远程服务器的 18789 端口。2. 访问 Web UI隧道建立后，在浏览器打开：http://127.0.0.1:18789即可访问 Clawdbot 的 Web 管理界面。sequenceDiagram participant B as 浏览器 participant L as 本地:18789 participant T as SSH隧道 participant S as 服务器:18789 participant C as Clawdbot B->>L: http://127.0.0.1:18789 L->>T: 转发请求 T->>S: 通过SSH隧道 S->>C: 访问服务 C-->>S: 返回响应 S-->>T: 隧道返回 T-->>L: 本地端口 L-->>B: 显示界面五、内存优化（1GB 服务器）如果使用 1GB 内存的服务器，NPM 安装可能会因内存不足失败。1. 方案一：增加 Node 内存限制export NODE_OPTIONS="--max-old-space-size=2048"2. 方案二：添加交换空间sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab此操作会创建 2GB 的交换文件，并在重启后自动挂载。六、常见问题1. SSH 连接失败检查服务器 IP 地址是否正确，确保防火墙允许 22 端口访问。2. 内存不足错误参考第五章内存优化方案，推荐直接使用 2GB 配置的服务器。3. 端口无法访问确认 SSH 隧道已建立，且 clawdbot gateway 服务正在运行。七、参考资料Clawdbot 官方安装指南DigitalOcean Droplet 文档原 Gist 链接
智谱AI HTTP API 调用教程一、概述1. 简介A. 是什么智谱AI 提供基于 RESTful 架构的应用程序接口，通过标准的 HTTP 协议与智谱AI 的模型服务进行交互。开发者可以使用任何支持 HTTP 协议的编程语言或开发框架调用智谱AI 的各种 AI 模型。B. 为什么学跨平台兼容：支持所有支持 HTTP 协议的编程语言和平台标准协议：基于 RESTful 设计，遵循 HTTP 标准，易于理解和使用灵活集成：可以集成到任何现有的应用程序和系统中实时调用：支持同步和异步调用，满足不同场景需求C. 学完能做什么使用任何编程语言调用智谱AI 的 GLM 系列模型实现简单对话、流式响应和多轮对话功能正确处理 API 鉴权和错误响应在生产环境中安全、高效地集成智谱AI 服务二、环境准备1. 前置条件有效的智谱AI 账户已获取 API Key基本的 HTTP 请求知识至少熟悉一种编程语言（Python、JavaScript、Java 等）2. 获取 API Key步骤流程访问智谱AI 开放平台：https://bigmodel.cn注册并登录账户进入 API Keys 管理页面创建 API Key复制生成的 API Key 以供使用安全建议建议将 API Key 设置为环境变量，避免硬编码到代码中，以提高安全性。三、API 基础信息1. 请求端点通用 API 端点https://open.bigmodel.cn/api/paas/v4/Coding 专用端点使用 GLM 编码套餐时，需要使用专属端点：https://open.bigmodel.cn/api/coding/paas/v4注意：Coding API 端点仅限 Coding 场景使用，不适用于通用 API 场景。2. 请求头要求所有请求必须包含以下 HTTP 头：请求头值说明Content-Typeapplication/json指定请求体格式为 JSONAuthorizationBearer YOUR_API_KEYAPI 密钥鉴权3. 支持的鉴权方式A. API Key 鉴权最简单的鉴权方式，直接使用 API Key：curl --location 'https://open.bigmodel.cn/api/paas/v4/chat/completions' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json' \ --data '{ "model": "glm-4.7", "messages": [ { "role": "user", "content": "你好" } ] }'B. JWT Token 鉴权适用于需要更复杂权限控制的场景（具体实现请参考官方文档）。四、基础调用示例1. 简单对话请求示例curl --location 'https://open.bigmodel.cn/api/paas/v4/chat/completions' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json' \ --data '{ "model": "glm-4.7", "messages": [ { "role": "user", "content": "请介绍一下人工智能的发展历程" } ], "temperature": 1.0, "max_tokens": 1024 }'参数说明model：使用的模型名称，如 glm-4.7messages：对话消息列表temperature：控制输出随机性，范围 0-2，默认 1.0max_tokens：限制响应最大 token 数2. 流式响应请求示例curl --location 'https://open.bigmodel.cn/api/paas/v4/chat/completions' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json' \ --data '{ "model": "glm-4.7", "messages": [ { "role": "user", "content": "写一首关于春天的诗" } ], "stream": true }'流式响应特点设置 stream 参数为 true 启用流式响应响应以 Server-Sent Events（SSE）格式返回可以实时获取模型生成的内容3. 多轮对话请求示例curl --location 'https://open.bigmodel.cn/api/paas/v4/chat/completions' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json' \ --data '{ "model": "glm-4.7", "messages": [ { "role": "system", "content": "你是一个专业的编程助手" }, { "role": "user", "content": "什么是递归？" }, { "role": "assistant", "content": "递归是一种编程技术，函数调用自身来解决问题..." }, { "role": "user", "content": "能给我一个 Python 递归的例子吗？" } ] }'消息角色说明system：设置系统角色和行为user：用户消息assistant：模型回复的历史消息五、常用编程语言示例1. Python 实现完整代码示例import requests import json def call_zhipu_api(messages, model="glm-4.7"): url = "https://open.bigmodel.cn/api/paas/v4/chat/completions" headers = { "Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json" } data = { "model": model, "messages": messages, "temperature": 1.0 } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: return response.json() else: raise Exception(f"API调用失败: {response.status_code}, {response.text}") # 使用示例 messages = [ {"role": "user", "content": "你好，请介绍一下自己"} ] result = call_zhipu_api(messages) print(result['choices'][0]['message']['content'])环境变量配置import os from dotenv import load_dotenv load_dotenv() api_key = os.getenv("ZHIPU_API_KEY")2. JavaScript 实现使用 Fetch APIasync function callZhipuAPI(messages) { const url = 'https://open.bigmodel.cn/api/paas/v4/chat/completions'; const headers = { 'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' }; const data = { model: 'glm-4.7', messages: messages, temperature: 1.0 }; const response = await fetch(url, { method: 'POST', headers: headers, body: JSON.stringify(data) }); if (!response.ok) { throw new Error(`API调用失败: ${response.status}`); } return await response.json(); } // 使用示例 const messages = [ {role: 'user', content: '你好'} ]; callZhipuAPI(messages).then(result => { console.log(result.choices[0].message.content); });3. Java 实现使用 OkHttpimport okhttp3.*; import com.google.gson.Gson; import java.io.IOException; public class ZhipuAPIClient { private static final String API_URL = "https://open.bigmodel.cn/api/paas/v4/chat/completions"; private static final String API_KEY = "YOUR_API_KEY"; private final OkHttpClient client; private final Gson gson; public ZhipuAPIClient() { this.client = new OkHttpClient(); this.gson = new Gson(); } public String callAPI(Message[] messages) throws IOException { RequestBody body = RequestBody.create( MediaType.parse("application/json"), gson.toJson(new ChatRequest("glm-4.7", messages)) ); Request request = new Request.Builder() .url(API_URL) .post(body) .addHeader("Authorization", "Bearer " + API_KEY) .addHeader("Content-Type", "application/json") .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException("API调用失败: " + response); } ChatResponse chatResponse = gson.fromJson( response.body().string(), ChatResponse.class ); return chatResponse.choices[0].message.content; } } }六、错误处理1. 常见错误码错误码说明解决方案401未授权检查 API Key 是否正确429请求过于频繁降低请求频率，实施重试机制500服务器内部错误稍后重试，如持续出现请联系支持更多错误码和解决方案请参考官方 API 错误码文档。2. 错误处理最佳实践实施指数退避重试机制import time import random def call_with_retry(func, max_retries=3): for attempt in range(max_retries): try: return func() except Exception as e: if attempt == max_retries - 1: raise wait_time = (2 ** attempt) + random.random() time.sleep(wait_time)记录详细错误日志import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) try: result = call_zhipu_api(messages) except Exception as e: logger.error(f"API调用失败: {str(e)}", exc_info=True)七、实践建议1. 安全性A. API Key 管理妥善保管 API Key，不要在代码中硬编码使用环境变量或配置文件存储敏感信息定期轮换 API KeyB. 数据传输始终使用 HTTPS 协议实施适当的加密措施保护数据传输2. 性能优化A. 连接管理实施连接池和会话复用合理设置超时时间B. 并发处理使用异步请求处理高并发场景考虑使用消息队列削峰填谷3. 监控与告警A. 关键指标监控 API 调用频率和成功率跟踪响应时间和错误率B. 告警机制设置合理的告警阈值建立快速响应流程八、架构图sequenceDiagram participant Client as 客户端应用 participant API as 智谱AI API participant Auth as 鉴权服务 participant Model as GLM 模型 Client->>Auth: 1. 携带 API Key Auth->>API: 2. 验证通过 Client->>API: 3. 发送 HTTP 请求 API->>Model: 4. 调用模型推理 Model->>API: 5. 返回生成结果 API->>Client: 6. 返回 JSON 响应九、更多资源1. 官方文档API 文档：查看完整的 API 接口文档和参数说明技术支持：获取技术支持和帮助2. 相关资源核心参数文档官方 Python SDK参考资料智谱AI HTTP API 调用文档
荷兰沃达丰 eSIM 保号卡全攻略一、概述1. 简介A. 是什么荷兰沃达丰（Vodafone）eSIM 是由全球电信巨头 Vodafone 提供的预付费 eSIM 服务，用户无需实名认证即可获取欧洲原生手机号。B. 为什么需要海外账号注册：Telegram、WhatsApp、Google、ChatGPT 等平台需要海外手机号接收验证码隐私保护：无需实名认证，保护个人隐私账号安全：作为辅助验证号码，提高账号安全性C. 核心优势持有成本极低：一年保号成本仅需 1.2 欧元（约 9.2 元人民币）大厂背景：Vodafone 是实体运营商，非虚拟运营商，账号权重高无需实名：全程不需要护照、身份证国内漫游：走移动/联通信号，收短信免费2. 前置知识A. 必备条件一张外币信用卡（Visa/Mastercard）或虚拟卡一个邮箱（接收 eSIM 二维码）支持 eSIM 的手机或 eSIM 写卡器B. 推荐知识了解 eSIM 基本概念了解手机漫游设置二、准备工作1. 硬件准备A. 海外版手机用户iPhone XS 及以上机型（海外版）Google Pixel 3 及以上机型三星 Galaxy S20 及以上机型B. 国行手机用户需要准备 eSIM 写卡器：Xesim（推荐）5berESTKSwitchesim使用方法：将 eSIM 写卡器插入安卓手机，下载 eSIM 后，将卡插回 iPhone 使用。2. 软件准备邮箱账户：Gmail、Outlook 等任意邮箱虚拟卡：Bybit Card 等（如无外币信用卡）VPN：推荐准备荷兰节点的梯子（用于 WiFi Calling）三、核心概念1. 基本术语eSIM：嵌入式 SIM 卡，无需实体卡槽MVNO：虚拟移动网络运营商WiFi Calling：通过 WiFi 网络拨打电话和发送短信保号：保持手机号活跃，避免被注销2. 工作原理graph LR A[官网购买] --> B[邮箱接收二维码] B --> C{手机类型} C -->|海外版| D[直接激活 eSIM] C -->|国行| E[eSIM 写卡器] E --> F[安卓写入] F --> G[iPhone 使用] D --> H[漫游国内网络] G --> H H --> I[收发短信]3. Vodafone 优势对比特性Vodafone 荷兰giffgaff 英国其他 eSIM运营商类型实体运营商虚拟运营商多样化账号权重高中低-中无需实名是是部分需要保号成本1.2 欧元/年需半年消费各异发送短信支持仅接收部分支持信号质量优秀良好参差不齐四、快速上手1. 第一步：购买 eSIMA. 访问官网打开网址：https://act.vodafone.nl/prepaid-esim/B. 选择套餐选择最便宜的套餐（约 14 欧元），包含：荷兰手机号码（永久使用）流量和通话套餐（国内不可用）eSIM 激活码C. 完成支付填写邮箱地址（务必准确）使用 Visa/Mastercard 支付支付成功后邮箱收到 QR Code 和 Activation CodesequenceDiagram participant U as 用户 participant W as Vodafone 官网 participant E as 邮箱 participant P as 支付网关 U->>W: 访问官网 U->>W: 选择套餐 U->>P: 支付 14 欧元 P-->>W: 支付成功 W->>E: 发送二维码邮件 E-->>U: 接收激活信息2. 第二步：激活 eSIMA. 海外版手机用户打开手机设置进入蜂窝网络/移动网络添加 eSIM/蜂窝号码计划扫描邮件中的二维码等待激活完成B. 国行手机用户（使用 Xesim）将 Xesim 卡插入安卓手机打开 Xesim App，选择"下载 eSIM"扫描二维码或手动输入 Activation Code下载完成后在 App 里启用该号码重要：如需输入 PIN 码，默认是"0000"关键设置：PIN 码：0000（默认）建议在手机设置中关闭 SIM 卡锁3. 第三步：注册账号A. 创建账号访问：https://www.vodafone.nl/account选择"我还没有账号"输入荷兰手机号（格式：06xxxxxxxx，不加 +31）接收短信验证码绑定邮箱并设置密码B. 完善资料登录后填写荷兰地址地址生成器：https://www.meiguodizhi.com/nl-address点击"Upgrade"升级账户账户功能完整后可充值管理C. 薅羊毛技巧查看是否有"Top up 5, get 5 free"活动充值 5 欧元获得 10 欧余额足够保号数年使用五、保号技巧1. 保号规则Vodafone 规则：每 180 天余额有变动，有效期顺延 180 天。重要：收短信免费但不算余额变动，必须主动消费（发短信）。2. 方案 A：普通漫游法成本计算发送短信成本：0.6 欧元/条一年发送：2 条年成本：1.2 欧元约 9.2 元人民币操作步骤在中国直接给国内手机号发短信建议每 5 个多月（160 天左右）发一次在日历设置循环提醒，避免遗忘3. 方案 B：WiFi Calling 法成本计算WiFi Calling 短信成本：0.07 欧元/条一年发送：2 条年成本：0.14 欧元约 1 元人民币操作步骤手机开启 WiFi Calling（安卓叫 VoWiFi）挂荷兰节点 VPN确保状态栏显示"Vodafone NL WiFi"发送短信10 欧余额可用 71 年graph TD A[保号方案选择] --> B{方案选择} B -->|简单直接| C[普通漫游法] B -->|极致省钱| D[WiFi Calling 法] C --> E[成本: 9.2元/年] D --> F[成本: 1元/年] E --> G[直接发送短信] F --> H[开启 WiFi Calling 挂荷兰 VPN] H --> I[发送短信] G --> J[每180天一次] I --> J六、避坑指南1. 关闭数据漫游重要：漫游流量巨贵（4 欧元/MB），不关闭可能瞬间清零余额。操作方法方法 1：在手机设置中关闭数据漫游开关方法 2：登录 Vodafone 后台，进入 Services，开启"拦截流量"2. PIN 码问题默认 PIN 码：0000每次重启手机需输入可在手机设置中关闭 SIM 卡锁3. 实名政策目前荷兰预付卡无需实名政策可能随时变化建议尽早入手七、实战应用1. 海外账号注册测试结果平台测试结果Telegram秒收验证码WhatsApp秒收，稳定微信绑定可直接绑定Google 账号可绑定辅助号码ChatGPT可直接注册海外钱包可收银行短信2. 注意事项部分平台对虚拟号段有风控，实体卡通过率更高建议作为辅助验证号码使用重要账号建议用主号码八、常见问题1. 激活问题Q：扫描二维码后没反应？A：检查网络连接，尝试切换 WiFi/移动数据，或手动输入 Activation Code。Q：提示 PIN 码错误？A：默认 PIN 码是 0000，如已修改请联系客服。2. 使用问题Q：收不到短信？A：检查是否开启漫游功能，确认手机信号正常。Q：余额突然变少？A：检查是否误开数据漫游，登录后台查看详细账单。3. 保号问题Q：忘记保号时间怎么办？A：尽快登录后台查看余额有效期，如已过期可能需要重新购买。Q：余额用完了怎么办？A：登录后台充值，注意查看是否有充值优惠活动。九、参考资料参考资料荷兰沃达丰 eSIM 官网Vodafone 账户管理荷兰地址生成器