feat(ai): read opencode-go credentials from SQLite account DB
This commit is contained in:
+51
-28
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user