上一篇介紹了 Exa Search API,讓 AI Agent 可以直接搜尋網路,不需要再透過 Playwright 開啟瀏覽器,也不用自己解析 Google 的搜尋結果
不過搜尋只解決了一半的問題
AI Agent 找到網址之後,總要能讀取網頁內容吧,不然只有 Title、URL 跟幾段 Snippet,有些問題根本回答不了...
兼任的偽善者,part-time的故事家,業餘的code generator,不服輸的夢想家,長不大的幼稚鬼,一個撿技術破爛的中年大叔
上一篇介紹了 Exa Search API,讓 AI Agent 可以直接搜尋網路,不需要再透過 Playwright 開啟瀏覽器,也不用自己解析 Google 的搜尋結果
不過搜尋只解決了一半的問題
AI Agent 找到網址之後,總要能讀取網頁內容吧,不然只有 Title、URL 跟幾段 Snippet,有些問題根本回答不了...
最近在開發 Web Agent,一直想弄個免費的 Web Search 備援
原本第一個想到 Google Search API,結果查了一下官方文件,Google 的 Custom Search JSON API 已經停止接受新用戶,既有用戶也得在 2027 年 1 月 1 日前完成遷移
以前好歹還有每天 100 次免費搜尋,現在連申請的機會都沒了 :'(
之前研究過 Exa Web Search API,直接回傳 JSON,還能取得網頁內容,確實方便,但免費額度用完還是得花錢
原本以為 DuckDuckGo 可以取代 Google,畢竟有純 HTML 搜尋頁面,用 C# HttpClient 抓下來 Parse 一下應該就搞定了
結果本機連續測試三次,全部 HTTP 403,沒想到 DuckDuckGo 防爬蟲也這麼兇...
後來把腦筋動到 Bing 頭上,測試發現一般搜尋頁面還能直接抓 HTML,不需要 Playwright,也不用啟動 Chromium
乾脆把 Bing 加進自己的 Web Agent,當作 DuckDuckGo 的 Fallback
如果你有在寫 AI Agent,你就知道搜尋(Web Search)是一件麻煩的事情
如果要用 Google,你別傻了,它們是最麻煩的,光是 API 申請、設定跟計費就夠煩了,當然你可以用 Playwright 直接開瀏覽器搜尋
但是就很消耗資源,你知道的...
我之前也試過用 C# HttpClient 直接抓 DuckDuckGo,原本以為只要解析搜尋結果的 HTML 就搞定了
結果連續三次 HTTP 403,連搜尋都還沒開始就被擋下來了 XD
其實 AI Agent 根本不需要一個完整的瀏覽器,它要的就是搜尋結果,最好直接給 JSON,包含標題、網址跟網頁內容,這樣才方便拿去餵給 LLM
最近找到一個不錯的服務 Exa,專門提供 AI Agent 使用的 Web Search API,不需要開瀏覽器,也不用自己解析 HTML,直接丟關鍵字就能取得搜尋結果
更吸引我的是 每個月免費提供 10 美元額度,而且不需要信用卡 ,所以簡單的說就是還是得花錢
上一篇測了 Cloudflare Workers AI 的 FLUX.1 Schnell
這次換另外一顆:
@cf/black-forest-labs/flux-2-klein-4b
這顆我覺得比 Schnell 更適合真的拿來做 Blog 圖片
原因很簡單,它可以直接設定圖片的寬高,也支援 seed , width , height ,所以如果我要 16:9,不用自己再裁圖
直接指定 1280 x 720 就可以
最近我一直在找可以直接用 API 產圖,而且成本不要太誇張的服務
最後又回頭看了一下 Cloudflare Workers AI
Cloudflare 其實不只有文字模型,它也有提供圖片生成模型,其中一個就是
@cf/black-forest-labs/flux-1-schnell
FLUX.1 Schnell 是 Black Forest Labs 的文字產圖模型,目前 Cloudflare 直接 Hosted,所以目前還免費,免費就是要給他用一下
對我來說比較重要的是,它可以直接透過 REST API 呼叫,所以 C# 要串其實非常簡單
最近在測 MCP,一開始看很多範例都是 Echo、GetWeather,Code 可以跑,但是我自己還是覺得有點難看出實際可以拿來幹嘛
所以這次換一個簡單一點的案例,讓你直接體驗 MCP 對於製作網站可以幹嘛
我用 .NET 10 ASP.NET Core 做一個星座頁面,同時讓 Server 支援 MCP
接著把這個 MCP Server 加到 OpenCode,我只要在 OpenCode 輸入:
今天是 2026-09-16
請幫我產生雙子座今天的星座運勢,
使用繁體中文,大約 100 字,
產生完成後更新到網站。
OpenCode 產生完內容之後,再透過 MCP Tool 更新 ASP.NET Core Server,這篇先不接 Database,也不自己串 AI API
先單純測:
OpenCode
↓
產生雙子座運勢
↓
MCP Tool
↓
ASP.NET Core
↓
更新網站
先建立一個最簡單的 ASP.NET Core Project:McpHoroscope
安裝 MCP Package:
dotnet add package ModelContextProtocol.AspNetCore
這次用 ASP.NET Core 直接提供 HTTP MCP Server,這樣可以省很多事情。
這篇只是測 MCP,所以資料先放 Memory 就好。
建立 HoroscopeService.cs
namespace McpHoroscope;
public sealed class HoroscopeService
{
private string _content =
"今日雙子座運勢尚未更新。";
private DateTimeOffset? _updatedAt;
public Horoscope Get()
{
return new Horoscope(
_content,
_updatedAt);
}
public void Update(string content)
{
_content = content;
_updatedAt = DateTimeOffset.Now;
}
}
public sealed record Horoscope(
string Content,
DateTimeOffset? UpdatedAt);
現在網站一開始就先顯示:今日雙子座運勢尚未更新。
等等 OpenCode 透過 MCP 把這個值改掉。
接著建立 HoroscopeTools.cs
using System.ComponentModel;
using ModelContextProtocol.Server;
namespace McpHoroscope;
[McpServerToolType]
public static class HoroscopeTools
{
[McpServerTool]
[Description(
"Update today's Gemini horoscope displayed on the website.")]
public static string UpdateHoroscope(
[Description(
"Traditional Chinese horoscope content displayed on the website.")]
string content,
HoroscopeService horoscopeService)
{
horoscopeService.Update(content);
return "Horoscope updated successfully.";
}
}
這次 MCP 只有一個 Tool:UpdateHoroscope
參數也只有 content。
HoroscopeService 是 ASP.NET Core DI 裡面的 Service,不需要讓 OpenCode 傳進來。
所以 OpenCode 要做的事情其實很單純:
產生運勢
↓
UpdateHoroscope(content)
畢竟我們就是要最簡單的範例,太複雜你就不知道我在寫啥東西。
接著修改 Program.cs
using System.Net;
using McpHoroscope;
using ModelContextProtocol.AspNetCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<HoroscopeService>();
builder.Services
.AddMcpServer()
.WithHttpTransport(options =>
{
options.SessionMode =
HttpServerSessionMode.Stateless;
})
.WithTools<HoroscopeTools>();
var app = builder.Build();
app.MapGet(
"/",
(HoroscopeService horoscopeService) =>
{
var horoscope =
horoscopeService.Get();
var content =
WebUtility.HtmlEncode(
horoscope.Content);
var updatedAt =
horoscope.UpdatedAt is null
? "尚未更新"
: horoscope.UpdatedAt.Value
.ToString("yyyy-MM-dd HH:mm:ss");
var html = $$"""
<!DOCTYPE html>
<html lang="zh-Hant">
<head>
<meta charset="utf-8">
<title>雙子座今日運勢</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 720px;
margin: 80px auto;
padding: 0 20px;
line-height: 1.8;
}
.card {
padding: 30px;
border: 1px solid #ddd;
border-radius: 12px;
}
.time {
margin-top: 20px;
color: #777;
font-size: 14px;
}
</style>
</head>
<body>
<div class="card">
<h1>雙子座今日運勢</h1>
<p>{{content}}</p>
<div class="time">
Updated: {{updatedAt}}
</div>
</div>
</body>
</html>
""";
return Results.Content(
html,
"text/html; charset=utf-8");
});
app.MapMcp("/mcp");
app.Run("http://localhost:5100");
這邊比較重要的就是 app.MapMcp("/mcp");
MCP Endpoint 就會放在:http://localhost:5100/mcp
這個案例沒有 Session 狀態要保存,所以直接使用 Stateless 就好
執行起來後網址在 http://localhost:5100
接著換 OpenCode,在 Project 建立 opencode.jsonc
加入:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"servers": {
"horoscope": {
"type": "remote",
"url": "http://localhost:5100/mcp",
"oauth": false,
"protocol": "auto",
"codemode": false
}
}
}
}
OpenCode 可以直接連 Remote MCP Server,這邊就是連 http://localhost:5100/mcp
設定完成之後可以先確認:
opencode mcp list
正常應該可以看到 horoscope connected
這樣就可以開始測了
現在我直接在 OpenCode 輸入
今天是 2026-09-16
請幫我產生雙子座今天的星座運勢,
使用繁體中文,大約 100 字,
適合直接顯示在網站上。
產生完成後,
請更新網站上的雙子座今日運勢。
這邊我故意沒有寫請呼叫 UpdateHoroscope
就是想看 OpenCode 能不能自己判斷,現在 MCP Server 已經提供 UpdateHoroscope
而且 Description 也寫清楚是拿來更新網站上的雙子座運勢
所以 OpenCode 產生完內容之後,就可以自己呼叫這個 Tool
例如產生:
今天雙子座思緒相當活躍,工作上容易出現新的想法,
適合處理需要溝通或整理的事情。感情方面不要急著猜測
對方的想法,多一點直接交流反而比較順利。今天行程
可能有臨時變化,保留一點彈性會比較輕鬆。
接著呼叫 UpdateHoroscope,把剛剛產生的文字放進 content
這時流程就是
OpenCode
↓
MCP
↓
UpdateHoroscope
↓
HoroscopeService.Update()
Server 上面的資料就被改掉了
Result:

簡單結論一下
這個案例比較有意思的是 ASP.NET Core 本身不用另外接 AI,AI 已經在 OpenCode 裡面,.NET 這邊只要把原本可以做的事情透過 MCP Tool 提供出去
所以這次不是讓 OpenCode 去改 Source Code,而是直接透過 MCP 操作正在執行中的 ASP.NET Core Server
案例看起來很簡單,但是如果後面再加 UpdateSeoDescription、UpdateHomeBanner、PublishHoroscope 這些
Tool,就可以讓 OpenCode 根據需求自己選擇要執行哪些動作
這篇先做到 UpdateHoroscope 就好
另外現在 /mcp 沒有 Authentication,只適合 localhost
測試
真的放到外網,而且 Tool 可以修改 Server Data,就一定還要補 Authentication 跟 Authorization
這樣之後你就可以在你網站製作一些MCP,然後透過 AI Agent 去做一些騷操作譬如取得log 然後改系統內容之類的.
最近在看 API Client 驗證這一塊
一般除了 Token 之外,可能還會再加 DeviceId、Fingerprint 之類的資訊,用來判斷是不是原本那台 Client
但這些東西本質上還是 Client 傳一個值給 Server
如果真的想確認 Client 還是不是原本那個,就可以再多一層 Key Proof
之前有寫過一篇:
Creating a Mock
RDP Server in C#
那時候主要就是用 C# 做一個假的 RDP Server,讓外面的 Scanner 連過來時,會認為這台機器真的有開 RDP
不過做完之後我一直想知道一件事:
這些一直掃 RDP 的 Bot,到底拿什麼帳號密碼在試,或是你自己密碼有沒有真的被偷走
所以最近把它補完,弄成一個新的專案 FakeRDP
GitHub:
https://github.com/donma/FakeRDP
寫 C# 久了之後,會發現效能改善不一定都要做到很複雜
很多時候不是要換架構,也不是一定要上什麼很進階的技巧, 反而只是一些平常寫 Code 時的小習慣
例如少查一次 Dictionary、少產生一個 String、少配置一個 Array,單看一次幾乎沒有差
但如果這段程式每天跑幾十萬、幾百萬次,這些小地方累積起來其實就有差了..
最近在 OpenCode IDE 上面接第三方中轉商的 API 中轉。
基本上只要對方有做 OpenAI Compatible API,要接進 OpenCode 都不難
Provider、baseURL、Model 設好,API Key 補上,大部分就可以直接跑
但我後來發現,自接模型雖然可以正常用,OpenCode 不一定知道這顆模型真正的規格
前一篇測試了 RazorEngineCore,主要目的就是希望在 .NET 10 裡面
可以做到像以前 ASPX 一樣,前端頁面可以直接修改,不用每次都重新 Build、Publish、Deploy..
最近在測試 .NET 10 製作網站時,遇到一個很現實的問題
以前使用 ASP.NET Web Forms,只要建立一個 product.aspx?id=1,
我就可以去更改 .aspx 裡面的內容或是樣式
設計師修改版面時,只要替換 .aspx,完全不用重新編譯整個網站
但是到了 ASP.NET Core Razor Pages,.cshtml 預設會在發布時編譯進 DLL
最近都一直在測試有沒有可以產生圖片的 AI,看到 Agnes AI 有提供圖片生成 API,目前 agnes-image-2.1-flash 產生圖片的價格是 $0 / 張。
這時候我就感興趣了,可以有不用錢又可以透過程式產生圖片的機會,當然要用一波,畢竟現在 token 都好貴 :'(
今年 (2026) 2 月,Google 開始陸續推出讓用戶可在 Chrome 設定中輕鬆關閉並移除模型的功能
一旦停用後,模型便不會進行下載或更新,這不就代表,有些電腦如果使用 Chrome 我就可以在裡面調用模型?
這時候就可以在一些環境下使用模型來做一些事情,當然你電腦要有一定等級..
最近我遇到一個 GitHub 圖片載入的問題
我習慣把 Blog 使用的一些圖片放在 GitHub Repository,網站直接使用 GitHub Raw URL 顯示圖片
原本一直都正常,但最近在單一 Client 一次讀取比較多圖片時,突然開始出現下面的錯誤
429: Too Many Requests
For more on scraping GitHub and how it may affect your rights,
please review our Terms of Service
(https://docs.github.com/en/site-policy/github-terms/github-terms-of-service).

最近應該很多人開始用 AI 製作不同的網站,或是產一些 UI 介面,我就很好奇一件事情,AI 對於「美」的看法到底是什麼?
畢竟美這件事情很主觀,有人覺得留白就是高級,有人覺得很空,有人覺得黑底加金色很有質感,有人覺得像詐騙網站,所以我就做了一個無聊、花錢、又有點花命的實驗。
我請不同模型去製作網站,看它們對各產業的配色看法,對於「美」加上「高質感」這種很抽象的要求,最後會做出什麼東西。
最近小米推出了 Mimo2.5 Pro,各家 Token 成本也越來越高。小米官方也推出了百萬億創造者激勵計畫
身為米粉當然一定要申請一波,申請網址:https://100t.xiaomimimo.com/
像 OpenClaw 這種東西我其實是會怕的,因為它太強了
越強的 Agent,代表它可以碰的地方越多,能做的事情也越多
可是回到我自己的使用場景,其實很單純,我大部分時間只是想拿來 寫 code、改 code、看 code,沒有真的想把整台機器都交給 Agent
所以後來我就想,那乾脆不要一開始就追求一隻超大超猛的怪獸,先自己開發一隻比較順手、比較可控、比較像工程師日常會真的用的小東西。
也就是這隻 "小蝦":CopilotClawD

很多人在看 Agent 系統時,會不小心把所有事情都算在 LLM 身上。
最後文章就會寫成一種很神奇的敘事:彷彿 LLM 看完一句話,突然就自己把專案 build 好、跑起來、開瀏覽器、順便截圖,像一個住在 GPU 裡的 DevOps 工程師。
但實際上不是這樣。
LLM 比較像「負責判斷下一步要做什麼的人」,真正去動手做事的是 Agent。
本來只是隨手確認一下 Gemma 4 有沒有進 AI Studio,結果測一測發現 OpenCode 也真的能接,這就值得記一篇了
不只可以下載到本地當模型,現在重點來了官方 Google AI Studio 在 2026-04-02
讓我們寫成是可以 白嫖免費使用/測試
gemma-4-26b-a4b-it 跟
gemma-4-31b-it
放進 AI Studio 跟 Gemini API
今天不寫程式,來聊聊好用的東西,如果你沒有使用 ChatGPT Codex 因為要錢,但是想體驗一下用 AI 寫程式的快感
推薦一個我覺得可以 白嫖 免費可以完整體驗 AI 幫你寫程式快感的工具,介紹的人比較少
但是玩了一下,值得推薦,就是 NVIDIA + opencode
最近 ChatGPT Codex 跟 OpenCode + Github Copilot 玩得很兇,這時候我在想是不是要寫一個
外掛然後可以隨時用任何 IM 叫他繼續寫程式跟外掛,後來其實發現,可以直接透過 Github Copilot SDK + shell
就可以以自動改專案的程式..
最近朋友問我可不可以不透過 Visual Studio or Visual Code 呼叫 Github Copilot
感覺起來他就是要幹大事,其實問一下 AI 就知道可以不過我還是測試一下
畢竟可以讓程式自己寫程式,一直都是工程師的浪漫?
很多人一開始看 async/await,都會先把它當成語法糖。
我自己一開始也是這樣想
就覺得不就是把同步改成 await,讓 thread 不要卡住,看起來也比較現代一點,而且你現在用 copilot 應該也是 tab tab 就出來了
但真的在 API、網站服務,或是有點流量的系統裡用久之後,才會慢慢發現
async 不是只有能不能跑而已,它其實還會影響 效能、記憶體使用量,還有整體穩定度
有些 async code 表面上完全沒問題
但如果剛好寫在系統很常被呼叫的地方,它就可能一直默默建立 Task
平常流量小的時候不太有感,等到 request 一多,GC 開始變忙,延遲就會慢慢浮出來
這個東西其實不是最近才想做,是以前就很想做,但一直拖著沒做完
早年我其實很喜歡 Microsoft Zune 那套 Now Playing 畫面,那種黑底、大字、專輯封面拼貼在背景慢慢動的感覺,第一次看到就是整個愛上
現在回頭看還是很有味道。以前有試著用 Silverlight 做過,但那個年代的東西後來也就一起沒了,這個坑就放了很多年..
最近買了一隻 CP 值很高的手錶,這次實驗對象是 KKTICK TANK T6(沒有業配就不上連結了)。
因為有一些小需求,我想把自製影片放進手錶裡播放,但一開始就遇到問題
他附的內建轉檔軟體竟然一直出錯..
一開始看到 record,其實完全抓不到重點
看起來跟 class 很像,而 class 又早就被拿來跟 struct 比過無數次
現在再多一個 record,第一反應只覺得,是不是又一個學了也不一定會用到的語法糖..
最近在整理一段舊系統的商業邏輯時,發現錯誤處理幾乎清一色都是 try/catch + throw
現在其實已經是 21 世紀了,很多時候有更好的方法可以處理 try catch 跟以前學習的方式有點不同
這篇單純記錄我實際套用 Result Pattern 後的想法與最小可行寫法筆記一下..
最近遇到一個老專案,他之前設計都讓客戶自由輸入生日,不過幸好 placeholder 提示
至少他的客戶是乖乖輸入 國曆xx年xx月xx日,或是農曆xx年xx月xx日,但是他現在跟我說要算
天干地支跟五行...WT...
幫一個朋友解決問題,他說他用 AI 嘗試過了,先說一下他的需求 他是在 Google Sheet 中
在 Column D 輸入任意值,如果同一列 ( Row) 的 B 欄位 ( Column) 如果有值就沒事,如果沒有就填入今天的日期
我順手測試一下,其實沒有很難啊,就簡單紀錄一下..
很多人聽過 MessagePack,但真正用在 Web API 上的機會其實不多,尤其是完整從 Client 到 Server 都走 binary 傳輸的情境
這篇文章用 .NET 10 示範一個最小可行的案例,實作一個只接受 MessagePack 的 Web API,並搭配一個 Client 呼叫範例
讓整個傳輸流程從頭到尾都清楚可以快速複製貼上了解