207 lines
6.7 KiB
Markdown
207 lines
6.7 KiB
Markdown
# Obsidian 智能日记整理 Agent
|
|||
|
|
|
||
|
|
**版本**: 0.1.0
|
||
|
|
|
||
|
|
这是一个基于 Agent 架构的智能日记整理系统,专为 Obsidian 用户设计。它能够自动分析您的每日日记,提取关键信息(如经验、待办事项、问题等),并将其智能地整理到您的知识库中的指定位置。
|
||
|
|
|
||
|
|
该系统采用 Command + Skill 架构,具有高度的可扩展性和灵活性,并支持通过命令行触发,方便与 Obsidian 或其他工具集成。
|
||
|
|
|
||
|
|
## 系统特性
|
||
|
|
|
||
|
|
- **智能分析**:集成 Claude 3.5 Sonnet 模型,深度理解日记内容并提取结构化信息。
|
||
|
|
- **自动化整理**:自动将提取的内容创建为新的笔记,并放置在预设的文件夹中。
|
||
|
|
- **双向链接**:在生成的笔记中自动添加指向原始日记的链接,方便溯源。
|
||
|
|
- **Agent 架构**:采用 Command + Skill 模式,逻辑清晰,易于扩展新功能。
|
||
|
|
- **命令行驱动**:通过标准命令行接口(CLI)操作,易于集成和自动化。
|
||
|
|
- **高度可配置**:所有关键参数(如 API 密钥、文件夹路径、分析规则)均可通过配置文件管理。
|
||
|
|
- **通用性设计**:核心框架与具体实现分离,可兼容 Claude Code、OpenCode 等多种 Agent 环境。
|
||
|
|
|
||
|
|
## 系统架构
|
||
|
|
|
||
|
|
系统由以下核心组件构成:
|
||
|
|
|
||
|
|
1. **Agent Core**:定义了 `Agent`、`Command` 和 `Skill` 的基础接口和交互逻辑。
|
||
|
|
2. **Skills**:原子化的功能单元,负责执行具体任务,如 `ObsidianReadSkill`(读取笔记)和 `ClaudeAnalyzeSkill`(分析内容)。
|
||
|
|
3. **Commands**:用户可执行的命令,负责编排一个或多个 Skill 来完成复杂任务,如 `OrganizeCommand`。
|
||
|
|
4. **CLI 入口**:提供一个命令行界面,用于接收用户指令并驱动 Agent 执行相应命令。
|
||
|
|
5. **配置文件**:使用 YAML 文件管理所有配置,实现代码与配置分离。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
graph TD
|
||
|
|
subgraph User Interface
|
||
|
|
CLI[命令行接口]
|
||
|
|
Obsidian[Obsidian (via shell command)]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Agent System
|
||
|
|
AgentCore[Agent Core]
|
||
|
|
CLI --> AgentCore
|
||
|
|
Obsidian --> AgentCore
|
||
|
|
|
||
|
|
AgentCore -- dispatches --> Commands
|
||
|
|
subgraph Commands
|
||
|
|
OrganizeCmd[Organize Command]
|
||
|
|
end
|
||
|
|
|
||
|
|
Commands -- orchestrates --> Skills
|
||
|
|
subgraph Skills
|
||
|
|
ReadNote[Obsidian Read Skill]
|
||
|
|
AnalyzeNote[Claude Analyze Skill]
|
||
|
|
WriteNote[Obsidian Write Skill]
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph External Services
|
||
|
|
ObsidianAPI[Obsidian Local REST API]
|
||
|
|
ClaudeAPI[Claude API]
|
||
|
|
end
|
||
|
|
|
||
|
|
ReadNote -- HTTP --> ObsidianAPI
|
||
|
|
WriteNote -- HTTP --> ObsidianAPI
|
||
|
|
AnalyzeNote -- HTTP --> ClaudeAPI
|
||
|
|
```
|
||
|
|
|
||
|
|
## 安装指南
|
||
|
|
|
||
|
|
### 1. 先决条件
|
||
|
|
|
||
|
|
- **Python 3.8+**
|
||
|
|
- **Obsidian**
|
||
|
|
- **Obsidian 插件**: `Local REST API`
|
||
|
|
|
||
|
|
### 2. 安装 Local REST API 插件
|
||
|
|
|
||
|
|
1. 在 Obsidian 中,进入 `设置` > `第三方插件`。
|
||
|
|
2. 关闭 `安全模式`。
|
||
|
|
3. 点击 `浏览社区插件`,搜索 `Local REST API` 并安装。
|
||
|
|
4. 启用插件,并在插件设置页面生成一个 API 密钥。请妥善保管此密钥。
|
||
|
|
|
||
|
|
### 3. 安装 Agent
|
||
|
|
|
||
|
|
1. 克隆或下载本项目到您的本地计算机。
|
||
|
|
|
||
|
|
```bash
|
||
|
|
git clone <repository_url> journal_organizer
|
||
|
|
cd journal_organizer
|
||
|
|
```
|
||
|
|
|
||
|
|
2. 安装 Python 依赖。
|
||
|
|
|
||
|
|
```bash
|
||
|
|
pip install -r requirements.txt
|
||
|
|
```
|
||
|
|
|
||
|
|
## 配置指南
|
||
|
|
|
||
|
|
1. **复制配置文件**
|
||
|
|
|
||
|
|
将 `config.example.yaml` 复制为 `config.yaml`。
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cp config.example.yaml config.yaml
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **编辑配置文件**
|
||
|
|
|
||
|
|
打开 `config.yaml` 并根据您的环境填写以下关键信息:
|
||
|
|
|
||
|
|
- `obsidian.vault_path`: 您的 Obsidian vault 在计算机上的绝对路径。
|
||
|
|
- `obsidian.rest_api.api_key`: 您在 `Local REST API` 插件中生成的 API 密钥。
|
||
|
|
- `claude.api_key`: 您的 Anthropic API 密钥。建议使用环境变量 `ANTHROPIC_API_KEY` 来设置。
|
||
|
|
- `journal` 和 `output` 部分的文件夹路径,确保它们在您的 vault 中存在。
|
||
|
|
|
||
|
|
**安全提示**: 请勿将包含敏感密钥的 `config.yaml` 文件提交到公共代码仓库。
|
||
|
|
|
||
|
|
## 使用方法
|
||
|
|
|
||
|
|
您可以通过命令行在项目根目录下运行 Agent。
|
||
|
|
|
||
|
|
### 整理今天的日记
|
||
|
|
|
||
|
|
```bash
|
||
|
|
python -m journal_organizer organize
|
||
|
|
```
|
||
|
|
|
||
|
|
### 整理指定日期的日记
|
||
|
|
|
||
|
|
```bash
|
||
|
|
python -m journal_organizer organize --date 2025-12-31
|
||
|
|
```
|
||
|
|
|
||
|
|
### 在 Obsidian 中调用
|
||
|
|
|
||
|
|
您可以使用 `Templater` 或 `QuickAdd` 等插件,通过执行 Shell 命令来调用 Agent。
|
||
|
|
|
||
|
|
例如,在 `Templater` 中可以这样设置:
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
<%*
|
||
|
|
const command = `cd /path/to/journal_organizer && python -m journal_organizer organize --date ` + tp.file.title;
|
||
|
|
const result = await tp.user.exec(command);
|
||
|
|
tp.obsidian.Notice.now(result, 10000);
|
||
|
|
%>
|
||
|
|
```
|
||
|
|
|
||
|
|
### 查看帮助
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 查看所有命令
|
||
|
|
python -m journal_organizer --help
|
||
|
|
|
||
|
|
# 查看特定命令的帮助
|
||
|
|
python -m journal_organizer organize --help
|
||
|
|
```
|
||
|
|
|
||
|
|
## 项目结构
|
||
|
|
|
||
|
|
```
|
||
|
|
journal_organizer/
|
||
|
|
├── commands/ # Command 模块
|
||
|
|
│ ├── __init__.py
|
||
|
|
│ └── organize_command.py # 日记整理命令
|
||
|
|
├── skills/ # Skill 模块
|
||
|
|
│ ├── __init__.py
|
||
|
|
│ ├── claude_skill.py # Claude AI 相关 Skill
|
||
|
|
│ └── obsidian_skill.py # Obsidian API 相关 Skill
|
||
|
|
├── __init__.py
|
||
|
|
├── agent_core.py # Agent 核心框架
|
||
|
|
├── main.py # 命令行入口和 Agent 初始化
|
||
|
|
├── config.example.yaml # 配置文件示例
|
||
|
|
├── requirements.txt # Python 依赖
|
||
|
|
└── README.md # 本文档
|
||
|
|
```
|
||
|
|
|
||
|
|
## 如何扩展
|
||
|
|
|
||
|
|
本系统基于 Command + Skill 架构,您可以轻松地添加新的功能。
|
||
|
|
|
||
|
|
### 添加一个新的 Skill
|
||
|
|
|
||
|
|
1. 在 `skills/` 目录下创建一个新的 Python 文件,例如 `my_new_skill.py`。
|
||
|
|
2. 在该文件中,创建一个继承自 `Skill` 的类。
|
||
|
|
3. 实现 `execute` 方法,该方法是 Skill 的核心逻辑。
|
||
|
|
|
||
|
|
```python
|
||
|
|
from ..agent_core import Skill, SkillType, SkillResult, CommandContext
|
||
|
|
|
||
|
|
class MyNewSkill(Skill):
|
||
|
|
def __init__(self):
|
||
|
|
super().__init__(name="my_new_skill", skill_type=SkillType.TRANSFORM, description="我的新技能")
|
||
|
|
|
||
|
|
async def execute(self, context: CommandContext, **kwargs) -> SkillResult:
|
||
|
|
# 在这里实现您的逻辑
|
||
|
|
return SkillResult(success=True, data="新技能执行成功")
|
||
|
|
```
|
||
|
|
|
||
|
|
### 添加一个新的 Command
|
||
|
|
|
||
|
|
1. 在 `commands/` 目录下创建一个新的 Python 文件。
|
||
|
|
2. 创建一个继承自 `Command` 的类。
|
||
|
|
3. 在 `__init__` 方法中注册所需的 Skills。
|
||
|
|
4. 实现 `execute` 方法,编排 Skills 来完成任务。
|
||
|
|
5. 在 `main.py` 的 `_register_commands` 方法中注册您的新命令。
|
||
|
|
|
||
|
|
## 许可证
|
||
|
|
|
||
|
|
本项目采用 MIT 许可证。
|