@lazyingart/agintiflow 0.20.4 → 0.20.5

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.
@@ -48,14 +48,17 @@ 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
- `/venice` is a toggle. When off, it enables:
51
+ `/venice` opens a two-step selector for the Venice route and main models. The current text choices are:
52
52
 
53
53
  ```text
54
- /route venice/venice-uncensored-1-2
55
- /main venice/venice-uncensored-1-2
54
+ venice/venice-uncensored-1-2
55
+ venice/e2ee-venice-uncensored-24b-p
56
+ venice/gemma-4-uncensored
56
57
  ```
57
58
 
58
- When already on, `/venice` switches back to the DeepSeek defaults:
59
+ 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`.
60
+
61
+ Use `/venice off` to switch back to the DeepSeek defaults:
59
62
 
60
63
  ```text
61
64
  /route deepseek/deepseek-v4-flash
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lazyingart/agintiflow",
3
- "version": "0.20.4",
3
+ "version": "0.20.5",
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,7 @@ Interactive equivalents:
53
53
  /auxiliary model grsai/nano-banana-2
54
54
  ```
55
55
 
56
- `/venice` is a toggle: it keeps smart routing enabled and points both route and main roles at `venice/venice-uncensored-1-2`; running it again or using `/venice off` restores `deepseek/deepseek-v4-flash` for route and `deepseek/deepseek-v4-pro` for main.
56
+ `/venice` opens a route/main selector for Venice text models. The selector includes `venice/venice-uncensored-1-2` (Venice 1.2), `venice/e2ee-venice-uncensored-24b-p` (Venice 1.1), and `venice/gemma-4-uncensored` (Gemma 4). 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` restores `deepseek/deepseek-v4-flash` for route and `deepseek/deepseek-v4-pro` for main.
57
57
 
58
58
  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
59
 
@@ -74,7 +74,7 @@ Codex wrapper defaults stay separate from native OpenAI API settings: GPT-5.5 me
74
74
 
75
75
  | UI bucket | Concrete default | Notes |
76
76
  |---|---|---|
77
- | `venice-uncensored` | `venice-uncensored-1-2` | Venice-native text |
77
+ | `venice-uncensored` | `venice-uncensored-1-2` | Venice-native text; `/venice` also exposes `e2ee-venice-uncensored-24b-p` as Venice 1.1 |
78
78
  | `venice-qwen` | `qwen3-6-27b` | Qwen-family text/code |
79
79
  | `venice-gpt` | `openai-gpt-55` | OpenAI-family through Venice |
80
80
  | `venice-claude` | `claude-sonnet-4-6` | Claude-family through Venice |
@@ -19,7 +19,7 @@ Store `VENICE_API_KEY` only in ignored local files such as `.aginti/.env` or a s
19
19
 
20
20
  | Bucket | Primary model | Other useful models | Use |
21
21
  |---|---|---|---|
22
- | `venice-uncensored` | `venice-uncensored-1-2` | `venice-uncensored`, `venice-uncensored-role-play` | Private/uncensored Venice-native text route |
22
+ | `venice-uncensored` | `venice-uncensored-1-2` | `e2ee-venice-uncensored-24b-p`, `venice-uncensored-role-play`, `venice-uncensored` legacy | Private/uncensored Venice-native text route |
23
23
  | `venice-gemma` | `gemma-4-uncensored` | `google-gemma-4-31b-it`, `google-gemma-4-26b-a4b-it` | Low-cost open-model writing and experimentation |
24
24
  | `venice-qwen` | `qwen3-6-27b` | `qwen-3-6-plus`, `qwen3-coder-480b-a35b-instruct-turbo`, `qwen3-vl-235b-a22b` | Chinese/open coding and general tasks |
25
25
  | `venice-gpt` | `openai-gpt-55` | `openai-gpt-54`, `openai-gpt-54-mini`, `openai-gpt-53-codex`, `openai-gpt-53-codex-spark` | OpenAI-family routes through Venice |
@@ -44,12 +44,15 @@ Store `VENICE_API_KEY` only in ignored local files such as `.aginti/.env` or a s
44
44
  | `google-gemma-4-26b-a4b-it` | 256K | Google Gemma 4 26B A4B Instruct |
45
45
  | `venice-uncensored-1-2` | 128K | Venice Uncensored 1.2 |
46
46
  | `openai-gpt-54-mini` | 400K | GPT-5.4 Mini |
47
+ | `e2ee-venice-uncensored-24b-p` | 32K | Venice Uncensored 1.1 E2EE |
47
48
  | `venice-uncensored-role-play` | 128K | Venice Role Play Uncensored |
48
49
  | `gemini-3-1-pro-preview` | 1.0M | Gemini 3.1 Pro Preview |
49
50
  | `claude-sonnet-4-6` | 1.0M | Claude Sonnet 4.6 |
50
51
  | `openai-gpt-53-codex` | 400K | GPT-5.3 Codex |
51
52
  | `openai-gpt-52` | 256K | GPT-5.2 |
52
- | `venice-uncensored` | 32K | Venice Uncensored legacy |
53
+ | `venice-uncensored` | 32K | Venice Uncensored legacy / deprecated |
54
+
55
+ AgInTiFlow exposes the primary Venice text choices through `/venice`: Venice 1.2 (`venice-uncensored-1-2`), Venice 1.1 (`e2ee-venice-uncensored-24b-p`), and Gemma 4 (`gemma-4-uncensored`). The command can select route and main independently, so a fast Venice route can be paired with a larger Gemma main model when useful. The older `venice-uncensored` ID is retained only as a legacy alias.
53
56
 
54
57
  ## Image And Edit Models
55
58
 
@@ -109,6 +109,7 @@ assert(fastRoute.model === "deepseek-v4-flash", "fast route did not use route mo
109
109
 
110
110
  assert(MODEL_PROVIDER_GROUPS["venice-gpt"].provider === "venice", "venice-gpt group missing");
111
111
  assert(modelsForProviderGroup("venice-gemma").some((item) => item.id === "gemma-4-uncensored"), "venice-gemma bucket missing Gemma");
112
+ assert(modelsForProviderGroup("venice-uncensored").some((item) => item.id === "e2ee-venice-uncensored-24b-p"), "venice-uncensored bucket missing Venice 1.1");
112
113
  assert(AUXILIARY_MODEL_CATALOG["venice-image"].some((item) => item.id === "gpt-image-2"), "Venice image catalog missing GPT Image 2");
113
114
  const parsedTextToolCalls = parseTextToolCalls('[TOOL_CALLS]list_files[ARGS]call_123[ARGS]{"path":".","maxDepth":1}');
114
115
  assert(parsedTextToolCalls.length === 1, "Venice text tool-call parser did not detect encoded tool call");
@@ -122,6 +123,9 @@ const interactiveOutput = await runInteractive("/venice\n");
122
123
  assert(interactiveOutput.includes("venice=on"), "/venice did not enable Venice roles");
123
124
  assert(interactiveOutput.includes("route=venice/venice-uncensored-1-2"), "/venice did not set Venice route role");
124
125
  assert(interactiveOutput.includes("main=venice/venice-uncensored-1-2"), "/venice did not set Venice main role");
126
+ const interactiveGemmaOutput = await runInteractive("/venice 1.1 gemma\n");
127
+ assert(interactiveGemmaOutput.includes("route=venice/e2ee-venice-uncensored-24b-p"), "/venice 1.1 did not set Venice 1.1 route role");
128
+ assert(interactiveGemmaOutput.includes("main=venice/gemma-4-uncensored"), "/venice gemma did not set Gemma 4 main role");
125
129
  const interactiveOffOutput = await runInteractive("/venice off\n");
126
130
  assert(interactiveOffOutput.includes("venice=off"), "/venice off did not restore DeepSeek roles");
127
131
  assert(interactiveOffOutput.includes("route=deepseek/deepseek-v4-flash"), "/venice off did not restore DeepSeek route role");
@@ -593,7 +593,7 @@ function printHelp() {
593
593
  " /instructions Show AGINTI.md project instructions status.",
594
594
  " /memory Alias for /instructions.",
595
595
  " /models Show route/main/spare/wrapper/auxiliary model roles.",
596
- " /venice [on|off] Toggle Venice Uncensored 1.2 for route and main roles.",
596
+ " /venice [off|model] Pick Venice route/main models, or restore DeepSeek defaults.",
597
597
  " /route [mode|provider/model]",
598
598
  " Open route selector, or set routing/fast route model.",
599
599
  " /model [provider/model] Open main-model selector, or set the active/main model.",
@@ -1640,23 +1640,59 @@ function useDeepSeekDefaults(state) {
1640
1640
  state.mainModel = "deepseek-v4-pro";
1641
1641
  }
1642
1642
 
1643
- function useVeniceDefaults(state) {
1643
+ function veniceTextModelChoices() {
1644
+ return [
1645
+ {
1646
+ provider: "venice",
1647
+ model: "venice-uncensored-1-2",
1648
+ label: "Venice 1.2",
1649
+ description: "default Venice text model; 128K context",
1650
+ },
1651
+ {
1652
+ provider: "venice",
1653
+ model: "e2ee-venice-uncensored-24b-p",
1654
+ label: "Venice 1.1",
1655
+ description: "E2EE Venice text model; 32K context",
1656
+ },
1657
+ {
1658
+ provider: "venice",
1659
+ model: "gemma-4-uncensored",
1660
+ label: "Gemma 4",
1661
+ description: "Gemma-family Venice text model; 256K context",
1662
+ },
1663
+ ];
1664
+ }
1665
+
1666
+ function resolveVeniceTextModel(value = "") {
1667
+ const normalized = String(value).trim().toLowerCase();
1668
+ if (!normalized || normalized === "on" || normalized === "venice" || normalized === "1.2" || normalized === "venice-1.2") {
1669
+ return "venice-uncensored-1-2";
1670
+ }
1671
+ if (
1672
+ normalized === "1.1" ||
1673
+ normalized === "venice-1.1" ||
1674
+ normalized === "e2ee-venice-uncensored-24b-p"
1675
+ ) {
1676
+ return "e2ee-venice-uncensored-24b-p";
1677
+ }
1678
+ if (normalized === "legacy" || normalized === "venice-uncensored") {
1679
+ return "venice-uncensored";
1680
+ }
1681
+ if (normalized === "gemma" || normalized === "gemma4" || normalized === "gemma-4" || normalized === "gemma-4-uncensored") {
1682
+ return "gemma-4-uncensored";
1683
+ }
1684
+ const exact = veniceTextModelChoices().find((item) => item.model.toLowerCase() === normalized);
1685
+ return exact?.model || "";
1686
+ }
1687
+
1688
+ function useVeniceModels(state, routeModel = "venice-uncensored-1-2", mainModel = routeModel) {
1644
1689
  state.routingMode = "smart";
1645
1690
  state.provider = "deepseek";
1646
1691
  state.model = "";
1647
1692
  state.routeProvider = "venice";
1648
- state.routeModel = "venice-uncensored-1-2";
1693
+ state.routeModel = routeModel;
1649
1694
  state.mainProvider = "venice";
1650
- state.mainModel = "venice-uncensored-1-2";
1651
- }
1652
-
1653
- function isVeniceDefaultActive(state) {
1654
- return (
1655
- state.routeProvider === "venice" &&
1656
- state.routeModel === "venice-uncensored-1-2" &&
1657
- state.mainProvider === "venice" &&
1658
- state.mainModel === "venice-uncensored-1-2"
1659
- );
1695
+ state.mainModel = mainModel;
1660
1696
  }
1661
1697
 
1662
1698
  function printModelRoles(state) {
@@ -1737,12 +1773,30 @@ function modelRoleChoices(role = "main") {
1737
1773
  {
1738
1774
  provider: "venice",
1739
1775
  model: "venice-uncensored-1-2",
1740
- label: "Venice Uncensored 1.2",
1776
+ label: "Venice 1.2",
1741
1777
  description: "Venice text route; use /auth venice if missing",
1742
1778
  route: true,
1743
1779
  main: true,
1744
1780
  spare: true,
1745
1781
  },
1782
+ {
1783
+ provider: "venice",
1784
+ model: "e2ee-venice-uncensored-24b-p",
1785
+ label: "Venice 1.1",
1786
+ description: "E2EE Venice text route; use /auth venice if missing",
1787
+ route: true,
1788
+ main: true,
1789
+ spare: true,
1790
+ },
1791
+ {
1792
+ provider: "venice",
1793
+ model: "gemma-4-uncensored",
1794
+ label: "Gemma 4",
1795
+ description: "Gemma-family Venice route; use /auth venice if missing",
1796
+ route: true,
1797
+ main: true,
1798
+ spare: true,
1799
+ },
1746
1800
  {
1747
1801
  provider: "openai",
1748
1802
  model: "gpt-5.5",
@@ -1849,7 +1903,7 @@ function providerChoices() {
1849
1903
  provider: "venice",
1850
1904
  model: "venice-uncensored-1-2",
1851
1905
  label: "Venice",
1852
- description: "manual Venice route; /venice toggles route+main roles",
1906
+ description: "manual Venice route; /venice picks route+main roles",
1853
1907
  },
1854
1908
  {
1855
1909
  provider: "qwen",
@@ -1880,10 +1934,12 @@ function renderSelector({ title, subtitle, options, selectedIndex, lineCount = 0
1880
1934
  if (lineCount > 0) clearSelector(lineCount);
1881
1935
  const width = Math.min(Math.max(terminalWidth() - 2, 60), 110);
1882
1936
  const bodyWidth = width - 4;
1937
+ const safeTitle = compactLine(title, bodyWidth);
1938
+ const safeSubtitle = compactLine(subtitle, bodyWidth);
1883
1939
  const rows = [
1884
1940
  `╭${"─".repeat(width - 2)}╮`,
1885
- `│ ${padVisible(title, bodyWidth)} │`,
1886
- `│ ${padVisible(subtitle, bodyWidth)} │`,
1941
+ `│ ${padVisible(safeTitle, bodyWidth)} │`,
1942
+ `│ ${padVisible(safeSubtitle, bodyWidth)} │`,
1887
1943
  `├${"─".repeat(width - 2)}┤`,
1888
1944
  ...options.map((option, index) => {
1889
1945
  const marker = index === selectedIndex ? ">" : " ";
@@ -2012,6 +2068,38 @@ async function pickModelRole(role, state) {
2012
2068
  return true;
2013
2069
  }
2014
2070
 
2071
+ async function pickVeniceRouteAndMain(state) {
2072
+ const options = veniceTextModelChoices();
2073
+ const routeIndex = Math.max(
2074
+ options.findIndex((item) => item.provider === state.routeProvider && item.model === state.routeModel),
2075
+ 0
2076
+ );
2077
+ const route = await selectModelChoice({
2078
+ title: "Select Venice route model",
2079
+ subtitle: "Route handles planning and short turns. Up/Down selects, Enter confirms, Esc cancels.",
2080
+ options,
2081
+ initialIndex: routeIndex,
2082
+ });
2083
+ if (!route) return false;
2084
+
2085
+ const mainIndex = Math.max(
2086
+ options.findIndex((item) => item.provider === state.mainProvider && item.model === state.mainModel),
2087
+ options.findIndex((item) => item.model === route.model),
2088
+ 0
2089
+ );
2090
+ const main = await selectModelChoice({
2091
+ title: "Select Venice main model",
2092
+ subtitle: "Main handles complex work. Up/Down selects, Enter confirms, Esc cancels.",
2093
+ options,
2094
+ initialIndex: mainIndex,
2095
+ });
2096
+ if (!main) return false;
2097
+
2098
+ useVeniceModels(state, route.model, main.model);
2099
+ printSystemLine(`venice=on routing=smart route=venice/${state.routeModel} main=venice/${state.mainModel}`);
2100
+ return true;
2101
+ }
2102
+
2015
2103
  async function pickProvider(state) {
2016
2104
  const options = providerChoices();
2017
2105
  const currentProvider = state.provider || "deepseek";
@@ -2266,19 +2354,45 @@ async function handleCommand(line, state, packageDir) {
2266
2354
  return true;
2267
2355
  }
2268
2356
  if (command === "venice") {
2269
- const action = value || (isVeniceDefaultActive(state) ? "off" : "on");
2357
+ const canUseSelector = input.isTTY && output.isTTY && typeof input.setRawMode === "function";
2358
+ const action = value || (canUseSelector ? "select" : "on");
2270
2359
  if (action === "off" || action === "deepseek" || action === "default") {
2271
2360
  useDeepSeekDefaults(state);
2272
2361
  printSystemLine("venice=off routing=smart route=deepseek/deepseek-v4-flash main=deepseek/deepseek-v4-pro");
2273
2362
  return true;
2274
2363
  }
2275
- if (action !== "on" && action !== "venice") {
2276
- printAgentMessage("Usage: /venice [on|off]. No argument toggles between Venice and DeepSeek defaults.");
2364
+ if (action === "select" && canUseSelector) {
2365
+ const changed = await pickVeniceRouteAndMain(state);
2366
+ if (!changed) {
2367
+ printSystemLine(`route=${state.routeProvider || "deepseek"}/${state.routeModel || "deepseek-v4-flash"} main=${state.mainProvider || "deepseek"}/${state.mainModel || "deepseek-v4-pro"}`);
2368
+ return true;
2369
+ }
2370
+ const keys = providerKeyStatus(process.cwd());
2371
+ if (!keys.venice) {
2372
+ printAgentMessage("Venice model roles are selected, but no Venice key is configured. Run `/auth venice` to save one.");
2373
+ }
2374
+ return true;
2375
+ }
2376
+
2377
+ const parts = action.split(/\s+/).filter(Boolean);
2378
+ const routeModel = resolveVeniceTextModel(parts[0] || "on");
2379
+ const mainModel = resolveVeniceTextModel(parts.slice(1).join(" ") || parts[0] || "on");
2380
+ if (!routeModel || !mainModel) {
2381
+ printAgentMessage(
2382
+ [
2383
+ "Usage: /venice [off|1.2|1.1|gemma] [main-model]",
2384
+ "Examples:",
2385
+ " /venice",
2386
+ " /venice gemma",
2387
+ " /venice 1.2 gemma",
2388
+ " /venice off",
2389
+ ].join("\n")
2390
+ );
2277
2391
  return true;
2278
2392
  }
2279
- useVeniceDefaults(state);
2393
+ useVeniceModels(state, routeModel, mainModel);
2280
2394
  const keys = providerKeyStatus(process.cwd());
2281
- printSystemLine("venice=on routing=smart route=venice/venice-uncensored-1-2 main=venice/venice-uncensored-1-2");
2395
+ printSystemLine(`venice=on routing=smart route=venice/${state.routeModel} main=venice/${state.mainModel}`);
2282
2396
  if (!keys.venice) {
2283
2397
  printAgentMessage("Venice model roles are selected, but no Venice key is configured. Run `/auth venice` to save one.");
2284
2398
  }
@@ -215,12 +215,19 @@ export const PROVIDER_MODEL_CATALOG = {
215
215
  context: "128K",
216
216
  description: "Current Venice uncensored text route.",
217
217
  },
218
+ {
219
+ id: "e2ee-venice-uncensored-24b-p",
220
+ label: "Venice Uncensored 1.1",
221
+ bucket: "venice-uncensored",
222
+ context: "32K",
223
+ description: "E2EE Venice uncensored 1.1 text route.",
224
+ },
218
225
  {
219
226
  id: "venice-uncensored",
220
- label: "Venice Uncensored",
227
+ label: "Venice Uncensored Legacy",
221
228
  bucket: "venice-uncensored",
222
229
  context: "32K",
223
- description: "Legacy Venice uncensored text route.",
230
+ description: "Deprecated legacy Venice uncensored text route.",
224
231
  },
225
232
  {
226
233
  id: "venice-uncensored-role-play",