<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Vscode on Tarragon</title><link>https://tarrragon.github.io/blog/tags/vscode/</link><description>Recent content in Vscode on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Mon, 11 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/vscode/index.xml" rel="self" type="application/rss+xml"/><item><title>1.3 VS Code + Continue.dev 整合</title><link>https://tarrragon.github.io/blog/llm/01-local-llm-services/vscode-continue-integration/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/01-local-llm-services/vscode-continue-integration/</guid><description>&lt;p>把本地 LLM 接到 VS Code 是「本地 LLM 寫 code」工作流的真正起點。前面章節安裝的 Ollama 是&lt;a href="https://tarrragon.github.io/blog/llm/00-foundations/three-layer-architecture/" data-link-title="0.2 介面 / 伺服器 / 模型三層架構" data-link-desc="把任何本地 LLM 工具放回正確的層級，用三層心智模型看懂工具關係">伺服器層&lt;/a>，本章要接的 Continue.dev 是&lt;strong>介面層&lt;/strong>：使用者實際在編輯器裡按快捷鍵、打字、看 inline diff 的工具。&lt;/p>
&lt;p>Continue.dev 是 2026 年 5 月時與本地 LLM 整合最成熟的 VS Code 擴充套件。對應到雲端世界、它的定位類似 Cursor、差別是 Continue.dev 預設綁本地、可以同時連雲端；Cursor 預設綁雲端、本地是次要 surface、設定深度較高。&lt;/p>
&lt;p>本章假設你已經裝好 Ollama 並至少跑過一次 &lt;code>ollama run&lt;/code>。沒裝過請先回 &lt;a href="https://tarrragon.github.io/blog/llm/01-local-llm-services/ollama/" data-link-title="1.0 Ollama：主流推論伺服器" data-link-desc="一行 brew 裝完、ollama run 一鍵跑 Gemma 4 MTP、OpenAI 相容 API on localhost:11434">1.0 Ollama&lt;/a>。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;p>讀完本章後，你應該能：&lt;/p>
&lt;ol>
&lt;li>安裝 Continue.dev 擴充套件。&lt;/li>
&lt;li>在 &lt;code>~/.continue/config.json&lt;/code> 設定本地 Ollama 模型。&lt;/li>
&lt;li>用 Cmd+L 開對話、Cmd+I 做行內編輯。&lt;/li>
&lt;li>同時設定本地與雲端模型，按任務切換。&lt;/li>
&lt;li>排除 Continue 連不上 Ollama 的常見問題。&lt;/li>
&lt;/ol>
&lt;h2 id="安裝擴充套件">安裝擴充套件&lt;/h2>
&lt;p>Continue 擴充套件是 VS Code 內接到本地 LLM 的介面層入口、裝完才有 chat panel 與 inline edit 快捷鍵。在 VS Code 內按 Cmd+Shift+X 開啟 extensions panel、搜尋 &lt;code>Continue&lt;/code>。第一個結果作者是 &lt;code>Continue Dev, Inc.&lt;/code>（藍色 verified 標記）、點 Install。&lt;/p>
&lt;p>裝完後左側 sidebar 多一個 Continue icon（一個小方塊）。第一次點開會跳出 onboarding、可以略過。&lt;/p>
&lt;p>擴充套件本身是 open source、Continue Dev 帳號（公司提供的雲端服務 tier、跟 VS Code 的 Microsoft 帳號是兩件事）可選。「本地 LLM」場景使用 open source 部分就足夠、不必登入。&lt;/p>
&lt;h2 id="找到-configjson">找到 config.json&lt;/h2>
&lt;p>Continue 的設定檔在 &lt;code>~/.continue/config.json&lt;/code>（macOS 是 &lt;code>/Users/&amp;lt;你的帳號&amp;gt;/.continue/config.json&lt;/code>）。第一次開 Continue 後檔案會自動產生。&lt;/p>
&lt;p>開檔案：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">code ~/.continue/config.json&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或在 VS Code Continue panel 點右上角齒輪 icon，會直接開 config.json。&lt;/p>
&lt;p>預設內容包含一些雲端範例 model（OpenAI、Anthropic、Mistral），我們要加自己的本地 model。&lt;/p>
&lt;h2 id="設定本地-ollama-模型">設定本地 Ollama 模型&lt;/h2>
&lt;p>把 &lt;code>models&lt;/code> 陣列改成這樣：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;models&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Local: Gemma 4 31B MTP&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;provider&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;ollama&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;model&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;gemma4:31b-coding-mtp-bf16&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;apiBase&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://localhost:11434&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;tabAutocompleteModel&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Local autocomplete&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">12&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;provider&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;ollama&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">13&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;model&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;gemma4:e4b&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">14&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;apiBase&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://localhost:11434&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">15&lt;/span>&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">16&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;embeddingsProvider&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">17&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;provider&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;ollama&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">18&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;model&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;nomic-embed-text&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">19&lt;/span>&lt;span class="cl"> &lt;span class="nt">&amp;#34;apiBase&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://localhost:11434&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">20&lt;/span>&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">21&lt;/span>&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>每個欄位的意義：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>欄位&lt;/th>
 &lt;th>意義&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>models&lt;/code>&lt;/td>
 &lt;td>可在 chat panel 下拉選擇的對話模型清單&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>tabAutocompleteModel&lt;/code>&lt;/td>
 &lt;td>在編輯器裡邊打邊補完的模型（按 Tab 接受）、建議用小模型加快回應&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>embeddingsProvider&lt;/code>&lt;/td>
 &lt;td>把 codebase 索引成向量、用於語意搜尋的 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/embedding-model/" data-link-title="Embedding Model" data-link-desc="把文字轉成向量的模型：用於 codebase 索引與語意搜尋">embedding 模型&lt;/a>。要先 &lt;code>ollama pull nomic-embed-text&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Embedding model 的角色跟 chat / autocomplete model 不同：chat model 負責「跟你對話」、embedding model 負責「把文字壓成向量、用來做語意相似比對」、是 &lt;code>@codebase&lt;/code> 功能的後端引擎。一般 chat model 沒法當 embedding model、要分開設定。&lt;/p></description><content:encoded><![CDATA[<p>把本地 LLM 接到 VS Code 是「本地 LLM 寫 code」工作流的真正起點。前面章節安裝的 Ollama 是<a href="/blog/llm/00-foundations/three-layer-architecture/" data-link-title="0.2 介面 / 伺服器 / 模型三層架構" data-link-desc="把任何本地 LLM 工具放回正確的層級，用三層心智模型看懂工具關係">伺服器層</a>，本章要接的 Continue.dev 是<strong>介面層</strong>：使用者實際在編輯器裡按快捷鍵、打字、看 inline diff 的工具。</p>
<p>Continue.dev 是 2026 年 5 月時與本地 LLM 整合最成熟的 VS Code 擴充套件。對應到雲端世界、它的定位類似 Cursor、差別是 Continue.dev 預設綁本地、可以同時連雲端；Cursor 預設綁雲端、本地是次要 surface、設定深度較高。</p>
<p>本章假設你已經裝好 Ollama 並至少跑過一次 <code>ollama run</code>。沒裝過請先回 <a href="/blog/llm/01-local-llm-services/ollama/" data-link-title="1.0 Ollama：主流推論伺服器" data-link-desc="一行 brew 裝完、ollama run 一鍵跑 Gemma 4 MTP、OpenAI 相容 API on localhost:11434">1.0 Ollama</a>。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本章後，你應該能：</p>
<ol>
<li>安裝 Continue.dev 擴充套件。</li>
<li>在 <code>~/.continue/config.json</code> 設定本地 Ollama 模型。</li>
<li>用 Cmd+L 開對話、Cmd+I 做行內編輯。</li>
<li>同時設定本地與雲端模型，按任務切換。</li>
<li>排除 Continue 連不上 Ollama 的常見問題。</li>
</ol>
<h2 id="安裝擴充套件">安裝擴充套件</h2>
<p>Continue 擴充套件是 VS Code 內接到本地 LLM 的介面層入口、裝完才有 chat panel 與 inline edit 快捷鍵。在 VS Code 內按 Cmd+Shift+X 開啟 extensions panel、搜尋 <code>Continue</code>。第一個結果作者是 <code>Continue Dev, Inc.</code>（藍色 verified 標記）、點 Install。</p>
<p>裝完後左側 sidebar 多一個 Continue icon（一個小方塊）。第一次點開會跳出 onboarding、可以略過。</p>
<p>擴充套件本身是 open source、Continue Dev 帳號（公司提供的雲端服務 tier、跟 VS Code 的 Microsoft 帳號是兩件事）可選。「本地 LLM」場景使用 open source 部分就足夠、不必登入。</p>
<h2 id="找到-configjson">找到 config.json</h2>
<p>Continue 的設定檔在 <code>~/.continue/config.json</code>（macOS 是 <code>/Users/&lt;你的帳號&gt;/.continue/config.json</code>）。第一次開 Continue 後檔案會自動產生。</p>
<p>開檔案：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">code ~/.continue/config.json</span></span></code></pre></div><p>或在 VS Code Continue panel 點右上角齒輪 icon，會直接開 config.json。</p>
<p>預設內容包含一些雲端範例 model（OpenAI、Anthropic、Mistral），我們要加自己的本地 model。</p>
<h2 id="設定本地-ollama-模型">設定本地 Ollama 模型</h2>
<p>把 <code>models</code> 陣列改成這樣：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  <span class="nt">&#34;models&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">      <span class="nt">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Local: Gemma 4 31B MTP&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">      <span class="nt">&#34;provider&#34;</span><span class="p">:</span> <span class="s2">&#34;ollama&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">      <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;gemma4:31b-coding-mtp-bf16&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">      <span class="nt">&#34;apiBase&#34;</span><span class="p">:</span> <span class="s2">&#34;http://localhost:11434&#34;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="nt">&#34;tabAutocompleteModel&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="nt">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Local autocomplete&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    <span class="nt">&#34;provider&#34;</span><span class="p">:</span> <span class="s2">&#34;ollama&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;gemma4:e4b&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="nt">&#34;apiBase&#34;</span><span class="p">:</span> <span class="s2">&#34;http://localhost:11434&#34;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="nt">&#34;embeddingsProvider&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">    <span class="nt">&#34;provider&#34;</span><span class="p">:</span> <span class="s2">&#34;ollama&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;nomic-embed-text&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="nt">&#34;apiBase&#34;</span><span class="p">:</span> <span class="s2">&#34;http://localhost:11434&#34;</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>每個欄位的意義：</p>
<table>
  <thead>
      <tr>
          <th>欄位</th>
          <th>意義</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>models</code></td>
          <td>可在 chat panel 下拉選擇的對話模型清單</td>
      </tr>
      <tr>
          <td><code>tabAutocompleteModel</code></td>
          <td>在編輯器裡邊打邊補完的模型（按 Tab 接受）、建議用小模型加快回應</td>
      </tr>
      <tr>
          <td><code>embeddingsProvider</code></td>
          <td>把 codebase 索引成向量、用於語意搜尋的 <a href="/blog/llm/knowledge-cards/embedding-model/" data-link-title="Embedding Model" data-link-desc="把文字轉成向量的模型：用於 codebase 索引與語意搜尋">embedding 模型</a>。要先 <code>ollama pull nomic-embed-text</code></td>
      </tr>
  </tbody>
</table>
<p>Embedding model 的角色跟 chat / autocomplete model 不同：chat model 負責「跟你對話」、embedding model 負責「把文字壓成向量、用來做語意相似比對」、是 <code>@codebase</code> 功能的後端引擎。一般 chat model 沒法當 embedding model、要分開設定。</p>
<p><code>provider: ollama</code> 是 Continue 內建的 Ollama 整合、比 <code>provider: openai</code> 多支援 model auto-pull 等功能。<code>apiBase</code> 不需要加 <code>/v1</code>、Continue 內部會處理。</p>
<p>存檔後 Continue 會自動 reload。</p>
<h2 id="用-cmdl-開對話">用 Cmd+L 開對話</h2>
<p>Cmd+L 是把當前 buffer 餵進 chat 的快捷路徑、context 由選取範圍決定。回到 VS Code、按 <code>Cmd+L</code>（macOS）開啟 Continue chat panel。預設快捷鍵：</p>
<table>
  <thead>
      <tr>
          <th>快捷鍵</th>
          <th>動作</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>Cmd+L</code></td>
          <td>開啟 Continue panel、把當前選取的程式碼當 context</td>
      </tr>
      <tr>
          <td><code>Cmd+Shift+L</code></td>
          <td>把當前選取加進現有對話 context</td>
      </tr>
      <tr>
          <td><code>Cmd+I</code></td>
          <td>在編輯器裡開 inline edit prompt</td>
      </tr>
      <tr>
          <td><code>Cmd+;</code></td>
          <td>接受 inline edit 結果</td>
      </tr>
      <tr>
          <td><code>Cmd+'</code></td>
          <td>拒絕 inline edit 結果</td>
      </tr>
  </tbody>
</table>
<p>按 <code>Cmd+L</code> 後 panel 開啟，下方輸入區可以打 prompt。如果先選了一段 code，那段 code 會自動加進 context，你可以直接問「解釋這段 code」「改成 async」「加 type annotation」。</p>
<p>第一次提問時 Ollama 會載入 model（30 ~ 60 秒）、看到 Continue panel 有 spinner 是預期的。之後同一個 model 會留在記憶體（<a href="/blog/llm/01-local-llm-services/ollama/#%e6%a8%a1%e5%9e%8b%e5%b8%b8%e9%a7%90keep_alive" data-link-title="1.0 Ollama：主流推論伺服器" data-link-desc="一行 brew 裝完、ollama run 一鍵跑 Gemma 4 MTP、OpenAI 相容 API on localhost:11434">ollama keep_alive</a>）、對話速度會快得多。</p>
<h2 id="用-cmdi-做-inline-edit">用 Cmd+I 做 inline edit</h2>
<p>把游標放在你要修改的 code 上（或選取一段），按 <code>Cmd+I</code> 開 inline prompt。打字描述要做什麼，例如：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">加 type annotation</span></span></code></pre></div><p>或：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">把這個 callback 改成 async/await</span></span></code></pre></div><p>Enter 後 Continue 會把選取的 code + 你的指令送給本地模型，回傳的 diff 直接 inline 顯示。按 <code>Cmd+;</code> 接受、<code>Cmd+'</code> 拒絕。</p>
<p>陷阱是「選取範圍太大」。本地模型的 context window 雖然多半 8K 以上、但塞太多 code 會讓 <a href="/blog/llm/knowledge-cards/ttft/" data-link-title="TTFT" data-link-desc="Time To First Token：送出 prompt 到第一個 token 出現的等待時間">TTFT</a> 暴增。把選取範圍縮在一個 function 或一個 block 內、體感最好。</p>
<h2 id="同時設定本地與雲端模型按任務切換">同時設定本地與雲端模型（按任務切換）</h2>
<p>寫 code 場景的常見配置是「本地當預設、雲端當大難題備援」。修改 <code>config.json</code>：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  <span class="nt">&#34;models&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">      <span class="nt">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Local: Gemma 4 31B MTP&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">      <span class="nt">&#34;provider&#34;</span><span class="p">:</span> <span class="s2">&#34;ollama&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">      <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;gemma4:31b-coding-mtp-bf16&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">      <span class="nt">&#34;apiBase&#34;</span><span class="p">:</span> <span class="s2">&#34;http://localhost:11434&#34;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">      <span class="nt">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Cloud: Claude Sonnet 4.6&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">      <span class="nt">&#34;provider&#34;</span><span class="p">:</span> <span class="s2">&#34;anthropic&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">      <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;claude-sonnet-4-6&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">      <span class="nt">&#34;apiKey&#34;</span><span class="p">:</span> <span class="s2">&#34;sk-ant-xxx&#34;</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">      <span class="nt">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Cloud: GPT-5&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">      <span class="nt">&#34;provider&#34;</span><span class="p">:</span> <span class="s2">&#34;openai&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">      <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;gpt-5&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">      <span class="nt">&#34;apiKey&#34;</span><span class="p">:</span> <span class="s2">&#34;sk-xxx&#34;</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>Continue chat panel 下方有 model selector，可以下拉切換。建議的切換時機：</p>
<table>
  <thead>
      <tr>
          <th>任務類型</th>
          <th>建議模型</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>簡單 function 補完、加 type、寫 docstring</td>
          <td>本地 Gemma 4 31B</td>
      </tr>
      <tr>
          <td>解釋程式碼、寫單元測試</td>
          <td>本地 Gemma 4 31B</td>
      </tr>
      <tr>
          <td>跨檔案重構、規劃新模組</td>
          <td>雲端 Claude Sonnet / GPT-5</td>
      </tr>
      <tr>
          <td>深度 debug、解奇怪 bug</td>
          <td>雲端 Claude Sonnet / GPT-5</td>
      </tr>
      <tr>
          <td>處理含 NDA 的客戶 code</td>
          <td>本地（合規要求 prompt 留在本機時、走本地路線）</td>
      </tr>
      <tr>
          <td>寫 commit message</td>
          <td>本地（隱私 + 任務簡單）</td>
      </tr>
  </tbody>
</table>
<p>詳細的判斷邏輯見 <a href="/blog/llm/01-local-llm-services/expectation-management/" data-link-title="1.5 期望管理：本地 LLM 的擅長領域與分工" data-link-desc="本地 LLM 是免費的初階 pair programmer：辨識它的擅長領域、跟雲端旗艦做結構性分工">1.5 期望管理</a>。<strong>安全 / 資料邊界面向</strong>：同個 IDE 同時接本地跟雲端 provider、prompt routing 設錯就會把該走本地的 NDA / 客戶 code 送到雲端、見 <a href="/blog/llm/06-security/cross-cloud-local-data-boundary/" data-link-title="6.4 跨雲端 / 本地的資料邊界" data-link-desc="個人 dev 場景下混用雲端 LLM 跟本地 LLM 時的 prompt 洩漏點：Continue.dev 多 provider 設定、隱私資料流、按敏感度分流的判讀">6.4 跨雲端 / 本地的資料邊界</a>；codebase / 外部文件 / 剪貼簿成為 prompt injection 攻擊面的判讀見 <a href="/blog/llm/06-security/prompt-injection-in-ide/" data-link-title="6.3 IDE 場景的 prompt injection" data-link-desc="個人 dev 場景下 IDE 寫 code 工作流的 prompt injection：codebase 內容、外部文件、剪貼簿作為攻擊面、跟雲端 LLM 場景的差異">6.3 IDE 場景的 prompt injection</a>。</p>
<h2 id="codebase-索引與--命令">Codebase 索引與 @ 命令</h2>
<p><code>@</code> 命令是把外部 context（整個專案 / 終端機輸出 / docs）注入到 chat prompt 的擴充機制、讓 LLM 在回應時能參考超出選取範圍的資料。Continue 支援把整個 codebase 索引成向量資料庫、讓你用 <code>@codebase</code> 參考整個專案。要啟用：</p>
<ol>
<li><code>~/.continue/config.json</code> 設定 <code>embeddingsProvider</code>（前面已給範例）。</li>
<li>開新 chat 後在 prompt 內打 <code>@codebase</code>，Continue 會自動把相關片段加進 context。</li>
<li>第一次索引要 5 ~ 30 分鐘（看 repo 大小），之後增量更新。</li>
</ol>
<p><code>@codebase</code> 對中型專案（&lt; 1000 檔案）效果不錯、本地模型有機會找到合適片段；對大型專案（10000+ 檔案）效果受限於 embedding model 品質。大型專案的退路：拆 workspace 縮小索引範圍、改用 <code>@file</code> 明確指定相關檔案、或換較強的 embedding model（例如雲端 OpenAI <code>text-embedding-3-large</code>）。</p>
<p>其他 <code>@</code> 命令：</p>
<table>
  <thead>
      <tr>
          <th>命令</th>
          <th>用途</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>@codebase</code></td>
          <td>整個專案的語意搜尋</td>
      </tr>
      <tr>
          <td><code>@docs</code></td>
          <td>加進 documentation context（要先設定）</td>
      </tr>
      <tr>
          <td><code>@terminal</code></td>
          <td>把終端機最後一段輸出加進 context</td>
      </tr>
      <tr>
          <td><code>@file</code></td>
          <td>指定特定檔案</td>
      </tr>
      <tr>
          <td><code>@tree</code></td>
          <td>加進專案結構</td>
      </tr>
      <tr>
          <td><code>@open</code></td>
          <td>加進目前開啟的所有 tab</td>
      </tr>
  </tbody>
</table>
<h2 id="處理-continue-連不上-ollama">處理 Continue 連不上 Ollama</h2>
<p>常見錯誤訊息與處理：</p>
<table>
  <thead>
      <tr>
          <th>錯誤訊息</th>
          <th>處理</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>Failed to fetch http://localhost:11434/...</code></td>
          <td>Ollama server 沒在跑。<code>brew services start ollama</code></td>
      </tr>
      <tr>
          <td><code>model 'xxx' not found</code></td>
          <td>還沒 pull。<code>ollama pull xxx</code></td>
      </tr>
      <tr>
          <td><code>address already in use</code>（Ollama 那邊）</td>
          <td>已有 instance 在跑，<code>pkill -f &quot;ollama serve&quot;</code> 重啟</td>
      </tr>
      <tr>
          <td>Continue 無回應、長時間 spinner</td>
          <td>Model 正在載入。第一次 30 ~ 60 秒正常</td>
      </tr>
      <tr>
          <td>對話內容亂碼 / 一直重複</td>
          <td>模型品質不夠或 temperature 太高，換較大模型或調 temp</td>
      </tr>
      <tr>
          <td>Tab autocomplete 完全沒觸發</td>
          <td>確認 <code>tabAutocompleteModel</code> 設定、模型已 pull</td>
      </tr>
  </tbody>
</table>
<p>排錯時先用 curl 驗證 Ollama 本身正常：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">curl http://localhost:11434/api/tags</span></span></code></pre></div><p>如果這個都回不出來、問題在 Ollama；如果這個正常但 Continue 連不上、問題在 Continue 設定。</p>
<p>排錯時的機制判讀：</p>
<ul>
<li><strong><code>Failed to fetch</code></strong>：通常是 Ollama 沒跑、或 listen address 配置不一致（Continue config 跟 <code>OLLAMA_HOST</code> 對不上）。</li>
<li><strong><code>address already in use</code></strong>：另一個 Ollama instance 佔了 port、或 LM Studio 啟動時也搶 11434。先用 <code>lsof -i :11434</code> 找佔用方。</li>
<li><strong>長時間 spinner</strong>：第一次載入大模型（30 ~ 60 秒）正常；如果每次新 chat 都這樣、可能 keep_alive 太短、模型每次被 unload。</li>
<li><strong>對話內容亂碼 / 一直重複</strong>：小模型 capacity 不足以維持長 context 連貫性、或 <code>repeat_penalty</code> 預設值對該模型不合適。先換較大模型驗證是不是 model 本身的問題、再回頭調 temperature / repeat_penalty。</li>
<li><strong>Tab autocomplete 沒觸發</strong>：autocomplete 模型沒 pull 成功、或 model 名稱拼錯。<code>ollama list</code> 確認 model 真的在。</li>
</ul>
<h2 id="何時-continuedev-不適合">何時 Continue.dev 不適合</h2>
<p>Continue.dev 是 VS Code 環境內最成熟的本地 LLM 介面層、但在以下情境會撞到設計邊界、需要找替代路徑：</p>
<table>
  <thead>
      <tr>
          <th>情境</th>
          <th>替代路徑</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>非 VS Code-family 編輯器（Vim / Emacs / Sublime）</td>
          <td>各 editor 有自己的 LLM plugin（如 Vim 的 <code>llm.nvim</code>、Emacs 的 <code>gptel</code>）、Continue 本身僅支援 VS Code / JetBrains</td>
      </tr>
      <tr>
          <td>Jupyter Notebook 環境</td>
          <td>Notebook 的 cell 結構跟 .py 檔不同、Continue 對 .ipynb 支援有限、改用 Jupyter-AI 或自己用 LangChain</td>
      </tr>
      <tr>
          <td>大型 monorepo（10000+ 檔案）</td>
          <td><code>@codebase</code> 索引效果受 embedding 品質限制、改拆 workspace 或用 <code>@file</code> 明確指定</td>
      </tr>
      <tr>
          <td>CLI-first / git-aware 工作流</td>
          <td><a href="/blog/llm/01-local-llm-services/extension-paths/" data-link-title="1.6 延伸方向：Web UI、coding agent、產圖" data-link-desc="日常路徑跑穩後可以玩的延伸：Open WebUI、aider、ComfyUI；先把基底跑穩再進階">aider</a> 直接在 CLI 操作 git + LLM、適合「沒打開 IDE 也想用 LLM」</td>
      </tr>
      <tr>
          <td>想跑 multi-step agent（自動探索 + 多輪修改）</td>
          <td>Cline、aider 等較完整 agent 工具的設計目標更貼近、Continue 偏單輪 chat + inline edit</td>
      </tr>
  </tbody>
</table>
<p>Continue 的甜蜜點是「VS Code 內、單檔到中型專案、人在駕駛位的 chat + inline edit」。離這個甜蜜點越遠、收益越低、改用 Cline / aider / Cursor 等工具更直接。</p>
<h2 id="continuedev-跟-cursor-的取捨">Continue.dev 跟 Cursor 的取捨</h2>
<p>如果你正考慮 Continue.dev vs Cursor，下表是寫 code 場景的取捨：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>Continue.dev</th>
          <th>Cursor</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>本地 LLM 支援</td>
          <td>First-class，多家 provider 完整支援</td>
          <td>有，但設定較深、不是主要使用情境</td>
      </tr>
      <tr>
          <td>雲端 LLM 支援</td>
          <td>多家 provider（OpenAI、Anthropic、本地）</td>
          <td>主要綁 Cursor 自己的服務、能接 OpenAI / Anthropic</td>
      </tr>
      <tr>
          <td>訂閱費</td>
          <td>免費（本地 LLM 完全免費；接雲端要自己付 API）</td>
          <td>月費 USD 20（含若干雲端用量）</td>
      </tr>
      <tr>
          <td>Inline edit 體驗</td>
          <td>良好（Cmd+I）</td>
          <td>優秀（Cursor 的招牌）</td>
      </tr>
      <tr>
          <td>Agent 模式</td>
          <td>較陽春，主打 chat + edit</td>
          <td>較完整，有 multi-step agent</td>
      </tr>
      <tr>
          <td>Codebase 索引</td>
          <td>自家 embedding（本地或雲端）</td>
          <td>雲端索引（要 opt-out）</td>
      </tr>
      <tr>
          <td>隱私</td>
          <td>完全可控（純本地）</td>
          <td>預設送 Cursor 雲端 telemetry</td>
      </tr>
  </tbody>
</table>
<p>對「本地 LLM 為主」的使用者，Continue.dev 是更直接的選擇。Cursor 是「雲端 LLM 為主、偶爾本地」的選擇。</p>
<h2 id="下一章">下一章</h2>
<p>下一章：<a href="/blog/llm/01-local-llm-services/model-selection-priority/" data-link-title="1.4 寫 code 場景的模型選型優先順序" data-link-desc="Gemma 4 31B MTP → Qwen3-Coder 30B → Qwen3 14B → gpt-oss 20B 的取捨與適用情境">1.4 寫 code 場景的模型選型優先順序</a>，回答「Ollama 跑起來該裝哪個 model」。</p>
]]></content:encoded></item></channel></rss>