| 版本 | 修改内容 |
| 0.3 | 增加对coze工作流直接输出内容的捕获 |
| 0.2 | 可以获取文件内容,发送给大模型 |
| 0.1 | 实现完整的功能闭环 |

记得把 RunJS=xxxxxx 自己加上
本文缘起
本系列文章基于我的个人想法与实践,我最近在把Notion笔记迁移到Obsidian中,希望将Obsidian打造成我的个人第二大脑,构建思路如下:

在构建的过程中,将一些心得记录下来,并且也方便答疑。
前提条件
准备文件夹
把自己的任务都放到’表/任务’文件夹下,且每个.md文件都是一个任务。
每个任务.md文件都有类似的文件属性
---
任务-时间: 2024-06-04
任务-是否完成: true
---
准备插件
dataview插件,默认配置
RunJS插件,默认配置
准备AI接口
coze的ai接口是免费的,注册一下就能有免费的ai接口了,国内可用
- coze地址: https://www.coze.cn/home
- coze个人访问令牌:https://www.coze.cn/open/api
配置好了,可以用下面的临时js代码测试
- 代码1
```js RunJS="基本示例/w网络/ai/调用豆包"
function callai(question ) {
new Notice("开始调用");
const myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer <你的令牌>");
myHeaders.append("Content-Type", "application/json");
myHeaders.append("Accept", "*/*");
myHeaders.append("Host", "api.coze.cn");
myHeaders.append("Connection", "keep-alive");
const raw = JSON.stringify({
"conversation_id": "123",
"bot_id": "<bot_id>", // 这个是豆包URL后面的一段 比如下面的URL中bot后面的 https://www.coze.cn/space/xxxxxx/bot/xxxxx
"user": "xxxxx",
//"query": "你好",
"query": question ,
"stream": false
});
const requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://api.coze.cn/open_api/v2/chat", requestOptions)
.then((response) => response.json())
.then((result) => {
new Notice("返回0:"+result['messages'][0]['content'])
new Notice("返回1:"+result['messages'][1]['content'])
}
)
.catch((error) => console.error(error));
}
callai("你好")
```

常见替换符的位置
user

你的令牌

AI任务管理的完整代码复制
函数(方便复用)
代码2(这个单独调用没有反应)
注意,每个代码独立一个代码块
```js RunJS="{n:'类库/w网络/callai豆包', t:'m'}"
/*
调用代码示例
import * as obsidian from 'obsidian';
import { callai } from '类库/w网络/callai豆包';
// 自调用异步函数示例
(async () => {
try {
const answer = await callai("你好");
new Notice("AI 返回的结果:"+ answer);
} catch (error) {
new Notice("调用失败:"+ error);
}
})();
*/
// 导出异步函数 callai 该函数是阻塞式的
export async function callai(question) {
new Notice("开始调用");
const myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer <你的令牌>");
myHeaders.append("Content-Type", "application/json");
myHeaders.append("Accept", "*/*");
myHeaders.append("Host", "api.coze.cn");
myHeaders.append("Connection", "keep-alive");
const raw = JSON.stringify({
"conversation_id": "123",
"bot_id": "<bot_id>", // 这个是豆包URL后面的一段 比如下面的URL中bot后面的 <https://www.coze.cn/space/xxxx/bot/xxx>
"user": "xxxxx",
"query": question,
"stream": false
});
const requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
try {
const response = await fetch("https://api.coze.cn/open_api/v2/chat", requestOptions);
const result = await response.json();
new Notice("返回0:" + result['messages'][0]['content']);
new Notice("返回1:" + result['messages'][1]['content']);
return result['messages'][0]['content']+"\n"+result['messages'][1]['content'];
} catch (error) {
console.error(error);
throw error;
}
}
```
调用函数(调用上面的函数)
- 代码3(这个会调用代码2)
```js RunJS="表/任务/让ai处理今日待办任务列表"
// Using obsidian
import * as obsidian from 'obsidian';
import { callai } from '类库/w网络/callai豆包';
// 自调用异步函数示例
(async () => {
// this plugin
const runJS = this;
// 获取 Dataview 的 API 引用
const dv = runJS.app.plugins.plugins["dataview"].api;
// 执行 DQL 查询并获取结果
const result = await dv.query(`
LIST
任务-时间
FROM "表/任务"
Where 任务-时间 = date(today)
Limit 10
`);
// 检查查询结果是否为空
if (result.successful) {
// 这里不能用forEach,因为forEach不支持异步操作,只能用for...of
// 使用 for...of 循环遍历查询结果并将每个笔记标题添加到列表中
for (const row of result.value.values) {
const titlePath = row['key']['path']; // 获取笔记的标题
new Notice('找到的笔记: ' + titlePath);
// 获取文件对象
const tFile = app.vault.getAbstractFileByPath(titlePath);
// 获取文件内容
const content = await app.vault.cachedRead(tFile);
// new Notice('文件内容: ' + content);
const promptStr = `这个任务应该如何处理:${titlePath}。任务的详细内容如下:${content}`;
new Notice('提示词: ' + promptStr);
// 异步调用 AI 接口
const answer = await callai(promptStr);
new Notice("AI 返回的结果: " + answer);
const file = this.app.vault.getAbstractFileByPath(titlePath);
if (file) {
// 直接追加内容到文件末尾
const additionalContent = '\n\n### AI答复'+'\n'+answer; // 替换为你要追加的内容
await this.app.vault.append(file, additionalContent);
new Notice('内容已成功追加。');
} else {
new Notice('File not found.');
}
}
} else {
// 处理查询失败的情况
new Notice('查询失败: ' + result.error);
}
})();
```
运行代码3之前,可以考虑单独运行下面的dataview,确定能查出来任务
```dataview
LIST
任务-时间
FROM "表/任务"
Where 任务-时间 = date(today)
Limit 10
```
其它信息(可以不看)
如果coze使用直接返回,就从1中获取结果


0是普通回答
