開發了 Stable Diffusion 桌面應用程式「Sodalite」
使用 Stable Diffusion 生成圖片的方法有很多種,但 Web UI 類型的工具往往需要建置 Python 環境、管理相依套件,過程相當繁瑣。
想要更簡單、只要下載安裝程式就能使用的桌面應用程式,於是從零開始開發了 Sodalite。
使用 Stable Diffusion 生成圖片的方法有很多種,但 Web UI 類型的工具往往需要建置 Python 環境、管理相依套件,過程相當繁瑣。
想要更簡單、只要下載安裝程式就能使用的桌面應用程式,於是從零開始開發了 Sodalite。
透過使用 Anthropic API 的 /v1/models 端點,可以從程式中獲取可用的 Claude 模型列表及其規格。
透過將 mitmproxy 設定為中間人代理,可以即時查看 AI 程式碼工具在背後進行的 API 通訊內容。
許多 AI 程式碼工具是以 Node.js 開發的應用程式,透過 HTTPS 與外部 API 進行通訊。將 mitmproxy 作為中間人代理插入,並讓 Node.js 信任 mitmproxy 的 CA 憑證,即可解密加密的通訊內容並即時查看。
使用 uv 安裝 mitmproxy 最為方便。
uv tool install mitmproxy
在啟動工具之前,先設定以下環境變數。
$env:HTTPS_PROXY = "http://127.0.0.1:8080"
$env:HTTP_PROXY = "http://127.0.0.1:8080"
$env:NODE_EXTRA_CA_CERTS = "$env:USERPROFILE\.mitmproxy\mitmproxy-ca-cert.pem"
只設定 HTTPS_PROXY 和 HTTP_PROXY 會導致 Node.js 的 TLS 驗證失敗而無法通訊。mitmproxy 在中繼 HTTPS 時使用自簽憑證,而 Node.js 預設會拒絕該憑證。
在 NODE_EXTRA_CA_CERTS 中指定 mitmproxy CA 憑證的路徑後,Node.js 便會信任該憑證,通訊也就能順利建立。
mitmproxy 在首次啟動時會自動產生 CA 憑證,並儲存至 ~\.mitmproxy\。若尚未產生,啟動一次即可。
mitmweb
瀏覽器會自動開啟,在 http://127.0.0.1:8081 顯示代理管理介面。
在另一個已設定環境變數的終端機中啟動工具。
開始操作工具後,mitmweb 畫面上就會出現請求流量。
工具會向以下端點發送請求。
POST https://api.example.com/v1/messages
x-service-version: ...
content-type: application/json
x-api-key: sk-...
{
"model": "model-name",
"max_tokens": 16000,
"stream": true,
"system": [
{
"type": "text",
"text": "..."
}
],
"messages": [
{
"role": "user",
"content": "..."
}
],
"tools": [
{
"name": "Read",
"description": "...",
"input_schema": {}
}
]
}
設定 stream: true 後,會以 Server-Sent Events (SSE) 格式接收串流回應。
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Hello"}}
...
data: {"type":"message_stop"}
| 項目 | 內容 |
|---|---|
| API 端點 | api.example.com/v1/messages |
| 認證方式 | API 金鑰 (x-api-key 標頭) |
| 串流方式 | SSE 格式 |
| 工具定義 | 每次請求都包含 |
| 系統提示詞 | 數千至數萬 token 規模 |
系統提示詞中包含 AI 程式碼工具的運作原則、可用工具的說明及注意事項等內容。
NODE_EXTRA_CA_CERTS 讓 Node.js 信任 mitmproxy 的 CA 憑證介紹如何從 PowerShell 經由 Google Cloud 的 Vertex AI 呼叫 Gemini 模型。涵蓋 OpenAI 相容端點與原生 Gemini 端點兩種方式。
不需要 API 金鑰,可直接使用現有的 Google Cloud 認證資訊。
$accessToken = (gcloud auth print-access-token)
$apiKey = $env:VERTEX_API_KEY
https://{region}-aiplatform.googleapis.com/v1beta1/projects/{projectId}/locations/{region}/endpoints/openapi/chat/completions
請求與回應格式與 OpenAI API 相同。模型名稱需加上 google/ 前綴(例:google/gemini-2.5-flash-lite)。
https://{region}-aiplatform.googleapis.com/v1/projects/{projectId}/locations/{region}/publishers/google/models/{model}:generateContent
若需要串流請使用 :streamGenerateContent。
$projectId = "your-project-id"
$region = "us-central1"
$model = "google/gemini-2.5-flash-lite"
$accessToken = (gcloud auth print-access-token)
$body = @{
model = $model
messages = @(
@{
role = "user"
content = "東京的人口是多少?"
}
)
} | ConvertTo-Json -Depth 10
$uri = "https://$region-aiplatform.googleapis.com/v1beta1/projects/$projectId/locations/$region/endpoints/openapi/chat/completions"
$response = Invoke-RestMethod `
-Uri $uri `
-Method Post `
-ContentType "application/json" `
-Headers @{ Authorization = "Bearer $accessToken" } `
-Body $body
$response.choices[0].message.content
$projectId = "your-project-id"
$region = "us-central1"
$model = "gemini-2.5-flash-lite"
$apiKey = $env:VERTEX_API_KEY
$body = @{
contents = @(
@{
role = "user"
parts = @(
@{ text = "東京的人口是多少?" }
)
}
)
} | ConvertTo-Json -Depth 10
$uri = "https://$region-aiplatform.googleapis.com/v1/projects/$projectId/locations/$region/publishers/google/models/${model}:generateContent?key=$apiKey"
$response = Invoke-RestMethod `
-Uri $uri `
-Method Post `
-ContentType "application/json" `
-Body $body
$response.candidates[0].content.parts[0].text
$response.choices[0].message.content # 產生的文字
$response.usage.total_tokens # 總 Token 數
$response.model # 使用的模型
$response.candidates[0].content.parts[0].text # 產生的文字
$response.usageMetadata.totalTokenCount # 總 Token 數
$response.modelVersion # 使用的模型版本
串流(streamGenerateContent)會回傳多個 chunk 的陣列,需將文字串接取出。
$fullText = ($response | ForEach-Object {
$_.candidates[0].content.parts[0].text
}) -join ""
$body = @{
model = $model
messages = @(
@{
role = "system"
content = "您是用日語回答的 AI 助理,請簡潔回覆。"
}
@{
role = "user"
content = "光速是多少?"
}
)
} | ConvertTo-Json -Depth 10
$body = @{
system_instruction = @{
parts = @(
@{ text = "您是用日語回答的 AI 助理,請簡潔回覆。" }
)
}
contents = @(
@{
role = "user"
parts = @(@{ text = "光速是多少?" })
}
)
} | ConvertTo-Json -Depth 10
將歷史對話依序放入陣列即可實現多回合對話。
$body = @{
model = $model
messages = @(
@{ role = "user"; content = "你比較喜歡貓還是狗?" }
@{ role = "assistant"; content = "我喜歡貓。" }
@{ role = "user"; content = "為什麼?" }
)
} | ConvertTo-Json -Depth 10
助理的角色需指定為 "model"。
$body = @{
contents = @(
@{
role = "user"
parts = @(@{ text = "你比較喜歡貓還是狗?" })
}
@{
role = "model"
parts = @(@{ text = "我喜歡貓。" })
}
@{
role = "user"
parts = @(@{ text = "為什麼?" })
}
)
} | ConvertTo-Json -Depth 10
| 模型 | OpenAI 相容名稱 | 特性 |
|---|---|---|
gemini-2.5-flash-lite | google/gemini-2.5-flash-lite | 輕量、快速、低成本 |
gemini-2.5-flash | google/gemini-2.5-flash | 平衡型 |
gemini-2.5-pro | google/gemini-2.5-pro | 高精度,適合複雜任務 |
| 情況 | 推薦方式 |
|---|---|
| 已有 GCP 認證的環境(開發、CI 等) | OpenAI 相容 + gcloud auth |
| 只能使用 API 金鑰 | 原生 Gemini |
| 從 OpenAI 移轉中 | OpenAI 相容(最小化程式碼變更) |
| 需要串流 | 原生 Gemini |
$env:VERTEX_API_KEY)讀取。Claude 若要透過 API 使用,除了直接使用 Anthropic API 外,也能經由 AWS Bedrock、Google Vertex AI、Microsoft Azure (Azure AI Foundry) 使用。基本價格各路徑幾乎相同,但在批次處理與與雲端生態系統整合面會有差異。
單位:USD / 1M 代幣 (MTok)。資料截至 2026 年 3 月。
| 模型 | 項目 | Anthropic API | Bedrock | Vertex AI | Azure |
|---|---|---|---|---|---|
| Claude Opus 4.6 | 輸入 | $5.00 | $5.00 | $5.00 | $5.00 |
| 輸出 | $25.00 | $25.00 | $25.00 | $25.00 | |
| Claude Sonnet 4.6 | 輸入 | $3.00 | $3.00 | $3.00 | $3.00 |
| 輸出 | $15.00 | $15.00 | $15.00 | $15.00 | |
| Claude Haiku 4.5 | 輸入 | $1.00 | $1.00 | $1.00 | $1.00 |
| 輸出 | $5.00 | $5.00 | $5.00 | $5.00 | |
| Claude Sonnet 4.5 | 輸入 | $3.00 | $3.00 | $3.00 | $3.00 |
| 輸出 | $15.00 | $15.00 | $15.00 | $15.00 |
基本價格在各路徑相同。
不過在 Vertex AI 若不是使用全球端點而指定區域端點(regional endpoint),標準價格會額外加收 10%。Bedrock 有 Long Context 變體(另有 SKU),但價格相同。Anthropic API 則已將 Long Context 整合在一般模型中。
Prompt 快取(Prompt Caching)的費用在各路徑也相同。
| 模型 | 快取類型 | Anthropic API | Bedrock | Vertex AI | Azure |
|---|---|---|---|---|---|
| Claude Opus 4.6 | 5 分快取寫入 | $6.25 | $6.25 | $6.25 | $6.25 |
| 1 小時快取寫入 | $10.00 | $10.00 | $10.00 | $10.00 | |
| 快取讀取 | $0.50 | $0.50 | $0.50 | $0.50 | |
| Claude Sonnet 4.6 | 5 分快取寫入 | $3.75 | $3.75 | $3.75 | $3.75 |
| 1 小時快取寫入 | $6.00 | $6.00 | $6.00 | $6.00 | |
| 快取讀取 | $0.30 | $0.30 | $0.30 | $0.30 | |
| Claude Haiku 4.5 | 5 分快取寫入 | $1.25 | $1.25 | $1.25 | $1.25 |
| 1 小時快取寫入 | $2.00 | $2.00 | $2.00 | $2.00 | |
| 快取讀取 | $0.10 | $0.10 | $0.10 | $0.10 |
快取寫入依 TTL 分為 5 分(短期)和 1 小時(長期)兩種。長期快取的寫入成本較高,但如果系統提示(system prompt)很長且會被重複參考,透過節省讀取費用通常是划得來的。
Bedrock、Vertex AI、Anthropic API 三者的非同步批次 API 可享按需價格的 50% 折扣。Azure 目前未明示。
| 模型 | 批次輸入 | 批次輸出 |
|---|---|---|
| Claude Opus 4.6 | $2.50 | $12.50 |
| Claude Sonnet 4.6 | $1.50 | $7.50 |
| Claude Haiku 4.5 | $0.50 | $2.50 |
| Claude Sonnet 4.5 | $1.50 | $7.50 |
若要大量處理資料(例如日誌分析、向量嵌入生成等)並頻繁使用批次處理,無論走哪個路徑都能把成本砍半。
| 比較重點 | Anthropic API | Bedrock | Vertex AI | Azure |
|---|---|---|---|---|
| 基本價格 | 相同 | 相同 | 相同 | 相同 |
| 區域加價 | — | — | +10%(區域端點) | — |
| 批次處理(50% OFF) | ○ | ○ | ○ | 未明示 |
| 東京區域 | — | ○ | ○ | — |
| IAM / 審計日誌整合 | — | AWS | Google Cloud | Azure |
| VPC / PrivateLink | — | ○ | ○ | ○ |
| 計費整合 | Anthropic 直接 | AWS | Google Cloud | Azure |
| 新功能推出速度 | 最快 | 會延遲 | 會延遲 | 會延遲 |
新功能(例如 Extended Thinking)通常會先在 Anthropic API 上推出,向 Vertex AI、Bedrock、Azure 的推展有時會晚幾週。
將「技能」加入 AI 代理人,就像在應用程式安裝功能擴充一樣,可以增加它能做的事情。本文解說 Agent Skills 的運作方式,以及代理人在內部如何處理任務。
首先作為前提,AI 代理人是指「接受指示並能自主執行任務的 AI 程式」。
與像 ChatGPT 那種「問了就回答」的 AI 不同,代理人可以做以下事情:
Agent Skills 是一種「用來為代理人新增能力或專業知識的機制」。
比喻成人類的話,就像把「新的工作手冊」交給對方一樣。閱讀了手冊(技能)的代理人就能理解該任務應如何進行,並據此行動。
無技能: 「寫一篇部落格」→ 代理人隨便寫
有技能: 「寫一篇部落格」→ 按照手冊步驟,以一定品質寫出文章
技能主要以 Markdown 檔案(SKILL.md)描述,通常包含以下要素:
AI 代理人能力很強,但不會預先具備你專案特有的知識。
例如:
這類資訊如果不以技能方式提供,代理人無從得知。有了技能,代理人就能在知道「正確做法」的前提下執行任務。
接下來看看代理人在內部如何運作。
重點如下:
代理人一開始會載入技能。技能內容成為輸入給 LLM 的一部分(提示)。LLM 讀到後會理解「這個任務的正確做法」。
LLM 根據收到的步驟,將任務拆成小步驟。例如「先閱讀既有文章 3 篇」「接著決定檔名」「寫 front matter」等。
在每個步驟中,視需要呼叫工具:讀檔、搜尋網路、執行程式碼等,依照技能定義的流程執行。
工具執行的結果會再次傳回給 LLM。LLM 根據結果判斷「下一步要做什麼」,並持續迴圈直到任務完成。
技能可以透過斜線指令(/命令名)來呼叫。
呼叫指令時,對應的 Markdown 檔內容會被展開為提示,代理人就會開始依該步驟執行。
Agent Skills 的格式是 由 Anthropic 開發並開放的,目前支援許多工具。
| 工具 | 是否支援 |
|---|---|
| Claude Code | ✅ |
| GitHub Copilot | ✅ |
| Cursor | ✅ |
| Gemini CLI | ✅ |
| OpenAI Codex | ✅ |
| VS Code | ✅ |
同一套技能能在多個工具間重複使用,這是很大的優勢。
SKILL.md)描述步驟與規則,就能建立技能善用技能可以省去「每次都要向 AI 解釋同一件事」的麻煩,讓代理人以一致的品質完成任務。
GPT-5 已經公開了,所以我用 PowerShell 試著呼叫它的 API。
$uri = "https://api.openai.com/v1/chat/completions"
$headers = @{
"Authorization" = "Bearer $env:OPENAI_API_KEY"
"Content-Type" = "application/json"
}
$body = @{
model = "gpt-5"
messages = @(
@{
role = "user"
content = "筆記本和鉛筆合計是100元。鉛筆比筆記本便宜40元。鉛筆多少錢?"
}
)
} | ConvertTo-Json -Depth 2
$response = Invoke-RestMethod -Uri $uri -Method Post -Headers $headers -Body $body
foreach($choice in $response.choices){
$choice.message.content
}
30元
理由:
- 設筆記本為 x 元、鉛筆為 y 元,則
- x + y = 100
- y = x - 40
- 代入得 2x - 40 = 100 → x = 70 → y = 30
- 驗算: 70 + 30 = 100,且鉛筆比筆記本便宜 40 元。