套件名稱叫 python-dotenv,但 import 時寫的是 dotenv。
> pip install python-dotenv
這樣做的好處是不用把 API Key 直接寫在程式裡,例如避免:
api_key = "sk-xxxxxxxx"
特別是程式要放到 GitHub 時,通常會把 .env 加到 .gitignore,避免不小心把金鑰一起上傳。
--------------------------------------------------------------------------------
openrouter設計流程
啟動 openrouter.py
↓
讀取 .env
↓
取得 OPEN_ROUTER_API_KEY
↓
建立 OpenAI Client
↓
把 API 位置改成 OpenRouter
↓
設定 AI 的 system prompt
↓
送出 user message
↓
OpenRouter 呼叫 DeepSeek
↓
收到 response
↓
response.choices[0].message.content
↓
print() 印出 AI 回答
--------------------------------------------------------------------------------
ctrl+shift+p輸入提示> WSL: Open Folder in WSL(windows subsystem for linux)
確保程式碼(client端)是在linux環境下執行(server端)

這份 openrouter.py 的功能,是:從 .env 讀取 OpenRouter API Key,透過 OpenAI Python SDK 呼叫 OpenRouter 上的 DeepSeek 模型,最後把 AI 的回答印出來。
1. 載入需要的套件
import os from dotenv import load_dotenv from openai import OpenAI
-
os:讀取作業系統的環境變數。 -
load_dotenv:把.env檔案裡的設定載入成環境變數。 -
OpenAI:OpenAI Python SDK。這裡雖然使用OpenAI類別,但實際連線的是 OpenRouter,因為後面有修改base_url。
2. 讀取 .env
load_dotenv() api_key = os.getenv("OPEN_ROUTER_API_KEY")
假設你的專案資料夾中有:
.env openrouter.py
.env 裡可能寫:
OPEN_ROUTER_API_KEY=sk-or-v1-xxxxxxxx
load_dotenv() 會載入它,而:
os.getenv("OPEN_ROUTER_API_KEY")
則取得 API Key。
接著:
print("有讀到 API key 嗎?", bool(api_key))
是在檢查有沒有成功讀取。
例如:
有讀到 API key 嗎? True
代表有讀到;如果是 False,通常表示 .env 找不到、變數名稱寫錯,或 Key 沒設定。
3. 建立 OpenRouter Client
client = OpenAI( api_key=api_key, base_url="https://openrouter.ai/api/v1" )
這裡是整份程式很重要的一段。
一般直接使用 OpenAI API 時,OpenAI() 會連到 OpenAI 的 API;但你指定:
base_url="https://openrouter.ai/api/v1"
所以 SDK 會改成把請求送到 OpenRouter。
可以理解成:
你的 Python ↓ OpenAI Python SDK ↓ OpenRouter API ↓ DeepSeek 模型
因此,OpenAI SDK 在這裡比較像 API 呼叫工具,不代表你正在使用 OpenAI 模型。
4. 設定 System Prompt
system_prompt = "你是一個會說繁體中文,而且會使用大量表情符號互動的可愛機器人"
system_prompt 是用來設定 AI 的角色與行為。
也就是先告訴模型:
你要使用繁體中文,而且講話要像可愛機器人並使用大量 Emoji。
它不是使用者真正問的問題,而是對模型的「最高層級角色設定」之一。
5. 呼叫模型
核心程式是:
response = client.chat.completions.create( model="deepseek/deepseek-chat-v3-0324", messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": "你好!你會說繁體中文嗎?你是誰呢?"}, ], max_tokens=100, temperature=0.7, )
可以拆成四個重要部分。
model
model="deepseek/deepseek-chat-v3-0324"
指定 OpenRouter 要使用哪個模型。
messages
messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": "你好!你會說繁體中文嗎?你是誰呢?"}, ]
這是聊天紀錄。
system:
{"role": "system", "content": system_prompt}
設定 AI 身分。
user:
{"role": "user", "content": "..."}
代表使用者實際輸入的問題。
所以模型實際收到的概念類似:
System: 你是一個會說繁體中文,而且會使用大量表情符號互動的可愛機器人 User: 你好!你會說繁體中文嗎?你是誰呢?
max_tokens=100
限制模型最多產生大約 100 個 token:
max_tokens=100
它不是「100 個中文字」;token 是模型處理文字使用的單位。
數字越大,通常代表允許回答得更長。
temperature=0.7
temperature=0.7
控制回答的隨機性。
粗略可以理解為:
temperature 低 → 回答比較穩定、保守 temperature 高 → 回答比較多變、有創意
0.7 算是常見的聊天設定。
6. 取得 AI 回答
API 執行完成後,結果放在:
response
程式最後:
print(response.choices[0].message.content)
可以由外往內理解:
response └── choices └── [0] └── message └── content
-
choices:模型產生的回答候選。 -
[0]:拿第一個回答。 -
message:這個回答的訊息物件。 -
content:真正的文字內容。
因此最後可能印出類似:
你好呀~🤖✨ 當然可以說繁體中文!💖 我是一個可愛的 AI 機器人~ 很高興認識你!🥰🌟
請先 登入 以發表留言。