Text generation based on tag suggestions, using Claude, OpenAI, Ollama, Kimi, Doubao, Qwen, Zhipu, DeepSeek, QianFan & more.
Tars is an Obsidian plugin that supports text generation based on tag suggestions, using services like Claude, OpenAI, Gemini, 🔥DeepSeek, 🔥SiliconFlow, 🔥OpenRouter, 🔥MiniMax, 🔥LongCat, Ollama, Kimi, Doubao, Qwen, Zhipu, QianFan & more. The name Tars comes from the robot Tars in the movie "Interstellar". The plugin supports both desktop and mobile devices.
⚠️ Note: Only embedded files (e.g.
![[example.jpg]]) are supported. External URL links will not work.

#DeepSeek :) from the command list to generate a response.
#, use Obsidian's native tag completion, then input space to trigger.# might be inconvenient, you can type the complete tag (without #) to trigger.

If the AI provider you want is not in the list above, you can propose a specific plan in the issue.
#, enter the tag, and then type a space to trigger the AI assistant.A simple conversation example:
#User : 1+1=?(user message)
(blank line)
#Claude :(trigger)
Conversation order rules:
graph LR
A[System message] --> B[User message] --> C[Assistant message] --> B
If you are not satisfied with the AI assistant's answer and want to retry. Use the plugin command "Select the message at the cursor", select and delete the AI assistant's response content, modify your question, and trigger the AI assistant again. Or select the response content and use a command like "#Claude :" to retrigger the AI assistant, which will delete the previous response and generate a new one.
A paragraph cannot contain multiple messages. Messages should be separated by blank lines.

NewChat tag.Tag commands are based on the paragraph at the cursor or in the selection. A Markdown paragraph can be:
With correct syntax, when you input a space after #tag, it will trigger tag completion. For example:
#NewChat
#System :
#User :
#NewChat #System :
#NewChat #User :
#Claude : (AI generate)
We recommend using the colored tags plugin.

There are several ways:
# + tag + spaceMost providers are asked for their own model list, so the choices come from the API rather than from a list baked into the plugin — a model the provider no longer advertises will not be among them.
Set it under "Override input parameters" as JSON, such as {"model":"your-desired-model"}, which takes precedence over the model chosen in the picker.
If the list cannot be read at all — an account still awaiting verification, a relay that does not implement it — the row turns into a plain text field and the model can be typed in directly.
CTRL + SHIFT + iCMD + OPTION + iCTRL + SHIFT + iModify the baseURL in the settings, copy and paste the corresponding address from the service provider's documentation, and finally check if the URL is complete.
LLM protocols differ significantly between openAI, claude, and gemini. Make sure to select the correct one. The chain of thought in deepseek-r1 is also different from openAI.
These are HTTP status codes:
npm install
npm run dev # watch build
npm run build # type-check, then production bundle
npm run lint
The settings tab is rendered by Obsidian from getSettingDefinitions(), so
neither the build nor the linter can tell you whether it works. See
Manual testing against a running Obsidian for
driving a live instance with the Obsidian CLI, plus a checklist to run before
a release.
Providers fail for reasons that live outside the code — Obsidian calls every API
cross-origin from app://obsidian.md, and a CORS rejection is indistinguishable
from an unreachable host unless you test for it deliberately. See
Testing providers against real networks for the two
harnesses that tell them apart, and npm run smoke for the one that runs inside
Obsidian.