go-translate 更新到 v3

是不是跟你的主题配色冲突了。

通过 M-x customize-group go-translate-faces 查看或修改配色。

进行了一点点修改。主要:

  1. 引入 pdd 包管理请求和异步任务
    • 一些跟网络相关的配置有变动,需要更改
  2. 对 ChatGPT 引擎进行了小小改动,让其能更好工作在不同场景

应该不是主题色导致的,比如截图当中 en → zh,显示的是中文拼音。

因为,Google 对 Deep 翻译的结果没有包含音标。而对小写的 deep 翻译是有音标的。试试看。

1 个赞

推荐一个跟 AI 集成,从而将选中文本跟 LLM 进行交互的命令。挺实用的。

(defvar my-ai-oneshot-prompts
  (list "优化、润色文本" "请认真分析代码,修复代码存在的错误,并给出建议"))

(defvar my-ai-oneshot-models
  (list "deepseek-reasoner" "gpt-4o-mini" "gemini-2.5-pro"))

(defvar my-ai-oneshot-last-model nil)

(defvar my-ai-oneshot-history nil)

(defun my-ai-oneshot ()
  "Use C-. C-, to switch model."
  (interactive)
  (require 'go-translate)
  (let ((prompt nil)
        (model (or my-ai-oneshot-last-model
                   (setq my-ai-oneshot-last-model (or (car my-ai-oneshot-models) gt-chatgpt-model)))))
    (cl-flet ((get-cands ()
                (cl-delete-duplicates
                 (append my-ai-oneshot-history my-ai-oneshot-prompts) :from-end t :test #'equal))
              (change-model (&optional prev)
                (let* ((pos (or (cl-position my-ai-oneshot-last-model my-ai-oneshot-models :test #'equal) -1))
                       (next (if prev (max 0 (1- pos)) (min (1- (length my-ai-oneshot-models)) (1+ pos)))))
                  (setq my-ai-oneshot-last-model (nth next my-ai-oneshot-models))
                  (setq model my-ai-oneshot-last-model)
                  (overlay-put (car (overlays-at 1)) 'after-string my-ai-oneshot-last-model))))
      (setq prompt
            (minibuffer-with-setup-hook
                (lambda ()
                  (local-set-key (kbd "C-,") (lambda () (interactive) (change-model)))
                  (local-set-key (kbd "C-.") (lambda () (interactive) (change-model t)))
                  ;; (local-set-key (kbd "C-c C-k") #'my-ai-oneshot-delete-current)
                  (overlay-put (make-overlay 1 9) 'after-string model)
                  (use-local-map (make-composed-keymap nil (current-local-map))))
              (completing-read "Prompt (): " (get-cands) nil nil nil 'my-ai-oneshot-history)))
      (gt-start (gt-translator
                 :taker (gt-taker
                         :text 'point :pick nil
                         :prompt (lambda (translator)
                                   (let ((text (car (oref translator text))))
                                     (oset translator text
                                           (list (if (string-blank-p text)
                                                     prompt
                                                   (let ((str (if (string-blank-p prompt) text
                                                                (format "%s\n\n内容如下:\n\n%s\n" prompt text))))
                                                     (if current-prefix-arg (read-string "Ensure: " str) str))))))
                                   (message "Processing...")))
                 :engines (gt-chatgpt-engine
                           :cache nil
                           :stream t
                           :model model
                           :timeout 300
                           :prompt #'identity)
                 :render (gt-buffer-render
                          :name (format "*ai-oneshot-%s*" model)
                          :mode 'markdown-mode
                          :init (lambda () (markdown-toggle-markup-hiding 1))
                          :dislike-header t
                          :dislike-source t
                          :window-config '((display-buffer-below-selected))))))))
1 个赞

我看了下 pdd 的代码,确实没有这个方法(而 go-translate 使用了)。 是不是 pdd 升级导致的?我是 250623 的 pdd 。

我也遇到了这个问题。

用你的这个例子,我这边总是会提示 wrong-type-argument listp t 错误。 使用的是最新的 go-translate 和 pdd.el, 直接从 Github 安装的。

我就在你的代码里加了这几行,我只用 DeepSeek,其他2个后端都删除了。

执行M-x my-ai-oneshot-models 后,在Prompt中选择“优化、润色文本”,出现“Processing…” 后过一会就会看到错误 wrong-type-argument listp t

  (setq gt-chatgpt-key (my-auth-secret "api.deepseek.com"))
  (setq gt-chatgpt-host "https://api.deepseek.com")
  (setq gt-chatgpt-model "deepseek-v3")
  (defvar my-ai-oneshot-prompts
    (list "优化、润色文本" "请认真分析代码,修复代码存在的错误,并给出建议"))

  (defvar my-ai-oneshot-models
    (list "deepseek-v3"))

我用的是第三方接口,示例中代码可以直接运行。如果使用 deepseek 官方接口,path 和模型名有些不一样,需要配置。比如:

(setq gt-chatgpt-host "https://api.deepseek.com")
(setq gt-chatgpt-path "/chat/completions")
(setq gt-chatgpt-model "deepseek-reasoner")  ; or "deepseek-chat"

https://api-docs.deepseek.com/zh-cn/api/create-chat-completion

BUG,已修复。

1 个赞

按照你说的设置试了,现在报wrong-type-argument char-or-string-p nil 错误。 go-translate 和 pdd 也已经更新到最新。

很奇怪,我用 gptel 是可正常访问官方的 DeepSeek的:

(use-package gptel
  :defer t
  :custom
  (gptel-default-mode 'org-mode)
  (gptel-model 'deepseek-reasoner)
  :config
  (setq gptel-backend (gptel-make-deepseek "DeepSeek"
                        :stream t
                        :key gptel-api-key)))

希望这个可以解决你的问题。

1 个赞

更新后试了下,目前 deepseek-chat 成功了,不知为何 reasoner 还是报错?结果如下:

go-translate 设置如下(参考的 Readme: GitHub - lorniu/go-translate: Translator on Emacs. Support multiple engines such as Google, Bing, deepL, StarDict and Youdao, also support LLMs like ChatGPT, DeepSeek and so on.

  (setq gt-chatgpt-key (my-auth-secret "api.deepseek.com"))
  (setq gt-default-translator
        (gt-translator :taker (gt-taker :pick nil :prompt t)
                       :engines (list
                                 (gt-chatgpt-engine
                                  :host "https://api.deepseek.com"
                                  :path "/chat/completions"
                                  :model "deepseek-chat")
                                 (gt-chatgpt-engine
                                  :host "https://api.deepseek.com"
                                  :path "/chat/completions"
                                  :model "deepseek-reasoner"
                                  :prompt "Translate the text to {{lang}} and return the first word:\n\n{{text}}"
                                  :stream t))
                       :render (gt-buffer-render)))

@lorniu 我把 :stream t 去了就都成功了。

无法复现你的错误,我用你的配置,不管怎么试都是正常的,不管 :stream 有没有设置。

先观望。

对我来说不用 :stream t,也没什么影响,目前已经很好用了。 感谢大佬写这么好用的包。

测试下来,deepseek-reasoner 的翻译效果比deepseek-chat要好很多,就是贵不少。

不好意思,又是半夜来提 bug 了。

我有一个需求想使用多个 LLMs ,他们各自有各自的 key ,但我不想使用 authinfo 文件来做这件事 。文档里有提到可以直接在 gt-chatgpt-engine 中设置 :key ,但现在会报错 You should provide a valid api key for ‘gt-chatgpt-engine’

大概扫了眼代码,应该是 gt-resolve-key 的问题,调用 (gt-resolve-key (gt-chatgpt-engine :key "key") 就是会报那个错误。

go-translate version: 20250625.1616

我这里的行为也和他的一致,设置 :stream t 就会报错,去掉 ok 。

感谢支持

建议区分简体和繁体,部分 llm 无法区分二者,老是翻译错

目前我是自己加了一段解决的:

(setcdr (assoc 'zh gt-lang-codes) "Simplified Chinese")

这个不确定性太大。如果有需要还是自己添加的好。直接用 push 可能更简单些:

(push '(zh . "简体中文") gt-lang-codes)