@lazyingart/agintiflow 0.20.6 → 0.20.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/docs/model-selection.md
CHANGED
|
@@ -48,12 +48,15 @@ Interactive commands:
|
|
|
48
48
|
|
|
49
49
|
In the interactive CLI, `/provider`, `/route`, `/model`, `/spare`, and `/auxiliary model` without arguments open selectors. Use Up/Down/Left/Right to move through choices, Enter to confirm, and Esc to cancel. Slash-command hints use the same arrow selection behavior: type a prefix such as `/mo`, use arrows to choose `/model` or `/models`, then press Enter or Tab.
|
|
50
50
|
|
|
51
|
+
`/route`, `/model`, and `/spare` intentionally share the same text-model selector so users do not need to learn three different catalogs. The shared list is grouped as DeepSeek, Venice Uncensored, Venice GPT/Claude/Gemma/Qwen, OpenAI, Qwen, and Mock. OpenAI entries show the recommended default reasoning effort in the description; `/spare` stores that reasoning value when selected.
|
|
52
|
+
|
|
51
53
|
`/venice` opens a two-step selector for the Venice route and main models. The current text choices are:
|
|
52
54
|
|
|
53
55
|
```text
|
|
54
56
|
venice/venice-uncensored-1-2
|
|
55
57
|
venice/venice-uncensored
|
|
56
58
|
venice/gemma-4-uncensored
|
|
59
|
+
Disable Venice
|
|
57
60
|
```
|
|
58
61
|
|
|
59
62
|
For scripts or non-interactive terminals, `/venice` uses Venice 1.2 for both roles. You can also set both roles directly with `/venice 1.2`, `/venice 1.1`, or `/venice gemma`. Use two values to set route and main separately, for example `/venice 1.2 gemma`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lazyingart/agintiflow",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AgInTiFlow is a web-first coding agent and CLI with DeepSeek routing, sandboxed tools, model providers, canvas artifacts, and optional wrappers.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -53,7 +53,9 @@ Interactive equivalents:
|
|
|
53
53
|
/auxiliary model grsai/nano-banana-2
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
`/
|
|
56
|
+
`/route`, `/model`, and `/spare` share a single text-model selector. The selector is grouped as DeepSeek, Venice Uncensored, Venice GPT/Claude/Gemma/Qwen, OpenAI, Qwen, and Mock so the user sees the same union of route/main/spare-capable models in every role.
|
|
57
|
+
|
|
58
|
+
`/venice` opens a route/main selector for Venice text models. The selector includes `venice/venice-uncensored-1-2` (Venice 1.2), `venice/venice-uncensored` (Venice 1.1), `venice/gemma-4-uncensored` (Gemma 4), and a Disable Venice option. In non-interactive shells, `/venice` keeps script compatibility by selecting `venice/venice-uncensored-1-2` for both roles. `/venice 1.2 gemma` sets route to Venice 1.2 and main to Gemma 4; `/venice off` or the Disable Venice selector option restores `deepseek/deepseek-v4-flash` for route and `deepseek/deepseek-v4-pro` for main.
|
|
57
59
|
|
|
58
60
|
The web UI should expose model names as dropdowns, not free-text fields. The left panel should stay focused on common daily controls, while model-role editing and less-used switches live in an Advanced settings modal. The terminal-like capability panels belong after the runtime log so the left control panel remains short.
|
|
59
61
|
|
|
@@ -7,6 +7,7 @@ import { fileURLToPath } from "node:url";
|
|
|
7
7
|
import {
|
|
8
8
|
buildLaunchHeaderLines,
|
|
9
9
|
buildPromptLayout,
|
|
10
|
+
buildPromptRenderSequence,
|
|
10
11
|
canonicalSlashPromptBuffer,
|
|
11
12
|
classifyEscapeAction,
|
|
12
13
|
formatWorkspaceChange,
|
|
@@ -131,6 +132,16 @@ try {
|
|
|
131
132
|
if (promptLayout.cursorRow < 0 || promptLayout.cursorColumn < 0) {
|
|
132
133
|
throw new Error("terminal prompt layout returned an invalid cursor location");
|
|
133
134
|
}
|
|
135
|
+
const promptCursorMoveBefore = buildPromptLayout("smooth typing", 13, 90, 24, { commandCwd: "/tmp/aginti-project" });
|
|
136
|
+
const promptCursorMoveAfter = buildPromptLayout("smooth typing", 4, 90, 24, { commandCwd: "/tmp/aginti-project" });
|
|
137
|
+
const cursorOnlySequence = buildPromptRenderSequence(promptCursorMoveAfter, {
|
|
138
|
+
lineCount: promptCursorMoveBefore.renderedRows.length,
|
|
139
|
+
cursorRow: promptCursorMoveBefore.cursorRow,
|
|
140
|
+
renderedRows: promptCursorMoveBefore.renderedRows,
|
|
141
|
+
});
|
|
142
|
+
if (cursorOnlySequence.includes("\x1b[2K") || cursorOnlySequence.includes("\x1b[?25l")) {
|
|
143
|
+
throw new Error("cursor-only prompt moves should not clear/redraw the input panel");
|
|
144
|
+
}
|
|
134
145
|
const paddedPromptLayout = buildPromptLayout("hello", 5, 80, 24, { commandCwd: "/tmp/aginti-project" });
|
|
135
146
|
const paddedRows = paddedPromptLayout.renderedRows.map((line) => line.replace(/\x1b\[[0-9;?]*[ -/]*[@-~]/g, ""));
|
|
136
147
|
if (
|
|
@@ -271,6 +282,7 @@ try {
|
|
|
271
282
|
"workspace-patch-event-render",
|
|
272
283
|
"large-launch-header",
|
|
273
284
|
"prompt-layout",
|
|
285
|
+
"prompt-redraw-fast-path",
|
|
274
286
|
"user-prompt-label",
|
|
275
287
|
"escape-policy",
|
|
276
288
|
"live-input-status-layout",
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
selectModelRoute,
|
|
11
11
|
} from "../src/model-routing.js";
|
|
12
12
|
import { parseTextToolCalls, usesTextToolProtocol } from "../src/model-client.js";
|
|
13
|
+
import { modelRoleChoices } from "../src/interactive-cli.js";
|
|
13
14
|
|
|
14
15
|
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
15
16
|
|
|
@@ -111,6 +112,32 @@ assert(MODEL_PROVIDER_GROUPS["venice-gpt"].provider === "venice", "venice-gpt gr
|
|
|
111
112
|
assert(modelsForProviderGroup("venice-gemma").some((item) => item.id === "gemma-4-uncensored"), "venice-gemma bucket missing Gemma");
|
|
112
113
|
assert(modelsForProviderGroup("venice-uncensored").some((item) => item.id === "e2ee-venice-uncensored-24b-p"), "venice-uncensored bucket missing Venice 1.1");
|
|
113
114
|
assert(AUXILIARY_MODEL_CATALOG["venice-image"].some((item) => item.id === "gpt-image-2"), "Venice image catalog missing GPT Image 2");
|
|
115
|
+
const routeChoices = modelRoleChoices("route").map((item) => `${item.provider}/${item.model}`);
|
|
116
|
+
const mainChoices = modelRoleChoices("main").map((item) => `${item.provider}/${item.model}`);
|
|
117
|
+
const spareChoices = modelRoleChoices("spare").map((item) => `${item.provider}/${item.model}`);
|
|
118
|
+
assert(JSON.stringify(routeChoices) === JSON.stringify(mainChoices), "route and main selectors should share the same text-model list");
|
|
119
|
+
assert(JSON.stringify(routeChoices) === JSON.stringify(spareChoices), "route and spare selectors should share the same text-model list");
|
|
120
|
+
for (const expected of [
|
|
121
|
+
"deepseek/deepseek-v4-flash",
|
|
122
|
+
"deepseek/deepseek-v4-pro",
|
|
123
|
+
"venice/venice-uncensored-1-2",
|
|
124
|
+
"venice/venice-uncensored",
|
|
125
|
+
"venice/gemma-4-uncensored",
|
|
126
|
+
"venice/openai-gpt-55",
|
|
127
|
+
"venice/claude-sonnet-4-6",
|
|
128
|
+
"venice/qwen3-6-27b",
|
|
129
|
+
"openai/gpt-5.5",
|
|
130
|
+
"openai/gpt-5.4",
|
|
131
|
+
"openai/gpt-5.4-mini",
|
|
132
|
+
"openai/gpt-5.3-codex",
|
|
133
|
+
"openai/gpt-5.3-codex-spark",
|
|
134
|
+
"qwen/qwen-plus",
|
|
135
|
+
"mock/mock-agent",
|
|
136
|
+
]) {
|
|
137
|
+
assert(routeChoices.includes(expected), `shared model selector missing ${expected}`);
|
|
138
|
+
}
|
|
139
|
+
assert(!routeChoices.includes("venice/e2ee-venice-uncensored-24b-p"), "shared model selector should hide unstable E2EE Venice 1.1");
|
|
140
|
+
assert(modelRoleChoices("auxiliary").some((item) => item.provider === "grsai"), "auxiliary selector missing GRS AI");
|
|
114
141
|
const parsedTextToolCalls = parseTextToolCalls('[TOOL_CALLS]list_files[ARGS]call_123[ARGS]{"path":".","maxDepth":1}');
|
|
115
142
|
assert(parsedTextToolCalls.length === 1, "Venice text tool-call parser did not detect encoded tool call");
|
|
116
143
|
assert(parsedTextToolCalls[0].function.name === "list_files", "Venice text tool-call parser returned wrong tool name");
|
|
@@ -151,6 +178,7 @@ console.log(
|
|
|
151
178
|
"route-overrides",
|
|
152
179
|
"provider-groups",
|
|
153
180
|
"auxiliary-catalog",
|
|
181
|
+
"shared-model-selectors",
|
|
154
182
|
"venice-text-tool-parser",
|
|
155
183
|
"cli-models-command",
|
|
156
184
|
"venice-shortcut",
|
package/src/interactive-cli.js
CHANGED
|
@@ -832,24 +832,58 @@ function cursorLocation(layout, cursor) {
|
|
|
832
832
|
|
|
833
833
|
function clearRenderedPrompt(previous) {
|
|
834
834
|
if (!previous.lineCount) return;
|
|
835
|
+
let sequence = ansi.cursorHide;
|
|
835
836
|
const below = previous.lineCount - 1 - previous.cursorRow;
|
|
836
|
-
if (below > 0)
|
|
837
|
-
|
|
837
|
+
if (below > 0) sequence += `\x1b[${below}B`;
|
|
838
|
+
sequence += `\r${ansi.clearLine}`;
|
|
838
839
|
for (let index = 1; index < previous.lineCount; index += 1) {
|
|
839
|
-
|
|
840
|
+
sequence += `\x1b[1A\r${ansi.clearLine}`;
|
|
841
|
+
}
|
|
842
|
+
sequence += ansi.cursorShow;
|
|
843
|
+
output.write(sequence);
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
function renderedRowsEqual(left = [], right = []) {
|
|
847
|
+
if (left.length !== right.length) return false;
|
|
848
|
+
return left.every((line, index) => line === right[index]);
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
export function buildPromptRenderSequence(layout, previous = { lineCount: 0, cursorRow: 0, renderedRows: [] }) {
|
|
852
|
+
const previousRows = Array.isArray(previous.renderedRows) ? previous.renderedRows : [];
|
|
853
|
+
const previousLineCount = Number(previous.lineCount) || 0;
|
|
854
|
+
const previousCursorRow = Number(previous.cursorRow) || 0;
|
|
855
|
+
const nextRows = layout.renderedRows || [];
|
|
856
|
+
|
|
857
|
+
if (previousLineCount > 0 && renderedRowsEqual(previousRows, nextRows)) {
|
|
858
|
+
const rowDelta = layout.cursorRow - previousCursorRow;
|
|
859
|
+
return `${rowDelta > 0 ? `\x1b[${rowDelta}B` : rowDelta < 0 ? `\x1b[${Math.abs(rowDelta)}A` : ""}\r\x1b[${
|
|
860
|
+
layout.cursorColumn + 1
|
|
861
|
+
}G`;
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
let sequence = ansi.cursorHide;
|
|
865
|
+
if (previousLineCount > 0) {
|
|
866
|
+
const below = Math.max(previousLineCount - 1 - previousCursorRow, 0);
|
|
867
|
+
if (below > 0) sequence += `\x1b[${below}B`;
|
|
868
|
+
sequence += "\r";
|
|
869
|
+
if (previousLineCount > 1) sequence += `\x1b[${previousLineCount - 1}A`;
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
const lineCount = Math.max(previousLineCount, nextRows.length);
|
|
873
|
+
for (let index = 0; index < lineCount; index += 1) {
|
|
874
|
+
sequence += `\r${ansi.clearLine}${nextRows[index] || ""}`;
|
|
875
|
+
if (index < lineCount - 1) sequence += "\n";
|
|
840
876
|
}
|
|
877
|
+
|
|
878
|
+
const cursorUp = Math.max(lineCount - 1 - layout.cursorRow, 0);
|
|
879
|
+
if (cursorUp > 0) sequence += `\x1b[${cursorUp}A`;
|
|
880
|
+
sequence += `\r\x1b[${layout.cursorColumn + 1}G${ansi.cursorShow}`;
|
|
881
|
+
return sequence;
|
|
841
882
|
}
|
|
842
883
|
|
|
843
884
|
function renderPromptBuffer(buffer, cursor, previous = { lineCount: 0, cursorRow: 0, renderedRows: [] }, options = {}) {
|
|
844
885
|
const layout = buildPromptLayout(buffer, cursor, terminalWidth(), terminalHeight(), options);
|
|
845
|
-
output.write(
|
|
846
|
-
clearRenderedPrompt(previous);
|
|
847
|
-
output.write(layout.renderedRows.join("\n"));
|
|
848
|
-
|
|
849
|
-
const below = layout.renderedRows.length - 1 - layout.cursorRow;
|
|
850
|
-
if (below > 0) output.write(`\x1b[${below}A`);
|
|
851
|
-
output.write(`\r\x1b[${layout.cursorColumn + 1}G`);
|
|
852
|
-
output.write(ansi.cursorShow);
|
|
886
|
+
output.write(buildPromptRenderSequence(layout, previous));
|
|
853
887
|
return {
|
|
854
888
|
lineCount: layout.renderedRows.length,
|
|
855
889
|
cursorRow: layout.cursorRow,
|
|
@@ -1660,6 +1694,13 @@ function veniceTextModelChoices() {
|
|
|
1660
1694
|
label: "Gemma 4",
|
|
1661
1695
|
description: "Gemma-family Venice text model; 256K context",
|
|
1662
1696
|
},
|
|
1697
|
+
{
|
|
1698
|
+
action: "disable",
|
|
1699
|
+
provider: "deepseek",
|
|
1700
|
+
model: "deepseek-v4-flash",
|
|
1701
|
+
label: "Disable Venice",
|
|
1702
|
+
description: "restore DeepSeek route/main defaults",
|
|
1703
|
+
},
|
|
1663
1704
|
];
|
|
1664
1705
|
}
|
|
1665
1706
|
|
|
@@ -1755,98 +1796,69 @@ function printModelRoles(state) {
|
|
|
1755
1796
|
);
|
|
1756
1797
|
}
|
|
1757
1798
|
|
|
1758
|
-
function
|
|
1799
|
+
function compactReasoning(model = {}) {
|
|
1800
|
+
const values = Array.isArray(model.reasoning) ? model.reasoning : [];
|
|
1801
|
+
if (values.length === 0) return "";
|
|
1802
|
+
const preferred = model.id === "gpt-5.4-mini" || model.id === "gpt-5.3-codex-spark" ? "high" : "medium";
|
|
1803
|
+
return `${preferred} reasoning`;
|
|
1804
|
+
}
|
|
1805
|
+
|
|
1806
|
+
function modelSelectorGroup(provider, model = {}) {
|
|
1807
|
+
if (provider === "deepseek") return "DeepSeek";
|
|
1808
|
+
if (provider === "openai") return "OpenAI";
|
|
1809
|
+
if (provider === "qwen") return "Qwen";
|
|
1810
|
+
if (provider === "mock") return "Mock";
|
|
1811
|
+
if (provider === "venice") {
|
|
1812
|
+
if (model.bucket === "venice-uncensored") return "Venice Uncensored";
|
|
1813
|
+
if (model.bucket === "venice-gpt") return "Venice GPT";
|
|
1814
|
+
if (model.bucket === "venice-claude") return "Venice Claude";
|
|
1815
|
+
if (model.bucket === "venice-gemma") return "Venice Gemma";
|
|
1816
|
+
if (model.bucket === "venice-qwen") return "Venice Qwen";
|
|
1817
|
+
return "Venice";
|
|
1818
|
+
}
|
|
1819
|
+
return provider;
|
|
1820
|
+
}
|
|
1821
|
+
|
|
1822
|
+
function textModelRoleChoices() {
|
|
1823
|
+
const providerOrder = ["deepseek", "venice", "openai", "qwen", "mock"];
|
|
1824
|
+
const veniceOrder = [
|
|
1825
|
+
"venice-uncensored-1-2",
|
|
1826
|
+
"venice-uncensored",
|
|
1827
|
+
"gemma-4-uncensored",
|
|
1828
|
+
"openai-gpt-55",
|
|
1829
|
+
"claude-sonnet-4-6",
|
|
1830
|
+
"qwen3-6-27b",
|
|
1831
|
+
];
|
|
1832
|
+
const choices = [];
|
|
1833
|
+
for (const provider of providerOrder) {
|
|
1834
|
+
let models = PROVIDER_MODEL_CATALOG[provider] || [];
|
|
1835
|
+
if (provider === "venice") {
|
|
1836
|
+
const byId = new Map(models.filter((model) => !model.hidden).map((model) => [model.id, model]));
|
|
1837
|
+
models = veniceOrder.map((id) => byId.get(id)).filter(Boolean);
|
|
1838
|
+
} else {
|
|
1839
|
+
models = models.filter((model) => !model.hidden);
|
|
1840
|
+
}
|
|
1841
|
+
for (const model of models) {
|
|
1842
|
+
const group = modelSelectorGroup(provider, model);
|
|
1843
|
+
const reasoning = compactReasoning(model);
|
|
1844
|
+
const context = model.context ? `${model.context} context` : "";
|
|
1845
|
+
const details = [reasoning, context, model.description].filter(Boolean).join("; ");
|
|
1846
|
+
choices.push({
|
|
1847
|
+
provider,
|
|
1848
|
+
model: model.id,
|
|
1849
|
+
label: `${group} · ${model.label}`,
|
|
1850
|
+
group,
|
|
1851
|
+
description: details,
|
|
1852
|
+
reasoningDefault: reasoning ? reasoning.split(" ")[0] : "",
|
|
1853
|
+
});
|
|
1854
|
+
}
|
|
1855
|
+
}
|
|
1856
|
+
return choices;
|
|
1857
|
+
}
|
|
1858
|
+
|
|
1859
|
+
export function modelRoleChoices(role = "main") {
|
|
1860
|
+
if (role !== "auxiliary") return textModelRoleChoices();
|
|
1759
1861
|
const common = [
|
|
1760
|
-
{
|
|
1761
|
-
provider: "deepseek",
|
|
1762
|
-
model: "deepseek-v4-flash",
|
|
1763
|
-
label: "DeepSeek V4 Flash",
|
|
1764
|
-
description: "fast planner, short shell/browser/code work",
|
|
1765
|
-
route: true,
|
|
1766
|
-
},
|
|
1767
|
-
{
|
|
1768
|
-
provider: "deepseek",
|
|
1769
|
-
model: "deepseek-v4-pro",
|
|
1770
|
-
label: "DeepSeek V4 Pro",
|
|
1771
|
-
description: "complex coding, debugging, writing, and long tasks",
|
|
1772
|
-
main: true,
|
|
1773
|
-
spare: true,
|
|
1774
|
-
},
|
|
1775
|
-
{
|
|
1776
|
-
provider: "venice",
|
|
1777
|
-
model: "venice-uncensored-1-2",
|
|
1778
|
-
label: "Venice 1.2",
|
|
1779
|
-
description: "Venice text route; use /auth venice if missing",
|
|
1780
|
-
route: true,
|
|
1781
|
-
main: true,
|
|
1782
|
-
spare: true,
|
|
1783
|
-
},
|
|
1784
|
-
{
|
|
1785
|
-
provider: "venice",
|
|
1786
|
-
model: "venice-uncensored",
|
|
1787
|
-
label: "Venice 1.1",
|
|
1788
|
-
description: "legacy Venice text route; use /auth venice if missing",
|
|
1789
|
-
route: true,
|
|
1790
|
-
main: true,
|
|
1791
|
-
spare: true,
|
|
1792
|
-
},
|
|
1793
|
-
{
|
|
1794
|
-
provider: "venice",
|
|
1795
|
-
model: "gemma-4-uncensored",
|
|
1796
|
-
label: "Gemma 4",
|
|
1797
|
-
description: "Gemma-family Venice route; use /auth venice if missing",
|
|
1798
|
-
route: true,
|
|
1799
|
-
main: true,
|
|
1800
|
-
spare: true,
|
|
1801
|
-
},
|
|
1802
|
-
{
|
|
1803
|
-
provider: "openai",
|
|
1804
|
-
model: "gpt-5.5",
|
|
1805
|
-
label: "OpenAI GPT-5.5",
|
|
1806
|
-
description: "frontier spare/manual model",
|
|
1807
|
-
main: true,
|
|
1808
|
-
spare: true,
|
|
1809
|
-
},
|
|
1810
|
-
{
|
|
1811
|
-
provider: "openai",
|
|
1812
|
-
model: "gpt-5.4",
|
|
1813
|
-
label: "OpenAI GPT-5.4",
|
|
1814
|
-
description: "strong everyday coding spare",
|
|
1815
|
-
main: true,
|
|
1816
|
-
spare: true,
|
|
1817
|
-
},
|
|
1818
|
-
{
|
|
1819
|
-
provider: "openai",
|
|
1820
|
-
model: "gpt-5.4-mini",
|
|
1821
|
-
label: "OpenAI GPT-5.4 Mini",
|
|
1822
|
-
description: "small fast spare route",
|
|
1823
|
-
route: true,
|
|
1824
|
-
spare: true,
|
|
1825
|
-
},
|
|
1826
|
-
{
|
|
1827
|
-
provider: "qwen",
|
|
1828
|
-
model: "qwen-plus",
|
|
1829
|
-
label: "Qwen Plus",
|
|
1830
|
-
description: "general Qwen route",
|
|
1831
|
-
route: true,
|
|
1832
|
-
},
|
|
1833
|
-
{
|
|
1834
|
-
provider: "qwen",
|
|
1835
|
-
model: "qwen-max",
|
|
1836
|
-
label: "Qwen Max",
|
|
1837
|
-
description: "larger Qwen route",
|
|
1838
|
-
main: true,
|
|
1839
|
-
spare: true,
|
|
1840
|
-
},
|
|
1841
|
-
{
|
|
1842
|
-
provider: "mock",
|
|
1843
|
-
model: "mock-agent",
|
|
1844
|
-
label: "Mock Agent",
|
|
1845
|
-
description: "local deterministic test route",
|
|
1846
|
-
route: true,
|
|
1847
|
-
main: true,
|
|
1848
|
-
spare: true,
|
|
1849
|
-
},
|
|
1850
1862
|
{
|
|
1851
1863
|
provider: "grsai",
|
|
1852
1864
|
model: "nano-banana-2",
|
|
@@ -1869,22 +1881,7 @@ function modelRoleChoices(role = "main") {
|
|
|
1869
1881
|
auxiliary: true,
|
|
1870
1882
|
},
|
|
1871
1883
|
];
|
|
1872
|
-
|
|
1873
|
-
if (role === "route") return item.route;
|
|
1874
|
-
if (role === "spare") return item.spare;
|
|
1875
|
-
if (role === "auxiliary") return item.auxiliary;
|
|
1876
|
-
return item.main;
|
|
1877
|
-
});
|
|
1878
|
-
if (role === "route") {
|
|
1879
|
-
return filtered.sort((a, b) => Number(b.model === "deepseek-v4-flash") - Number(a.model === "deepseek-v4-flash"));
|
|
1880
|
-
}
|
|
1881
|
-
if (role === "spare") {
|
|
1882
|
-
return filtered.sort((a, b) => Number(b.model === "gpt-5.4") - Number(a.model === "gpt-5.4"));
|
|
1883
|
-
}
|
|
1884
|
-
if (role === "auxiliary") {
|
|
1885
|
-
return filtered.sort((a, b) => Number(b.provider === "grsai") - Number(a.provider === "grsai"));
|
|
1886
|
-
}
|
|
1887
|
-
return filtered.sort((a, b) => Number(b.model === "deepseek-v4-pro") - Number(a.model === "deepseek-v4-pro"));
|
|
1884
|
+
return common.filter((item) => item.auxiliary).sort((a, b) => Number(b.provider === "grsai") - Number(a.provider === "grsai"));
|
|
1888
1885
|
}
|
|
1889
1886
|
|
|
1890
1887
|
function providerChoices() {
|
|
@@ -1923,6 +1920,7 @@ function providerChoices() {
|
|
|
1923
1920
|
}
|
|
1924
1921
|
|
|
1925
1922
|
function modelChoiceLine(option) {
|
|
1923
|
+
if (option.action === "disable") return `${option.label} ${option.description}`;
|
|
1926
1924
|
return `${option.label} ${option.provider}/${option.model} ${option.description}`;
|
|
1927
1925
|
}
|
|
1928
1926
|
|
|
@@ -2058,7 +2056,7 @@ async function pickModelRole(role, state) {
|
|
|
2058
2056
|
} else if (role === "spare") {
|
|
2059
2057
|
state.spareProvider = selected.provider;
|
|
2060
2058
|
state.spareModel = selected.model;
|
|
2061
|
-
state.spareReasoning = state.spareReasoning || "medium";
|
|
2059
|
+
state.spareReasoning = selected.reasoningDefault || state.spareReasoning || "medium";
|
|
2062
2060
|
printSystemLine(`spare=${state.spareProvider}/${state.spareModel} reasoning=${state.spareReasoning}`);
|
|
2063
2061
|
} else if (role === "auxiliary") {
|
|
2064
2062
|
state.auxiliaryProvider = selected.provider;
|
|
@@ -2086,10 +2084,15 @@ async function pickVeniceRouteAndMain(state) {
|
|
|
2086
2084
|
initialIndex: routeIndex,
|
|
2087
2085
|
});
|
|
2088
2086
|
if (!route) return false;
|
|
2087
|
+
if (route.action === "disable") {
|
|
2088
|
+
useDeepSeekDefaults(state);
|
|
2089
|
+
printSystemLine("venice=off routing=smart route=deepseek/deepseek-v4-flash main=deepseek/deepseek-v4-pro");
|
|
2090
|
+
return true;
|
|
2091
|
+
}
|
|
2089
2092
|
|
|
2090
2093
|
const mainIndex = Math.max(
|
|
2091
|
-
options.findIndex((item) => item.provider === state.mainProvider && item.model === state.mainModel),
|
|
2092
|
-
options.findIndex((item) => item.model === route.model),
|
|
2094
|
+
options.findIndex((item) => item.action !== "disable" && item.provider === state.mainProvider && item.model === state.mainModel),
|
|
2095
|
+
options.findIndex((item) => item.action !== "disable" && item.model === route.model),
|
|
2093
2096
|
0
|
|
2094
2097
|
);
|
|
2095
2098
|
const main = await selectModelChoice({
|
|
@@ -2099,6 +2102,11 @@ async function pickVeniceRouteAndMain(state) {
|
|
|
2099
2102
|
initialIndex: mainIndex,
|
|
2100
2103
|
});
|
|
2101
2104
|
if (!main) return false;
|
|
2105
|
+
if (main.action === "disable") {
|
|
2106
|
+
useDeepSeekDefaults(state);
|
|
2107
|
+
printSystemLine("venice=off routing=smart route=deepseek/deepseek-v4-flash main=deepseek/deepseek-v4-pro");
|
|
2108
|
+
return true;
|
|
2109
|
+
}
|
|
2102
2110
|
|
|
2103
2111
|
useVeniceModels(state, route.model, main.model);
|
|
2104
2112
|
printSystemLine(`venice=on routing=smart route=venice/${state.routeModel} main=venice/${state.mainModel}`);
|
package/src/model-routing.js
CHANGED
|
@@ -216,24 +216,26 @@ export const PROVIDER_MODEL_CATALOG = {
|
|
|
216
216
|
description: "Current Venice uncensored text route.",
|
|
217
217
|
},
|
|
218
218
|
{
|
|
219
|
-
id: "
|
|
219
|
+
id: "venice-uncensored",
|
|
220
220
|
label: "Venice Uncensored 1.1",
|
|
221
221
|
bucket: "venice-uncensored",
|
|
222
222
|
context: "32K",
|
|
223
|
-
description: "
|
|
223
|
+
description: "Working Venice uncensored 1.1 text route.",
|
|
224
224
|
},
|
|
225
225
|
{
|
|
226
|
-
id: "venice-uncensored",
|
|
227
|
-
label: "Venice Uncensored
|
|
226
|
+
id: "e2ee-venice-uncensored-24b-p",
|
|
227
|
+
label: "Venice Uncensored 1.1 E2EE",
|
|
228
228
|
bucket: "venice-uncensored",
|
|
229
229
|
context: "32K",
|
|
230
|
-
|
|
230
|
+
hidden: true,
|
|
231
|
+
description: "Documented E2EE Venice 1.1 route; hidden from selectors until upstream stabilizes.",
|
|
231
232
|
},
|
|
232
233
|
{
|
|
233
234
|
id: "venice-uncensored-role-play",
|
|
234
235
|
label: "Venice Role Play Uncensored",
|
|
235
236
|
bucket: "venice-uncensored",
|
|
236
237
|
context: "128K",
|
|
238
|
+
hidden: true,
|
|
237
239
|
description: "Role-play oriented Venice route.",
|
|
238
240
|
},
|
|
239
241
|
{
|