reactive-resume
reactive-resume
A one-of-a-kind resume builder that keeps your privacy in mind. Completely secure, customizable, portable, open-source and free forever. Try it out today!
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:DevViking-Persike/dsh-subscriptions
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
Use your own Claude and ChatGPT/Codex subscriptions as model providers in DeepSeek Harness — the same OAuth sign-in the Claude Code and Codex CLIs use. No API key.
dsh plugin --profile web add github:DevViking-Persike/dsh-subscriptions
Restart dsh, then sign in to whichever subscription you have:
http://127.0.0.1:1458/claude/start
http://127.0.0.1:1458/codex/start
Each opens the vendor's own sign-in page and stores the resulting OAuth credential locally. Tokens refresh on their own; you sign in once.
| Route | Provider | Credential |
|---|---|---|
claude |
claude-code-oauth |
~/.dsh/claude-code-oauth.json |
codex |
codex-oauth |
~/.dsh/codex-oauth.json |
Other endpoints: GET /<route>/status reports whether a subscription is connected and when its token expires; POST /<route>/logout removes the credential; GET /<route>/models reports the current model list and when it was last refreshed; POST /<route>/refresh-models re-queries the vendor's model-list endpoint now. The server binds to loopback only.
Catalogs are curated snapshots, and vendors add models between plugin releases. With discoverModels (default), each route also asks the vendor's own model-list endpoint — Anthropic's /v1/models under the Claude Code identity, the Codex backend's /codex/models under the CLI identity — at mount, every modelRefreshMs, and through POST /<route>/refresh-models. Curated entries keep their hand-verified metadata; vendor-reported models append with the endpoint's context window, input modalities, and reasoning-effort levels (Codex models the installed CLI is too old for are skipped, matching the backend's own refusal). A failed refresh leaves the previous list standing.
Every field is optional.
| Field | Default | Meaning |
|---|---|---|
routes |
['claude', 'codex'] |
Which subscriptions to mount. |
discoverModels |
true |
Merge the vendor's live model list into each catalog (see Model discovery). |
modelRefreshMs |
21600000 |
Period between live model-list refreshes. |
controlPort |
1458 |
Loopback port for the sign-in endpoints. |
claudeModels / codexModels |
shipped catalogs | A supplied array replaces the default. |
claudeCredentialPath / codexCredentialPath |
under ~/.dsh |
Where each credential is stored. |
claudeImportFrom / codexImportFrom |
— | Seed once from a CLIProxyAPI auth file. |
streamIdleTimeoutMs |
300000 |
Budget between reads before the transport gives up. |
defaultContextWindow |
200000 |
Context assumed for a model absent from the catalog. |
maxTokens |
32000 |
Output cap when neither request nor catalog states one. |
retryPolicy |
normal, 3 retries | Merged over the default. |
claudeCodeVersion / codexVersion |
installed CLI | Client version sent in the user agent. Unset, the plugin reads it from the claude / codex executable on PATH (or ~/.local/bin), re-checked every minute, so updating the CLI is the whole upgrade. Set to pin one. |
- id: dsh-subscriptions
name: 'dsh-subscriptions'
config:
routes: ['claude']
controlPort: 1458
Each backend accepts only the models its own CLI version knows: a request that identifies as an older Claude Code fails with does not support this model; version X or newer is required. The plugin therefore never hard-codes the version. It resolves it per request from the installed CLI (install path first, then --version), falls back to the last verified version only when no CLI is found, and logs the identity each route mounts with. Pin claudeCodeVersion / codexVersion only when the Host must impersonate a version other than the one installed.
The shipped catalogs include GPT-6 Astra (gpt-6-astra) and Claude Fable 5.1 (claude-fable-5-1), with text and image input. Availability still depends on the subscription. Both expose Low, Medium, High, Xhigh, and Ultra Code (max) in the Harness effort selector. Other known models expose their supported levels; an unknown or newly discovered model always advertises the route's standard selector (Claude: Low–Ultra Code; Codex: Off–Ultra Code), never none. Omitting effort preserves the provider default.
Claude sends the selected value through output_config.effort; Codex uses reasoning.effort. Ultra Code is a display label, not an ultracode API value. Unsupported declared choices fail before credential access or provider I/O. Capabilities follow the Astra model reference and Claude effort reference. Changing top-level effort can affect prompt-cache reuse.
Transparent to the model: the plugin registers provider routes and streams responses, adding no tool, prompt section, or context.
What it affects is accounting, and the two routes deliberately disagree:
input_tokens already excluding cache reads, so nothing is subtracted.Both directions are pinned by tests recorded from the harness's own implementations, because getting either backwards raises nothing — it just misreports context in every cost display.
Text and image input on both routes. An image block is a durable attachment reference, not bytes: the adapter resolves it through the harness attachment service per request (so mounting that service later starts image input without a restart) and sends it inline — a base64 image source on the Anthropic route, a data: URL input_image on the Responses route. A model whose catalog entry does not declare image input is refused before serialization, since dropping the image silently would have the model answer a question it never saw. Tool-result images ride inside the tool_result content array on the Claude route; the Codex route's function_call_output takes a string only, so its images are flushed into a following user message in order.
0600, parent 0700), and the file is read through a cross-process writer lock. Two DSH instances refreshing at once cannot corrupt the document or burn the refresh token twice — proven by a test that forks real processes, with a negative control that fails when the lock is removed./status response. Upstream error bodies are redacted before being quoted.STREAM_CLOSED rather than presenting as a finished response.127.0.0.1, while the vendors' registered redirect URIs say localhost. On a host where localhost resolves to ::1 first, the browser callback will not arrive. The ports are fixed by the public clients and cannot be reconfigured.ctx.attachments); without it, an image request is refused with UNSUPPORTED_CONTENT rather than dropped. The Codex route rejects stop sequences — the Responses API has no equivalent, and silently dropping one would let a model run past a boundary the caller relied on.node:http servers. It proves this plugin's behavior, not that either vendor still speaks exactly this dialect: the fixtures encode the harness's belief about the wire, recorded from its own implementations.Codex sends tool-call blocks received in user messages, including background-subagent notices, as quoted text with their original fields. Only assistant messages create Responses function calls. This applies when serializing existing history as well as new messages; stored Session events remain unchanged. Both text and image requests preserve the quoted information and genuine assistant call/result pairs.
Both adapters implement the Harness prepareCall() protocol: preparation binds model metadata and dispatch to the same adapter configuration without reading credentials or contacting the provider. Image request pricing is unspecified, so the Harness uses its neutral estimate. Adapter transport tests dispatch through prepared calls.
npm install && node --test test/*.test.js
No vendor network access or credentials are required; adapter tests bind temporary loopback ports.
MIT — see LICENSE and NOTICE.md. Using this plugin means using your own subscription under its own terms.
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: oauth。