昨天說要跟網頁點擊說再見。
今天說到做到。
打開終端機,準備寫下這個系列的第一行「正式代碼」。
前六天,所有實驗都在 Google AI Studio 的網頁介面裡完成。
方便,但有一個限制:沒辦法把它接進自己的工具裡。
DevPulse 最終要做到的是「終端機輸入一行指令,自動分析代碼」,這件事網頁做不到,只能靠 API。
所以今天的目標很單純:
用最少的代碼,讓 Gemini 第一次在我的終端機裡開口說話。
Google 目前官方建議用 @google/genai 這個套件(TypeScript / JavaScript 通用):
npm init -y
npm install @google/genai dotenv
dotenv 是拿來讀取等一下要設定的環境變數,跟今天的重點沒有直接關係,但少不了它。
Day 02 花了整篇在講「不要把 Key 燒在代碼裡」,今天正式派上用場。
在專案根目錄建一個 .env:
GEMINI_API_KEY=你的金鑰貼這裡
然後打開 .gitignore,確認這一行有在裡面:
.env
沒有的話現在就加上去,這一步做完才安心。
新建一個 index.js:
import 'dotenv/config';
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({}); // 會自動讀取 GEMINI_API_KEY
async function main() {
const interaction = await ai.interactions.create({
model: "gemini-3.5-flash",
input: "用一句話跟我打招呼,說你是我的 Coding 助理。",
});
console.log(interaction.output_text);
}
main();
不算 import 跟空行,核心邏輯真的差不多十行。
值得一提的是 ai.interactions.create——這是 Google 目前官方主推的新寫法,取代舊版常見的 generateContent,之後如果要接工具呼叫或多步驟推理,也是走這條路線,算是提前跟上最新的官方建議。
執行:
node index.js
終端機印出一句話,大概是這樣:
哈囉!我是你的 Coding 助理,隨時準備好幫你抓蟲、給建議。
畫面上沒什麼特效,就一句話。
但這一句話的意義是:DevPulse 第一次真正「活」了起來,不再只是網頁上的對話框,而是終端機裡跑得動的程式。
代碼寫完不代表一次就跑得動。
第一次執行 node index.js,終端機直接噴了一串紅字:
SyntaxError: Cannot use import statement outside a module
翻開 package.json 才發現,npm init -y 預設產生的是:
"type": "commonjs"
但代碼裡用的是 ES Module 的 import 語法,兩邊對不上,Node.js 才會直接罷工。
解法很單純,把這一行改成:
"type": "module"
存檔、重新執行,錯誤就消失了。這大概是每個第一次用 ES Module 寫 Node.js 的人都會踩過的坑,記一筆,下次就不會再中招。
修完坑之後總算成功了,但實際跑起來又有一個新的小小不滿足:程式安靜等了好幾秒,才把整句話一次印出來,體驗有點乾。
原因也不難理解——現在用的是一次性呼叫,Gemini 要在伺服器端把整句話完整生成好,才會一次性傳回終端機,字數越長,等待感越明顯。
如果是聊天視窗,通常都是一個字一個字蹦出來,感覺比較「有在思考」。這個「打字機效果」背後其實有個技術名詞——Streaming(串流)。
明天就來處理這件事,讓 DevPulse 的回應也能一個字一個字跑出來。
順便打開 Google AI Studio 的 Rate Limit 面板看了一眼,這幾次測試的用量都還遠遠低在免費額度裡,Day 02 設定的安全防護,這時候正好派上用場。
第一行代碼寫完了,接下來會越來越好玩。