feat(ai): read opencode-go credentials from SQLite account DB

This commit is contained in:
kj
2026-10-19 14:37:22 -03:00
parent f4b83af6cd
commit ac205f4e9c
+51 -28
View File
@@ -39,13 +39,41 @@
"minimax-m2.5:cloud" "minimax-m2.5:cloud"
"qwen3-coder-next:cloud")) "qwen3-coder-next:cloud"))
;; Backend opencode-go: suscripción OpenCode Go vía endpoint OpenAI-compatible ;; Backend opencode-go: suscripción OpenCode Go vía endpoint OpenAI-compatible.
;; Las versiones actuales de opencode guardan el login de consola en su base
;; de datos SQLite (token OAuth + organización activa), no en auth.json.
(defconst kj-opencode-db-file
(expand-file-name "~/.local/share/opencode/opencode.db")
"Ruta de la base de datos SQLite de opencode.")
(defun kj-opencode-console-credentials ()
"Return (TOKEN . ORG-ID) for opencode's active console account."
(when (and (fboundp 'sqlite-select)
(file-readable-p kj-opencode-db-file))
(ignore-errors
(let ((db (sqlite-open kj-opencode-db-file t)))
(unwind-protect
(when-let* ((row (car (sqlite-select
db
"select a.access_token, s.active_org_id \
from account_state s join account a on a.id = s.active_account_id \
limit 1"))))
(cons (nth 0 row) (nth 1 row)))
(sqlite-close db))))))
(defun kj-opencode-go-key () (defun kj-opencode-go-key ()
"Return the OpenCode Go API key from opencode's auth file." "Return the credential to use for the OpenCode Go backend."
(let ((auth (with-temp-buffer (or (car (kj-opencode-console-credentials))
(insert-file-contents "~/.local/share/opencode/auth.json") (getenv "OPENCODE_CONSOLE_TOKEN")
(json-parse-buffer :object-type 'alist)))) (let ((auth (with-temp-buffer
(alist-get 'key (alist-get 'opencode-go auth)))) (insert-file-contents "~/.local/share/opencode/auth.json")
(json-parse-buffer :object-type 'alist))))
(alist-get 'key (alist-get 'opencode-go auth)))))
(defun kj-opencode-go-org-id ()
"Return opencode's active workspace id, when available."
(or (cdr (kj-opencode-console-credentials))
(getenv "OPENCODE_ORG_ID")))
(defvar-local kj-opencode-session-id nil (defvar-local kj-opencode-session-id nil
"Stable OpenCode session id for this conversation buffer.") "Stable OpenCode session id for this conversation buffer.")
@@ -65,10 +93,12 @@
(kj-opencode-go-new-session-id)))) (kj-opencode-go-new-session-id))))
(defun kj-opencode-go-header (info) (defun kj-opencode-go-header (info)
"Auth plus per-conversation session header for the OpenCode Go backends." "Auth, workspace and per-conversation session headers for OpenCode Go."
(append (append
(when-let* ((key (gptel--get-api-key))) (when-let* ((key (gptel--get-api-key)))
`(("Authorization" . ,(concat "Bearer " key)))) `(("Authorization" . ,(concat "Bearer " key))))
(when-let* ((org (kj-opencode-go-org-id)))
`(("x-opencode-org-id" . ,org)))
`(("x-opencode-session" . ,(kj-opencode-go-session-id info))))) `(("x-opencode-session" . ,(kj-opencode-go-session-id info)))))
(gptel-make-openai "OpenCode Go" (gptel-make-openai "OpenCode Go"
@@ -77,30 +107,23 @@
:key #'kj-opencode-go-key :key #'kj-opencode-go-key
:header #'kj-opencode-go-header :header #'kj-opencode-go-header
:stream t :stream t
:models '(minimax-m3 minimax-m2.7 minimax-m2.5 :models '(deepseek-v4.1-flash deepseek-v4-pro
kimi-k3 kimi-k2.7-code kimi-k2.6 longcat-2.0 kimi-k2.5 glm-5.1 glm-5.2 glm-5.3 glm-5.3-flash
glm-5.3-flash glm-5.3 glm-5.2 glm-5.1 glm-5 grok-4.6 grok-4.7
deepseek-v4-pro deepseek-v4-flash deepseek-v4-flash-vision-exp mimo-v2.5 mimo-v2.5-pro mimo-v2.6-flash mimo-v2.6-pro
qwen3.8-max qwen3.7-max qwen3.7-plus qwen3.6-plus qwen3.5-plus minimax-m2.5 minimax-m2.7 minimax-m3
mimo-v2-pro mimo-v2-omni mimo-v2.5-pro mimo-v2.5 kimi-k2.6 kimi-k2.7-code kimi-k3
hy3 hy3-preview longcat-2.0
gpt-5.6-luna grok-4.5 grok-4.6 qwen3.6-plus qwen3.7-plus qwen3.7-max qwen3.8-flash qwen3.8-max
muse-spark-1.2-contributor)) gpt-5.6-luna gpt-6-luna claude-haiku-5-5
hy3 hy4-preview omen-alpha step-5-preview
;; Modelos gratuitos de OpenCode Go, servidos vía el endpoint /zen/v1 beam-free minimax-m3.1-flash-free longcat-2.5-preview-free
(gptel-make-openai "OpenCode Free" muse-spark-1.2-contributor muse-spark-1.3-contributor
:host "opencode.ai" gemini-4-argon-contributor))
:endpoint "/zen/v1/chat/completions"
:key #'kj-opencode-go-key
:header #'kj-opencode-go-header
:stream t
:models '(big-pickle deepseek-v4-flash-free muse-spark-1.2-contributor-free
mimo-v2.5-free hy3-free nemotron-3-ultra-free
nemotron-3.5-lightning-free laguna-s-2.1-free))
;; Backend y modelo por defecto ;; Backend y modelo por defecto
(setq gptel-backend (gptel-get-backend "OpenCode Go") (setq gptel-backend (gptel-get-backend "OpenCode Go")
gptel-model 'mimo-v2.5-free) gptel-model 'mimo-v2.6-flash)
(setq gptel-default-mode 'markdown-mode (setq gptel-default-mode 'markdown-mode
gptel-prompt-prefix-alist gptel-prompt-prefix-alist