原始内容
AI智能招聘与办公自动化平台
基于Next.js 15构建的企业级智能招聘助手,集成了多模型AI对话、本地浏览器自动化、智能回复生成等功能,助力HR提升招聘效率和候选人体验。
功能特性
🤖 多模型AI智能对话
- 智能回复生成:两阶段AI架构(分类→生成),支持16种招聘和考勤场景的智能回复
- 多模型集成:
- Anthropic Claude
- 阿里通义千问 (qwen-turbo/qwen-plus/qwen-max)
- OpenAI GPT系列
- Google Gemini
- DeepSeek
- OpenRouter (聚合多模型)
- 动态模型切换:运行时切换AI模型,无需重启应用
- 智能降级机制:AI服务不可用时自动降级到规则引擎
🖥️ 本地自动化能力
- 本地工具调用:通过 AI SDK 工具注册表统一启用
bash、截图分析和业务自动化工具 - 浏览器自动化:基于 Playwright/MCP 执行网页抓取、页面操作和招聘平台流程
- 截图与分析:支持页面截图、AI截图分析和结构化结果回传
- 人工确认执行:
bash工具走本地 HITL 流程,由前端展示命令并等待用户确认
💼 招聘业务定制
- Boss直聘集成:完整的招聘流程自动化,包含反检测措施
- DulidayHR系统:职位管理、面试预约等功能集成
- 职位信息生成:智能生成格式化的招聘信息,支持多种岗位类型
- 多品牌支持:动态品牌检测和切换,支持多租户架构
🔧 企业级配置管理
- 统一配置服务:基于LocalForage的持久化配置管理
- 三层数据结构:品牌数据、系统提示词、回复提示词分层管理
- 可视化管理界面:
/admin/settings提供完整的配置管理UI - 数据迁移系统:从硬编码到持久化存储的自动迁移
- 配置版本控制:支持配置的导入、导出、版本管理
🔗 第三方集成
- 通信工具:
- 飞书群机器人(支持富文本消息)
- 企业微信机器人(支持图片附件)
- MCP协议:支持 Model Context Protocol,集成 Playwright、Google Maps 等
- 浏览器自动化:Playwright MCP 集成,支持网页抓取和招聘平台自动化
🚀 技术架构亮点
- Next.js 15 App Router:最新的React服务端渲染框架
- TypeScript严格模式:100%类型安全,禁用any类型
- Zod模式驱动:运行时验证与编译时类型推导统一
- 单例模式服务:核心服务采用单例模式,防止内存泄漏
- React 19特性:利用最新React特性提升性能
🔒 安全与合规
- 工具执行边界:工具按注册表白名单和上下文要求启用
- 命令确认机制:本地命令通过 HITL 交互确认后执行
- 环境变量隔离:构建时和运行时变量严格分离
- 生产环境保护:生产环境下的额外安全限制
本地开发
环境要求
- Node.js 18.18+
- pnpm 8+ (推荐) 或 npm/yarn
- Docker (可选,用于容器化部署)
快速开始
克隆项目并安装依赖
git clone <repository-url> cd ai-sdk-computer-use pnpm install # 推荐使用pnpm配置环境变量
复制环境变量模板并配置:
cp .env.example .env.local编辑
.env.local文件,配置必要的环境变量:# AI模型API密钥(至少配置一个) ANTHROPIC_API_KEY=your_anthropic_key # Claude模型 DASHSCOPE_API_KEY=your_dashscope_key # 通义千问 DEEPSEEK_API_KEY=your_deepseek_key # DeepSeek(可选) OPENROUTER_API_KEY=your_openrouter_key # OpenRouter(可选) GEMINI_API_KEY=your_google_gemini_key # Google Gemini(可选) # Supabase认证(可选,不配置则以独立模式运行) NEXT_PUBLIC_SUPABASE_URL=your_supabase_url NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_key # 第三方集成(可选) FEISHU_BOT_WEBHOOK=your_feishu_webhook # 飞书机器人 WECHAT_BOT_WEBHOOK=your_wechat_webhook # 企微机器人 WECHAT_BOT_ACCESS_TOKEN=your_wechat_token DULIDAY_TOKEN=your_duliday_token # DulidayHR系统 # MCP集成(可选) EXA_API_KEY=your_exa_search_key # Exa搜索启动开发服务器
pnpm dev # 使用Turbopack加速开发构建访问应用
开发命令
# 开发
pnpm dev # 启动开发服务器(Turbopack)
pnpm build # 构建生产版本
pnpm start # 启动生产服务器
# 测试
pnpm test # 运行单元测试(watch模式)
pnpm test:run # 运行单元测试(单次)
pnpm test:ui # 可视化测试界面
pnpm test:coverage # 生成测试覆盖率报告
pnpm test:mcp # 测试MCP连接
# 代码质量
pnpm lint # ESLint检查
pnpm format # Prettier格式化
pnpm format:check # 检查格式化
npx tsc --noEmit # TypeScript类型检查
# Docker部署
./scripts/deploy.sh # 自动构建并推送到GitHub Container Registry
调试技巧
🔧 配置管理调试
- 访问
/admin/settings进行可视化配置 - 浏览器DevTools > Application > IndexedDB查看存储的配置
- 使用
ConfigInitializer组件确保配置初始化 - 清除IndexedDB可强制重新初始化配置
🤖 AI功能调试
- 使用
/test-llm-reply测试智能回复功能 - 检查
useModelConfigStore中的模型配置状态 - 查看网络请求确认AI API调用情况
- 测试降级机制:故意使用错误的API密钥
🖥️ 本地自动化调试
- 使用
/api/health检查服务状态 - 查看
lib/tools/tool-registry.ts确认工具是否被当前promptType启用 - 查看
lib/tools/bash-tool.ts确认本地命令工具的输入输出契约 - 使用 Playwright/MCP 相关工具时先运行
pnpm test:mcp-connection
🐛 常见问题
- TypeScript错误: 运行
npx tsc --noEmit检查类型 - 配置不生效: 检查
ConfigInitializer是否正确加载 - 工具组件不渲染: 确认使用
message.parts而非message.content - Docker构建失败: 检查是否使用正确的docker-compose文件(ARM64 vs AMD64)
架构设计
核心设计原则
Zod Schema-First: 所有数据结构从Zod schema派生类型
const schema = z.object({...}) type SchemaType = z.infer<typeof schema>单例模式服务: 核心服务使用单例模式防止资源泄漏
configService: 配置管理mcpClientManager: MCP连接管理
零容忍any类型: 使用unknown和类型收窄替代any
智能降级机制: AI不可用时自动降级到规则引擎
数据流架构
- 配置加载:
ConfigInitializer→configService→ Components - 智能回复: Message → Classification → Reply Generation
- 本地自动化: User Action → Tool Registry → Local Tool/MCP → Result
- 模型选择:
useModelConfigStore→ Provider → AI SDK
目录结构
├── app/ # Next.js App Router
│ ├── api/ # API路由
│ └── (routes)/ # 页面路由
├── components/ # React组件
│ ├── ui/ # 通用UI组件
│ └── tool-messages/ # 工具消息组件
├── lib/ # 核心逻辑
│ ├── services/ # 单例服务
│ ├── stores/ # Zustand状态管理
│ └── tools/ # AI工具集成
└── types/ # TypeScript类型定义
部署指南
Docker部署(推荐)
本地测试(macOS ARM64)
docker compose -f docker-compose.local.yml up -d生产构建
./scripts/deploy.sh # 自动构建并推送到GitHub Container RegistryVPS部署
# 在VPS上拉取并运行 docker compose -f docker-compose.prod.yml up -d
Vercel部署
配置环境变量后即可一键部署。
手动部署
构建应用
pnpm build启动服务
pnpm start # 或使用PM2: pm2 start ecosystem.config.js配置Nginx反向代理
location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; }
部署检查清单
- 环境变量配置完整
- 数据库连接正常(如使用Supabase)
- 健康检查端点响应正常
- SSL证书配置正确
- 日志和监控配置完成
测试
运行测试
# 单元测试
pnpm test # Watch模式
pnpm test:run # 单次运行
pnpm test:coverage # 覆盖率报告
# 集成测试
pnpm test:mcp # MCP连接测试
# E2E测试
curl http://localhost:3000/api/health # 健康检查
测试覆盖率要求
- 语句覆盖率: 80%
- 分支覆盖率: 80%
- 函数覆盖率: 80%
- 行覆盖率: 80%
性能优化
开发环境
- 使用Turbopack加速构建
- React 19并发特性
- 懒加载重型组件
生产环境
- 缓存AI provider实例
- 单例模式防止重复创建
- MCP延迟连接建立
- 自动资源清理
安全最佳实践
环境变量安全
- 使用
.env.local存储敏感信息 - 构建时变量使用
NEXT_PUBLIC_前缀 - 运行时变量通过服务端传递
- 使用
命令执行安全
- 危险命令黑名单检测
- 本地命令通过 HITL 人工确认后执行
- 生产环境额外限制
数据安全
- 配置数据本地加密存储
- API密钥不在前端暴露
- 请求签名验证
故障排查
常见问题
Docker 在 macOS 上报架构错误
- 使用
docker-compose.local.yml替代 - 或本地直接运行:
pnpm dev - 浏览器自动化通过 CDP 连接宿主机 Chrome,无需在容器内安装 Chromium
- 使用
配置不生效
- 清除浏览器IndexedDB
- 检查
ConfigInitializer加载 - 访问
/admin/settings重新配置
AI模型调用失败
- 检查API密钥配置
- 验证网络连接
- 查看API配额限制
Docker构建失败
- 确认使用正确的compose文件
- 检查环境变量文件位置
- 验证镜像架构匹配
贡献指南
开发流程
- Fork项目并创建功能分支
- 遵循Conventional Commits规范
- 确保测试通过和类型检查无误
- 提交Pull Request并等待代码审查
代码规范
- TypeScript严格模式,禁用any
- 使用Zod schema定义数据结构
- 遵循ESLint和Prettier配置
- 组件使用明确的Props接口
- 中文场景必须测试
提交规范
feat: 添加新功能
fix: 修复问题
docs: 文档更新
style: 代码格式调整
refactor: 代码重构
test: 测试相关
chore: 构建或辅助工具变动
相关资源
许可证
本项目采用双重许可模式:
非商业用途
本项目对个人学习、研究和非商业用途免费开放,遵循 Apache License 2.0。
商业用途
任何商业用途(包括但不限于):
- 将本软件集成到商业产品或服务中
- 使用本软件为客户提供付费服务
- 在商业环境中部署使用本软件
必须获得我们的商业授权许可。
如需商业授权,请联系:rensiwen@duliday.com
未经授权的商业使用将被视为侵权行为。
详见 LICENSE 文件。