@lazyingart/agintiflow 0.17.6 → 0.18.0
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 +6 -3
- package/docs/auxiliary-image-generation.md +15 -4
- package/package.json +7 -2
- package/public/app.js +62 -5
- package/public/index.html +15 -3
- package/public/styles.css +68 -0
- package/references/agintiflow-logo-prompt.md +57 -0
- package/references/backend-frontend-artifact-tunnel.md +214 -0
- package/references/codex-style-agent-command-execution.md +112 -0
- package/references/design-philosophy-review.md +234 -0
- package/references/model-routing-provider-design.md +63 -0
- package/references/run_design_scan.sh +91 -0
- package/references/venice-model-reference.md +119 -0
- package/scripts/smoke-auth.js +14 -3
- package/scripts/smoke-auxiliary-tools.js +27 -1
- package/scripts/smoke-capabilities.js +1 -0
- package/scripts/smoke-web-api.js +12 -0
- package/src/agent-runner.js +1 -1
- package/src/auth-onboarding.js +13 -4
- package/src/auxiliary-tools.js +144 -4
- package/src/capabilities.js +5 -1
- package/src/cli.js +11 -6
- package/src/command-policy.js +3 -0
- package/src/config.js +9 -1
- package/src/interactive-cli.js +5 -5
- package/src/model-client.js +8 -3
- package/src/model-routing.js +249 -2
- package/src/project.js +31 -5
- package/src/redaction.js +1 -1
- package/src/task-profiles.js +1 -1
- package/web.js +5 -2
package/README.md
CHANGED
|
@@ -46,15 +46,17 @@ aginti --list-profiles
|
|
|
46
46
|
aginti --sandbox-status
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
On first interactive use, if no main model key is detected, `aginti` opens an auth wizard. Use Up/Down to choose DeepSeek, OpenAI, or
|
|
49
|
+
On first interactive use, if no main model key is detected, `aginti` opens an auth wizard. Use Up/Down to choose DeepSeek, OpenAI, Qwen, or Venice, paste the key, and press Enter to save it to the project-local ignored file `.aginti/.env` with `0600` permissions. The wizard points to DeepSeek keys at `https://platform.deepseek.com/api_keys`, OpenAI keys at `https://platform.openai.com/api-keys`, and Venice at `https://venice.ai`. It then offers the optional auxiliary image key; press Esc to skip. You can rerun it even when keys already exist:
|
|
50
50
|
|
|
51
51
|
```bash
|
|
52
52
|
aginti auth
|
|
53
53
|
aginti auth openai
|
|
54
|
+
aginti auth venice
|
|
54
55
|
# inside chat, use /login or /auth for the same wizard
|
|
55
56
|
# or non-interactively:
|
|
56
57
|
printf '%s' "$DEEPSEEK_API_KEY" | aginti keys set deepseek --stdin
|
|
57
58
|
printf '%s' "$QWEN_API_KEY" | aginti keys set qwen --stdin
|
|
59
|
+
printf '%s' "$VENICE_API_KEY" | aginti keys set venice --stdin
|
|
58
60
|
|
|
59
61
|
# optional image-generation auxiliary skill:
|
|
60
62
|
aginti login grsai
|
|
@@ -83,7 +85,7 @@ The next productive-agent roadmap is tracked in [docs/productive-agent-roadmap.m
|
|
|
83
85
|
|
|
84
86
|
For current docs, install errors, package/toolchain setup, and source discovery, the agent has a guarded `web_search` tool. It returns compact search results without browser search-engine loops and respects configured domain allowlists. Disable with `--no-web-search`.
|
|
85
87
|
|
|
86
|
-
For raster image work, AgInTiFlow has
|
|
88
|
+
For raster image work, AgInTiFlow has optional `image_generation` and `venice_image_generation` skills backed by the `generate_image` tool and local `GRSAI` or `VENICE_API_KEY` credentials. The skill tells the model when image generation is appropriate; the tool saves manifests/images under `artifacts/images` and sends the result to the canvas. See [docs/auxiliary-image-generation.md](docs/auxiliary-image-generation.md) and [references/venice-model-reference.md](references/venice-model-reference.md).
|
|
87
89
|
|
|
88
90
|
For long-running shell work, AgInTiFlow exposes host-side tmux tools when the shell tool is enabled: `tmux_list_sessions`, `tmux_capture_pane`, `tmux_send_keys`, and `tmux_start_session`. Use normal prompts such as `start this test server in tmux and monitor it` or `check my tmux session`. The agent captures panes before interacting, redacts outputs, blocks secret-like sends, and avoids sending sudo passwords or destructive commands. Tmux is intentionally host-side: Docker `run_command` containers are short-lived, so tmux servers started there cannot persist.
|
|
89
91
|
|
|
@@ -273,7 +275,7 @@ Defaults:
|
|
|
273
275
|
| `smart` | DeepSeek | Fast for normal tasks, pro for complex tasks | `AGENT_ROUTING_MODE=smart` |
|
|
274
276
|
| `fast` | DeepSeek | `deepseek-v4-flash` | `DEEPSEEK_FAST_MODEL` |
|
|
275
277
|
| `complex` | DeepSeek | `deepseek-v4-pro` | `DEEPSEEK_PRO_MODEL` |
|
|
276
|
-
| `manual` | DeepSeek/OpenAI/Qwen | user supplied | `AGENT_PROVIDER`, `LLM_MODEL` |
|
|
278
|
+
| `manual` | DeepSeek/OpenAI/Qwen/Venice | user supplied | `AGENT_PROVIDER`, `LLM_MODEL` |
|
|
277
279
|
|
|
278
280
|
Provider credentials:
|
|
279
281
|
|
|
@@ -282,6 +284,7 @@ Provider credentials:
|
|
|
282
284
|
| OpenAI | `OPENAI_API_KEY` | `https://api.openai.com/v1` |
|
|
283
285
|
| DeepSeek | `DEEPSEEK_API_KEY` | `https://api.deepseek.com/v1` |
|
|
284
286
|
| Qwen | `QWEN_API_KEY` | `QWEN_BASE_URL` or DashScope compatible mode |
|
|
287
|
+
| Venice | `VENICE_API_KEY` | `VENICE_API_BASE` or `https://api.venice.ai/api/v1` |
|
|
285
288
|
|
|
286
289
|
Project-local credentials can be stored without committing secrets:
|
|
287
290
|
|
|
@@ -5,16 +5,18 @@ AgInTiFlow separates **skills** from **tools**:
|
|
|
5
5
|
- A skill is instruction and routing context that teaches the agent when a capability is useful.
|
|
6
6
|
- A tool is the deterministic callable function that performs the action and writes auditable artifacts.
|
|
7
7
|
|
|
8
|
-
The optional image-generation
|
|
8
|
+
The optional image-generation skills are `image_generation` and `venice_image_generation`. Both use the deterministic `generate_image` tool.
|
|
9
9
|
|
|
10
10
|
## Setup
|
|
11
11
|
|
|
12
|
-
Store
|
|
12
|
+
Store a GRS AI or Venice key project-locally:
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
15
|
aginti login grsai
|
|
16
|
+
aginti login venice
|
|
16
17
|
# or
|
|
17
18
|
printf '%s' "$GRSAI" | aginti keys set grsai --stdin
|
|
19
|
+
printf '%s' "$VENICE_API_KEY" | aginti keys set venice --stdin
|
|
18
20
|
```
|
|
19
21
|
|
|
20
22
|
Inside interactive chat, use either spelling:
|
|
@@ -24,7 +26,7 @@ Inside interactive chat, use either spelling:
|
|
|
24
26
|
/auxiliary grsai
|
|
25
27
|
```
|
|
26
28
|
|
|
27
|
-
|
|
29
|
+
Keys are saved in `.aginti/.env` as `GRSAI` or `VENICE_API_KEY` with `0600` permissions. The CLI and web app only report whether a key exists; they never return raw values.
|
|
28
30
|
|
|
29
31
|
## Runtime Flow
|
|
30
32
|
|
|
@@ -33,6 +35,8 @@ For image, cover, poster, illustration, photo, or logo-concept requests, the mod
|
|
|
33
35
|
```json
|
|
34
36
|
{
|
|
35
37
|
"prompt": "A polished cyan robot painting a circuit-board river, high-end product illustration",
|
|
38
|
+
"provider": "venice",
|
|
39
|
+
"model": "nano-banana-2",
|
|
36
40
|
"outputDir": "artifacts/images/robot-cover",
|
|
37
41
|
"outputStem": "robot-cover",
|
|
38
42
|
"aspectRatio": "1:1",
|
|
@@ -40,18 +44,25 @@ For image, cover, poster, illustration, photo, or logo-concept requests, the mod
|
|
|
40
44
|
}
|
|
41
45
|
```
|
|
42
46
|
|
|
43
|
-
|
|
47
|
+
With GRS AI, the tool uses the Nano Banana API:
|
|
44
48
|
|
|
45
49
|
- `POST https://grsaiapi.com/v1/draw/nano-banana`
|
|
46
50
|
- `POST https://grsaiapi.com/v1/draw/result`
|
|
47
51
|
- `Authorization: Bearer <GRSAI>`
|
|
48
52
|
|
|
53
|
+
With Venice, the tool uses the image-generation API:
|
|
54
|
+
|
|
55
|
+
- `POST https://api.venice.ai/api/v1/image/generate`
|
|
56
|
+
- `Authorization: Bearer <VENICE_API_KEY>`
|
|
57
|
+
- image models such as `nano-banana-2`, `gpt-image-2`, `qwen-image-2`, `wan-2-7-text-to-image`, `bria-bg-remover`, and `venice-sd35`
|
|
58
|
+
|
|
49
59
|
Saved workspace artifacts:
|
|
50
60
|
|
|
51
61
|
- `prompt.txt`
|
|
52
62
|
- `request_payload.redacted.json`
|
|
53
63
|
- `submit_response.json`
|
|
54
64
|
- `result_response.json`
|
|
65
|
+
- `venice_result_response.json` for Venice image calls
|
|
55
66
|
- `task_manifest.json`
|
|
56
67
|
- generated image files, for example `image.png`
|
|
57
68
|
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lazyingart/agintiflow",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "AgInTiFlow is a
|
|
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",
|
|
7
7
|
"homepage": "https://flow.lazying.art",
|
|
8
8
|
"repository": {
|
|
@@ -18,6 +18,9 @@
|
|
|
18
18
|
"browser",
|
|
19
19
|
"playwright",
|
|
20
20
|
"deepseek",
|
|
21
|
+
"venice",
|
|
22
|
+
"openai",
|
|
23
|
+
"qwen",
|
|
21
24
|
"sandbox",
|
|
22
25
|
"cli"
|
|
23
26
|
],
|
|
@@ -38,6 +41,8 @@
|
|
|
38
41
|
"logos/banner-opaque.png",
|
|
39
42
|
"logos/logo.png",
|
|
40
43
|
"public/",
|
|
44
|
+
"references/*.md",
|
|
45
|
+
"references/run_design_scan.sh",
|
|
41
46
|
"scripts/install-docker-ubuntu.sh",
|
|
42
47
|
"scripts/setup-agent-toolchain-docker.sh",
|
|
43
48
|
"scripts/real-deepseek-capabilities.js",
|
package/public/app.js
CHANGED
|
@@ -22,9 +22,9 @@ const translations = {
|
|
|
22
22
|
projectStatusTitle: "Project folder",
|
|
23
23
|
setupTitle: "Provider setup",
|
|
24
24
|
setupHelp:
|
|
25
|
-
"DeepSeek/OpenAI/Qwen keys are missing. Use mock mode, export an env var, or save a project-local model key.",
|
|
25
|
+
"DeepSeek/OpenAI/Qwen/Venice keys are missing. Use mock mode, export an env var, or save a project-local model key.",
|
|
26
26
|
setupEnvHelp:
|
|
27
|
-
"Env vars: DEEPSEEK_API_KEY, OPENAI_API_KEY, QWEN_API_KEY, LLM_API_KEY, and optional GRSAI for image generation. Mock mode remains available for local tests.",
|
|
27
|
+
"Env vars: DEEPSEEK_API_KEY, OPENAI_API_KEY, QWEN_API_KEY, VENICE_API_KEY, LLM_API_KEY, and optional GRSAI for image generation. Mock mode remains available for local tests.",
|
|
28
28
|
setupKeyLinksLabel: "Get keys:",
|
|
29
29
|
deepseekKeyLink: "DeepSeek API keys",
|
|
30
30
|
openaiKeyLink: "OpenAI API keys",
|
|
@@ -649,6 +649,9 @@ const languageField = document.querySelector("#language");
|
|
|
649
649
|
const routingModeField = document.querySelector("#routingMode");
|
|
650
650
|
const providerField = document.querySelector("#provider");
|
|
651
651
|
const modelField = document.querySelector("#model");
|
|
652
|
+
const modelOptionsEl = document.querySelector("#model-options");
|
|
653
|
+
const modelCatalogEl = document.querySelector("#model-catalog");
|
|
654
|
+
const modelRoutePillEl = document.querySelector("#model-route-pill");
|
|
652
655
|
const routingHintEl = document.querySelector("#routing-hint");
|
|
653
656
|
const modelRouteStatusEl = document.querySelector("#model-route-status");
|
|
654
657
|
const projectStatusEl = document.querySelector("#project-status");
|
|
@@ -718,11 +721,13 @@ const defaults = {
|
|
|
718
721
|
openai: "gpt-5.4-mini",
|
|
719
722
|
deepseek: "deepseek-v4-flash",
|
|
720
723
|
qwen: "qwen-plus",
|
|
724
|
+
venice: "venice-uncensored-1-2",
|
|
721
725
|
mock: "mock-agent",
|
|
722
726
|
};
|
|
723
727
|
|
|
724
728
|
let currentLanguage = "en";
|
|
725
729
|
let routingPresets = {};
|
|
730
|
+
let modelCatalog = {};
|
|
726
731
|
let taskProfiles = [];
|
|
727
732
|
let projectInfo = null;
|
|
728
733
|
let currentSessionId = "";
|
|
@@ -789,12 +794,14 @@ function renderKeyStatus(status = lastKeyStatus) {
|
|
|
789
794
|
status.openai ? t("availableLabel") : t("missingLabel")
|
|
790
795
|
} · DeepSeek ${status.deepseek ? t("availableLabel") : t("missingLabel")} · Qwen ${
|
|
791
796
|
status.qwen ? t("availableLabel") : t("missingLabel")
|
|
797
|
+
} · Venice ${
|
|
798
|
+
status.venice ? t("availableLabel") : t("missingLabel")
|
|
792
799
|
} · GRS AI ${
|
|
793
800
|
status.grsai ? t("availableLabel") : t("missingLabel")
|
|
794
801
|
} · ${t("mockLabel")} ${
|
|
795
802
|
status.mock ? t("availableLabel") : t("missingLabel")
|
|
796
803
|
}`;
|
|
797
|
-
if (setupCardEl) setupCardEl.hidden = Boolean(status.openai || status.deepseek || status.qwen);
|
|
804
|
+
if (setupCardEl) setupCardEl.hidden = Boolean(status.openai || status.deepseek || status.qwen || status.venice);
|
|
798
805
|
}
|
|
799
806
|
|
|
800
807
|
function renderProjectStatus(info = projectInfo) {
|
|
@@ -959,6 +966,44 @@ function renderSandboxLogs(logs) {
|
|
|
959
966
|
.join("\n\n");
|
|
960
967
|
}
|
|
961
968
|
|
|
969
|
+
function providerModelOptions(provider = providerField.value) {
|
|
970
|
+
return modelCatalog[provider] || [];
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
function renderModelOptions() {
|
|
974
|
+
const provider = providerField.value || "deepseek";
|
|
975
|
+
const options = providerModelOptions(provider);
|
|
976
|
+
if (modelOptionsEl) {
|
|
977
|
+
modelOptionsEl.innerHTML = options
|
|
978
|
+
.map((item) => `<option value="${escapeHtml(item.id)}">${escapeHtml(item.label || item.id)}</option>`)
|
|
979
|
+
.join("");
|
|
980
|
+
}
|
|
981
|
+
if (modelRoutePillEl) {
|
|
982
|
+
const mode = routingModeField.value || "smart";
|
|
983
|
+
const primary = modelField.value.trim() || defaults[provider] || "";
|
|
984
|
+
const secondary = provider === "deepseek" ? defaults.deepseek : routingPresets.complex?.model || "deepseek-v4-pro";
|
|
985
|
+
modelRoutePillEl.textContent =
|
|
986
|
+
mode === "manual"
|
|
987
|
+
? `${provider} · ${primary}`
|
|
988
|
+
: `smart · primary ${primary || "auto"} · secondary ${secondary || "auto"}`;
|
|
989
|
+
}
|
|
990
|
+
if (!modelCatalogEl) return;
|
|
991
|
+
if (options.length === 0) {
|
|
992
|
+
modelCatalogEl.innerHTML = "";
|
|
993
|
+
return;
|
|
994
|
+
}
|
|
995
|
+
modelCatalogEl.innerHTML = options
|
|
996
|
+
.map(
|
|
997
|
+
(item) => `
|
|
998
|
+
<button class="model-chip" type="button" data-model-id="${escapeHtml(item.id)}" data-active="${item.id === modelField.value.trim()}">
|
|
999
|
+
<strong>${escapeHtml(item.label || item.id)}</strong>
|
|
1000
|
+
<span>${escapeHtml([item.bucket || item.role, item.context, item.reasoning?.length ? `reasoning ${item.reasoning.join("/")}` : ""].filter(Boolean).join(" · "))}</span>
|
|
1001
|
+
</button>
|
|
1002
|
+
`
|
|
1003
|
+
)
|
|
1004
|
+
.join("");
|
|
1005
|
+
}
|
|
1006
|
+
|
|
962
1007
|
function updateRoutingHint() {
|
|
963
1008
|
const mode = routingModeField.value || "smart";
|
|
964
1009
|
const hintKey = {
|
|
@@ -969,7 +1014,7 @@ function updateRoutingHint() {
|
|
|
969
1014
|
}[mode];
|
|
970
1015
|
routingHintEl.textContent = t(hintKey);
|
|
971
1016
|
|
|
972
|
-
if (mode !== "manual") {
|
|
1017
|
+
if (mode !== "manual" && providerField.value === "deepseek") {
|
|
973
1018
|
const preset = mode === "complex" ? routingPresets.complex : routingPresets.fast;
|
|
974
1019
|
if (preset) {
|
|
975
1020
|
providerField.value = preset.provider === "deepseek" ? "deepseek" : providerField.value;
|
|
@@ -980,6 +1025,7 @@ function updateRoutingHint() {
|
|
|
980
1025
|
modelRouteStatusEl.textContent = `${t("modelRouteStatus")}: ${providerField.value} / ${
|
|
981
1026
|
modelField.value.trim() || defaults[providerField.value] || ""
|
|
982
1027
|
}`;
|
|
1028
|
+
renderModelOptions();
|
|
983
1029
|
}
|
|
984
1030
|
|
|
985
1031
|
function updatePackageWarning() {
|
|
@@ -2293,7 +2339,7 @@ deleteSessionButton.addEventListener("click", () => {
|
|
|
2293
2339
|
});
|
|
2294
2340
|
|
|
2295
2341
|
providerField.addEventListener("change", () => {
|
|
2296
|
-
if (providerField.value === "mock") {
|
|
2342
|
+
if (providerField.value === "mock" || providerField.value === "venice" || providerField.value === "openai" || providerField.value === "qwen") {
|
|
2297
2343
|
routingModeField.value = "manual";
|
|
2298
2344
|
}
|
|
2299
2345
|
|
|
@@ -2302,6 +2348,7 @@ providerField.addEventListener("change", () => {
|
|
|
2302
2348
|
modelField.value === defaults.openai ||
|
|
2303
2349
|
modelField.value === defaults.deepseek ||
|
|
2304
2350
|
modelField.value === defaults.qwen ||
|
|
2351
|
+
modelField.value === defaults.venice ||
|
|
2305
2352
|
modelField.value === defaults.mock
|
|
2306
2353
|
) {
|
|
2307
2354
|
modelField.value = defaults[providerField.value] || "";
|
|
@@ -2310,6 +2357,14 @@ providerField.addEventListener("change", () => {
|
|
|
2310
2357
|
schedulePreferenceSave();
|
|
2311
2358
|
});
|
|
2312
2359
|
|
|
2360
|
+
modelCatalogEl?.addEventListener("click", (event) => {
|
|
2361
|
+
const button = event.target.closest("[data-model-id]");
|
|
2362
|
+
if (!button) return;
|
|
2363
|
+
modelField.value = button.dataset.modelId || modelField.value;
|
|
2364
|
+
updateRoutingHint();
|
|
2365
|
+
schedulePreferenceSave();
|
|
2366
|
+
});
|
|
2367
|
+
|
|
2313
2368
|
modelField.addEventListener("input", updateRoutingHint);
|
|
2314
2369
|
sandboxModeField.addEventListener("change", updatePackageWarning);
|
|
2315
2370
|
packageInstallPolicyField.addEventListener("change", updatePackageWarning);
|
|
@@ -2534,10 +2589,12 @@ async function loadConfig() {
|
|
|
2534
2589
|
const data = await response.json();
|
|
2535
2590
|
const prefs = data.preferences || {};
|
|
2536
2591
|
routingPresets = data.routing?.presets || {};
|
|
2592
|
+
modelCatalog = data.modelCatalog || {};
|
|
2537
2593
|
taskProfiles = data.taskProfiles || [];
|
|
2538
2594
|
projectInfo = data.project || null;
|
|
2539
2595
|
defaults.openai = data.defaults?.openai?.model || defaults.openai;
|
|
2540
2596
|
defaults.qwen = data.defaults?.qwen?.model || defaults.qwen;
|
|
2597
|
+
defaults.venice = data.defaults?.venice?.model || defaults.venice;
|
|
2541
2598
|
defaults.deepseek = routingPresets.fast?.model || data.defaults?.deepseek?.model || defaults.deepseek;
|
|
2542
2599
|
defaults.mock = data.defaults?.mock?.model || defaults.mock;
|
|
2543
2600
|
|
package/public/index.html
CHANGED
|
@@ -45,16 +45,18 @@
|
|
|
45
45
|
<div>
|
|
46
46
|
<strong data-i18n="setupTitle">Provider setup</strong>
|
|
47
47
|
<p class="subtle" data-i18n="setupHelp">
|
|
48
|
-
DeepSeek/OpenAI keys are missing. Use mock mode, export an env var, or save a project-local
|
|
48
|
+
DeepSeek/OpenAI/Qwen/Venice keys are missing. Use mock mode, export an env var, or save a project-local key.
|
|
49
49
|
</p>
|
|
50
50
|
<p class="subtle" data-i18n="setupEnvHelp">
|
|
51
|
-
Env vars: DEEPSEEK_API_KEY, OPENAI_API_KEY, QWEN_API_KEY, or LLM_API_KEY. Mock mode remains available for local tests.
|
|
51
|
+
Env vars: DEEPSEEK_API_KEY, OPENAI_API_KEY, QWEN_API_KEY, VENICE_API_KEY, or LLM_API_KEY. Mock mode remains available for local tests.
|
|
52
52
|
</p>
|
|
53
53
|
<p class="subtle key-links">
|
|
54
54
|
<span data-i18n="setupKeyLinksLabel">Get keys:</span>
|
|
55
55
|
<a href="https://platform.deepseek.com/api_keys" target="_blank" rel="noreferrer" data-i18n="deepseekKeyLink">DeepSeek API keys</a>
|
|
56
56
|
<span aria-hidden="true">·</span>
|
|
57
57
|
<a href="https://platform.openai.com/api-keys" target="_blank" rel="noreferrer" data-i18n="openaiKeyLink">OpenAI API keys</a>
|
|
58
|
+
<span aria-hidden="true">·</span>
|
|
59
|
+
<a href="https://venice.ai" target="_blank" rel="noreferrer">Venice API</a>
|
|
58
60
|
</p>
|
|
59
61
|
</div>
|
|
60
62
|
<div class="grid">
|
|
@@ -64,6 +66,7 @@
|
|
|
64
66
|
<option value="deepseek">DeepSeek</option>
|
|
65
67
|
<option value="openai">OpenAI</option>
|
|
66
68
|
<option value="qwen">Qwen</option>
|
|
69
|
+
<option value="venice">Venice</option>
|
|
67
70
|
<option value="grsai">GRS AI image</option>
|
|
68
71
|
</select>
|
|
69
72
|
</label>
|
|
@@ -96,18 +99,27 @@
|
|
|
96
99
|
<option value="deepseek">DeepSeek</option>
|
|
97
100
|
<option value="openai">OpenAI</option>
|
|
98
101
|
<option value="qwen">Qwen</option>
|
|
102
|
+
<option value="venice">Venice</option>
|
|
99
103
|
<option value="mock" data-i18n="mockProviderOption">Mock local</option>
|
|
100
104
|
</select>
|
|
101
105
|
</label>
|
|
102
106
|
|
|
103
107
|
<label>
|
|
104
108
|
<span data-i18n="modelLabel">Model</span>
|
|
105
|
-
<input id="model" name="model" type="text" value="deepseek-v4-flash" />
|
|
109
|
+
<input id="model" name="model" type="text" list="model-options" value="deepseek-v4-flash" />
|
|
110
|
+
<datalist id="model-options"></datalist>
|
|
106
111
|
</label>
|
|
107
112
|
</div>
|
|
108
113
|
|
|
109
114
|
<p id="routing-hint" class="subtle route-hint"></p>
|
|
110
115
|
<p id="model-route-status" class="subtle route-hint"></p>
|
|
116
|
+
<section class="model-catalog-panel" aria-label="Model catalog">
|
|
117
|
+
<div class="model-catalog-head">
|
|
118
|
+
<span>Route</span>
|
|
119
|
+
<strong id="model-route-pill">DeepSeek flash/pro</strong>
|
|
120
|
+
</div>
|
|
121
|
+
<div id="model-catalog" class="model-catalog"></div>
|
|
122
|
+
</section>
|
|
111
123
|
|
|
112
124
|
<label>
|
|
113
125
|
<span data-i18n="taskProfileLabel">Task profile</span>
|
package/public/styles.css
CHANGED
|
@@ -120,6 +120,74 @@ h1 {
|
|
|
120
120
|
line-height: 1.45;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
+
.model-catalog-panel {
|
|
124
|
+
display: grid;
|
|
125
|
+
gap: 10px;
|
|
126
|
+
padding: 12px;
|
|
127
|
+
border: 1px solid rgba(15, 118, 110, 0.16);
|
|
128
|
+
border-radius: 16px;
|
|
129
|
+
background:
|
|
130
|
+
linear-gradient(135deg, rgba(236, 253, 245, 0.82), rgba(255, 253, 250, 0.9)),
|
|
131
|
+
#fffdfa;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.model-catalog-head {
|
|
135
|
+
display: flex;
|
|
136
|
+
align-items: center;
|
|
137
|
+
justify-content: space-between;
|
|
138
|
+
gap: 10px;
|
|
139
|
+
color: var(--muted);
|
|
140
|
+
font-size: 0.78rem;
|
|
141
|
+
font-weight: 800;
|
|
142
|
+
letter-spacing: 0.07em;
|
|
143
|
+
text-transform: uppercase;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.model-catalog-head strong {
|
|
147
|
+
max-width: 70%;
|
|
148
|
+
overflow: hidden;
|
|
149
|
+
color: var(--accent);
|
|
150
|
+
text-overflow: ellipsis;
|
|
151
|
+
white-space: nowrap;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.model-catalog {
|
|
155
|
+
display: flex;
|
|
156
|
+
flex-wrap: wrap;
|
|
157
|
+
gap: 8px;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.model-chip {
|
|
161
|
+
display: grid;
|
|
162
|
+
gap: 2px;
|
|
163
|
+
flex: 1 1 148px;
|
|
164
|
+
min-width: 0;
|
|
165
|
+
padding: 9px 11px;
|
|
166
|
+
border: 1px solid rgba(15, 118, 110, 0.2);
|
|
167
|
+
border-radius: 14px;
|
|
168
|
+
background: rgba(255, 253, 250, 0.82);
|
|
169
|
+
color: var(--ink);
|
|
170
|
+
text-align: left;
|
|
171
|
+
box-shadow: none;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.model-chip strong,
|
|
175
|
+
.model-chip span {
|
|
176
|
+
overflow: hidden;
|
|
177
|
+
text-overflow: ellipsis;
|
|
178
|
+
white-space: nowrap;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.model-chip span {
|
|
182
|
+
color: var(--muted);
|
|
183
|
+
font-size: 0.76rem;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.model-chip[data-active="true"] {
|
|
187
|
+
border-color: rgba(15, 118, 110, 0.72);
|
|
188
|
+
background: rgba(204, 251, 241, 0.52);
|
|
189
|
+
}
|
|
190
|
+
|
|
123
191
|
.project-card,
|
|
124
192
|
.setup-card {
|
|
125
193
|
display: grid;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# AgInTiFlow Logo Prompt
|
|
2
|
+
|
|
3
|
+
## Primary Prompt
|
|
4
|
+
|
|
5
|
+
Design a premium technology brand logo for **AgInTiFlow**, an AI automation product by AgInTi. The mark should feel like **liquid intelligence**: elegant, futuristic, wealthy, and engineered. Build the visual language around the layered meaning of **Ag / In / Ti** as if they are advanced materials in a next-generation semiconductor system: silver-metal fluidity, indium-like conductive precision, titanium-grade strength. Combine four ideas into one cohesive symbol: **wealth**, **AI cognition**, **semiconductor structure**, and **robotic motion**.
|
|
6
|
+
|
|
7
|
+
Create a logo system with:
|
|
8
|
+
|
|
9
|
+
- a strong standalone symbol
|
|
10
|
+
- a refined wordmark for `AgInTiFlow`
|
|
11
|
+
- an icon version suitable for app, favicon, and terminal product branding
|
|
12
|
+
|
|
13
|
+
Visual direction:
|
|
14
|
+
|
|
15
|
+
- liquid metal surfaces, but controlled and minimal
|
|
16
|
+
- subtle circuit geometry or chip-layer structure
|
|
17
|
+
- a flowing pathway or current to imply “Flow”
|
|
18
|
+
- robotic precision without cartoon robot parts
|
|
19
|
+
- luxury-tech feeling, not playful startup style
|
|
20
|
+
- sharp silhouette, high contrast, memorable at small size
|
|
21
|
+
|
|
22
|
+
Preferred palette:
|
|
23
|
+
|
|
24
|
+
- polished silver
|
|
25
|
+
- deep graphite
|
|
26
|
+
- titanium black
|
|
27
|
+
- selective emerald or electric cyan accent
|
|
28
|
+
|
|
29
|
+
Typography:
|
|
30
|
+
|
|
31
|
+
- custom geometric letterforms
|
|
32
|
+
- elegant, engineered, slightly condensed
|
|
33
|
+
- avoid generic rounded AI fonts
|
|
34
|
+
|
|
35
|
+
Composition idea:
|
|
36
|
+
|
|
37
|
+
Let the symbol suggest an abstract monogram formed from **A**, **G**, and a flowing channel, with hidden references to chip traces and a robotic eye or sensor. The logo should feel like a fusion of **TSMC-grade semiconductor precision**, **liquid metal luxury**, **autonomous agent intelligence**, and **high-value financial confidence**.
|
|
38
|
+
|
|
39
|
+
Style constraints:
|
|
40
|
+
|
|
41
|
+
- clean background
|
|
42
|
+
- no mockup scene
|
|
43
|
+
- no 3D mascot
|
|
44
|
+
- no obvious humanoid robot
|
|
45
|
+
- no cheap crypto aesthetic
|
|
46
|
+
- no over-detailed gradients
|
|
47
|
+
- no generic brain icon
|
|
48
|
+
|
|
49
|
+
Output as a polished brand identity concept sheet showing symbol, wordmark, monochrome version, and dark-background version.
|
|
50
|
+
|
|
51
|
+
## Short Variant
|
|
52
|
+
|
|
53
|
+
Create a luxury deep-tech logo for **AgInTiFlow**. Blend liquid metal elegance, semiconductor precision, AI intelligence, and robotic motion into a clean futuristic symbol and wordmark. Use silver, graphite, titanium black, and a restrained emerald or cyan accent. Make it feel premium, memorable, sharp, and engineered, with subtle chip-trace structure and fluid energy flow. Avoid generic AI brains, cartoon robots, and cheap crypto styling.
|
|
54
|
+
|
|
55
|
+
## Negative Prompt
|
|
56
|
+
|
|
57
|
+
cartoon robot, smiling mascot, generic brain, blockchain coin, cluttered gradients, playful startup aesthetic, childish icon, obvious humanoid face, low-detail typography, flat clipart, noisy sci-fi background, cyberpunk overload, random neon effects
|