昨天還在迴圈裡刷「我還在」,今天我打算認真一點,來打造我的 Python Client 專案。
任務很單純:
想得很美,實際上卻是一場「從天堂到地獄」的驚險旅程。
CLI 開場白很有氣勢,ASCII Art 排場一流,還給了幾條小貼士。
我開門見山:
Let's create a project that can connect to copilot studio agent with directline.
Read questions from csv, send to agent, collect answers, generate report.
結果 CLI 還真懂,幫我規劃八大步驟:建立專案、安裝套件、讀 CSV、呼叫 Direct Line API、收回答、最後生成報表。
一步步照做,requirements.txt
、questions.csv
、main.py
全部寫好,甚至還貼心加上:
report_df = pd.DataFrame(report_data, columns=[
"question","response","starttime","usetime","username","conversationid"
])
report_df.to_csv("report.csv", index=False)
我看著這段程式碼,內心只有一個字:爽。
我真的把伺服器跑起來,丟了一個測試:
curl -X POST "http://localhost:7979/start_test?username=TestUser"
結果 CLI 回我:
{"message":"Test completed. Report generated in report.csv"}
打開 report.csv
,看到表格裡乖乖排著:
question | response | starttime | usetime | username | conversationid |
---|---|---|---|---|---|
What is your name? | 目前沒有相關資訊顯示我的名稱... | 2025-09-17 13:21:36 | 12.6 | TestUser | 7zFqfkZ9gb19… |
What can you do? | 您好,今天有什麼可以為您效勞… | 2025-09-17 13:21:48 | 5.6 | TestUser | DMLCWJE7Jps… |
那一瞬間,我真的感動到差點想請 CLI 吃一頓好的。
正當我準備繼續壯大功能時,系統突然冒出:
Error processing question 'What is your favorite color?': HTTPSConnectionPool(host='directline.botframework.com', port=443): Max retries exceeded
沒錯——Token 用光了 → Gemini-Pro 下台一鞠躬 → 換成 Gemini-Flash。
結果 Flash 模式不只笨,還完全搞不清楚 Direct Line WebSocket 該怎麼連:
我原本參考文件,把 token 硬塞到 URL:
wss://directline.botframework.com/v3/directline/conversations/{id}/stream?watermark=0&token={conversation_token}
→ 伺服器直接回我 404。
Flash 模式還一本正經跟我說「可以試試 query string」,結果依然失敗。
真相其實很簡單:
POST /conversations
回傳的 streamUrl
。extra_headers=[("Authorization", f"Bearer {conversation_token}")]
但 Flash 模式完全解不出來,搞得我在終端機前面一臉黑人問號。
原本想大展拳腳,結果被「點數清零」打斷。
今天只能宣布:
「本回合結束,明日再戰!」
不過至少我收穫了:
明天,就算要掏錢,我也要讓我的 Client 繼續進化!💸