# Ai Agent Plus
**Repository Path**: PrettyAnt/ai-agent-plus
## Basic Information
- **Project Name**: Ai Agent Plus
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-03
- **Last Updated**: 2026-09-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# AI Agent Demo
[](LICENSE)
[](https://developer.android.com)
[](https://kotlinlang.org)
基于 DeepSeek API 的 Android 手机助手(AI Agent)。你可以用中文跟它对话,它能自主决定调用哪个工具,帮你查位置、看设备信息、查天气、打开设置、发短信。
## 界面预览
## 功能特性
- **ReAct 模式 AI Agent**:大模型自主"思考 → 调用工具 → 观察结果 → 再思考",支持多轮工具调用循环
- **自然语言工具调用**(Function Calling):
- `get_current_location` — 获取当前设备经纬度
- `get_device_info` — 获取设备型号、系统版本
- `get_weather` — 查询指定城市实时天气(Open-Meteo 免费 API)
- `open_settings` — 打开系统设置页面
- `send_sms` — 发送短信
- **热词栏**:输入框上方展示服务端热词(B 站热搜公开接口),点击即可填入输入框
- **仿微信聊天交互**:
- 聊天气泡长按弹出"复制 / 全选 / 收藏"菜单,支持拖动光标调整选区
- 菜单位置根据气泡在窗口中的位置智能定位(上半屏显示在选区下方、下半屏显示在选区上方)
- 点击任意位置、滑动列表、按返回键均可收起菜单并取消选中
## 技术栈
| 类别 | 技术 |
|------|------|
| 语言 | Kotlin + 协程 + Flow |
| UI | Jetpack Compose (Material 3) |
| 架构 | MVVM(ViewModel + StateFlow) |
| 网络 | Retrofit + OkHttp + Gson |
| AI | DeepSeek API(deepseek-chat) |
| 权限 | Accompanist Permissions(运行时权限) |
| 测试 | JUnit + MockWebServer |
## 项目结构
```
app/src/main/java/com/prettyant/agentdemo/
├── MainActivity.kt # 入口,组装依赖并注入 API Key
├── data/ # 数据层
│ ├── models/ # 网络数据模型(ChatModels / WeatherModels / HotWordModels 等)
│ └── network/ # 网络客户端(Retrofit 接口 + object 合并在同一文件)
│ ├── DeepSeekClient.kt # DeepSeek 对话 API
│ ├── WeatherClient.kt # Open-Meteo 天气 API
│ ├── HotWordClient.kt # B 站热搜 API
│ └── RetrofitFactory.kt # Retrofit 统一构建工厂
├── domain/ # 领域层
│ └── agent/
│ ├── AgentManager.kt # ReAct 循环核心,多轮工具调用
│ └── ToolExecutor.kt # 工具定义与执行(定位/设备/天气/设置/短信)
└── ui/ # 界面层
├── components/ # 聊天气泡、输入栏、热词栏、自定义文本选择菜单
├── screens/ # ChatScreen
└── viewmodel/ # ChatViewModel + ChatUiState
```
分层约定:UI → ViewModel → AgentManager(领域层)→ 网络客户端(数据层)。
## 快速开始
### 1. 配置 API Key
在项目根目录的 `local.properties` 中添加 DeepSeek API Key(构建时由 Gradle 读入 `BuildConfig`,避免硬编码):
```properties
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxx
```
> API Key 申请地址:https://platform.deepseek.com/
### 2. 构建运行
用 Android Studio 打开项目,等待 Gradle 同步完成后运行到设备或模拟器即可。
环境要求:
- Android Studio(较新版本即可)
- JDK 17+
- Android SDK 35(minSdk 24 / targetSdk 34)
### 3. 试试这些指令
| 指令 | 效果 |
|------|------|
| "我的位置在哪?" | 调用定位工具(需授权定位权限) |
| "查看设备信息" | 显示手机型号与系统版本 |
| "查一下上海的天气" | 调用 Open-Meteo 天气 API |
| "打开设置" | 打开系统设置页面 |
| "发短信给13800138000,内容是我已到达" | 调用短信工具(需授权短信权限) |
## 运行测试
网络层单元测试基于 MockWebServer,不依赖真实网络:
```bash
./gradlew :app:testDebugUnitTest
```
## 对话流程(ReAct 循环)
```
用户输入 → DeepSeek 思考 → 返回工具调用 → ToolExecutor 执行
↑ ↓
└──────────── 结果回填给模型继续思考 ←──────────┘
(直到模型给出最终回答)
```
`AgentManager` 以 `Flow` 对外输出状态(Thinking / ToolCalling / Completed / Error),`ChatViewModel` 收集后更新消息列表。
## 许可证
本项目采用 [Apache License 2.0](LICENSE)。
## 注意事项
- 本项目为学习演示用途,热词接口使用 B 站公开热搜接口,无鉴权
- 短信功能调用系统短信工具,实际发送行为取决于设备权限与系统策略
- 请勿将 API Key 提交到仓库:`local.properties` 已在 `.gitignore` 中,Key 仅保存在本地