Commit abe8a79
authored
Privacy-First AI Tool Calling
Summary
This release introduces AI tool calling with human-in-the-loop approval—a significant step forward for knowledge management workflows. Your AI can now search your vault, read files, and query
the web, but only with explicit approval at every step.
Key additions:
- Vault Search: AI discovers relevant notes across filenames and content
- File Read: AI requests access to specific files you select
- Web Search: Brave Search integration (1,000 free queries/month)
- Editable queries: Modify AI-generated search terms before execution
- Three-layer approval: Approve execution → Review results → Select what to share
Architecture Changes
New service layer (~2,500 lines):
- ToolService - Orchestrates tool execution and approval workflow
- VaultSearchService - Full-text vault search via Obsidian API
- WebSearchService - Brave Search/custom endpoint integration
- ToolSupportDetector + WhitelistValidator - Model capability detection
Major refactoring (~22,000 insertions, ~4,500 deletions):
- Consolidated 6 AI services into unified AiProviderService with provider adapters
- Replaced ServiceLocator with new ServiceContainer
- Extracted command handlers from monolithic CommandRegistry
- Added comprehensive utility modules for error handling, input validation, and message processing
New UI components:
- ToolApprovalModal - Shows tool name, parameters, editable queries
- SearchResultsApprovalModal - Multi-select file filtering
- WebSearchApprovalModal - Web result filtering with previews
Privacy & Security
- Opt-in only: All tools disabled by default
- Local execution: Vault operations run entirely within Obsidian's API
- Selective sharing: Choose exactly which results reach the AI
- No telemetry: Zero external tracking
Configuration
Settings → ChatGPT MD → Tool Calling:
- Enable/disable tool calling (default: off)
- Brave Search API key (optional)
- Custom search provider URL
- Max web results (1-10)
Model Support
Tool calling requires model support. The plugin includes:
- Whitelist of tested models (~150 models across OpenAI, Anthropic, OpenRouter, Gemini)
- Visual indicator in model selector showing tool compatibility
- Automatic filtering for unsupported models
Breaking Changes
None. Existing configurations work unchanged. Tools are disabled by default.
Test Plan
- Verify tool calling toggle enables/disables all tool features
- Test vault search with various query types
- Confirm file read approval shows correct file list
- Test web search with and without API key configured
- Verify query editing works for vault and web search
- Test with multiple AI providers (OpenAI, Anthropic, Ollama, etc.)
- Confirm model selector shows tool support indicatorsFile tree
108 files changed
+20899
-4954
lines changed- docs
- scripts/tool-whitelist
- src
- Commands
- Models
- Services
- Adapters
- Types
- Utilities
- Views
- core
- tool-support-results
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
108 files changed
+20899
-4954
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
25 | 30 | | |
26 | 31 | | |
27 | 32 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
9 | | - | |
| 9 | + | |
10 | 10 | | |
11 | | - | |
| 11 | + | |
12 | 12 | | |
13 | | - | |
14 | 13 | | |
15 | 14 | | |
16 | 15 | | |
17 | 16 | | |
18 | | - | |
19 | | - | |
20 | | - | |
| 17 | + | |
21 | 18 | | |
22 | 19 | | |
23 | 20 | | |
24 | 21 | | |
25 | 22 | | |
26 | | - | |
| 23 | + | |
27 | 24 | | |
28 | 25 | | |
29 | 26 | | |
30 | 27 | | |
31 | 28 | | |
32 | 29 | | |
| 30 | + | |
33 | 31 | | |
34 | 32 | | |
| 33 | + | |
| 34 | + | |
35 | 35 | | |
36 | 36 | | |
37 | | - | |
| 37 | + | |
38 | 38 | | |
39 | | - | |
40 | | - | |
41 | | - | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
42 | 42 | | |
43 | | - | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
44 | 46 | | |
45 | 47 | | |
46 | 48 | | |
47 | | - | |
| 49 | + | |
48 | 50 | | |
49 | | - | |
50 | | - | |
51 | | - | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
52 | 55 | | |
| 56 | + | |
| 57 | + | |
53 | 58 | | |
54 | 59 | | |
55 | 60 | | |
56 | | - | |
57 | | - | |
58 | 61 | | |
59 | 62 | | |
60 | 63 | | |
61 | 64 | | |
62 | 65 | | |
63 | | - | |
64 | | - | |
| 66 | + | |
| 67 | + | |
65 | 68 | | |
66 | | - | |
| 69 | + | |
67 | 70 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
| 7 | + | |
8 | 8 | | |
9 | | - | |
| 9 | + | |
10 | 10 | | |
11 | | - | |
| 11 | + | |
12 | 12 | | |
13 | | - | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
18 | | - | |
19 | | - | |
20 | | - | |
21 | | - | |
22 | | - | |
23 | | - | |
24 | | - | |
25 | | - | |
26 | | - | |
27 | | - | |
28 | | - | |
29 | | - | |
30 | | - | |
31 | | - | |
32 | | - | |
33 | | - | |
34 | | - | |
35 | | - | |
36 | | - | |
37 | | - | |
38 | | - | |
39 | | - | |
40 | | - | |
41 | | - | |
42 | | - | |
43 | 13 | | |
44 | 14 | | |
45 | 15 | | |
| |||
160 | 130 | | |
161 | 131 | | |
162 | 132 | | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
163 | 204 | | |
164 | 205 | | |
165 | 206 | | |
| |||
0 commit comments