@xiaobuyu/nodesign 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +266 -79
- package/README.zh-CN.md +254 -67
- package/package.json +2 -2
- package/server/api/admin.js +7 -0
- package/server/api/assets/docx-page.js +5 -4
- package/server/api/assets/helpers.js +26 -0
- package/server/api/assets/notes.js +50 -0
- package/server/api/assets.js +31 -38
- package/server/api/board.js +29 -1
- package/server/api/browse.js +3 -2
- package/server/api/chatai.js +9 -8
- package/server/api/exports/cards.js +7 -6
- package/server/api/exports/docx-pdf.js +4 -1
- package/server/api/instruction.js +3 -3
- package/server/api/local.js +10 -8
- package/server/api/projects.js +19 -3
- package/server/api/publish.js +3 -2
- package/server/api/sessions-rewind.js +220 -0
- package/server/api/sessions.js +58 -194
- package/server/api/stage.js +35 -0
- package/server/api/turn-model-switch.js +109 -0
- package/server/api/turn.js +52 -88
- package/server/auth/middleware.js +29 -6
- package/server/auth/tier.js +27 -7
- package/server/auth/users-store.js +14 -1
- package/server/engine/agent/actor-trail.js +110 -0
- package/server/engine/agent/agent-shared.js +22 -52
- package/server/engine/agent/beat-state.js +61 -0
- package/server/engine/agent/cast.js +322 -0
- package/server/engine/agent/events.js +18 -1
- package/server/engine/agent/hooks/beat-gate.js +73 -0
- package/server/engine/agent/hooks/failure.js +11 -1
- package/server/engine/agent/hooks/lifecycle.js +16 -41
- package/server/engine/agent/hooks/post-guidance.js +4 -38
- package/server/engine/agent/hooks/post-trim.js +1 -0
- package/server/engine/agent/hooks/pre-board-dirty.js +29 -0
- package/server/engine/agent/hooks/pre-defaults.js +206 -2
- package/server/engine/agent/hooks/pre-injectors.js +19 -2
- package/server/engine/agent/hooks/pre-peer-guard.js +88 -0
- package/server/engine/agent/hooks/pre-unknown-params.js +82 -0
- package/server/engine/agent/hooks/pre-workspace-scope-guard.js +33 -0
- package/server/engine/agent/hooks/resident-role-lifecycle.js +100 -0
- package/server/engine/agent/hooks/slot-alias.js +30 -0
- package/server/engine/agent/hooks/user-prompt-submit.js +208 -47
- package/server/engine/agent/hooks.js +80 -14
- package/server/engine/agent/isolation.js +25 -2
- package/server/engine/agent/memory-config.js +87 -0
- package/server/engine/agent/model-context.js +102 -18
- package/server/engine/agent/model-table.js +361 -58
- package/server/engine/agent/prompts/nodesign-prelude.md +579 -70
- package/server/engine/agent/prompts/tools/direct-edit-protocol.md +1 -1
- package/server/engine/agent/prompts/tools/generate-image-cookbook.md +26 -9
- package/server/engine/agent/prompts/tools/paint-still-cookbook.md +1 -1
- package/server/engine/agent/prompts/tools/site-reference.md +15 -4
- package/server/engine/agent/role-card.js +175 -0
- package/server/engine/agent/rp-mode.js +17 -0
- package/server/engine/agent/session-loop.js +55 -32
- package/server/engine/agent/stage-status.js +73 -0
- package/server/engine/agent/subagent-flight.js +73 -0
- package/server/engine/agent/system-prompts.js +41 -0
- package/server/engine/agent/tool-input-stream.js +165 -0
- package/server/engine/agents/explorer.md +1 -1
- package/server/engine/agents/index.js +1 -1
- package/server/engine/mcp/actor.js +59 -0
- package/server/engine/mcp/capability-gate.js +21 -2
- package/server/engine/mcp/index.js +118 -33
- package/server/engine/mcp/mode-profile.js +139 -0
- package/server/engine/mcp/server-name.js +19 -0
- package/server/engine/mcp/tools/artifact-session.js +2 -1
- package/server/engine/mcp/tools/browse-computer.js +2 -1
- package/server/engine/mcp/tools/browse-find-batch.js +95 -16
- package/server/engine/mcp/tools/browse.js +25 -3
- package/server/engine/mcp/tools/cast-role.js +167 -0
- package/server/engine/mcp/tools/crystallize-skill.js +1 -1
- package/server/engine/mcp/tools/draw-trend.js +104 -0
- package/server/engine/mcp/tools/edit-board-schema.js +56 -0
- package/server/engine/mcp/tools/edit-board.js +569 -0
- package/server/engine/mcp/tools/generate-image.js +50 -70
- package/server/engine/mcp/tools/helpers/codex-imagegen.js +139 -0
- package/server/engine/mcp/tools/helpers/rembg.js +7 -2
- package/server/engine/mcp/tools/helpers/shot-pipeline.js +109 -0
- package/server/engine/mcp/tools/list-pages.js +11 -5
- package/server/engine/mcp/tools/look-at-board.js +4 -3
- package/server/engine/mcp/tools/open-sheet.js +242 -0
- package/server/engine/mcp/tools/organize-board.js +45 -6
- package/server/engine/mcp/tools/paint-still.js +1 -1
- package/server/engine/mcp/tools/pin-to-board.js +103 -19
- package/server/engine/mcp/tools/read-board.js +123 -16
- package/server/engine/mcp/tools/read-tavern-json.js +87 -19
- package/server/engine/mcp/tools/report-issue.js +15 -7
- package/server/engine/mcp/tools/role-memory.js +83 -0
- package/server/engine/mcp/tools/roll-dice.js +82 -0
- package/server/engine/mcp/tools/roll-film.js +1 -1
- package/server/engine/mcp/tools/screenshot.js +19 -9
- package/server/engine/mcp/tools/set-vars.js +150 -0
- package/server/engine/mcp/tools/sheet-replan.js +46 -0
- package/server/engine/mcp/tools/web-search.js +12 -16
- package/server/engine/mcp/tools/write-on-board-flow.js +108 -0
- package/server/engine/mcp/tools/write-on-board-place.js +211 -0
- package/server/engine/mcp/tools/write-on-board-role-anchor.js +48 -0
- package/server/engine/mcp/tools/write-on-board-schema.js +125 -0
- package/server/engine/mcp/tools/write-on-board.js +568 -99
- package/server/engine/plugins/nodesign/skills/blackboard-rp/SKILL.md +215 -0
- package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/SKILL.md +14 -7
- package/server/engine/plugins/nodesign/skills/docx-craft/SKILL.md +44 -5
- package/server/engine/plugins/nodesign/skills/docx-craft/references/token-schema.md +16 -0
- package/server/engine/plugins/nodesign/skills/site-craft/SKILL.md +24 -8
- package/server/engine/plugins/nodesign/skills/story-craft/SKILL.md +94 -0
- package/server/engine/plugins/nodesign/skills/story-import/SKILL.md +112 -0
- package/server/engine/plugins/nodesign/skills/story-intimacy/SKILL.md +72 -0
- package/server/engine/plugins/nodesign/skills/story-voice/SKILL.md +66 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//345/206/267/347/241/254.md +33 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//346/203/205/346/204/237/347/233/264/347/273/231.md +42 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//346/204/217/350/257/206/346/265/201.md +42 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//346/255/246/344/276/240/347/231/275/350/257/235.md +34 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//347/224/237/346/264/273/346/265/201.md +35 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//347/231/275/346/217/217.md +37 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//350/210/236/345/217/260/345/211/247.md +32 -0
- package/server/engine/plugins/nodesign/skills/story-voice/voices//351/230/266/346/256/265/345/210/207/346/215/242.md +42 -0
- package/server/engine/runs/board-seater.js +272 -0
- package/server/engine/runs/board-tasklist.js +90 -48
- package/server/engine/runs/turn-relay.js +24 -2
- package/server/engine/runs/user-chalk-echo.js +44 -0
- package/server/index.js +2 -2
- package/server/lib/artifact-target.js +31 -14
- package/server/lib/board-anchor.js +49 -0
- package/server/lib/board-dirty.js +93 -0
- package/server/lib/board-excerpt.js +80 -0
- package/server/lib/board-follow.js +111 -0
- package/server/lib/board-groups.js +1 -5
- package/server/lib/board-hero.js +3 -1
- package/server/lib/board-kind-sizes.js +38 -3
- package/server/lib/board-lanes.js +58 -0
- package/server/lib/board-obstacles.js +80 -0
- package/server/lib/board-relations.js +5 -1
- package/server/lib/board-sheets.js +467 -0
- package/server/lib/board-shelf.js +86 -0
- package/server/lib/board-transform.js +62 -0
- package/server/lib/canvas-id.js +46 -4
- package/server/lib/chalk-flow.js +88 -0
- package/server/lib/chalk-rewrite.js +63 -0
- package/server/lib/chalk-size-pref.js +48 -0
- package/server/lib/chalk.js +42 -3
- package/server/lib/export-collect.js +3 -1
- package/server/lib/ingress/forward-openai-chat.js +16 -4
- package/server/lib/ingress/openai-chat.js +23 -12
- package/server/lib/ingress/session-routes.js +3 -3
- package/server/lib/ingress/stream-watchdog.js +53 -0
- package/server/lib/ingress/upstream-billing.js +15 -0
- package/server/lib/ingress/upstream-error-hints.js +36 -0
- package/server/lib/issues-store.js +3 -1
- package/server/lib/json-preview.js +58 -0
- package/server/lib/kinds/docx.js +11 -4
- package/server/lib/kinds/index.js +6 -16
- package/server/lib/kinds/site.js +40 -7
- package/server/lib/model-ingress.js +26 -1
- package/server/lib/moderation.js +10 -5
- package/server/lib/quota.js +26 -6
- package/server/lib/rect.js +50 -0
- package/server/lib/rewrite-refs.js +110 -0
- package/server/lib/screen.js +36 -0
- package/server/lib/sheet-state.js +19 -0
- package/server/lib/sketch-array.js +118 -0
- package/server/lib/sketch-hatch.js +99 -0
- package/server/lib/sketch-layout.js +269 -69
- package/server/lib/sketch-shapes.js +152 -0
- package/server/lib/sketch-stencils.js +170 -0
- package/server/lib/ssrf-guard.js +9 -0
- package/server/lib/state-table.js +237 -0
- package/server/lib/state-trend.js +94 -0
- package/server/lib/state-triggers.js +199 -0
- package/server/lib/task-scan.js +18 -0
- package/server/lib/tavern-json.js +48 -0
- package/server/lib/user-uploads.js +88 -0
- package/server/projects/board-limits.js +5 -3
- package/server/projects/board-sanitize.js +220 -10
- package/server/projects/board-store.js +137 -7
- package/server/projects/memory-migration.js +85 -0
- package/server/projects/move-entry.js +11 -1
- package/server/projects/session-jsonl.js +110 -0
- package/server/projects/store.js +56 -3
- package/server/projects/ui-config.js +2 -1
- package/server/projects/viewpoint-store.js +35 -3
- package/server/projects/workspace-slots.js +30 -0
- package/server/projects/workspace-templates.js +42 -10
- package/server/projects/workspace.js +25 -26
- package/server/runtime/capabilities.js +6 -2
- package/server/services/rembg-launcher.js +5 -2
- package/server/shared/locales.js +70 -0
- package/server/shared/messages-en.js +69 -0
- package/server/shared/messages.js +65 -0
- package/server/ws/broker.js +3 -0
- package/server/ws/index.js +43 -3
- package/web/README.md +1 -1
- package/web/dist/assets/{BrowserWindow-P_vIdh-G.js → BrowserWindow-CcaGRWz5.js} +1 -1
- package/web/dist/assets/DeckWindow-BIr2KGFT.js +6 -0
- package/web/dist/assets/{DocxWindow-DSAU1-tD.js → DocxWindow-B9KZmU5z.js} +2 -2
- package/web/dist/assets/{MermaidBlock-DR1GikCv.js → MermaidBlock-DrfRnz8E.js} +43 -43
- package/web/dist/assets/{SiteWindow-92uBuRRR.js → SiteWindow-CJOjCF7d.js} +6 -6
- package/web/dist/assets/{abnfDiagram-VCTEODGH-uA8Esix4.js → abnfDiagram-VCTEODGH-CUZbQGIg.js} +1 -1
- package/web/dist/assets/{arc-D_khH_xN.js → arc-C1-HSUny.js} +1 -1
- package/web/dist/assets/{architectureDiagram-5GKGNRK7-DydJHqOt.js → architectureDiagram-5GKGNRK7-B5nwvu60.js} +2 -2
- package/web/dist/assets/{blockDiagram-NRAW4CY4-B7wBbKiW.js → blockDiagram-NRAW4CY4-uPPuFLwR.js} +1 -1
- package/web/dist/assets/{c4Diagram-UCG6FXSJ-6mrH0x7Y.js → c4Diagram-UCG6FXSJ-C0mKBFlz.js} +1 -1
- package/web/dist/assets/channel-BxpWNOGU.js +1 -0
- package/web/dist/assets/{chunk-2Q5K7J3B-Cuikho5Q.js → chunk-2Q5K7J3B-Cs0rlZ4q.js} +1 -1
- package/web/dist/assets/{chunk-5VM5RSS4-3-KZ5AUz.js → chunk-5VM5RSS4-DtR63oYb.js} +1 -1
- package/web/dist/assets/{chunk-F27PBJKO-Bkwq2gGU.js → chunk-F27PBJKO-B3MRdezJ.js} +1 -1
- package/web/dist/assets/{chunk-G27WJ6UU-BLyQzdGE.js → chunk-G27WJ6UU-BtwntwpS.js} +1 -1
- package/web/dist/assets/{chunk-JWPE2WC7-B7HxxQds.js → chunk-JWPE2WC7-BHsTe5PD.js} +1 -1
- package/web/dist/assets/{chunk-LCL6LL3I-CtXrnUwF.js → chunk-LCL6LL3I-knY15Qdm.js} +1 -1
- package/web/dist/assets/{chunk-POPQ4Y6H-dxddZlXt.js → chunk-POPQ4Y6H-C51tgK_I.js} +1 -1
- package/web/dist/assets/{chunk-SVP7TREG-DpkmrgHn.js → chunk-SVP7TREG-CnwRZmF_.js} +1 -1
- package/web/dist/assets/{chunk-XXDRQBXY-BwZ7RbpQ.js → chunk-XXDRQBXY-BtXzVF-_.js} +1 -1
- package/web/dist/assets/classDiagram-DTDB5LWJ-DUEKmDfo.js +1 -0
- package/web/dist/assets/classDiagram-v2-JRS7N3AN-DUEKmDfo.js +1 -0
- package/web/dist/assets/{cose-bilkent-JH36ORCC-DGFOsMUt.js → cose-bilkent-JH36ORCC-CzWlGP6i.js} +1 -1
- package/web/dist/assets/{cynefin-OW5HDTMX-DUwn3ehS.js → cynefin-OW5HDTMX-vK64EGSv.js} +1 -1
- package/web/dist/assets/{cynefinDiagram-5FMLGOSQ-DlLAOZ9x.js → cynefinDiagram-5FMLGOSQ-Bs3g1Gvh.js} +1 -1
- package/web/dist/assets/{dagre-3AP2YEHR-CyourLfz.js → dagre-3AP2YEHR-BhgkYe8V.js} +1 -1
- package/web/dist/assets/{diagram-S7CK7UJ4-BTMbx2np.js → diagram-S7CK7UJ4-C_6mvD2V.js} +1 -1
- package/web/dist/assets/{diagram-UQ7AKVKN-UK94_1-P.js → diagram-UQ7AKVKN-qW7tssUW.js} +1 -1
- package/web/dist/assets/{diagram-VSXAHHWV-C7zS-v9v.js → diagram-VSXAHHWV-txJPHpvG.js} +1 -1
- package/web/dist/assets/{diagram-VX7I27RA-DKJRa6CK.js → diagram-VX7I27RA-CQTMsCnL.js} +1 -1
- package/web/dist/assets/{diagram-Z3DM3KII-kUbAfGAp.js → diagram-Z3DM3KII--cb1hoE6.js} +1 -1
- package/web/dist/assets/{ebnfDiagram-PWID7BFC-CVW16_vb.js → ebnfDiagram-PWID7BFC-Da6lDU77.js} +1 -1
- package/web/dist/assets/{erDiagram-SSCWMZ5O-BRQMFQ5y.js → erDiagram-SSCWMZ5O-DGCMrsQn.js} +1 -1
- package/web/dist/assets/{flowDiagram-A5DVABFB-S34LpLtK.js → flowDiagram-A5DVABFB-GdOL_qno.js} +1 -1
- package/web/dist/assets/{ganttDiagram-EL5Y4UJY-BFiqk1-G.js → ganttDiagram-EL5Y4UJY-Cx1F_jBK.js} +4 -4
- package/web/dist/assets/{gitGraphDiagram-WWUBYQGX-LZsrdyyv.js → gitGraphDiagram-WWUBYQGX-B5_6JhR3.js} +1 -1
- package/web/dist/assets/hand-CuvZZQGW.webp +0 -0
- package/web/dist/assets/index-BYKfMnmv.js +2759 -0
- package/web/dist/assets/index-CW7VsrVg.css +1 -0
- package/web/dist/assets/{infoDiagram-RXCK75RN-0DvN6KIp.js → infoDiagram-RXCK75RN-CjvKpSPA.js} +1 -1
- package/web/dist/assets/{ishikawaDiagram-5VMMS53U-CaY3A-Bx.js → ishikawaDiagram-5VMMS53U-CxLoAPhx.js} +1 -1
- package/web/dist/assets/{journeyDiagram-EYS64GPL-BBeiaCrj.js → journeyDiagram-EYS64GPL-BfvS1upJ.js} +1 -1
- package/web/dist/assets/{kanban-definition-3QL26DDD-ux42DRXQ.js → kanban-definition-3QL26DDD-DKPPu0w4.js} +1 -1
- package/web/dist/assets/{layout-CnXiF_NB.js → layout-Dhgck-Zo.js} +1 -1
- package/web/dist/assets/{linear-BMW0u6G6.js → linear-DMSQ-aUw.js} +1 -1
- package/web/dist/assets/lxgw-nd-app-bold-D1pKA1bR.woff2 +0 -0
- package/web/dist/assets/lxgw-nd-app-regular-BDe3d26v.woff2 +0 -0
- package/web/dist/assets/lxgw-nd-bold-Bufvlg03.woff2 +0 -0
- package/web/dist/assets/lxgw-nd-regular-DQwoI4OP.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-100-DLPe7tEt.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-101-d3VsZKWT.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-102-ClzJuLq6.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-103-DuDnQ6K-.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-104-kPGW3Eem.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-105-BzD54h-0.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-106-BQ7fIzlx.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-107-D8tDfFHI.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-108-tGhkpwep.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-109-7SMVSrly.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-110-_uDKrFed.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-111-Bio825RE.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-112-D2ee0i-C.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-113-JPFVDrga.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-114-BcfxYA4w.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-115-B1HeeOsd.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-116-hY12tXpq.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-117-BvuZwmre.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-118-tzvs_H7j.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-119-J2DWuYDN.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-21-pDubCJV5.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-22-ChAPMpqp.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-23-BBx3oNpT.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-24-CYt-Oagk.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-25-Cx3j-ZUv.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-26-B9AfZ3LL.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-27-Bh2s9MNE.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-28-C02JPoKP.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-29-T_tbUGhk.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-30-DMfyNzhz.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-31-DFfdzbkg.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-32-Bs1fz2iW.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-33-cpB96OkZ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-34-BhinPYWX.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-35-D_njRQqA.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-36-DqXlLE3t.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-37-j5LbvMph.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-38-oO4jWdKm.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-39-CabsX4rw.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-4-PatS3YHh.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-40-yrLg3C3e.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-41-DBXmCQhc.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-42-Bqij_UiQ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-43-D3kp0Ntc.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-44-B_BNGvK4.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-45-CZc0cQWs.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-46-CHQX5Kd9.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-47-Ci8gLrHA.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-48-run3ugD3.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-49-DgfiUb6u.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-5-B0CtGbX_.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-50-CdCG-POr.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-51-L2okeQZ2.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-52-BZAqyGJW.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-53-B0xWqLeU.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-54-BZVQX-EA.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-55-093mkIUJ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-56-CbhWG8G-.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-57-pLQuvo6c.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-58-BHhoY50x.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-59-D1_6DuIQ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-6-BnAelmYU.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-60-HDBIuLTZ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-61-C-c13SeU.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-62-kHRVOhZ2.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-63-C0MCsvFv.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-64-DZekguCj.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-65-CtP6c3IU.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-66-DLVWoMSf.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-67-BVuOnayH.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-68-DpxQ6Mnx.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-69-qesBxLmC.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-70-BBt1xN7h.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-71-BWqZacwB.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-72-B1wP_Yst.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-73-C99T7jNZ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-74-DrUTsWBe.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-75-C4M5XXQe.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-76-Bq8spVWF.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-77-D9vNupE2.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-78-D6th7Gnu.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-79-bezM85cS.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-80-DD8pnhG2.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-81-N6jtSyBs.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-82-D6c180bZ.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-83-em17AadM.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-84-CJ8gdrMK.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-85-9PPGO1eB.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-86-CjWPf-u5.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-87-8D_X_yOC.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-88-9vtKFPBx.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-89-BhE5jAKX.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-90-D2Npfm5E.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-91-C6Ft1-Eu.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-97-CaExyQP9.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-98-CPoVbsUd.woff2 +0 -0
- package/web/dist/assets/lxgwwenkaiscreen-subset-99-ZUQZGVgH.woff2 +0 -0
- package/web/dist/assets/{mindmap-definition-FBJOCRG2-hUxSpdKn.js → mindmap-definition-FBJOCRG2-CalfL_Kn.js} +1 -1
- package/web/dist/assets/{pegDiagram-XKGWAZYB-aCaQPH0w.js → pegDiagram-XKGWAZYB-D9mVWz7l.js} +1 -1
- package/web/dist/assets/pending-edit-apply-kwMFWsUe.js +31 -0
- package/web/dist/assets/{pieDiagram-E7YTZNPT-CmOEZ8zg.js → pieDiagram-E7YTZNPT-DELzbZNS.js} +1 -1
- package/web/dist/assets/{quadrantDiagram-AXDQQJYC-VW6fAhsV.js → quadrantDiagram-AXDQQJYC-TZqp4mfA.js} +1 -1
- package/web/dist/assets/{railroadDiagram-O6MQD6OU-CKJ7Ba5K.js → railroadDiagram-O6MQD6OU-DxX59f0i.js} +1 -1
- package/web/dist/assets/{requirementDiagram-EFPCY7ZU-pNGkq9Vw.js → requirementDiagram-EFPCY7ZU-DFdsJLIe.js} +1 -1
- package/web/dist/assets/{rotate-cw-KAfChbGV.js → rotate-cw-62liz7LX.js} +1 -1
- package/web/dist/assets/{sankeyDiagram-P5KCCOFB-BIMmDTfZ.js → sankeyDiagram-P5KCCOFB-ByYcd3fG.js} +1 -1
- package/web/dist/assets/{sequenceDiagram-WJ2MYXX4-BBW7wzKY.js → sequenceDiagram-WJ2MYXX4-Bj-ml1jS.js} +1 -1
- package/web/dist/assets/{sizeCapture-X5ZJPWSS-DdkXmLYR.js → sizeCapture-X5ZJPWSS-KhsXThyD.js} +1 -1
- package/web/dist/assets/{square-dashed-mouse-pointer-CDUlhUP7.js → square-dashed-mouse-pointer-D_VrqVpy.js} +1 -1
- package/web/dist/assets/{stateDiagram-HBIQ2CUA-W313Uz16.js → stateDiagram-HBIQ2CUA-BJlpHfWU.js} +1 -1
- package/web/dist/assets/stateDiagram-v2-4QOOHH4V-CR2kYAH2.js +1 -0
- package/web/dist/assets/{swimlanes-XN3QIQJK-C29TL26K.js → swimlanes-XN3QIQJK-DUB9OJVs.js} +1 -1
- package/web/dist/assets/swimlanesDiagram-VK2B7HYN-BitOxnG2.js +8 -0
- package/web/dist/assets/{timeline-definition-24CTP7MA-CF0JMObX.js → timeline-definition-24CTP7MA-C03NX82A.js} +1 -1
- package/web/dist/assets/{vennDiagram-4TSXK5OY-DrDFsaH3.js → vennDiagram-4TSXK5OY-B9pjzngp.js} +1 -1
- package/web/dist/assets/{wardleyDiagram-VM6X3IG4-CVrnRIS_.js → wardleyDiagram-VM6X3IG4-UqWq_mcT.js} +1 -1
- package/web/dist/assets/{xychartDiagram-S5SC5T6Z-BvkN1zsT.js → xychartDiagram-S5SC5T6Z-D2pDKtOv.js} +1 -1
- package/web/dist/index.html +2 -2
- package/server/api/memory.js +0 -185
- package/server/engine/agent/prompts/tools/generate-image-cookbook.gemini-gateway.md +0 -583
- package/server/engine/mcp/tools/arrange-on-board.js +0 -124
- package/server/engine/mcp/tools/create-on-board.js +0 -152
- package/server/engine/mcp/tools/edit-sketch.js +0 -167
- package/server/engine/mcp/tools/record-decision.js +0 -140
- package/server/engine/mcp/tools/relate-on-board.js +0 -112
- package/server/engine/mcp/tools/sketch-on-board.js +0 -337
- package/server/engine/plugins/nodesign/skills/rp-craft/SKILL.md +0 -235
- package/server/engine/plugins/nodesign/skills/rp-craft/patterns//346/274/224/345/207/272/351/241/265-/346/234/200/345/260/217/345/256/236/347/216/260.html +0 -78
- package/server/engine/plugins/nodesign/skills/rp-craft//346/274/224/345/207/272.template.js +0 -268
- package/web/dist/assets/DeckWindow-BpLv5082.js +0 -16
- package/web/dist/assets/channel-DGkccMO1.js +0 -1
- package/web/dist/assets/classDiagram-DTDB5LWJ-BGscw3OD.js +0 -1
- package/web/dist/assets/classDiagram-v2-JRS7N3AN-BGscw3OD.js +0 -1
- package/web/dist/assets/index-C0KUf6Wd.css +0 -1
- package/web/dist/assets/index-GAamh1p4.js +0 -2152
- package/web/dist/assets/lxgw-nd-bold-DbRfiTgo.woff2 +0 -0
- package/web/dist/assets/lxgw-nd-regular-CpMw9Ehg.woff2 +0 -0
- package/web/dist/assets/pending-edit-apply-AcdOQ9Ij.js +0 -31
- package/web/dist/assets/stateDiagram-v2-4QOOHH4V-DDhJBZzf.js +0 -1
- package/web/dist/assets/swimlanesDiagram-VK2B7HYN-BfN-Xdmu.js +0 -8
|
@@ -43,10 +43,12 @@ export const UPSTREAMS_BUILTIN = Object.freeze({
|
|
|
43
43
|
// model-ingress.normalizeImages)。不填 = 什么都能吃,中转站那两个上游维持原样。
|
|
44
44
|
imageFormats: Object.freeze(['image/png', 'image/jpeg']),
|
|
45
45
|
}),
|
|
46
|
-
// OpenCode Zen(08-21
|
|
46
|
+
// OpenCode Zen(08-21):主入口 /zen/v1。这家**只有 OpenAI chat 格式能用工具**
|
|
47
47
|
// (它的 /v1/messages 桥一带 tools 就 [1210],四种写法探死)。protocol 'openai-chat'
|
|
48
48
|
// 让 ingress 走 lib/ingress/openai-chat.js 的协议转换而不是透传;其余上游没有这个
|
|
49
|
-
// 字段 = 透传 Anthropic。钥匙在 .env(NODESIGN_UPSTREAM_ZEN_KEY
|
|
49
|
+
// 字段 = 透传 Anthropic。钥匙在 .env(NODESIGN_UPSTREAM_ZEN_KEY),两个入口同一把。
|
|
50
|
+
// 今天没有行挂在它上面(内置行全在下面的 zenGo);留着的理由是这家的**免费 stealth 行只在这个
|
|
51
|
+
// 入口有**(Ox Alpha 曾经在这儿,08-26 下架;目录里换成了 big-pickle 那一批),下次要接免费行走这条。
|
|
50
52
|
zen: Object.freeze({
|
|
51
53
|
label: 'OpenCode Zen',
|
|
52
54
|
// 覆盖旋钮跟 qwenLocal 同款,**只给探针用**(假上游跑真 ingress+转换层,见 _probe-truncation-e2e.mjs);
|
|
@@ -57,8 +59,39 @@ export const UPSTREAMS_BUILTIN = Object.freeze({
|
|
|
57
59
|
protocol: 'openai-chat',
|
|
58
60
|
countTokens: false, // 08-21 探针:404
|
|
59
61
|
}),
|
|
60
|
-
// 08-
|
|
61
|
-
//
|
|
62
|
+
// GMI Cloud(08-25):算力平台,转卖各家开源权重的部署。**它自己就说 Anthropic 协议**
|
|
63
|
+
// (`/v1/messages` 原生,不是桥)—— 08-25 用 server/_probe-upstream.mjs 体检 M3 拿 8/9:
|
|
64
|
+
// 顶层图 ✓ / tool_result 图原样直通 ✓ / prompt cache 真命中 ✓ / 流式 tool_use 分片 ✓ /
|
|
65
|
+
// max_tokens 128k 不炸 ✓,只差 count_tokens(404,入口本地估算兜底)。所以**不走
|
|
66
|
+
// openai-chat 转换层**:同一条链路上少一层翻译就少一类 quirk。
|
|
67
|
+
// ⚠️ 这个账户没有余额:付费模型(gemini/claude/gpt 那些它也转卖)一律 402 CreditsError,
|
|
68
|
+
// 只有 is_free 的 MiniMax 两行能用 —— 也就是说踩错行不会静默花钱,会当场 402 fail-loud。
|
|
69
|
+
// 钥匙是一枚 JWT(`~/apikey/gmicloud-API.md`),x-api-key 和 bearer 两种头实测都通,
|
|
70
|
+
// 按平台文档取 bearer。
|
|
71
|
+
gmi: Object.freeze({
|
|
72
|
+
label: 'GMI Cloud api.gmi-serving.com',
|
|
73
|
+
baseUrl: process.env.NODESIGN_UPSTREAM_GMI_URL || 'https://api.gmi-serving.com', // ⚠️ 不带 /v1:透传路是 baseUrl + 原始路径
|
|
74
|
+
keyEnv: 'NODESIGN_UPSTREAM_GMI_KEY',
|
|
75
|
+
authStyle: 'bearer',
|
|
76
|
+
countTokens: false, // 08-25 体检:404
|
|
77
|
+
}),
|
|
78
|
+
// NVIDIA build(08-25):NVIDIA 自己托管的一堆开源权重(102 个模型),开发者档拿 nvapi- 钥匙直接用。
|
|
79
|
+
// ⛔ **只有 OpenAI 格式**:`/v1/messages` 和 `/v1/messages/count_tokens` 都是 404 → 走 openai-chat 转换层。
|
|
80
|
+
// ⚠️ 免费档**限流很紧**:08-25 实测串行、间隔 5 秒的小请求里 6 发撞了 1 发 429(141ms 就回),
|
|
81
|
+
// 大 body 的请求更容易撞。入口对 4xx 是原样透传状态码(forward-openai-chat.js),CLI 见 429 会退避重试、
|
|
82
|
+
// 用户那边会收到「上游繁忙,正在自动重试」——能用,但别指望它当高频主力。
|
|
83
|
+
// 延迟画像(同一趟实测 max_tokens=20 的小请求):中位 772ms,但尾巴很长(单发见过 24.8s / 69s)。
|
|
84
|
+
nvidia: Object.freeze({
|
|
85
|
+
label: 'NVIDIA build integrate.api.nvidia.com',
|
|
86
|
+
baseUrl: process.env.NODESIGN_UPSTREAM_NVIDIA_URL || 'https://integrate.api.nvidia.com/v1',
|
|
87
|
+
keyEnv: 'NODESIGN_UPSTREAM_NVIDIA_KEY',
|
|
88
|
+
authStyle: 'bearer',
|
|
89
|
+
protocol: 'openai-chat',
|
|
90
|
+
countTokens: false, // 08-25 体检:404
|
|
91
|
+
}),
|
|
92
|
+
// 08-21 晚:Zen 第二入口 /zen/go(= OpenCode Go 订阅,$10/月换 $12/5h·$30/周·$60/月)。跟 'zen' 同一把钥匙、
|
|
93
|
+
// **目录不同**(免费 stealth 行只在 /zen/v1,Go 目录里是常驻付费款)。响应带 `cost`(流式在 [DONE] 之后
|
|
94
|
+
// 补 {"choices":[],"cost":"…"})与 cached_tokens → lib/ingress/upstream-billing.js。今天内置的 API 行大半挂这儿。
|
|
62
95
|
zenGo: Object.freeze({
|
|
63
96
|
label: 'OpenCode Zen Go',
|
|
64
97
|
baseUrl: process.env.NODESIGN_UPSTREAM_ZEN_GO_URL || 'https://opencode.ai/zen/go/v1', // 探针覆盖,同上
|
|
@@ -67,6 +100,63 @@ export const UPSTREAMS_BUILTIN = Object.freeze({
|
|
|
67
100
|
protocol: 'openai-chat',
|
|
68
101
|
countTokens: false,
|
|
69
102
|
}),
|
|
103
|
+
// Z.ai / 智谱官方(08-26):站主自己的 **Coding Plan 订阅**钥匙。
|
|
104
|
+
// ⚠️ 这把钥匙只认订阅入口:按量的 `/api/paas/v4` 一律 1113「余额不足」,
|
|
105
|
+
// 能用的是 `/api/anthropic`(Anthropic 原生)和 `/api/coding/paas/v4`(OpenAI 格式)。
|
|
106
|
+
// **它自己就说 Anthropic 协议**,所以不写 protocol = 透传,不过 openai-chat 转换层
|
|
107
|
+
// (同 gmi 的理由:链路上少一层翻译就少一类 quirk)。
|
|
108
|
+
//
|
|
109
|
+
// 08-26 用 server/_probe-upstream.mjs 体检 glm-5.3-flash 拿 8/9:顶层图 ✓ /
|
|
110
|
+
// **tool_result 图原样直通** ✓(不需要 liftImages)/ 流式 tool_use 分片拼得回 ✓ /
|
|
111
|
+
// max_tokens 128k 不炸 ✓ / png+webp+jpeg 三种图都认 ✓;只差 prompt cache(没有)。
|
|
112
|
+
//
|
|
113
|
+
// ⛔⛔ **countTokens 必须是 false,而且理由跟别家不一样**:这家的 count_tokens
|
|
114
|
+
// **不是 404,是恒回 `{"input_tokens":0}` 的桩**(同一段文本真实请求计 462)。
|
|
115
|
+
// 入口对 `countTokens: true` 的语义是「先转发、404 才回退本地」—— 一个 200 的 0
|
|
116
|
+
// 会被当真话传给 CLI,**auto-compact 就永远不触发**,会话一路涨到撞上游硬上限才 400。
|
|
117
|
+
// 荒谬的数反而安全,这个"看起来是正常响应"的 0 才是最危险的那种。
|
|
118
|
+
//
|
|
119
|
+
// ⚠️ 并发上限 **3**(08-26 实测:并发 2/3 全过,并发 4 当场两发 429,0.5s 就回)。
|
|
120
|
+
// 串行完美(10 次间隔 1s 全 200)—— 跟 GMI 那种"串行都掉一半"是两种病。
|
|
121
|
+
// ⛔ 上游 `zai`(Z.ai / 智谱官方直连,Anthropic 原生透传)**2026-08-30 随它唯一那条行一起删**:
|
|
122
|
+
// 站主那条包月订阅的额度耗尽了。删之前查过的两处(撤上游照这个查):① 全表只有 glm-5.3-flash-zai
|
|
123
|
+
// 一行挂在它上面;② 没有别的行的 fastModel 指着那一行(Ox 那次就是栽在这里,失效还不出声)。
|
|
124
|
+
// 复牌配方:baseUrl `https://api.z.ai/api/anthropic`(⚠️ 不带 /v1,透传路是 baseUrl + 原始路径)、
|
|
125
|
+
// keyEnv `NODESIGN_UPSTREAM_ZAI_KEY`、authStyle `x-api-key`(bearer 也通)、
|
|
126
|
+
// ⛔ `countTokens: false` 必须留着 —— 这家的 count_tokens 不是 404 而是**恒回 0 的 200**,
|
|
127
|
+
// 入口会把这个 0 当真话传给 CLI,auto-compact 就永远不触发,会话一路涨到撞上游硬上限才 400。
|
|
128
|
+
// 并发上限 3(08-26 实测:2/3 全过,第 4 发当场 429)。
|
|
129
|
+
// Merge Gateway(08-27):**多厂商聚合网关**(api-gateway.merge.dev)。一个模型名后面挂着好几家部署
|
|
130
|
+
// (GLM-5.3-Flash = particle + zai),网关自己挑,响应头 `x-merge-vendor` 说这一发是谁服务的。
|
|
131
|
+
// ⭐⭐ 08-28 更正前一句「挑哪家决定不了」:**body 里写 `vendor: '<家名>'` 就能点名**,是硬闸而不是
|
|
132
|
+
// 建议(写不存在的家回 400「Vendor 'nope' does not serve model」)。头 x-merge-vendor / x-vendor、
|
|
133
|
+
// routing.vendor、模型名后缀 @zai/:zai 确实都不管用,上一趟试到这里就收工了 —— ⛔ 真正的失误是
|
|
134
|
+
// **没读 `x-merge-vendor` 响应头**:判「点名成没成」的唯一判据就是它,而当时拿"答得对不对"当判据,
|
|
135
|
+
// 那个量在轮盘下本来就时对时错。谁在服务这个模型:GET /v1/models?provider=zai 的 `vendors` 映射
|
|
136
|
+
// (particle / zai / baseten),三家的能力位和单价分开声明(baseten 同模型贵 10 倍)。
|
|
137
|
+
// 钥匙 `~/apikey/merge.md`(`mg_` 46 字符),bearer 与 x-api-key 都通,取 bearer。账只在响应头上:
|
|
138
|
+
// `x-credit-balance-usd: 20.00` / `x-budget-limit-usd: 10.00`,**没有余额端点**(/v1/usage 等全 404)。
|
|
139
|
+
//
|
|
140
|
+
// ⛔ **08-30 更正上一段**:写的是**偏好序** `vendors:['zai','particle']` 而不是点死一家(见行内
|
|
141
|
+
// bodyExtra 那段)。08-28 记的「particle 一次只收一张图」这条**部分作废**:上限从 1 张放宽到 **8 张**,
|
|
142
|
+
// 8 张以内两家表现一致,第 9 张起 particle 一律 400 —— 所以 zai 打头的理由没变,只是换了个数。
|
|
143
|
+
// → 08-27 记的「约 7~10% 瞎图」和「Anthropic 腿的图路死」,多半也是同一家当时的账,不是协议的账。
|
|
144
|
+
// ⭐ 留给下一个人的判据:**厂商的能力位是会变的,别把一次实测当常量**;判"这家还瞎不瞎图"要
|
|
145
|
+
// 重跑 `_merge-vendor-check.mjs`,别读注释。
|
|
146
|
+
// 仍走 openai-chat:08-27 那趟它 27 发 25 对(Anthropic 腿当时 tool_result 里的图被当**文本**塞进去,
|
|
147
|
+
// 10KB base64 → prompt 8300 token;那次没点名,归因存疑)。08-28 两条腿点名后复测表现相同 ——
|
|
148
|
+
// 换腿不再被图挡着,但也没有换的理由,不动。
|
|
149
|
+
//
|
|
150
|
+
// count_tokens 这家**有**(回真数不是桩),仍写 false:走 openai-chat 的行不该从 Anthropic 端口取数,
|
|
151
|
+
// 且实测对中文超收 1.67 倍(同段中文 count 1487 / 真实 892),跟本站本地估算一样偏高,取来不会更准。
|
|
152
|
+
merge: Object.freeze({
|
|
153
|
+
label: 'Merge Gateway api-gateway.merge.dev',
|
|
154
|
+
baseUrl: process.env.NODESIGN_UPSTREAM_MERGE_URL || 'https://api-gateway.merge.dev/v1',
|
|
155
|
+
keyEnv: 'NODESIGN_UPSTREAM_MERGE_KEY',
|
|
156
|
+
authStyle: 'bearer',
|
|
157
|
+
protocol: 'openai-chat',
|
|
158
|
+
countTokens: false, // 见上:不是没有,是不该从这条腿取
|
|
159
|
+
}),
|
|
70
160
|
});
|
|
71
161
|
|
|
72
162
|
/**
|
|
@@ -77,7 +167,12 @@ export const UPSTREAMS_BUILTIN = Object.freeze({
|
|
|
77
167
|
* api API 通路配置(没有 = 订阅通路):
|
|
78
168
|
* upstream UPSTREAMS 的 key
|
|
79
169
|
* wireModel 发给上游的真模型名(入口出口替换)
|
|
80
|
-
* sdkAlias 喂 SDK 的 spoof
|
|
170
|
+
* sdkAlias 喂 SDK 的 spoof 名。**可选,加新行默认不用写**:不写 = 自动用共用别名
|
|
171
|
+
* (SHARED_SDK_ALIAS,model-context.js 派生时补上)走会话级路由,全表反查
|
|
172
|
+
* 认不出这行的 alias(没会话前缀的请求 502,探针带 /__nd/<sid> 前缀)。
|
|
173
|
+
* 显式写 = 独占一个 1M 坑位(必须是 SDK 认识的订阅 Claude 名,⚠️独占名
|
|
174
|
+
* 全表唯一、加载断言),换来的是没会话也能按 alias 反查(裸探针能直呼)。
|
|
175
|
+
* 七个独占坑位已全部占满(见下面 SHARED_SDK_ALIAS 注释),新行别惦记
|
|
81
176
|
* fastModel 该路的 helper/subagent 模型(必须也是本表可路由的 id;
|
|
82
177
|
* 订阅的 haiku 在 API 模式不可用 —— binary 见 API key 即弃 OAuth,
|
|
83
178
|
* helper 请求同样走唯一的 BASE_URL)
|
|
@@ -99,9 +194,55 @@ export const UPSTREAMS_BUILTIN = Object.freeze({
|
|
|
99
194
|
*
|
|
100
195
|
* 口径(08-21 用户拍板):有自己标的用自己的(deepseek 蓝鲸、gemini 星),
|
|
101
196
|
* **隐身/神秘的免费行一律用供应商 OpenCode 的方块标**(Ox 这类不公开身份的模型)。
|
|
197
|
+
*
|
|
198
|
+
* 08-26 补一家 'glm':Ox 下架后接替它的 glm-5.3-flash 是**公开身份**的 Z.ai 模型,
|
|
199
|
+
* 按上面那条口径就该有自己的标,不再走供应商方块。'opencode' 那枚留着 —— 它是给
|
|
200
|
+
* 下一个隐身行准备的,Zen 目录里那类行一直有(big-pickle 之类)。
|
|
102
201
|
*/
|
|
103
202
|
// 'custom':本地分发版用户自己配的插槽(runtime/local-config.js)没填 brand 时的默认牌子,前端用通用标
|
|
104
|
-
export const BRANDS = Object.freeze(['claude', 'deepseek', 'opencode', 'gemini', 'qwen', 'custom']);
|
|
203
|
+
export const BRANDS = Object.freeze(['claude', 'deepseek', 'opencode', 'glm', 'gemini', 'qwen', 'minimax', 'kimi', 'custom']);
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Merge 网关上那两条 GLM 行**共用**的 api 配置:它们是同一个模型、同一个网关,
|
|
207
|
+
* **差别只有厂商**(各自行里的 `bodyExtra.vendors`;为什么要分两行见表里那两行上方一整段)。
|
|
208
|
+
* ⛔ 写成共用不是为了省行数:思考档 / maxOutput / 价 / helper 行这些**必须对两条同时生效**,
|
|
209
|
+
* 分开写迟早漂。改厂商以外的任何东西改这里,model-context.test.js 有断言盯着两行别分家。
|
|
210
|
+
*/
|
|
211
|
+
const GLM_MERGE_API = Object.freeze({
|
|
212
|
+
upstream: 'merge', wireModel: 'zai/glm-5.3-flash',
|
|
213
|
+
// 不写 sdkAlias = 共用别名(SHARED_SDK_ALIAS)走会话级路由,08-25 起的默认写法
|
|
214
|
+
fastModel: 'deepseek-v4-flash-helper', // helper 挑最耐久的线不是最便宜的线:这家的厂商轮盘不该让标题/压缩也跟着掷骰子
|
|
215
|
+
thinking: 'strip', // 出口删 thinking 字段;转换层按 reasoningEffort 发 reasoning_effort
|
|
216
|
+
// 08-27 实测这家 low|medium|high|max **四档都收**(thinking 字数 922/981/1753/1843),
|
|
217
|
+
// 比 zen 系宽(那边没有 medium)。取 high 跟另外两条 glm 行一致。
|
|
218
|
+
reasoningEffort: 'high',
|
|
219
|
+
maxOutput: 131_072, // 131072 实测直接吃下
|
|
220
|
+
// ⚠️ 这家的思考文本字段叫 **thinking / thinking_signature**,不是 zen 系的 reasoning_content
|
|
221
|
+
// (08-27 第一趟真 SDK 循环"看到 thinking 块:false"就是这么来的)。转换层两处已改成
|
|
222
|
+
// 「reasoning_content 优先、回退 thinking」,所以这行不用配任何东西 —— 记在这儿是给下一家看的:
|
|
223
|
+
// **接新行时先看一眼它的思考字段叫什么**,掉了不报错、只是用户看不见思考。
|
|
224
|
+
// 不设 liftImages:openai-chat 转换层本身就把 tool_result 里的图搬进随后的 user 消息(同 zenGo 那行)
|
|
225
|
+
// 网关目录价($0.015/$0.05,缓存读 $0.003)。⚠️ 它的响应把真金额放在 **usage.cost** 里而不是
|
|
226
|
+
// 顶层 cost(Zen 是顶层),lib/ingress/upstream-billing.js 的 upstreamCostOf 两处都认,
|
|
227
|
+
// 所以额度口径以上游自报为准,这里的表价是兜底
|
|
228
|
+
prices: { input: 0.015, output: 0.05, cacheRead: 0.003, cacheWrite: 0 },
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* **共用 spoof 别名**:`sdkAlias` 不写时的默认值(model-context.js 派生时补上)。
|
|
233
|
+
*
|
|
234
|
+
* SDK binary 认识的 1M 名只有七个(strings 扫出来:opus-4-6/4-7/4-8/5、sonnet-4-5-20250929/4-6/5),
|
|
235
|
+
* 六个已被内置行独占、sonnet-5[1m] 是订阅默认行不许被路由 —— 也就是说「一行一个独占别名」这条路
|
|
236
|
+
* 已经走到头。共用别名的行(= 不写 sdkAlias 的行 + 本地分发版的全部外部插槽)**不进 WIRE_LOOKUP
|
|
237
|
+
* 的 alias 键、只按 id 可查**,靠会话级路由分辨(lib/ingress/session-routes.js:一个会话只认
|
|
238
|
+
* 自己那行和自己的 fast 行,主行优先)。外部插槽(runtime/local-config.js)一直是这么跑的,
|
|
239
|
+
* 08-25 起内置行也走这条默认路 —— **加新模型行不用再考虑别名这件事**。
|
|
240
|
+
*
|
|
241
|
+
* ⚠️ 代价:**没注册会话的请求用这个名发过来一律 502**(全表反查里没有它)—— 探针要带会话前缀
|
|
242
|
+
* (`/__nd/<sid>/v1/messages`),直呼 appModel id 也行。
|
|
243
|
+
* ⚠️ 它必须始终是表内一条订阅 Claude 行(SDK 才认识、窗口才查得到)——model-context.js 加载断言。
|
|
244
|
+
*/
|
|
245
|
+
export const SHARED_SDK_ALIAS = 'claude-sonnet-4-6[1m]';
|
|
105
246
|
|
|
106
247
|
export const MODELS_BUILTIN = Object.freeze([
|
|
107
248
|
// ── 订阅通路(Claude 真名,零注入)──
|
|
@@ -116,19 +257,22 @@ export const MODELS_BUILTIN = Object.freeze([
|
|
|
116
257
|
{ id: 'claude-sonnet-5', window: 200_000, brand: 'claude' },
|
|
117
258
|
{ id: 'claude-opus-5', window: 200_000, brand: 'claude' },
|
|
118
259
|
{ id: 'claude-opus-4-7[1m]', window: 1_000_000, brand: 'claude' },
|
|
119
|
-
{ id: 'claude-sonnet-4-6[1m]', window: 1_000_000, brand: 'claude' },
|
|
260
|
+
{ id: 'claude-sonnet-4-6[1m]', window: 1_000_000, brand: 'claude' }, // = SHARED_SDK_ALIAS(共用别名的本体行,删了它加载断言会炸)
|
|
120
261
|
{ id: 'claude-opus-4-7', window: 200_000, brand: 'claude' },
|
|
121
262
|
{ id: 'claude-sonnet-4-6', window: 200_000, brand: 'claude' },
|
|
122
263
|
{ id: 'claude-haiku-4-5', window: 200_000, brand: 'claude' },
|
|
123
264
|
// 只当 alias 用的订阅名(08-20):SDK 二进制认识的 1M 名里还空着的一个(strings 扫过:
|
|
124
265
|
// opus-4-6/4-7/4-8/5、sonnet-4-5-20250929/4-6/5 七个 [1m]),给 gemini-3.7-flash 行做 spoof。
|
|
125
266
|
{ id: 'claude-opus-4-6[1m]', window: 1_000_000, brand: 'claude' },
|
|
126
|
-
//
|
|
267
|
+
// 08-21 给 ox-alpha 做 spoof,08-26 随 Ox 整族下架**空出来**(行留着:它是 SDK 认识的 1M 名,是坑位不是垃圾)
|
|
127
268
|
{ id: 'claude-opus-4-8[1m]', window: 1_000_000, brand: 'claude' },
|
|
128
|
-
//
|
|
269
|
+
// 同上,08-21 晚给 ox-alpha-max,08-26 也空出来了
|
|
129
270
|
{ id: 'claude-sonnet-4-5-20250929[1m]', window: 1_000_000, brand: 'claude' },
|
|
130
|
-
// alias 池现状(08-
|
|
131
|
-
// opus-
|
|
271
|
+
// 独占 alias 池现状(08-26 更新):opus-4-6[1m]→gemini-3.7-flash、opus-4-7[1m]→deepseek-v4-flash-vision、opus-5[1m]→qwen;
|
|
272
|
+
// **空着三个**:opus-4-8[1m]、sonnet-4-5-20250929[1m]、haiku-4-5(Ox 三行 08-26 下架腾出来的);
|
|
273
|
+
// sonnet-5[1m] 是订阅默认行不许被路由;**sonnet-4-6[1m] = SHARED_SDK_ALIAS**(共用别名,永远不许被独占)。
|
|
274
|
+
// ⚠️ 空出来不等于新行该去占:08-25 起加新行的默认写法就是**不写 sdkAlias**(走共用别名 + 会话级路由),
|
|
275
|
+
// 这三个坑位留给真正需要"没会话也能按 alias 反查"的场合(探针、跨进程重放那类)。
|
|
132
276
|
|
|
133
277
|
// ── API 通路 ──
|
|
134
278
|
// kimi-k2.6 行与 moonshot 上游 08-21 深夜清掉(用户:「把 kimi 3.1pro 的槽都清理一下」):NoDesk 退役后没走过流量,
|
|
@@ -222,71 +366,230 @@ export const MODELS_BUILTIN = Object.freeze([
|
|
|
222
366
|
api: {
|
|
223
367
|
upstream: 'zenGo', wireModel: 'deepseek-v4-flash-vision-exp',
|
|
224
368
|
sdkAlias: 'claude-opus-4-7[1m]', // kimi 退役腾出来的 1M 名;窗口由 CLAUDE_CODE_AUTO_COMPACT_WINDOW=272k 钉住
|
|
225
|
-
|
|
369
|
+
// 08-26 从 ox-alpha-helper 改过来:Ox 整族下架(上游 401 "Model ox-alpha-free is not supported"),
|
|
370
|
+
// 那条 helper 一起没了。⚠️ 这处失效**完全不出声** —— helper 角色 ingress 不推 onNotice、不报
|
|
371
|
+
// onTruncated,用户只会觉得"标题没生成、压缩没做成"。改挂 08-25 建的通用 helper 行
|
|
372
|
+
fastModel: 'deepseek-v4-flash-helper',
|
|
226
373
|
thinking: 'strip',
|
|
227
374
|
reasoningEffort: 'high',
|
|
228
375
|
maxOutput: 128_000,
|
|
229
376
|
prices: { input: 0.44, output: 1.32, cacheRead: 0.014, cacheWrite: 0 },
|
|
230
377
|
},
|
|
231
378
|
},
|
|
232
|
-
//
|
|
233
|
-
//
|
|
234
|
-
//
|
|
235
|
-
//
|
|
236
|
-
//
|
|
237
|
-
//
|
|
379
|
+
// ⛔ `glm-5.3-flash`(/zen/go 上那条,08-26 接替下架的 Ox Alpha)**08-27 撤掉**:用户拍板。
|
|
380
|
+
// 同一个模型现在还有两条线(下面的 zai 官方直连、再下面的 merge 网关),而这条是三条里最贵的
|
|
381
|
+
// ($0.15/$0.50 缓存 $0.03,是 merge 那条的十倍),留着只会让人在 picker 里挑错。
|
|
382
|
+
// 撤之前查过的两处(下次删行照这个查):① 全表没有别的行的 fastModel 指着它(Ox 那次就是栽在这里,
|
|
383
|
+
// 失效还不出声);② 生产累计只跑过 9 个 run($0.26),session-config 里钉着它的会话只有 2 个 ——
|
|
384
|
+
// 那两个会拿到 403 MODEL_NOT_ALLOWED(「这个会话指向的模型现在不可用,请换一个」),fail-loud,
|
|
385
|
+
// 表里没有"退役 → 继任"的映射,也**不会**静默落到订阅通路。
|
|
386
|
+
// ⚠️ 上游 `zenGo` 本身留着:deepseek 视觉行和全站唯一的 helper 行都挂在它上面。
|
|
387
|
+
// 复牌就是照下面两条 glm 行的形状写一份:upstream 'zenGo'、wireModel 'glm-5.3-flash'、
|
|
388
|
+
// 窗口跟那两行取同一个数(08-30 起是 1M)、thinking strip、reasoningEffort high、
|
|
389
|
+
// maxOutput 131072、prices 0.15/0.50/0.03/0。
|
|
390
|
+
// ⛔⛔ `glm-5.3-flash-zai`(Z.ai 官方直连,08-26 接替下架的 Ox、08-27 起当全员默认行)
|
|
391
|
+
// **2026-08-30 撤掉:站主那条包月订阅的额度耗尽了**。
|
|
392
|
+
// ⭐ 撤的时候上游原话是:`[1310][Weekly/Monthly Limit Exhausted. Your limit will reset at
|
|
393
|
+
// 2026-09-03 02:23:20]` —— **不是订阅到期,是周/月配额用尽,09-03 会自己重置**。
|
|
394
|
+
// 所以这不见得是永别:09-03 之后想复牌,照下面的配方把行和上游加回来、.env 里那行钥匙
|
|
395
|
+
// 去掉 # 即可。⚠️ 但复牌**不等于自动拿回默认**:`default: true` 现在在 merge 那行上,
|
|
396
|
+
// 而且"默认行是谁"有三条断言钉着(见 model-context.test.js),要挪得先在那儿绊一下。
|
|
397
|
+
// ⚠️ 也别忘了它每周都会再耗尽一次 —— 真要长期当默认,得先想清楚"配额用尽那天怎么办",
|
|
398
|
+
// 这次的答案是人工撤行,那不是个能每周做一遍的答案。这一行从 08-26 起就写着「用完就撤」,
|
|
399
|
+
// 撤法也提前写好了,这次是照着执行的:删行 + 删上游 zai + 删 .env 的 NODESIGN_UPSTREAM_ZAI_KEY
|
|
400
|
+
// + **同一个动作把 `default: true` 挪走**(那条代价当时就点名了:不挪的话新会话第一轮就落在
|
|
401
|
+
// 一个不存在的行上,而"默认行必须免费"那条断言拦不住这一种 —— 它只看价,不看这行还在不在)。
|
|
402
|
+
// 撤之前查的两处照旧:① 没有别的行的 fastModel 指着它;② 只有它挂在上游 zai 上。
|
|
403
|
+
// 钉着它的 15 个会话(13 个项目、大多是真的 basic 用户)**改钉到下面那条 merge 行** ——
|
|
404
|
+
// 同一个模型,对话中途不换性格;不清空钉子是因为清了会落到 NODESIGN_MODEL 的订阅行,
|
|
405
|
+
// basic 用户照样 403。表里仍然没有"退役 → 继任"的自动映射,那是数据迁移不是代码。
|
|
406
|
+
// 复牌配方(上游注释里那份没删):upstream 'zai'、wireModel 'glm-5.3-flash'、窗口跟 merge 行取同一个数、
|
|
407
|
+
// thinking 'strip'(⚠️ budget_tokens 在这家不管用,要"不想"走 disabled)、liftImages false、
|
|
408
|
+
// maxOutput 131072、四价全 0、fastModel 'deepseek-v4-flash-helper'(helper 特意不留在这家:并发桶只有 3)。
|
|
409
|
+
// ── Merge 网关 · GLM-5.3-Flash(08-27)── 同一个模型的**第三条线**。照 08-26 那次的判断做成独立行、
|
|
410
|
+
// 不做动态路由:三家各有各的 prompt cache,一个会话在几条线之间跳,跳一次几边都是冷的。
|
|
411
|
+
// 三条线的实测差别(都是真跑出来的,不是抄文档;接第四条时照这个格式对账):
|
|
412
|
+
// zai 官方直连(默认行) merge 网关(本行)
|
|
413
|
+
// 协议 Anthropic 原生透传 **只能** OpenAI chat(见上游注释)
|
|
414
|
+
// prompt cache **没有** 真命中(9038 → 第二发 cache_read 9024)
|
|
415
|
+
// 花钱 包月订阅,记 0(限时) **$0.015/$0.05**,真金白银但全表最便宜的一档
|
|
416
|
+
// 并发 **上限 3** 6 并发全 200(15.8s,没撞到上限)
|
|
417
|
+
// 视觉 稳 **约 7~10% 的请求会瞎**(厂商轮盘,见上游注释)
|
|
418
|
+
// count_tokens 恒 0 的桩 → 关掉 有且回真数,但仍关掉(理由见上游注释)
|
|
419
|
+
// 08-27 撤掉的 zenGo 那条($0.15/$0.50)是三条里最贵的,本行的输入价是它的 1/10:
|
|
420
|
+
// 满窗一轮的缓存读从 $0.03 掉到 $0.003。**zai 那条订阅用完之后,这条是接得住量的那一条**
|
|
421
|
+
// (有缓存、并发不紧),只是接默认之前得先解决瞎图那 7~10%(或者接受它)。
|
|
422
|
+
// ── Merge 网关上的**两条** GLM 行(08-30 深夜拆开):同模型、同网关、同价,**差别只有厂商** ──
|
|
423
|
+
// particle:内联图 **8 张是硬上限** —— n=8 ✅,n=9 起一律 400
|
|
424
|
+
// 「GLM requests accept at most 8 inline PNG…」(9/10/12/16/20 全挂)。
|
|
425
|
+
// zai:n=4→20 全 ✅,且抽问第 1/10/16 张里印的词都念得出来 —— 是真读了,不是收下再悄悄丢。
|
|
426
|
+
// 速度(28 万上下文、逐轮追加、缓存 4/4 命中):particle 每步 1.8-2.8s / 冷启 14.4s,
|
|
427
|
+
// zai 每步 3.9-7.0s / 冷启 20.6s,5 轮同价 $0.00787。⛔ 早前「只快 20%」是 6.5 万上量的,
|
|
428
|
+
// 差距随上下文放大 —— **这类账必须在真实体量上量**。
|
|
429
|
+
// → 默认行(设计)走 zai:真会话一个就有 51 张图,图多是这个产品的主路径不是边角。
|
|
430
|
+
// 演出行走 particle:rp 模式的会话实测最多 6 张图(见那行的注释)。
|
|
431
|
+
// ⛔⛔ 留给下一个人的判据:**复验 particle 的图必须发 9 张以上。**08-30 白天那趟用三张图复测,
|
|
432
|
+
// 得出「多图 400 已经没了 36/36」于是把默认改成 particle,上线 40 分钟就被真会话打回 ——
|
|
433
|
+
// 那条限制不是没了,是从 1 张放宽到 8 张,三张的题目它根本不需要拦。同族老账见
|
|
434
|
+
// feedback-verify-the-instrument:判一道闸在不在,要给它一个它必须拦的东西。
|
|
435
|
+
// ⚠️ particle 次要弱项:图散在多轮历史 + **请求没声明 tools** 时只看得见最后一张(20 发挂 8 发);
|
|
436
|
+
// 声明了 tools 就 20/20。本站请求永远带 tools,撞不到。
|
|
437
|
+
// ⭐⭐ 真正决定「一步要等多久」的是**这一轮缓存命不命中**,不是挑了哪家:命中时上下文从 4.5 万
|
|
438
|
+
// 涨到 28 万、延迟只从 5s 到 6.7s;不命中一路涨到 29s(compact 后必冷一轮,28 万 14-20s)。
|
|
439
|
+
// vendors 的语义是「按顺序取第一个**可用的**」(OpenAPI 原话 "First available wins.")。
|
|
440
|
+
// ⚠️ 「后备」含金量有限:实测**不在错误后转移**(`['zai','baseten']` 拿一个 zai 必拒的请求试,
|
|
441
|
+
// 回 400 而不是转给 baseten)。particle 兜的是「zai 被标成不可用」那一档,不是「zai 这一发报错」。
|
|
442
|
+
// ⛔ **baseten 不许进这两串**:同一发请求 usage.cost $0.000626,是 particle 的 48 倍、zai 的 11 倍。
|
|
443
|
+
// ⛔ 「不指定让网关自己挑」是假出路:不点名实测 20/20 全落 zai,而网关的默认自己会变(08-28 裸请求
|
|
444
|
+
// 8/8 落 particle)。它自带的 round_robin / least_latency / 策略 API 也不能用 —— **全是按请求选的,
|
|
445
|
+
// 而 prompt cache 每家一份跨不过去**(同一前缀换一家 cached 立刻归 0、贵 5 倍)=每轮都冷。
|
|
446
|
+
// ⏸ 曾按 sessionId 哈希做过会话粘性分配(`4939279`),撤了;要回来去那个 commit 拿。
|
|
447
|
+
{
|
|
448
|
+
// 08-30 起 **1M**(跟上面那行一起开,用户拍板)。网关目录里这个模型本来就写的 1000000
|
|
449
|
+
// (max_output 131072),此前的 272k 是我们自己收的口。两条 glm 行同时改,换线时
|
|
450
|
+
// auto-compact 的分母仍然一致,上下文条不会"换条线突然缩水"。
|
|
451
|
+
// ⭐ 跟 zai 那行不同的是**这条有 prompt cache**(9038 → 第二发 cache_read 9024),
|
|
452
|
+
// 所以窗口开大对它的边际成本温和得多:重传的部分大都按 $0.003/M 的缓存读走。
|
|
453
|
+
id: 'glm-5.3-flash-merge', window: 1_000_000, brand: 'glm',
|
|
454
|
+
// 08-27 用户拍板**直接对全员开**(含 basic):跟 deepseek 视觉行同一套管法 ——
|
|
455
|
+
// 它**不是免费行**(四价非 0),走的是每日美元额度,basic 的 $5/天 + 表价记账管着它,
|
|
456
|
+
// 而这行的单价是全表最低的一档,同样的钱能跑十倍的量。
|
|
457
|
+
// 08-28 之前这里写着"偶发瞎图约 7~10%"—— 那是没点名 vendor 时的账,点名之后 desc 里的
|
|
458
|
+
// "偶尔会漏看图"已撤。要收回这行就在 select 里加 `gate: 'localGen'` 一处(三个消费方都走 selectableModelsFor)。
|
|
459
|
+
// 08-30 desc 砍短:价格表撤进注释,picker 里只留"极便宜"这个判断。
|
|
460
|
+
// ⭐⭐ **08-30 起接过全员默认**(zai 那条订阅额度耗尽撤行,用户拍板「默认丢到 merge 那边」)。
|
|
461
|
+
// 这一脚**故意踩破了「默认行必须是免费行」那条规矩**,所以把破了之后各处怎么变写在这儿:
|
|
462
|
+
// ① 钱:不再走 turn.js 的按轮次免费闸(300 轮/天),改走美元闸。真实单价按 zai 那行的
|
|
463
|
+
// token 画像折算 ≈ **$0.0023/轮**(均输入 31.6k / 输出 3.0k / 缓存读 567k),basic 的
|
|
464
|
+
// $5/天 ≈ 2000 轮 —— 比免费行的 300 轮/天还宽。**钱不是这次的风险**。
|
|
465
|
+
// ② ⛔⛔ 并发才是:`checkConcurrency` 原来按"免费/付费"分档,付费行走
|
|
466
|
+
// NODESIGN_MAX_CONCURRENT_RUNS(.env 里是 **3**),免费行走 FREE_MAX(12)+ 内存闸。
|
|
467
|
+
// 照原样改完,站点默认路径的并发天花板会从 12 掉到 3,而实测峰值在飞 turn 是 4 ——
|
|
468
|
+
// 第 4 个人当场吃「现在有点挤」。所以同一刀把那道闸的判据改成**订阅/非订阅**:
|
|
469
|
+
// 那个 3 从来是护站主 Claude 订阅的,不是护一个 $0.015/M 的网关(见 lib/quota.js)。
|
|
470
|
+
// ③ 单点:厂商偏好序第一顺位是 zai(`vendors:['zai','particle']`),而网关**不在错误后转移**,
|
|
471
|
+
// 所以那一家挂 = 全站默认路径挂;掉到 particle 也只有不带图的会话还能用(8 张上限)。
|
|
472
|
+
// ⚠️ label 第二段是这两行**唯一**的区分(第一段一模一样):`compactLabel` 按"撞不撞名"
|
|
473
|
+
// 自己决定按钮上印长名还是短名,表里不用替它做这个决定,但第二段不能砍。
|
|
474
|
+
select: { label: 'GLM-5.3-Flash · 设计', desc: '有视觉 · 图不限张数 · 1M 上下文 · 极便宜', default: true },
|
|
475
|
+
api: { ...GLM_MERGE_API, bodyExtra: { vendors: ['zai', 'particle'] } },
|
|
476
|
+
},
|
|
238
477
|
{
|
|
239
|
-
|
|
240
|
-
//
|
|
241
|
-
|
|
478
|
+
// ⭐⭐ 08-30 深夜加的第二条(用户拍板「让 RP 和设计玩家对号入座」)。跟上面那行同模型同价,
|
|
479
|
+
// 只是把厂商换成 particle:**每步更快,代价是内联图上限 8 张**(见上面那整段)。
|
|
480
|
+
// ⭐ 拍板前先量了真会话,用户的直觉是对的:rp 模式 12 个会话图数 0/0/0/0/0/0/0/1/1/2/5/6 ——
|
|
481
|
+
// 一个都没到过 8;design 模式 25 个里有 7 个超过 8(9/9/10/11/21/31/51)。
|
|
482
|
+
// ⚠️ 但最高那个 6 离 8 只差两张,所以撞线是迟早的事:转换层把那条 400 翻译成了
|
|
483
|
+
// 「换到设计那条线」的人话(lib/ingress/upstream-error-hints.js),别把它删了。
|
|
484
|
+
// ⛔ 不设 default —— 默认永远是上面那条(图不限张数的那条兜得住所有人)。
|
|
485
|
+
id: 'glm-5.3-flash-rp', window: 1_000_000, brand: 'glm',
|
|
486
|
+
select: { label: 'GLM-5.3-Flash · 演出', desc: '每步更快 · 但整场最多 8 张图 · 1M 上下文 · 极便宜' },
|
|
487
|
+
api: { ...GLM_MERGE_API, bodyExtra: { vendors: ['particle'] } },
|
|
488
|
+
},
|
|
489
|
+
// ── GMI Cloud · MiniMax(08-25)── 两行都是 GMI 标 `is_free` 的免费部署;账户无余额,付费行 402,
|
|
490
|
+
// 所以这条上游不存在"选错模型静默烧钱"。目录价(免费期结束后才会真收):M3 $0.60/$2.40 缓存 $0.12,
|
|
491
|
+
// **prompt 超过 512k 单价翻倍**($1.20/$4.80);M2.7 $0.30/$1.20 缓存 $0.06。今天一律记 0。
|
|
492
|
+
{
|
|
493
|
+
// 真窗口 1048576。272k 是用户 08-25 拍板的档(跟 deepseek 行同一个理由:每轮都要重传全量上下文,
|
|
494
|
+
// 这台机器的出网流量超 200GiB/月要真付钱;且正好落在 GMI「512k 以上翻倍」那道价格坎下面)。
|
|
495
|
+
id: 'minimax-m3', window: 272_000, brand: 'minimax',
|
|
496
|
+
// 08-26 到 08-27 当过全员默认,08-27 把 `default: true` 交给 zai 那条官方直连(用户拍板):
|
|
497
|
+
// 这条上游 08-26 实测串行 4/8 大面积限流(当天生产日志 106 次 429),当默认不够好。
|
|
498
|
+
// ⭐ 它仍是**候补默认**:四价全 0 = modelIsFree,公开注册号的经营态靠的是免费行走 turn.js 的
|
|
499
|
+
// 按轮次闸而不是金额闸 —— zai 那条订阅用完撤掉的那天,`default: true` 要么回到这里,
|
|
500
|
+
// 要么去别的四价全 0 的行(⛔ 不许落在付费行:那等于公开注册就直接烧钱)。
|
|
501
|
+
// ⚠️ 这行的免费是 GMI「限时免费部署」,免费期一结束这条候补也不成立了
|
|
502
|
+
select: { label: 'MiniMax M3(免费)', desc: '免费 · 有视觉 · 272k 上下文 · 自己决定想多久' },
|
|
242
503
|
api: {
|
|
243
|
-
upstream: '
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
fastModel: '
|
|
247
|
-
|
|
248
|
-
//
|
|
249
|
-
//
|
|
250
|
-
// "
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
// 不设 liftImages:openai-chat 转换层本身就把 tool_result 里的图搬进随后的 user 消息
|
|
254
|
-
// (OpenAI 的 tool 角色消息装不下图,上游放了会挂死 120s)。同一件事只留一条路。
|
|
504
|
+
upstream: 'gmi', wireModel: 'MiniMaxAI/MiniMax-M3',
|
|
505
|
+
// 不写 sdkAlias = 共用别名(SHARED_SDK_ALIAS)走会话级路由:会话认得出,
|
|
506
|
+
// 全表反查认不出(探针要带会话前缀)。独占 1M 坑位 08-25 起已满员,新行都走这条默认路。
|
|
507
|
+
fastModel: 'deepseek-v4-flash-helper',
|
|
508
|
+
// ⭐ M3 的思考是**开关不是档位**:GMI 部署实测 adaptive(模型自己决定想不想、想多久)/
|
|
509
|
+
// disabled(不想)/ enabled+budget(每轮强制想)三种都收,但没有 low|medium|high 这套档。
|
|
510
|
+
// 本站给 API 行一律发 enabled+8192(pickThinkingConfig),对 M3 等于每一轮都强制想 ——
|
|
511
|
+
// agent 的活大半是"读文件、调工具"这种不值得想的,所以出口改写成 adaptive。
|
|
512
|
+
thinking: 'adaptive',
|
|
513
|
+
liftImages: false, // 08-25 体检 3b:tool_result 里的图**原生直通**(跟 llama.cpp 一样),不需要提升
|
|
255
514
|
prices: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
256
515
|
},
|
|
257
516
|
},
|
|
517
|
+
// ── NVIDIA build · Kimi K3(08-25)── 免费开发者档,08-25 体检(裸 OpenAI 协议):
|
|
518
|
+
// 文本 ✓ / 工具(含回程 tool 消息)✓ / **视觉真的有** ✓(判据是 token 账:同一张图 prompt_tokens 98 → 322
|
|
519
|
+
// 且答出图里的 ND-7342 与黄色三角)/ 流式含 reasoning_content 与 tool_calls 增量、末块带 usage ✓ /
|
|
520
|
+
// prompt cache 命中(8101 里缓存 3072)✓ / 上下文实测 **40 万 token 照收**(260k/400k 两档都 200)。
|
|
521
|
+
// ⛔ 没有 /v1/messages 也没有 count_tokens(都 404)→ 走 openai-chat 转换层 + 入口本地估算。
|
|
522
|
+
// ⛔ 思考档是 **low | high | max** 三个值(上游 400 的原话:`Unsupported Kimi K3 thinking_effort="medium"`),
|
|
523
|
+
// 跟 Ox 一样,所以 medium 别写。
|
|
258
524
|
{
|
|
259
|
-
//
|
|
260
|
-
//
|
|
261
|
-
id: '
|
|
262
|
-
|
|
525
|
+
// 上游至少收 400k,这里按 272k 收口:跟 deepseek 行同一个理由(每轮重传全量上下文,出网流量要钱),
|
|
526
|
+
// 而且实测延迟随上下文明显变长(260k 那发 24.9s、400k 那发 39.8s)。要放大改这一个数就行。
|
|
527
|
+
id: 'kimi-k3', window: 272_000, brand: 'kimi',
|
|
528
|
+
// ⚠️ 先 gate localGen(admin + 获批),理由是**限流**:全站共用一把 nvapi 钥匙 = 一个限流桶,
|
|
529
|
+
// 而 agent 一轮会连着发好几发。08-25 实测串行 5 秒间隔的小请求 6 发里就撞了 1 发 429。
|
|
530
|
+
// 开闸只要删掉 gate 这一处(清单、PUT /model、turn.js 三个消费方都走 selectableModelsFor)。
|
|
531
|
+
select: { label: 'Kimi K3(免费)', desc: '免费 · 有视觉 · 272k 上下文 · 思考档 max,首字可能等 · 上游限流,偶尔要等自动重试', gate: 'localGen' },
|
|
263
532
|
api: {
|
|
264
|
-
upstream: '
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
533
|
+
upstream: 'nvidia', wireModel: 'moonshotai/kimi-k3',
|
|
534
|
+
// sdkAlias 不写 = 共用别名走会话路由(08-25 起的默认写法,见 SHARED_SDK_ALIAS)
|
|
535
|
+
// helper 特意**不留在 NVIDIA**:那把钥匙的限流桶是全站共用的,标题/分类器那几发会跟主回合抢配额,
|
|
536
|
+
// 交给 /zen/go 那条常驻的 helper 行(跨上游做 helper 有先例:deepseek 视觉行用的是 Ox 的 helper)
|
|
537
|
+
fastModel: 'deepseek-v4-flash-helper',
|
|
538
|
+
thinking: 'strip', // 转换层按 reasoningEffort 发 thinking_effort,Anthropic 的 thinking 字段出口删掉
|
|
539
|
+
// 三档 low|high|max(没有 medium)。给满档的理由是**这家限的是并发不是 token**(用户 08-25 拍板):
|
|
540
|
+
// 想多久都不额外花钱,那就别省。⚠️ 代价是首字更慢 —— Ox 那行的 max 在真会话里想过 4 分 20 秒才出
|
|
541
|
+
// 第一个字(用户看到的是"只有绿点没有回复"),所以 desc 里写明了;而且想得久就占着并发槽更久,
|
|
542
|
+
// 全站共用一把 nvapi 钥匙,这也是它先 gate localGen 的原因之一。想改回快档就是这一个字段。
|
|
543
|
+
// helper 那行走自己的档(deepseek-v4-flash-helper 的 low),不受这里影响。
|
|
269
544
|
reasoningEffort: 'max',
|
|
270
|
-
|
|
271
|
-
prices: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
545
|
+
prices: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, // 开发者档不计费,真限流的是速率不是钱
|
|
272
546
|
},
|
|
273
547
|
},
|
|
548
|
+
// ⛔ `minimax-m2.7` 行 08-25 当天加上又撤掉(用户拍板「2.7 撤了吧」):**GMI 这家部署把图整个丢掉**。
|
|
549
|
+
// 判据是 token 账不是模型的说法 —— 七种形态(Anthropic base64 图在前/文本在前、source.type=url、
|
|
550
|
+
// OpenAI data:URI、OpenAI http URL、两个协议的纯文本基线)打过去,input_tokens **一律 47**,
|
|
551
|
+
// 跟不带图的基线一个字节不差;同一趟 M3 是 27 → 561/667/703/809 且描述对得上真值。上游 200、不报错,
|
|
552
|
+
// 模型只会说"我没看到图片" —— 静默丢弃。加上它比它自己慢一档(同题 M3 3s / M2.7 34s),
|
|
553
|
+
// 本站整条感知栈(截图、板面渲染、生图回看)都靠工具回图,一个瞎子行只会让人踩坑。
|
|
554
|
+
// 复牌就是照着 minimax-m3 那行写一份:wireModel 'MiniMaxAI/MiniMax-M2.7'、window 180_000、
|
|
555
|
+
// 不写 sdkAlias(默认共用别名)、fastModel 'deepseek-v4-flash-helper'、thinking 'adaptive'、零价 —— 但先重跑一遍
|
|
556
|
+
// server/lib/_gmi-check.mjs 的图那一项,确认这家换后端了再说。
|
|
274
557
|
{
|
|
275
|
-
//
|
|
276
|
-
//
|
|
277
|
-
//
|
|
278
|
-
//
|
|
279
|
-
id
|
|
558
|
+
// ── 通用 helper 行(08-25 晚,用户拍板"用 opencode 的 deepseek-v4-flash,这个坚挺")──
|
|
559
|
+
// 标题 / auto 分类器 / 摘要这类一句话的活。不进 picker。
|
|
560
|
+
//
|
|
561
|
+
// 为什么单独一行:session-loop 给 CLI 的 ANTHROPIC_SMALL_FAST_MODEL 是 **app id**,helper 请求
|
|
562
|
+
// 因此带着这一行的 id 进来 —— 跟主行的名字不同,入口才分得出 role(同名就分不出,主行想多久
|
|
563
|
+
// helper 跟着想多久)。
|
|
564
|
+
//
|
|
565
|
+
// ⭐ 为什么挂在 zenGo 而不是跟着主行走:**helper 要挑最耐久的那条线,不是最便宜的那条**。
|
|
566
|
+
// GMI 的 MiniMax 是限时免费(免费期结束就 402),NVIDIA 的开发者档限流紧(429 说来就来,
|
|
567
|
+
// 而且全站共用一把钥匙 = 一个限流桶,helper 会跟主回合抢),Ox 是随时可能下架的 stealth 行。
|
|
568
|
+
// /zen/go 是按月订阅的池子,deepseek-v4-flash 是它目录里的常驻款。08-25 实测:1.3~2.3s、
|
|
569
|
+
// reasoning_effort 三档都收、额度内 cost 报 "0"。
|
|
570
|
+
//
|
|
571
|
+
// ⚠️ 这条一挂上,**minimax-m3 就成了第一条"主行说 Anthropic、fast 行说 OpenAI"的会话**。
|
|
572
|
+
// 值得担心的是转换层合成的 thinking 块没有 signature(08-21 记过:这种块回传给真 Anthropic 会
|
|
573
|
+
// 400 invalid signature,crossLaneSwitchReason 那条闸就是为它装的)。08-25 专门探了一遍 GMI:
|
|
574
|
+
// 空 signature / 没有 signature 字段 / 瞎编 32 字节,**三种都照收 200**(答案还对)——
|
|
575
|
+
// 也就是这家不校验签名,这个配对是安全的。⛔ 换别的 Anthropic 原生上游做主行时要重探这一项。
|
|
576
|
+
id: 'deepseek-v4-flash-helper', window: 272_000, brand: 'deepseek',
|
|
280
577
|
api: {
|
|
281
|
-
|
|
282
|
-
// helper
|
|
283
|
-
//
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
578
|
+
// ⛔ **必须是 -vision-exp 那个变体**:08-25 实测同池的纯文本版 `deepseek-v4-flash` 一带图就 400
|
|
579
|
+
// (上游原话 invalid_request / "does not support image"),而 helper 行接的**不只是标题** ——
|
|
580
|
+
// auto-compact 要把整段对话(含工具回的截图)交给它,会话级路由还会把一切认不出的名字兜底改道过来。
|
|
581
|
+
// 更坏的是这类失败**不出声**:ingress 对 helper 角色特意不推 onNotice / 不报 onTruncated
|
|
582
|
+
// (model-ingress.js),用户只会觉得"标题没生成、压缩没做成",日志里也难翻。
|
|
583
|
+
// 对照实测:纯文本版 无图 200 / 有图 400;vision-exp 无图 200 / 有图 200。
|
|
584
|
+
upstream: 'zenGo', wireModel: 'deepseek-v4-flash-vision-exp',
|
|
585
|
+
fastModel: 'deepseek-v4-flash-helper', // 不写 sdkAlias,走共用别名
|
|
586
|
+
thinking: 'strip', // 出口删 thinking 字段,档位由 reasoningEffort 发
|
|
587
|
+
reasoningEffort: 'low', // 一句话的活不该想;实测 low 仍会想一两句,够短
|
|
588
|
+
// ⚠️ 不设 maxOutput(走转换层默认 131072):auto-compact 的摘要也走这一行,钉个小上限会把摘要
|
|
589
|
+
// 静默截断 —— 而 helper 的截断标记恰恰是被压掉的那一路,出了事没有任何信号
|
|
590
|
+
// Go 额度内上游报 cost="0",真金额以上游为准(context.applyUpstreamBilling);这里的表价是
|
|
591
|
+
// 额度外的兜底与配额口径,先跟视觉那行同价(保守高估,helper 一次也就几百 token)
|
|
592
|
+
prices: { input: 0.44, output: 1.32, cacheRead: 0.014, cacheWrite: 0 },
|
|
290
593
|
},
|
|
291
594
|
},
|
|
292
595
|
]);
|