xy0v0's Blog

xy0v0's Blog

在obsidian中实现文章概括生成

2025-02-05

开发缘由

在使用 obsidian+hugo 的博客配置时,发现需要文章的概括内容,于是决定直接从 obsidian 端实现该功能。

主要实现

openai请求

采用 obsidian 推荐的 requesturl 库进行大模型请求

export class OpenAIService {
    constructor(apiKey: string, baseUrl: string, model: string, systemPrompt: string) {
        this.apiKey = apiKey;
        this.baseUrl = baseUrl;
        this.model = model;
        this.systemPrompt = systemPrompt;
    }

    private async makeRequest(messages: ChatMessage[]): Promise<string> {
        try {
            const response = await requestUrl({
                url: `${this.baseUrl}/v1/chat/completions`,
                method: 'POST',
                headers: {
                    'Authorization': `Bearer ${this.apiKey}`,
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({
                    model: this.model,
                    messages,
                    temperature: 0.7,
                    max_tokens: COMPLETION_TOKENS,
                }),
            });
            // 处理响应...
        } catch (error) {
            // 错误处理...
        }
    }
}

formatter内容修改处理

考虑到添加的字段名有个性化需求,因此在设置中可让用户自行设定添加的字段名,对多种不同的格式有较好适配性。

针对formatter修改有如下方案可选:

  • 使用YAML解析器
  • 正则表达式

个人对正则表达式比较熟悉,最终采用正则表达式进行

flowchart TD A[开始] --> B{检查frontmatter} B -->|不存在| C[创建新的frontmatter] B -->|存在| D{检查summaryField字段} D -->|存在| E[使用已有字段] D -->|不存在| F[准备创建新字段] C --> G[生成AI摘要] E --> G F --> G G --> H{字段是否存在} H -->|存在| I[替换原有内容] H -->|不存在| J[添加新字段] I --> K[保持格式] J --> K K --> L[更新文档] L --> M[结束]
private static readonly FRONTMATTER_REGEX = /^---\n([\s\S]*?)\n---\n*/;
private static readonly FIELD_REGEX = (field: string) =>
new RegExp(`^${field}:([\\s\\S]*?)(?=\\n[^\\s]|$)`, 'm');

错误处理

请求遇到错误时抛出相对应的错误类型

   try {
       // API调用
   } catch (error) {
       if (error.status === 429) {
           new Notice('API rate limit exceeded. Please try again later.');
       } else if (error.status === 401) {
           new Notice('Invalid API key. Please check your settings.');
       } else {
           new Notice(`API Error: ${error.message}`);
       }
       throw error;
   }

总结

经过开发,终于可以为博客文章自动生成描述,方便阅读和后续检索

{{< github
name="Auto-AI-Summary"
link="https://github.com/DanielZhangyc/Auto-AI-Summary"
description="Obsidian的AI摘要生成插件"
language="TypeScript"

}}