Skip to content

圖片描述功能調整:Token 無限制預設、API Key 遮蔽、新增 Pollinations 模型#77

Merged
keyang556 merged 4 commits into
mainfrom
claude/awesome-noether-1bdd27
May 14, 2026
Merged

圖片描述功能調整:Token 無限制預設、API Key 遮蔽、新增 Pollinations 模型#77
keyang556 merged 4 commits into
mainfrom
claude/awesome-noether-1bdd27

Conversation

@keyang556
Copy link
Copy Markdown
Owner

@keyang556 keyang556 commented May 14, 2026

Summary

  • Token 限制改為預設無限制:新增「限制圖片描述最大 Token (&L)」checkbox。預設不勾選時,三個 backend(Google / NVIDIA / Pollinations)皆不向 API 傳送 max_tokens/maxOutputTokens 參數,讓模型自由輸出。勾選後 SpinCtrl 啟用可自行調整數值。同步移除已無用的 _getEffectiveImageMaxTokens 快取函式與相關 _cachedEffectiveImageMaxTokens 全域變數。

  • API Key 欄位改為密碼模式wx.TextCtrl 預設加上 wx.TE_PASSWORD 樣式遮蔽內容,避免旁人窺視。旁邊新增「顯示 API 金鑰 (&S)」checkbox,勾選後透過 sizer.Replace() 將控制項換成不帶遮罩的新 wx.TextCtrl(wxPython 無法熱切換 TE_PASSWORD 旗標),並保留游標位置與焦點。

  • Pollinations.AI 新增 10 個模型

    顯示名稱 API 端點
    Mistral Small 3.1 mistral
    Meta Llama 4 Scout 17B 16E Instruct llama-scout
    Gemini 2.5 Flash Lite gemini-fast
    Qwen3 VL 30B A3B Thinking qwen-vision
    Google Gemini 2.5 Flash Lite Search gemini-search
    Grok 4.20 Non-Reasoning grok
    Moonshot Kimi K2.5 kimi
    Mistral Large 3 mistral-large
    Qwen3.6 Plus qwen-large
    Moonshot Kimi K2.6 kimi-k2.6

Test plan

  • 開啟 NVDA 設定 → LINE Desktop,確認 API Key 欄位預設顯示遮蔽字元
  • 勾選「顯示 API 金鑰」後確認明文出現,再取消勾選確認重新遮蔽,且值不遺失
  • 確認「限制圖片描述最大 Token」預設未勾選,SpinCtrl 為停用狀態
  • 勾選 Token 限制後調整數值,儲存後重開設定確認值保留
  • 取消勾選 Token 限制後儲存,確認不帶 max_tokens 送出(可用抓包或 log 確認)
  • 切換至 Pollinations.AI 服務,確認模型下拉選單包含新增的 10 個模型
  • 執行 pytest 確認全部測試通過

🤖 Generated with Claude Code

Greptile Summary

此 PR 在圖片描述功能上做了三項獨立調整:Token 上限預設改為無限制(需勾選 checkbox 才啟用)、API Key 欄位預設遮蔽並以 Win32 EM_SETPASSWORDCHAR 實作顯示切換、以及新增 10 個 Pollinations.AI 模型。

  • Token 無限制:移除 _getEffectiveImageMaxTokens 快取函式與 _cachedEffectiveImageMaxTokens 全域變數,改由各後端直接呼叫 getUserImageMaxTokens() 並在回傳 None 時省略 max_tokens 參數;UI 端以 checkbox 控制是否傳送限制值,邏輯一致。
  • API Key 遮蔽:以 ctypes.windll.user32.SendMessageW 傳送 EM_SETPASSWORDCHAR 訊息切換遮蔽狀態,避免 sizer 重排;ctypes 已在檔案頂部 import,Win32 常數值正確(0x00CC)。
  • Pollinations 模型:10 個新模型同步加入 _IMAGE_DESCRIPTION_POLLINATIONS_AVAILABLE_MODELS tuple 與 _IMAGE_DESCRIPTION_POLLINATIONS_MODEL_LABELS dict,且下拉選單的 label 產生邏輯(.get(mid, mid))能正確 fallback,無遺漏。

Confidence Score: 5/5

此 PR 三項改動邏輯均正確且一致,無資料遺失或邊界條件問題,可安全合併。

Token 限制的 checkbox 邏輯、None 判斷與 setUserImageMaxTokens 的行為完全匹配;EM_SETPASSWORDCHAR 透過 ctypes 切換遮蔽狀態的實作方式在 Windows 上正確可靠;新增的 10 個 Pollinations 模型已同步更新 tuple 與 labels dict,下拉選單 fallback 邏輯也能處理潛在缺漏。整體變更範圍明確,未破壞既有功能。

兩個檔案均無需特別關注。

Important Files Changed

Filename Overview
addon/globalPlugins/lineDesktopHelper.py 新增 API Key 遮蔽切換(EM_SETPASSWORDCHAR via ctypes)、Token 限制 checkbox 及對應事件處理邏輯;實作正確,ctypes 已 import,無邏輯錯誤。
addon/appModules/line.py 移除 _getEffectiveImageMaxTokens 快取函式及相關全域變數;三個後端改為直接讀取 getUserImageMaxTokens() 並條件性加入 max_tokens;新增 10 個 Pollinations 模型至 tuple 與 labels dict,均一致無遺漏。

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[使用者開啟設定面板] --> B[API Key TextCtrl\nwx.TE_PASSWORD 建立]
    B --> C{勾選「顯示 API 金鑰」?}
    C -- 是 --> D[SendMessageW\nEM_SETPASSWORDCHAR wParam=0\n顯示明文]
    C -- 否 --> E[SendMessageW\nEM_SETPASSWORDCHAR wParam=ord★\n遮蔽顯示]
    D --> F[Refresh 重繪]
    E --> F

    G[使用者開啟設定面板] --> H{勾選「限制最大 Token」?}
    H -- 是 --> I[SpinCtrl 啟用\n讀取 getUserImageMaxTokens]
    H -- 否 --> J[SpinCtrl 停用\nnewMaxTokens = None]

    K[onSave] --> L{_limitTokensCheck?}
    L -- 勾選 --> M[newMaxTokens = SpinCtrl.GetValue\nsetUserImageMaxTokens n]
    L -- 未勾選 --> N[setUserImageMaxTokens None\n清除 max_tokens 檔案]

    O[API 呼叫] --> P[getUserImageMaxTokens]
    P --> Q{回傳值?}
    Q -- None --> R[不傳送 max_tokens\n讓模型自由輸出]
    Q -- 整數 --> S[加入 max_tokens / maxOutputTokens\n至 request body]
Loading

Reviews (3): Last reviewed commit: "Fix API key show/hide: use EM_SETPASSWOR..." | Re-trigger Greptile

keyang556 and others added 2 commits May 14, 2026 13:01
1. Token 限制改為預設無限制:新增「限制圖片描述最大 Token」checkbox,
   未勾選時不向 API 傳送 max_tokens(Google/NVIDIA/Pollinations 三個 backend
   皆適用)。移除已無用的 _getEffectiveImageMaxTokens 快取函式。

2. API Key 欄位改為密碼模式:預設以 wx.TE_PASSWORD 遮蔽,旁邊新增
   「顯示 API 金鑰」checkbox,勾選後透過 sizer.Replace() 換成明文控制項。

3. Pollinations.AI 新增 10 個模型:
   mistral / llama-scout / gemini-fast / qwen-vision / gemini-search /
   grok / kimi / mistral-large / qwen-large / kimi-k2.6

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Comment thread addon/globalPlugins/lineDesktopHelper.py Outdated
Comment thread addon/appModules/line.py Outdated
- Check sizer.Replace() return value; destroy orphaned newCtrl and bail
  if the replacement fails, so the existing field is never lost.
- Rename _userMaxTokens -> userMaxTokens in all three API backends
  (Google, NVIDIA, Pollinations) — underscore prefix implies module-private
  in Python convention, not appropriate for a local variable.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@keyang556
Copy link
Copy Markdown
Owner Author

Re: sizer.Replace() return value (P1) — Fixed: check the return value; if False, destroy the orphaned newCtrl and return early so the existing field is never lost. Re: _userMaxTokens naming (P2) — Fixed: renamed to userMaxTokens in all three backends (Google, NVIDIA, Pollinations).

The sizer.Replace approach caused the field to move and lose its label.
Replace with Win32 EM_SETPASSWORDCHAR message: wParam=0 shows plain text,
wParam=ord('*') re-enables masking. The TextCtrl stays in its original
position and retains its label — no sizer manipulation needed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@keyang556 keyang556 merged commit 16749a7 into main May 14, 2026
3 checks passed
@keyang556 keyang556 deleted the claude/awesome-noether-1bdd27 branch May 14, 2026 05:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant