@vierratale/ai 0.1.0-beta.15 → 0.1.0-beta.16
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 +24 -145
- package/bin/vierrataleai.js +1 -76
- package/build.sh +17 -0
- package/package.json +16 -22
- package/scripts/postinstall.js +2 -2
- package/src/catalog.js +48 -116
- package/src/cli.js +122 -1008
- package/src/config.js +10 -26
- package/src/index.js +1 -2
- package/src/installer.js +105 -0
- package/src/prompts/system.json +2 -2
- package/src/prompts/system.md +0 -42
- package/src/providers/anthropic.js +34 -65
- package/src/providers/base.js +0 -10
- package/src/providers/cortex.js +40 -223
- package/src/providers/gemini.js +31 -62
- package/src/providers/openai.js +33 -64
- package/src/session.js +15 -195
- package/src/ui/branding.js +1 -1
- package/src/utils/intents.js +1 -61
- package/src/utils/webfetch.js +24 -576
- package/src/utils/websearch.js +44 -213
- package/LICENSE +0 -21
- package/src/cmd/agent.js +0 -1825
- package/src/cmd/executor.js +0 -271
- package/src/cmd/todos.js +0 -64
- package/src/cmd/tools.js +0 -204
- package/src/engine.js +0 -150
- package/src/ui/chatbox.js +0 -280
- package/src/ui/input.js +0 -501
- package/src/utils/downloader.js +0 -364
- package/src/utils/filetree.js +0 -44
- package/src/utils/filewriter.js +0 -97
- package/src/utils/logger.js +0 -67
- package/src/utils/math.js +0 -142
package/README.md
CHANGED
|
@@ -4,25 +4,16 @@ Intelligent terminal assistant that runs AI models locally and in the cloud.
|
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
7
|
-
Install requirements and run from source:
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
git clone <your-repo-url>/vierratale-ai.git
|
|
11
|
-
cd vierratale-ai
|
|
12
|
-
|
|
13
|
-
./install.sh --node # installs requirements + links the commands
|
|
14
|
-
vierratale # start chatting
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
Or run directly from npm:
|
|
18
|
-
|
|
19
7
|
```bash
|
|
8
|
+
# From npm
|
|
20
9
|
npm install -g @vierratale/ai
|
|
10
|
+
|
|
11
|
+
# Or run directly
|
|
21
12
|
npx @vierratale/ai
|
|
22
13
|
```
|
|
23
14
|
|
|
24
15
|
The first launch detects and, if needed, installs and starts the local engine
|
|
25
|
-
(**Cortex**), then pulls the model you use.
|
|
16
|
+
(**Cortex** - "secretly" Ollama under the hood), then pulls the model you use.
|
|
26
17
|
|
|
27
18
|
## Usage
|
|
28
19
|
|
|
@@ -32,44 +23,32 @@ vierrataleai --provider cortex # Use local models
|
|
|
32
23
|
vierrataleai --provider openai # Use cloud models (OpenAI)
|
|
33
24
|
vierrataleai --provider anthropic # Use cloud models (Claude)
|
|
34
25
|
vierrataleai --provider gemini # Use cloud models (Gemini)
|
|
35
|
-
vierrataleai --model
|
|
26
|
+
vierrataleai --model vierratale-pro # Use specific model
|
|
36
27
|
```
|
|
37
28
|
|
|
38
29
|
## Models
|
|
39
30
|
|
|
40
31
|
Local models run through the **Cortex** engine:
|
|
41
32
|
|
|
42
|
-
| Model |
|
|
43
|
-
|
|
44
|
-
|
|
|
45
|
-
|
|
|
46
|
-
|
|
|
47
|
-
|
|
|
48
|
-
|
|
|
49
|
-
|
|
|
50
|
-
| VTL-3.5-Reason | reasoning |
|
|
51
|
-
| VTL-3.7-Ultra | ultra |
|
|
52
|
-
| VTL-4.7-Gusto | balanced |
|
|
53
|
-
| VTL-5.4-Tempo | balanced |
|
|
54
|
-
| VTL-5.2-Pinnacle | pro |
|
|
55
|
-
| VTL-5.9-Sovereign | pro |
|
|
33
|
+
| Model | Backend |
|
|
34
|
+
|-------|---------|
|
|
35
|
+
| vierratale-lite | qwen3:0.6b |
|
|
36
|
+
| vierratale-fast | gemma3:1b |
|
|
37
|
+
| vierratale-small | llama3.2:1b |
|
|
38
|
+
| vierratale-balanced | qwen2.5:1.5b |
|
|
39
|
+
| vierratale-plus | qwen3:1.7b |
|
|
40
|
+
| vierratale-pro | qwen2.5:3b |
|
|
56
41
|
|
|
57
42
|
Cloud models are available when the matching provider + API key is configured:
|
|
58
43
|
|
|
59
|
-
| Model |
|
|
60
|
-
|
|
61
|
-
|
|
|
62
|
-
|
|
|
63
|
-
|
|
|
64
|
-
|
|
|
65
|
-
|
|
|
66
|
-
|
|
|
67
|
-
| VTL-8.0-Fabric | cloud-fabric |
|
|
68
|
-
| VTL-9.0-Forge | cloud-forge |
|
|
69
|
-
| VTL-10.0-Singularity | cloud-singularity |
|
|
70
|
-
|
|
71
|
-
> Legacy `vierratale-*` and old `VRTL-*` model names (e.g. `vierratale-fast`,
|
|
72
|
-
> `vierratale-cloud`) still work and map to the VTL names.
|
|
44
|
+
| Model | Backend |
|
|
45
|
+
|-------|---------|
|
|
46
|
+
| vierratale-cloud-mini | gpt-4o-mini (OpenAI) |
|
|
47
|
+
| vierratale-cloud | gpt-4o (OpenAI) |
|
|
48
|
+
| vierratale-cloud-fast | claude-3-5-haiku-20241022 (Anthropic) |
|
|
49
|
+
| vierratale-cloud-pro | claude-sonnet-4-20250514 (Anthropic) |
|
|
50
|
+
| vierratale-cloud-lite | gemini-2.0-flash (Gemini) |
|
|
51
|
+
| vierratale-cloud-plus | gemini-1.5-pro (Gemini) |
|
|
73
52
|
|
|
74
53
|
## Commands
|
|
75
54
|
|
|
@@ -79,8 +58,6 @@ Cloud models are available when the matching provider + API key is configured:
|
|
|
79
58
|
- `/models` - List available models
|
|
80
59
|
- `/system [text]` - Set a custom system prompt / persona
|
|
81
60
|
- `/search <query>` - Search the web and summarize with AI
|
|
82
|
-
- `/fetch <url>` - Open a link and summarize its content
|
|
83
|
-
- `/log [n|path]` - Show the last n log entries (default 30) or the log file path
|
|
84
61
|
- `/clear` - Clear screen
|
|
85
62
|
- `/new` - Start a new conversation (clear memory)
|
|
86
63
|
- `/quit` - Exit
|
|
@@ -88,112 +65,14 @@ Cloud models are available when the matching provider + API key is configured:
|
|
|
88
65
|
## Smart Search
|
|
89
66
|
|
|
90
67
|
Asking a question (Who/What/When/Where/Why/How...?) automatically searches the
|
|
91
|
-
web and summarizes the results with AI.
|
|
92
|
-
trigger a search — e.g. `timun mas from indonesia`, `the legend of roro
|
|
93
|
-
jonggrang`. For example:
|
|
68
|
+
web and summarizes the results with AI. For example:
|
|
94
69
|
|
|
95
70
|
```
|
|
96
71
|
> Who is Cristiano Ronaldo?
|
|
97
|
-
> timun mas from indonesia
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
triggers a live web search and answers from the results. If no web results come
|
|
101
|
-
back, the AI answers from its own knowledge instead of going quiet. Use
|
|
102
|
-
`/search <query>` to force a search explicitly.
|
|
103
|
-
|
|
104
|
-
Story requests about any subject work the same way — no matter how they're
|
|
105
|
-
phrased (`a story about X`, `the legend of X`, `tell me about X`, `narrate the
|
|
106
|
-
tale of X`, `write X into a txt file`). The subject is pulled out of the
|
|
107
|
-
sentence, searched first, and the reply is saved to a `<subject>.txt` file.
|
|
108
|
-
A generic `tell me a story` (no subject) is told directly from the model — and
|
|
109
|
-
is also saved to a `.txt` file.
|
|
110
|
-
|
|
111
|
-
Greetings (`hi`, `hello`, `hey`, `good morning`, ...) are answered instantly
|
|
112
|
-
with a short fixed reply — they never reach the model.
|
|
113
|
-
|
|
114
|
-
## Writing Files
|
|
115
|
-
|
|
116
|
-
Ask the AI to create code, configs, scripts, web pages, or a whole project. When it
|
|
117
|
-
responds, it lists each file with a `FILE: <path>` header followed by a code
|
|
118
|
-
fence (and `FOLDER: <path>` for empty folders) — just running in the chat writes
|
|
119
|
-
them to your disk in the current working directory. Any file type is supported,
|
|
120
|
-
including JSON config files and HTML pages. Nested folders are created automatically, existing
|
|
121
|
-
files are skipped unless you confirm to overwrite, and nothing is ever written
|
|
122
|
-
outside the working directory.
|
|
123
|
-
|
|
124
|
-
If the AI ever answers with the code but forgets the `FILE:` header (or writes an
|
|
125
|
-
HTML page without a fence), the assistant rescues it: any `FILE: <path>` line in
|
|
126
|
-
the reply is honored even without a fence, otherwise the request is used to
|
|
127
|
-
infer a filename and the code block is saved anyway. Filename inference covers
|
|
128
|
-
many formats, not just web pages:
|
|
129
|
-
|
|
130
|
-
| Request contains… | Saved as |
|
|
131
|
-
|--------------------|----------|
|
|
132
|
-
| `html` / `webpage` / `website` / `page` | `index.html` |
|
|
133
|
-
| `css` | `style.css` |
|
|
134
|
-
| `python` / `py` | `script.py` |
|
|
135
|
-
| `flask` / `django` / `fastapi` / `streamlit` / `app` | `app.py` |
|
|
136
|
-
| `javascript` / `js` / `script` | `script.js` |
|
|
137
|
-
| `typescript` / `ts` | `script.ts` |
|
|
138
|
-
| `bash` / `zsh` / `shell` | `script.sh` |
|
|
139
|
-
| `json` / `yaml` / `yml` / `csv` / `sql` | `output.json` / `.yml` / `.csv` / `.sql` |
|
|
140
|
-
|
|
141
|
-
When the request has no hint at all, the fence language in the reply picks the
|
|
142
|
-
name (```python → `script.py`, ```css → `style.css`, …). Saving also kicks in
|
|
143
|
-
whenever the reply itself contains a `FILE:`/`FOLDER:` line, or when a reply is
|
|
144
|
-
basically just one substantial code block, even if the request phrasing wasn't
|
|
145
|
-
matched.
|
|
146
|
-
|
|
147
|
-
For file requests, a short format instruction is silently attached to your
|
|
148
|
-
message so the model emits complete `FILE:` blocks with closed fences. And if
|
|
149
|
-
the model ever answers a file request *without any code* (free-style prose,
|
|
150
|
-
interrupted before a fence), nothing is saved and you get a notice telling you
|
|
151
|
-
to ask again — a `.py` file full of chatter is never created.
|
|
152
|
-
|
|
153
|
-
Example of what the AI emits:
|
|
154
|
-
|
|
155
|
-
```
|
|
156
|
-
FILE: config.json
|
|
157
|
-
```json
|
|
158
|
-
{
|
|
159
|
-
"name": "my-app",
|
|
160
|
-
"port": 3000
|
|
161
|
-
}
|
|
162
72
|
```
|
|
163
73
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
<!doctype html>
|
|
167
|
-
<html><body>Hello</body></html>
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
FILE: src/hello.js
|
|
171
|
-
```js
|
|
172
|
-
console.log('Hello VierrataleAI');
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
## Chat UI
|
|
176
|
-
|
|
177
|
-
The chat runs in a clean, minimal full-screen interface: your turns are labelled
|
|
178
|
-
`You` and the assistant's `AI`, with plain wrapped text in between. Code blocks
|
|
179
|
-
are the exception — they render inside a green bordered box with their language
|
|
180
|
-
tag (`╭─ html ─╮`), so files stand out at a glance. The latest reply stays pinned
|
|
181
|
-
to the bottom of the terminal while it streams in (no screen flashing), and
|
|
182
|
-
internal search/fetch context stays hidden.
|
|
183
|
-
|
|
184
|
-
## Automatic Logging
|
|
185
|
-
|
|
186
|
-
Everything that happens in a session is written automatically to a per-day log
|
|
187
|
-
file in `~/.config/vierrataleai/logs/` (e.g. `vierrataleai-20260101.log`):
|
|
188
|
-
app/session start, every user message, every AI reply, every file write or
|
|
189
|
-
skip, and any errors — with a timestamp. The logs are plain text and safe to
|
|
190
|
-
grep. To inspect them from inside the chat:
|
|
191
|
-
|
|
192
|
-
```
|
|
193
|
-
/log # show the last 30 entries
|
|
194
|
-
/log 100 # show the last 100 entries
|
|
195
|
-
/log path # print the log file path
|
|
196
|
-
```
|
|
74
|
+
triggers a live web search and answers from the results. Use `/search <query>`
|
|
75
|
+
to force a search explicitly.
|
|
197
76
|
|
|
198
77
|
## Conversation Memory
|
|
199
78
|
|
package/bin/vierrataleai.js
CHANGED
|
@@ -1,78 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// VierrataleAI launcher + installer.
|
|
3
|
-
//
|
|
4
|
-
// Running without flags starts the assistant and auto-detects dependencies:
|
|
5
|
-
// if the AI engine (ollama) or the model is missing, they are installed first.
|
|
6
|
-
// Running with --install (or --setup / install) additionally creates a global
|
|
7
|
-
// "vierrataleai" / "vierratale" command, then starts the assistant.
|
|
8
|
-
//
|
|
9
|
-
// Installation progress is always the fake animated bar — real engine/model
|
|
10
|
-
// output is deliberately hidden so first-run feels quick and clean.
|
|
11
2
|
import { run } from '../src/cli.js';
|
|
12
|
-
|
|
13
|
-
import { Config } from '../src/config.js';
|
|
14
|
-
import { Branding } from '../src/ui/branding.js';
|
|
15
|
-
|
|
16
|
-
const C = Branding.colors;
|
|
17
|
-
|
|
18
|
-
const INSTALL_STEPS = [
|
|
19
|
-
'Checking the AI engine',
|
|
20
|
-
'Installing dependencies',
|
|
21
|
-
'Downloading the model',
|
|
22
|
-
'Linking the vierrataleai command',
|
|
23
|
-
'Optimizing for this device',
|
|
24
|
-
];
|
|
25
|
-
|
|
26
|
-
const READY_STEPS = ['Checking engine', 'Installing dependencies', 'Downloading model', 'Optimizing'];
|
|
27
|
-
|
|
28
|
-
function delay(ms) {
|
|
29
|
-
return new Promise((r) => setTimeout(r, ms));
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
async function fakeProgress(steps, work) {
|
|
33
|
-
const frames = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];
|
|
34
|
-
let i = 0;
|
|
35
|
-
const tty = process.stdout.isTTY;
|
|
36
|
-
const timer = setInterval(() => {
|
|
37
|
-
if (!tty) return;
|
|
38
|
-
i++;
|
|
39
|
-
const stage = steps[Math.floor((i / 10) % steps.length)];
|
|
40
|
-
const pct = String(8 + ((i * 7) % 85)).padStart(3, ' ');
|
|
41
|
-
const bar = frames[i % frames.length];
|
|
42
|
-
const fillLen = 1 + (i % 20);
|
|
43
|
-
const fill = '█'.repeat(fillLen) + '░'.repeat(Math.max(0, 20 - fillLen));
|
|
44
|
-
process.stdout.write(`\r ${C.accent}${bar}${C.reset} ${C.bold}${pct}%${C.reset} ${C.dim}${stage}${C.reset} [${C.accent}${fill}${C.reset}]`);
|
|
45
|
-
}, 110);
|
|
46
|
-
try {
|
|
47
|
-
return await work;
|
|
48
|
-
} finally {
|
|
49
|
-
clearInterval(timer);
|
|
50
|
-
if (tty) process.stdout.write('\r\x1b[2K');
|
|
51
|
-
process.stdout.write(` ${C.success}✔${C.reset} ${C.bold}${C.dim}100%${C.reset} ${C.dim}Ready${C.reset}\n`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
async function main() {
|
|
56
|
-
const args = process.argv.slice(2);
|
|
57
|
-
const doInstall = args.includes('--install') || args.includes('--setup') || args.includes('install');
|
|
58
|
-
const quick = args.includes('--version') || args.includes('-v') || args.includes('--help') || args.includes('-h');
|
|
59
|
-
|
|
60
|
-
Config.load();
|
|
61
|
-
|
|
62
|
-
if (doInstall) {
|
|
63
|
-
console.log(`\n ${C.bold}${C.primary}${Branding.APP_NAME} ${Branding.VERSION}${C.reset} ${C.dim}— installer${C.reset}\n`);
|
|
64
|
-
await fakeProgress(INSTALL_STEPS, Engine.ensure());
|
|
65
|
-
console.log();
|
|
66
|
-
} else if (!quick) {
|
|
67
|
-
// Auto-detect: install anything that's missing (engine, model) before starting.
|
|
68
|
-
await fakeProgress(READY_STEPS, Engine.ensure());
|
|
69
|
-
console.log();
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return run();
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
main().catch((err) => {
|
|
76
|
-
console.error(err);
|
|
77
|
-
process.exit(1);
|
|
78
|
-
});
|
|
3
|
+
run();
|
package/build.sh
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Build VierrataleAI Node.js version for packaging
|
|
3
|
+
set -e
|
|
4
|
+
|
|
5
|
+
cd "$(dirname "$0")"
|
|
6
|
+
|
|
7
|
+
echo "Installing dependencies..."
|
|
8
|
+
npm install
|
|
9
|
+
|
|
10
|
+
echo "Testing..."
|
|
11
|
+
node bin/vierrataleai.js --version
|
|
12
|
+
|
|
13
|
+
echo "Packaging..."
|
|
14
|
+
npm pack
|
|
15
|
+
|
|
16
|
+
echo "Build complete!"
|
|
17
|
+
echo "To publish: npm publish --tag beta"
|
package/package.json
CHANGED
|
@@ -1,31 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vierratale/ai",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.16",
|
|
4
4
|
"description": "VierrataleAI - Intelligent terminal assistant",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"engines": {
|
|
8
|
-
"node": ">=18"
|
|
9
|
-
},
|
|
10
6
|
"bin": {
|
|
11
|
-
"vierrataleai": "./bin/vierrataleai.js"
|
|
12
|
-
|
|
7
|
+
"vierrataleai": "./bin/vierrataleai.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./src/index.js",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": "./src/index.js"
|
|
13
12
|
},
|
|
14
13
|
"scripts": {
|
|
14
|
+
"start": "node bin/vierrataleai.js",
|
|
15
|
+
"test": "node --test test/",
|
|
15
16
|
"postinstall": "node scripts/postinstall.js"
|
|
16
17
|
},
|
|
17
|
-
"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
"
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"ai",
|
|
26
|
-
"chatbot",
|
|
27
|
-
"terminal",
|
|
28
|
-
"assistant",
|
|
29
|
-
"llm"
|
|
30
|
-
]
|
|
31
|
-
}
|
|
18
|
+
"keywords": ["ai", "chatbot", "terminal", "assistant", "llm"],
|
|
19
|
+
"author": "Vierratale",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=18.0.0"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {}
|
|
25
|
+
}
|
package/scripts/postinstall.js
CHANGED
|
@@ -25,9 +25,9 @@ try {
|
|
|
25
25
|
execSync('curl -fsSL https://ollama.com/install.sh | sh', { stdio: 'inherit' });
|
|
26
26
|
} else {
|
|
27
27
|
console.log(
|
|
28
|
-
'\n[vierrataleai] The local engine was not detected.\n' +
|
|
28
|
+
'\n[vierrataleai] The local engine (ollama) was not detected.\n' +
|
|
29
29
|
' - Run the CLI: it will attempt to install and start the engine automatically.\n' +
|
|
30
|
-
' - Or
|
|
30
|
+
' - Or install it yourself: curl -fsSL https://ollama.com/install.sh | sh\n'
|
|
31
31
|
);
|
|
32
32
|
}
|
|
33
33
|
} catch {
|
package/src/catalog.js
CHANGED
|
@@ -1,59 +1,16 @@
|
|
|
1
|
-
// Model catalog. Display names use the opaque VTL branding:
|
|
2
|
-
// VTL-<number>.<name>, e.g. VTL-2.7-Flash, VTL-4.0.
|
|
3
|
-
// The real engine tags are mapped to display names here and kept internal.
|
|
4
1
|
const MODELS = {
|
|
5
|
-
'qwen3:0.6b': '
|
|
6
|
-
'gemma3:1b': '
|
|
7
|
-
'llama3.2:1b': '
|
|
8
|
-
'
|
|
9
|
-
'
|
|
10
|
-
'qwen2.5
|
|
11
|
-
'
|
|
12
|
-
'
|
|
13
|
-
'
|
|
14
|
-
'
|
|
15
|
-
'
|
|
16
|
-
'
|
|
17
|
-
'gpt-4o-mini': 'VTL-4.0',
|
|
18
|
-
'gpt-4o': 'VTL-4.2-Omni',
|
|
19
|
-
'claude-3-5-haiku-20241022': 'VTL-4.5-Plus',
|
|
20
|
-
'claude-sonnet-4-20250514': 'VTL-5.0-Pro',
|
|
21
|
-
'gemini-2.0-flash': 'VTL-6.0-Reason',
|
|
22
|
-
'gemini-1.5-pro': 'VTL-7.0-Omnij',
|
|
23
|
-
'kimi-k2.6:cloud': 'VTL-8.0-Fabric',
|
|
24
|
-
'kimi-k2.7-code:cloud': 'VTL-9.0-Forge',
|
|
25
|
-
'kimi-k3': 'VTL-10.0-Singularity',
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
// Legacy display names (older `VRTL-*` and `vierratale-<word>`), accepted
|
|
29
|
-
// everywhere for backwards compatibility (existing config files may contain
|
|
30
|
-
// them). All map onto the current VTL display names.
|
|
31
|
-
const LEGACY_DISPLAY = {
|
|
32
|
-
'VRTL-1.lite': 'VTL-2.5-Mini',
|
|
33
|
-
'VRTL-2.fast': 'VTL-2.7-Flash',
|
|
34
|
-
'VRTL-3.small': 'VTL-2.9-Core',
|
|
35
|
-
'VRTL-4.balanced': 'VTL-3.1-Plus',
|
|
36
|
-
'VRTL-4.coder': 'VTL-3.3-Pro',
|
|
37
|
-
'VRTL-5.plus': 'VTL-3.5-Reason',
|
|
38
|
-
'VRTL-6.pro': 'VTL-3.7-Ultra',
|
|
39
|
-
'VRTL-7.cloud-mini': 'VTL-4.0',
|
|
40
|
-
'VRTL-8.cloud': 'VTL-4.2-Omni',
|
|
41
|
-
'VRTL-9.cloud-fast': 'VTL-4.5-Plus',
|
|
42
|
-
'VRTL-10.cloud-pro': 'VTL-5.0-Pro',
|
|
43
|
-
'VRTL-11.cloud-lite': 'VTL-6.0-Reason',
|
|
44
|
-
'VRTL-12.cloud-plus': 'VTL-7.0-Omnij',
|
|
45
|
-
'vierratale-lite': 'VTL-2.5-Mini',
|
|
46
|
-
'vierratale-fast': 'VTL-2.7-Flash',
|
|
47
|
-
'vierratale-small': 'VTL-2.9-Core',
|
|
48
|
-
'vierratale-balanced': 'VTL-3.1-Plus',
|
|
49
|
-
'vierratale-plus': 'VTL-3.5-Reason',
|
|
50
|
-
'vierratale-pro': 'VTL-3.7-Ultra',
|
|
51
|
-
'vierratale-cloud-mini': 'VTL-4.0',
|
|
52
|
-
'vierratale-cloud': 'VTL-4.2-Omni',
|
|
53
|
-
'vierratale-cloud-fast': 'VTL-4.5-Plus',
|
|
54
|
-
'vierratale-cloud-pro': 'VTL-5.0-Pro',
|
|
55
|
-
'vierratale-cloud-lite': 'VTL-6.0-Reason',
|
|
56
|
-
'vierratale-cloud-plus': 'VTL-7.0-Omnij',
|
|
2
|
+
'qwen3:0.6b': 'vierratale-lite',
|
|
3
|
+
'gemma3:1b': 'vierratale-fast',
|
|
4
|
+
'llama3.2:1b': 'vierratale-small',
|
|
5
|
+
'qwen2.5:1.5b': 'vierratale-balanced',
|
|
6
|
+
'qwen3:1.7b': 'vierratale-plus',
|
|
7
|
+
'qwen2.5:3b': 'vierratale-pro',
|
|
8
|
+
'gpt-4o-mini': 'vierratale-cloud-mini',
|
|
9
|
+
'gpt-4o': 'vierratale-cloud',
|
|
10
|
+
'claude-3-5-haiku-20241022': 'vierratale-cloud-fast',
|
|
11
|
+
'claude-sonnet-4-20250514': 'vierratale-cloud-pro',
|
|
12
|
+
'gemini-2.0-flash': 'vierratale-cloud-lite',
|
|
13
|
+
'gemini-1.5-pro': 'vierratale-cloud-plus',
|
|
57
14
|
};
|
|
58
15
|
|
|
59
16
|
const REVERSE = Object.fromEntries(
|
|
@@ -61,64 +18,26 @@ const REVERSE = Object.fromEntries(
|
|
|
61
18
|
);
|
|
62
19
|
|
|
63
20
|
const LOCAL_MODELS = [
|
|
64
|
-
'
|
|
65
|
-
'
|
|
66
|
-
'
|
|
67
|
-
'
|
|
68
|
-
'
|
|
69
|
-
'
|
|
70
|
-
'VTL-3.5-Reason',
|
|
71
|
-
'VTL-3.7-Ultra',
|
|
72
|
-
'VTL-4.7-Gusto',
|
|
73
|
-
'VTL-5.4-Tempo',
|
|
74
|
-
'VTL-5.2-Pinnacle',
|
|
75
|
-
'VTL-5.9-Sovereign',
|
|
21
|
+
'vierratale-lite',
|
|
22
|
+
'vierratale-fast',
|
|
23
|
+
'vierratale-small',
|
|
24
|
+
'vierratale-balanced',
|
|
25
|
+
'vierratale-plus',
|
|
26
|
+
'vierratale-pro',
|
|
76
27
|
];
|
|
77
28
|
|
|
78
29
|
const CLOUD_MODELS = [
|
|
79
|
-
'
|
|
80
|
-
'
|
|
81
|
-
'
|
|
82
|
-
'
|
|
83
|
-
'
|
|
84
|
-
'
|
|
85
|
-
'VTL-8.0-Fabric',
|
|
86
|
-
'VTL-9.0-Forge',
|
|
87
|
-
'VTL-10.0-Singularity',
|
|
30
|
+
'vierratale-cloud-mini',
|
|
31
|
+
'vierratale-cloud',
|
|
32
|
+
'vierratale-cloud-fast',
|
|
33
|
+
'vierratale-cloud-pro',
|
|
34
|
+
'vierratale-cloud-lite',
|
|
35
|
+
'vierratale-cloud-plus',
|
|
88
36
|
];
|
|
89
37
|
|
|
90
|
-
const TIERS = {
|
|
91
|
-
'VTL-2.5-Mini': 'minimal',
|
|
92
|
-
'VTL-2.7-Flash': 'fast',
|
|
93
|
-
'VTL-2.9-Core': 'small',
|
|
94
|
-
'VTL-3.2-Orbit': 'small',
|
|
95
|
-
'VTL-3.1-Plus': 'balanced',
|
|
96
|
-
'VTL-3.3-Pro': 'coder',
|
|
97
|
-
'VTL-3.5-Reason': 'reasoning',
|
|
98
|
-
'VTL-3.7-Ultra': 'ultra',
|
|
99
|
-
'VTL-4.7-Gusto': 'balanced',
|
|
100
|
-
'VTL-5.4-Tempo': 'balanced',
|
|
101
|
-
'VTL-5.2-Pinnacle': 'pro',
|
|
102
|
-
'VTL-5.9-Sovereign': 'pro',
|
|
103
|
-
'VTL-4.0': 'cloud-mini',
|
|
104
|
-
'VTL-4.2-Omni': 'cloud',
|
|
105
|
-
'VTL-4.5-Plus': 'cloud-fast',
|
|
106
|
-
'VTL-5.0-Pro': 'cloud-pro',
|
|
107
|
-
'VTL-6.0-Reason': 'cloud-lite',
|
|
108
|
-
'VTL-7.0-Omnij': 'cloud-plus',
|
|
109
|
-
'VTL-8.0-Fabric': 'cloud-fabric',
|
|
110
|
-
'VTL-9.0-Forge': 'cloud-forge',
|
|
111
|
-
'VTL-10.0-Singularity': 'cloud-singularity',
|
|
112
|
-
};
|
|
113
|
-
|
|
114
38
|
export const Catalog = {
|
|
115
|
-
// Map any known name (new or legacy) to the current VTL display name.
|
|
116
|
-
normalize(displayName) {
|
|
117
|
-
return LEGACY_DISPLAY[displayName] || displayName;
|
|
118
|
-
},
|
|
119
|
-
|
|
120
39
|
getRealModel(displayName) {
|
|
121
|
-
return REVERSE[
|
|
40
|
+
return REVERSE[displayName] || displayName;
|
|
122
41
|
},
|
|
123
42
|
|
|
124
43
|
getDisplayName(realModel) {
|
|
@@ -138,23 +57,23 @@ export const Catalog = {
|
|
|
138
57
|
},
|
|
139
58
|
|
|
140
59
|
getDefaultModel() {
|
|
141
|
-
return '
|
|
60
|
+
return 'vierratale-fast';
|
|
142
61
|
},
|
|
143
62
|
|
|
144
63
|
getDefaultCloudModel() {
|
|
145
|
-
return '
|
|
64
|
+
return 'vierratale-cloud-mini';
|
|
146
65
|
},
|
|
147
66
|
|
|
148
67
|
isLocalModel(displayName) {
|
|
149
|
-
return LOCAL_MODELS.includes(
|
|
68
|
+
return LOCAL_MODELS.includes(displayName);
|
|
150
69
|
},
|
|
151
70
|
|
|
152
71
|
isCloudModel(displayName) {
|
|
153
|
-
return CLOUD_MODELS.includes(
|
|
72
|
+
return CLOUD_MODELS.includes(displayName);
|
|
154
73
|
},
|
|
155
74
|
|
|
156
75
|
getVendorForCloudModel(displayName) {
|
|
157
|
-
const real = REVERSE[
|
|
76
|
+
const real = REVERSE[displayName];
|
|
158
77
|
if (real && real.startsWith('claude-')) return 'anthropic';
|
|
159
78
|
if (real && real.startsWith('gemini-')) return 'gemini';
|
|
160
79
|
if (real && real.startsWith('gpt-')) return 'openai';
|
|
@@ -162,17 +81,30 @@ export const Catalog = {
|
|
|
162
81
|
},
|
|
163
82
|
|
|
164
83
|
getModelInfo(displayName) {
|
|
165
|
-
const
|
|
166
|
-
const real = REVERSE[name];
|
|
84
|
+
const real = REVERSE[displayName];
|
|
167
85
|
if (!real) return null;
|
|
168
|
-
const isLocal = LOCAL_MODELS.includes(
|
|
169
|
-
const isCloud = CLOUD_MODELS.includes(
|
|
86
|
+
const isLocal = LOCAL_MODELS.includes(displayName);
|
|
87
|
+
const isCloud = CLOUD_MODELS.includes(displayName);
|
|
88
|
+
const tiers = {
|
|
89
|
+
'vierratale-lite': 'minimal',
|
|
90
|
+
'vierratale-fast': 'fast',
|
|
91
|
+
'vierratale-small': 'small',
|
|
92
|
+
'vierratale-balanced': 'balanced',
|
|
93
|
+
'vierratale-plus': 'plus',
|
|
94
|
+
'vierratale-pro': 'professional',
|
|
95
|
+
'vierratale-cloud-mini': 'cloud-mini',
|
|
96
|
+
'vierratale-cloud': 'cloud',
|
|
97
|
+
'vierratale-cloud-fast': 'cloud-fast',
|
|
98
|
+
'vierratale-cloud-pro': 'cloud-pro',
|
|
99
|
+
'vierratale-cloud-lite': 'cloud-lite',
|
|
100
|
+
'vierratale-cloud-plus': 'cloud-plus',
|
|
101
|
+
};
|
|
170
102
|
return {
|
|
171
103
|
displayName,
|
|
172
104
|
realModel: real,
|
|
173
105
|
isLocal,
|
|
174
106
|
isCloud,
|
|
175
|
-
tier:
|
|
107
|
+
tier: tiers[displayName] || 'unknown',
|
|
176
108
|
};
|
|
177
109
|
},
|
|
178
110
|
};
|