Repository navigation
feat(ai): add Groq GPT-OSS adapter - #32
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Remindly 新增個人 Groq Key 語意解析,固定使用
openai/gpt-oss-120b,沿用既有加密、排序、冷卻、最多三組 Key 備援與 18 秒共用等待預算。使用者在私聊輸入/ai add groq <Key>即可設定;Gemini 仍為預設,建立提醒仍須確認。同時修正時間守衛只辨識合法前綴就覆寫模型的問題。例如「明天晚上八點過十分鐘」原本會把正確的 20:10 改成 20:00,現在確認時間保留為 20:10。AI 與關閉 AI 路徑也共用必要條件守衛,僅補時間不會清掉尚未釐清的條件。
供應商接入
additionalProperties: false,保留 nullable 型別;無新增 SDK、依賴或資料庫 migration。User-Agent: Remindly,解決真實 Key 測試中預設 urllib 被 Cloudflare 以 403/1010 擋下的問題。共用解析守衛
條件辨識與追問保留抽到
reminders/guards.py,兩條解析路徑重用,不另造解析器。已有未解條件的草稿,改時間後仍須釐清條件。明確時間修正共用
ReminderParser.explicit_update();否定或無法辨識的變更不能被填成事項。週期只有時鐘時用既有
next_fire()計算首次日期,保留明確起始日期,避免每週一、三、五的首次日期落在週六。TimeParse.is_complete檢查解析前綴後是否尚有時刻、時間長度或時段;不完整前綴不能覆寫模型完整時間/事項。明確日期、過去/無效日期、歧義與模型格式驗證仍保留。四個已保存的實測案例(共六筆回應)現在正確保留 14:45、20:10、18:30、20:00。修正不使用案例 ID 或整句比對;另覆蓋不同日期、時刻、事項,以及普通事項中的時間詞。
星期文法與提醒觸發共用
WEEKDAY_RE,支援「這個星期/這個禮拜/下個星期/下下個禮拜」等助詞變形,沿用既有週一週界;本週已過的日期不自動滾到下週。共用
new_reminder_text()辨識另外/新增/另開等明確另建指令。只有單一明確請求才擷取新請求;一般修改、事項提及與多筆提醒不強制新建。明確新請求不帶入舊草稿上下文,模型資料先驗證格式再約束為
create,避免update誤標沿用舊時間、條件或週期。原始 JSON 不改寫,完整原句仍保存為新草稿來源;舊確認按鈕失效,建立仍須確認。共用追問判定依已驗證的事項完整性,清除多餘的內容詢問及模型自行提出的曆法重複提議;不比對原句或案例 ID。缺少資訊、無效時間、未定對象、多筆提醒、擅加週期與既有未解條件仍保留。原文「每個/逢工作日、假日等」視為未解條件,不能默默改成一次性提醒。
評估工具與資料
scripts/groq_live_eval.py支援--cases選資料集;逐筆保存原始 JSON、差異、耗時及失敗事件,429 冷卻後續跑,同一輸出路徑不重送已完成請求。intent與實際路由,透過 BotRouter/ReminderService、臨時 SQLite 與 FakeTelegramClient 比較關閉 AI、模型原始資料與 AI 處理後結果。不能再以欄位完整性推定路由成功。@alice的 username/user ID 表示,不評估身份解析差異。.env載入個人GROQ_API_KEY,不接觸正式 Telegram/資料庫。真實 API 與離線驗證結果
既有歷史資料
10/30 共 58 次 API 嘗試:52 次取得回應、5 次 429、1 次 request 錯誤;10/31 共 33 次嘗試:30 次取得回應、3 次 429 各冷卻 60 秒後續跑。當時人工探索組關閉 AI 為 7/20;目前共用新建意圖修正後為 8/20,不能混用不同版本的分數。
11/4 重新呼叫 Groq:同批 56 案例,86 次回應
使用
1aa8250、固定openai/gpt-oss-120b,沿用原始預期值與固定測試時鐘。36 個回歸案例共 52 次、20 個探索案例原定 30 次;13 個易漂移案例各跑三次。另外對已知漂移的this-sunday、replace-draft各補兩次,讓這兩筆也各跑三次,共 86 次取得回應。未依本輪回應修改 prompt、產品程式或答案。5ca733f為 83/86、修正後1aa8250為 84/86;新增通過一筆、沒有舊版通過而新版失敗。這隔離本機處理差異,不能推斷不同 prompt 對隨機回應的因果影響。原始回應及三方結果保存為
tests/fixtures/groq_live_results_2026-11-04.jsonl、groq_exploration_results_2026-11-04.jsonl、groq_targeted_drift_results_2026-11-04.jsonl;當時差異與版本對照保存在groq_comparison_2026-11-04.json,維持原樣。本批多餘追問修正:原始 JSON 不變,離線重播 168/168
實測仍出現兩個案例各 1/3 次失敗:「工作日行事曆」被追問是否應每個工作日重複;補事項「延後寄包裹」被追問提醒內容。共用守衛漏認這些可由已驗證事項解決的詢問,最終留下不必要的 clarification。
本批擴充共用事項/追問語法與曆法條件約束,保留未知問題及必要追問;不使用完整原句或案例 ID。回歸測試先確認兩筆原始回應在修正前失敗、修正後通過,並覆蓋其他事項、曆法詞、缺漏資訊、無效時間、未定對象、多筆提醒及擅加週期反例。
groq_question_guard_replay_2026-11-04.json另存程式/資料雜湊、逐筆評分與重播結果。make check通過:Ruff、403 個 unit tests、smoke flow。另通過格式、git diff --check、資料雜湊與暫存內容 Key 洩漏檢查;.env未納入提交。目前只有合成/既有回歸案例,不能推估真實使用準確率。測過的探索資料後續只能作回歸/漂移診斷,真實使用者語料與獨立標註仍待補;尚未驗證正式 Telegram/部署環境。18 秒沿用既有等待預算,並非嚴格的整次執行期限。
最後審查修正與驗證
61f83de。本機make check通過:Ruff、408 個 unit tests、smoke flow;修改檔案的 Ruff 格式檢查與git diff --check通過。既有 Groq 錄製回應重播也通過。61f83de的 GitHub CIcheck已通過:執行紀錄。