以下の内容はhttps://wineroses.hatenablog.com/entry/2025/05/22/142332より取得しました。


Obsidian:Geminiでタグを埋め込んでみた

Obsidian BASE の仕様を見て 「今後はタグとかもプロパティに埋め込むのが標準になるなあ」と思い、 それから 2hop links のことを考え、くっつきました。

両方を活かせばいいわけだ。

Geminiの助けを借りて

以前作った「全修」の変形です。

プロンプトを「キーワードを抽出し、フロントマターの形式でtagsに設定してください」と決め打ちする。 生成AIでプロパティを設定しようという作戦です。

tagging.md

Geminiと交信するTemplaterスクリプト

<%*
// APIキーを https://aistudio.google.com/app/apikey で取得してください。
const api_key = 'QuuuuuuX'

const url = 'https://generativelanguage.googleapis.com/v1beta/models/'
const model = 'gemini-1.5-flash'
prompt = "<content>からキーワードを抽出し、フロントマターの形式でtagsに設定してください。"
if(!prompt) return
const content = tp.file.content
text = `<content>${content}</content>\n:${prompt}`
end_point = `${url}${model}:generateContent?key=${api_key}`
new Notice("tagging...")
const data = {
  contents: [{
    parts: [{ text: text }]
  }]
}

response = await fetch(end_point, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify(data)
})
if(response.ok) {
  const result = await response.json()
  new Notice("プロパティに設定")
  s = result.candidates[0].content.parts[0].text
  if(s[0]=="\`") {
    s = s.replace(/^```.*\n/, "")
    s = s.replace("```", "")
  }
  if(content[0]=="-") {
    s = s.replace("---\n", "")
    d = content.split("---\n\n")
    a = d.shift()
    b = d.join("---\n\n")
    s = a + s + b
  } else {
    s = `${s}${content}`
  }
  e = app.workspace.activeLeaf.view.editor
  e.setValue(s)
}else{
  new Notice(response.statusText)
}
%>

api_keyを最初に設定してください。

使い方

TemplaterのHotKeyに設定して、ツールバーなどから実行。

プロパティが作成され、文中のキーワードがタグになって並びます。

2hop links も繋がりやすくなります。 これは行けそうな気がする。

たまにただのリストを返すときがありますが、 Undoして再実行するとプロパティに戻ります。 すでにプロパティがある場合も、 追記することで対応します。

まとめ

文中にスクリプトがあると、プロンプトを無視して 「このスクリプトは修正した方がいいよ」とお節介が始まります。

Gemini の困ったところだ。




以上の内容はhttps://wineroses.hatenablog.com/entry/2025/05/22/142332より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14