@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 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 Qwen, 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` and OpenAI keys at `https://platform.openai.com/api-keys`. It then offers the optional auxiliary image key; press Esc to skip. You can rerun it even when keys already exist:
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 an optional `image_generation` skill backed by the `generate_image` tool and a local `GRSAI` key. The skill tells DeepSeek when image generation is appropriate; the tool calls GRS AI Nano Banana, saves manifests/images under `artifacts/images`, and sends the result to the canvas. See [docs/auxiliary-image-generation.md](docs/auxiliary-image-generation.md).
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 skill is `image_generation`. Its tool is `generate_image`.
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 the GRS AI key project-locally:
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
- The key is saved in `.aginti/.env` as `GRSAI` with `0600` permissions. The CLI and web app only report whether the key exists; they never return the raw value.
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
- The tool uses the GRS AI Nano Banana API:
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.17.6",
3
+ "version": "0.18.0",
4
4
  "type": "module",
5
- "description": "AgInTiFlow is a resumable Playwright website-control agent with OpenAI-compatible tool calling.",
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 DeepSeek key.
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