SqcAICode --- AI 驱动的 macOS 编程工具

SqcAICode 是一款面向 macOS 的原生桌面 AI 编程助手,集成 DeepSeek API ,提供智能对话、代码编辑、终端操作、文件管理等一站式开发体验。采用 VS Code 风格的深色主题 UI,支持 Function Calling 工具链,让 AI 直接读写文件、执行终端命令和搜索网页。

项目地址:https://github.com/sunqichaoPHP/SQCcoder
✨ 核心功能
| 模块 | 说明 |
|---|---|
| AI 对话 | 接入 DeepSeek API(支持 deepseek-chat / deepseek-reasoner),多轮对话 + 上下文记忆 |
| 工具调用 (Function Calling) | AI 可自动调用文件读写、终端命令、网页搜索等工具,无需人工中转 |
| 流式输出 + 打字机动画 | 实时展示 AI 回答,Markdown 全文渲染(标题/列表/代码块/引用) |
| 代码编辑器 | 多 Tab 标签页、语法高亮、行号显示、代码字体、自动保存 |
| 文件浏览器 | 项目目录树导航,支持文件创建/打开/搜索 |
| Markdown 预览 | .md 文件一键切换源码 / 富文本预览,支持代码块高亮与拷贝 |
| 内置终端 | 底部可拖拽终端面板,支持命令输入与输出展示 |
| 图片发送 | 聊天中粘贴截图或选择图片,通过多模态 API 发送给 AI 分析 |
| 网页搜索 | 内置搜索工具,AI 可联网查询最新信息 |
| 文档自动保存 | 长回答自动存档为 .md 文件到工作区,附带摘要预览 |
| 自定义设置 | API Key、Base URL、模型选择、温度参数、System Prompt 等均可配置 |
| 深色主题 | 仿 VS Code 暗色配色,护眼且专业 |
🏗 架构设计
整体架构
┌─────────────────────────────────────────────────────────┐
│ ContentView (主窗口) │
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ ┌────────┐ │
│ │ Activity │ │ Sidebar │ │ Editor Area │ │ Chat │ │
│ │ Bar │ │(Explorer/│ │(Tabs+Editor+ │ │ Panel │ │
│ │ (左1) │ │ Search/ │ │ Terminal) │ │ (右侧) │ │
│ │ │ │ Settings)│ │ │ │ │ │
│ └──────────┘ └──────────┘ └──────────────┘ └────────┘ │
│ ↓ │
│ ┌──────────────────┐ │
│ │ AppState │ ObservableObject │
│ │ (状态中心) │ @Published 驱动 UI │
│ └──────┬───────────┘ │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ ↓ ↓ ↓ │
│ DeepSeekService ProjectTools TerminalTool │
│ (API 调用) (文件操作) (命令执行) │
│ + streaming + readWrite + shell exec │
│ + tool calling + search + output capture │
└─────────────────────────────────────────────────────────┘
数据流
用户输入 → ChatPanelView → AppState.sendChat()
→ DeepSeekService.chatStream() (SSE 流式请求)
→ 逐 token 更新 chatMessages → ChatBubbleView 打字机渲染
AI 返回 tool_calls → AppState.executeTools()
→ ProjectTools / TerminalTool / WebSearchTool 执行
→ 结果回传 DeepSeekService → AI 生成最终回答
→ MarkdownText(full:) 全文渲染 → 长答案自动存档
核心设计模式
| 模式 | 应用 |
|---|---|
| MVVM | AppState 作为 ViewModel,View 通过 @ObservedObject / @StateObject 订阅 |
| 单例状态管理 | 全局 AppState 持有所有 UI 状态,通过 @Published 响应式驱动 |
| 依赖注入 | DeepSeekService 在方法调用时动态注入 API Key / Base URL |
| 组合式 View | 每个功能区域拆分为独立 SwiftUI View,通过 environmentObject 共享状态 |
| SSE 流式解析 | 使用 URLSession.bytes 原生解析 Server-Sent Events,逐行读取 data: 帧 |
工具调用系统
当用户提出需要操作文件/执行命令的需求时,DeepSeek API 返回 tool_calls,AppState.executeTools() 自动分发执行:
| 工具 | 实现文件 | 能力 |
|---|---|---|
read_file |
ProjectTools.swift |
读取指定文件内容(支持行号范围) |
write_file |
ProjectTools.swift |
写入/覆盖文件 |
edit_file |
ProjectTools.swift |
精确替换文件内容 |
list_files |
ProjectTools.swift |
列出目录结构 |
search_files |
ProjectTools.swift |
按通配符搜索文件 |
run_terminal |
TerminalTool.swift |
执行终端命令并返回输出 |
web_search |
WebSearchTool.swift |
联网搜索并返回结构化结果 |
🛠 技术栈
| 层级 | 技术 |
|---|---|
| UI 框架 | SwiftUI (macOS 14+) |
| 语言 | Swift 5.9+ |
| 构建系统 | Swift Package Manager (SPM) |
| AI API | DeepSeek Chat Completions API (OpenAI 兼容) |
| 网络层 | 原生 URLSession + SSE 流式解析 |
| 代码编辑 | NSTextView (AppKit 桥接)、Syntax Highlighting via TextKit |
| 终端 | Process / Pipe 原生 Shell 执行 |
| CLI 工具 | TypeScript (Node.js) --- 命令行辅助脚本 |
| 状态管理 | Swift ObservableObject + @Published + Combine |
| 持久化 | UserDefaults (API Key / 设置)、文件系统 (文档存档) |
📁 项目结构
sqcaicode/
├── sqcaicode-app/ # macOS SwiftUI 原生应用
│ ├── Package.swift # SPM 包描述 (macOS 14+, Swift 5.9)
│ └── Sources/
│ ├── App.swift # @main 入口 + 菜单命令
│ ├── Theme.swift # 全局配色(VS Code 暗色风格)
│ ├── Models/
│ │ └── AppState.swift # 核心状态管理 (MVVM 的 ViewModel)
│ ├── Services/
│ │ ├── DeepSeekService.swift # API 调用 + 流式 + Tool Calling
│ │ ├── ProjectTools.swift # 文件系统工具封装
│ │ ├── TerminalTool.swift # Shell 终端工具
│ │ └── WebSearchTool.swift # 网页搜索工具
│ └── Views/
│ ├── ContentView.swift # 主布局 (4 面板 + 拖拽分隔线)
│ ├── ActivityBarView.swift # 左侧活动栏
│ ├── FileBrowserView.swift # 文件资源管理器
│ ├── CodeEditorView.swift # 代码编辑器 + Markdown 预览
│ ├── ChatPanelView.swift # AI 对话面板 (含图片发送)
│ ├── ChatBubbleView.swift # 聊天气泡 (打字机 + Markdown)
│ ├── MarkdownPreview.swift # 自定义 Markdown 渲染器
│ ├── TerminalView.swift # 内嵌终端面板
│ ├── SettingsView.swift # 设置面板
│ ├── StatusBarView.swift # 底部状态栏
│ └── SearchResultRow.swift # 搜索结果行
├── src/ # TypeScript CLI 工具
│ ├── index.ts # 入口
│ ├── cli/ # 命令行界面 (chat, run)
│ ├── core/ # 核心引擎 (client, context, engine)
│ ├── tools/ # 工具注册 (fs, shell, todo, web)
│ ├── repair/ # 代码修复工具
│ └── config/ # 配置管理
├── assets/ # 截图等静态资源
│ ├── screenshot-chat.png
│ └── screenshot-editor.png
├── .gitignore
├── package.json
├── tsconfig.json
└── README.md
🚀 快速开始
环境要求
- macOS 14.0 (Sonoma) 或更高版本
- Xcode 15.0 或更高版本(含 Swift 5.9)
- Node.js 18+(仅 CLI 工具需要)
- DeepSeek API Key (在 platform.deepseek.com 申请)
构建 & 运行
bash
# 1. 克隆仓库
git clone https://github.com/yourusername/sqcaicode.git
cd sqcaicode
# 2. 安装 CLI 依赖(可选)
npm install
# 3. 构建 Swift 应用(使用 Swift Package Manager)
cd sqcaicode-app
swift build
# 4. 运行
swift run
# 或者在 Xcode 中打开:
open Package.swift
# 按 Cmd+R 运行
配置 API Key
- 启动应用后在左侧活动栏点击 齿轮图标 进入设置
- 填入你的 DeepSeek API Key
- 可选:修改 Base URL(自定义代理)、模型、温度参数
- 设置会自动保存到 UserDefaults
🔧 配置项说明
| 配置项 | 默认值 | 说明 |
|---|---|---|
API Key |
--- | DeepSeek API 密钥(必填) |
Base URL |
https://api.deepseek.com |
API 端点地址,支持自定义代理 |
Model |
deepseek-chat |
模型选择(deepseek-chat / deepseek-reasoner) |
Temperature |
0.7 |
生成温度 (0-2),越高越随机 |
Max Tokens |
4096 |
单次回答最大 token 数 |
System Prompt |
--- | 系统提示词,定义 AI 角色行为 |
📝 使用场景
- 写代码:让 AI 帮你写新功能、生成代码片段、解释算法
- 改 Bug:粘贴错误信息或相关代码,让 AI 分析并给出修复方案
- 代码审查:打开文件后让 AI Review 代码质量和潜在问题
- 重构优化:描述需求让 AI 直接编辑文件
- 学习理解:选中陌生代码让 AI 逐行解释
- 截图分析:粘贴 UI 截图让 AI 分析并实现对应界面
- 终端协作:让 AI 执行构建/测试/部署命令