Skip to content

CodeYHJ/Deepseek-Monitor-Mac

Repository files navigation

Deepseek-Monitor-Mac

DeepSeek Monitor 的 macOS 本地监控仓库。通过 Chrome 扩展同步 platform.deepseek.com 上的 API 账户余额和模型用量数据。

SwiftUI SwiftData WidgetKit Chrome Extension MV3 Network Framework

预览

Dashboard Widget 组件
Dashboard 小组件 中组件 大组件

项目简介

DeepSeek Monitor 由两部分组成:

  • macOS App — 本地 HTTP 服务监听 127.0.0.1:5199,接收 Chrome 扩展推送的数据,通过 SwiftData 持久化至本地 SQLite,并提供 Dashboard 总览、模型用量详情、Widget 组件和菜单栏常驻入口
  • Chrome 扩展 — Manifest V3 扩展,在 DeepSeek 平台页面中获取 API 数据,通过 HTTP POST 推送至本地 App

所有数据存储在本地,不经过任何第三方服务器。

核心特性

  • Dashboard 总览 — 查看账户余额、钱包明细(普通/赠送额度)、当月消费金额和 Token 用量
  • 多模型监控 — 分别追踪 deepseek-v4-pro / deepseek-v4-flash 的 Token 消耗、请求次数、缓存命中率
  • 月度趋势图 — 按天展示各模型消耗金额柱状图
  • 模型钻取 — 进入模型详情页查看 Token 消耗堆叠图(缓存未命中 / 缓存命中 / 输出)
  • WidgetKit 组件 — 支持小、中、大三种尺寸,在通知中心直接查看余额和消耗概览
  • 菜单栏常驻 — 通过 MenuBarExtra 驻留菜单栏,一键打开主窗口;关闭主窗口后自动隐藏 Dock 图标
  • Chrome 扩展同步 — 点击扩展图标一键同步 DeepSeek 平台数据至本地 App
  • SwiftData 持久化 — 所有数据本地存储,无第三方依赖

架构

┌─────────────────────────────────────────────────────────┐
│ Chrome 浏览器                                            │
│  ┌─────────────────────────────────────┐                │
│  │ Chrome Extension (MV3)              │                │
│  │  ┌────────────┐  ┌───────────────┐  │                │
│  │  │ content.js  │  │ background.js  │  │                │
│  │  │ 页面数据抓取 │  │ 后台调度 & 通信 │  │                │
│  │  └──────┬─────┘  └───────┬───────┘  │                │
│  │         │                 │          │                │
│  │         ▼                 ▼          │                │
│  │  ┌──────────────────────────────┐   │                │
│  │  │  POST /api/data              │   │                │
│  │  │  → http://127.0.0.1:5199     │   │                │
│  │  └──────────────┬───────────────┘   │                │
│  └─────────────────┼───────────────────┘                │
└────────────────────┼────────────────────────────────────┘
                     │ HTTP (localhost only)
                     ▼
┌─────────────────────────────────────────────────────────┐
│ macOS App                                                │
│  ┌────────────────┐  ┌──────────────────────────────┐   │
│  │ LocalServer     │  │ DatabaseService              │   │
│  │ NWListener:5199 │──▶ SwiftData → 本地 SQLite      │   │
│  └────────────────┘  └──────────────┬───────────────┘   │
│                                     │                   │
│                          ┌──────────▼──────────┐       │
│                          │ WidgetSnapshotStore  │       │
│                          │ App Group UserDefaults│       │
│                          └──────────┬──────────┘       │
└─────────────────────────────────────┼───────────────────┘
                                      │ WidgetKit
                                      ▼
┌─────────────────────────────────────────────────────────┐
│ Widget Extension (WidgetKit)                             │
│  ┌──────────────────────────────────────────────────┐   │
│  │ Provider.readSnapshot() → WidgetSnapshot          │   │
│  │ App Group UserDefaults 读取 → Widget UI 渲染      │   │
│  └──────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────┘

数据流说明:

  1. Chrome Extensioncontent.js 在 DeepSeek 平台页面注入,通过页面 API 获取余额、钱包、模型用量等数据;background.js 负责调度后台同步任务
  2. 本地通信:扩展将数据通过 HTTP POST 发送至 http://127.0.0.1:5199/api/data,仅限本地回环地址,不对外暴露
  3. SwiftData 持久化:macOS App 的 LocalServer(基于 Network Framework 的 NWListener)接收请求后,由 DatabaseService 解析 JSON 并写入 SwiftData(底层 SQLite)
  4. Widget 数据共享DatabaseService 在每次写入后生成精简 WidgetSnapshot,通过 App Group 共享的 UserDefaults(suiteName:) 写入;Widget Extension 的 Provider 在刷新时读取该快照渲染 UI

环境要求

组件 要求
macOS 14.0+
Xcode 16.0+
Chrome 最新版本(用于加载扩展)
DeepSeek platform.deepseek.com 账号

签名配置

首次运行如遇签名问题,从 example 创建本地配置(Configs/Local.xcconfig 已被 .gitignore 忽略,不会提交个人配置):

cp Configs/Local.xcconfig.example Configs/Local.xcconfig

然后填写以下三个键值:

说明
DEVELOPMENT_TEAM 你的 Apple Team ID
PRODUCT_BUNDLE_IDENTIFIER_PREFIX 产品 Bundle Identifier 前缀,例如 com.example
APP_GROUP_IDENTIFIER App Group 标识符(macOS 推荐 TeamID 前缀格式,如 ABCDEF1234.com.example.monitor),App 与 Widget 两个 target 必须使用同一个 App Group,否则 Widget 会读不到数据

如果不使用 Local.xcconfig,也可通过 Xcode Signing & Capabilities 面板选择 Team,但 Xcode 可能会修改已跟踪的 project.pbxproj 文件,提交前请检查不要将个人签名信息提交进 Git。

快速开始

1. 打开 macOS App

直接用 Xcode 打开 deepseek-monitor.xcodeproj,选择 DeepSeekMonitor scheme,运行即可。

首次运行: 如果遇到签名问题,请从 example 创建本地配置:cp Configs/Local.xcconfig.example Configs/Local.xcconfig(已加入 .gitignore,不会提交)。然后填写 DEVELOPMENT_TEAMPRODUCT_BUNDLE_IDENTIFIER_PREFIXAPP_GROUP_IDENTIFIER(macOS 推荐 APP_GROUP_IDENTIFIER 使用 TeamID 前缀格式,例如 ABCDEF1234.com.example.monitor,且 App 与 Widget 两个 target 必须使用同一个 App Group,否则 Widget 会读不到数据)。如果通过 Xcode Signing & Capabilities 选择 Team,注意提交前检查 project.pbxproj 差异,避免将个人签名配置提交进 Git。

本项目无需执行额外构建命令,Xcode 打开即可运行。

2. 加载 Chrome 扩展

  1. 打开 Chrome 浏览器,访问 chrome://extensions/
  2. 开启右上角"开发者模式"
  3. 点击"加载已解压的扩展程序"
  4. 选择仓库中的 chrome-extension 目录

3. 同步数据

  1. 启动 macOS App(菜单栏会出现 DeepSeek Monitor 鲸鱼图标)
  2. 在 Chrome 中登录 platform.deepseek.com
  3. 点击 Chrome 工具栏中的 DeepSeek Monitor 扩展图标
  4. 在弹出的面板中点击"同步"按钮,数据将自动推送至本地 App

首次同步前需要先打开并登录 DeepSeek 平台页面。后续可在任意页面点击扩展同步,失效时按提示刷新平台页面即可。

使用说明

主窗口

  • 从菜单栏图标或 Dock 中打开 Dashboard,查看余额、钱包明细、当月累计消费
  • 点击模型卡片进入详情页,查看 Token 消耗堆叠图(区分缓存未命中、缓存命中、输出)
  • 设置页面可执行"清空本地数据"操作

Widget 组件

  • 在通知中心编辑器中添加 DeepSeek Monitor Widget
  • 小组件:显示可用余额估算和当日消费
  • 中组件:额外展示当月消费和双模型概览
  • 大组件:完整展示余额、当月/今日消费、模型 Token/请求数/缓存命中率、月度每日消费柱状图

菜单栏

  • 点击菜单栏鲸鱼图标快速打开主窗口
  • 关闭主窗口后 App 自动隐藏 Dock 图标,从菜单栏重新打开

项目结构

Deepseek-Monitor-Mac/
├── Configs/                        # xcconfig 构建配置
│   ├── Base.xcconfig
│   ├── Debug.xcconfig
│   ├── Local.xcconfig.example      # 本地签名配置模板
│   └── Release.xcconfig
├── DeepSeekMonitor/                # App 主 Target
│   ├── DeepSeekMonitorApp.swift    # App 入口 (WindowGroup + MenuBarExtra)
│   ├── Server/
│   │   ├── LocalServer.swift       # 本地 HTTP 服务 (NWListener, 端口 5199)
│   │   └── DatabaseService.swift   # SwiftData 读写封装
│   ├── Models/
│   │   └── MonitorData.swift       # 数据模型 & JSON 通信格式 & SwiftData Schema
│   ├── Shared/
│   │   └── WidgetSnapshot.swift    # Widget 快照 & App Group UserDefaults 存储
│   ├── Views/
│   │   ├── Dashboard/              # 总览页 (余额 + 模型卡片 + 月度消费图)
│   │   ├── Detail/                 # 模型钻取页 (Token 堆叠图)
│   │   └── Settings/               # 设置页
│   └── Assets.xcassets/
├── DeepSeekMonitorWidget/          # WidgetKit 组件 Target
│   ├── Provider.swift              # Widget 时间线数据提供
│   ├── SmallWidgetView.swift
│   ├── MediumWidgetView.swift
│   └── LargeWidgetView.swift
├── DeepSeekMonitorTests/           # 单元测试
├── chrome-extension/               # Chrome MV3 扩展
│   ├── manifest.json
│   ├── background.js               # Service Worker (后台调度)
│   ├── content.js                  # 页面注入脚本
│   ├── page-intercept.js           # 页面 API 拦截辅助
│   ├── popup/                      # 扩展弹出面板
│   └── tests/                      # 扩展测试数据
└── deepseek-monitor.xcodeproj      # Xcode 工程文件

开发说明

  • 语言:Swift 5.9+,SwiftUI 构建 UI
  • 数据存储:SwiftData(底层 SQLite),无第三方依赖
  • 本地服务:基于 Network Framework 的 NWListener,仅监听 127.0.0.1:5199
  • 组件通信:Widget 通过 App Group 共享 UserDefaults 读取快照数据(suite 由 APP_GROUP_IDENTIFIER 配置)
  • Chrome 扩展:Manifest V3,Service Worker + Content Script 架构
  • 最低部署目标:macOS 14.0
  • 项目约束:不引入第三方依赖

隐私与安全

  • 全部本地化:Chrome 扩展从 DeepSeek 平台获取的数据直接推送至本地 127.0.0.1:5199,不经过任何第三方服务器
  • 本地端口限制:App 的 HTTP 服务仅监听本地回环地址,不对外暴露
  • 沙箱保护:App 运行在 macOS App Sandbox 中
  • 无数据上传:项目不含任何数据上传、遥测或分析 SDK
  • 有限访问范围:扩展仅访问 DeepSeek 平台、本地 App 和必要的本地存储

常见问题

Q:同步时提示"无法连接本地 App"

A:请确认 macOS App 已经启动,并且没有其他程序占用 5199 端口。可在终端使用 lsof -i :5199 检查端口占用情况。

Q:所有页面都可以点击同步吗?

A:在有有效同步信息时可以。首次同步或同步失效时需回到 DeepSeek 平台页面重新同步。

Q:同步后数据没有更新

A:点击扩展图标重新同步,或检查 App 菜单栏 Debug 日志面板查看详细错误信息。

Q:Widget 显示"无数据"

A:请先完成至少一次数据同步,Widget 会自动在 15 分钟内刷新。也可以手动在通知中心下拉刷新。

Q:数据存储在什么位置?

A:App 使用 SwiftData 在应用沙箱内存储 SQLite 数据库,Widget 快照通过 App Group 共享 UserDefaults 存储。所有数据均不离开本地设备。

许可证

本项目基于 MIT License 开源。

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors