tesseract-agent 0.12.3 → 0.12.4-beta.1
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/dist-bundle/builtin-skills/3d-product-shots/SKILL.md +1 -1
- package/dist-bundle/builtin-skills/canvas-design/scripts/design_check.mjs +9 -0
- package/dist-bundle/builtin-skills/chart-design/scripts/design_check.mjs +9 -0
- package/dist-bundle/builtin-skills/diagram-design/scripts/design_check.mjs +9 -0
- package/dist-bundle/builtin-skills/interactive-ui/scripts/design_check.mjs +9 -0
- package/dist-bundle/builtin-skills/short-form-video/SKILL.md +1 -1
- package/dist-bundle/builtin-skills/tesseract-help/SKILL.md +2 -2
- package/dist-bundle/builtin-skills/tutorials/SKILL.md +6 -5
- package/dist-bundle/builtin-skills/video-editing/SKILL.md +4 -4
- package/dist-bundle/catalog-vectors/embeddinggemma-300m-q4@ort1.23.2.bin +0 -0
- package/dist-bundle/cli.js +8347 -5107
- package/dist-bundle/mesh-core/package.json +1 -1
- package/dist-bundle/office-page.css +1 -1
- package/dist-bundle/office-page.js +949 -932
- package/dist-bundle/office.js +6106 -1567
- package/dist-bundle/pdf.js +80 -4
- package/dist-bundle/serpapi-mcp.js +4783 -1816
- package/package.json +1 -1
|
@@ -52,7 +52,7 @@ packshots there.
|
|
|
52
52
|
## 3. Price first, one pilot, then the set
|
|
53
53
|
|
|
54
54
|
Free steps run without asking. Before the first paid one, say what will be made and the rough price in one line (an
|
|
55
|
-
image edit is a few cents to about $0.15; a 5-second clip about $0.25–0.50; an effect about $0.
|
|
55
|
+
image edit is a few cents to about $0.15; a 5-second clip about $0.25–0.50; an effect about $0.001–2.10, most $0.20–0.50). On their own
|
|
56
56
|
keys `generate_video` returns the estimate first; confirm with `confirmed_cost_usd`. Make **one** picture of the hardest
|
|
57
57
|
look first, get a yes, then the rest in the same light and framing.
|
|
58
58
|
|
|
@@ -157,6 +157,13 @@ const toBrowser = child.stdio[3], fromBrowser = child.stdio[4];
|
|
|
157
157
|
let exited = false;
|
|
158
158
|
child.on('exit', () => { exited = true; });
|
|
159
159
|
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
160
|
+
/** Waits, in the page, for every CSS animation or transition still running that has an end — an entrance that
|
|
161
|
+
* holds its captions back until a typed line is done (2.5 s) outlasted the fixed settle and was measured as hidden
|
|
162
|
+
* for good. Ones that never end (a loop, a breathing icon) are not waited for; nothing waits past 5 s. */
|
|
163
|
+
const SETTLE_ANIMATIONS = `Promise.race([
|
|
164
|
+
Promise.all(document.getAnimations().filter((a) => { const t = a.effect && a.effect.getComputedTiming && a.effect.getComputedTiming(); return a.playState === 'running' && t && Number.isFinite(t.endTime); }).map((a) => a.finished.catch(() => null))),
|
|
165
|
+
new Promise((r) => setTimeout(r, 5000)),
|
|
166
|
+
]).then(() => new Promise((r) => setTimeout(r, 100)))`;
|
|
160
167
|
function killTree() {
|
|
161
168
|
if (exited) return;
|
|
162
169
|
try {
|
|
@@ -494,6 +501,7 @@ try {
|
|
|
494
501
|
// The app's own theme choice, as a host sets it on a loaded page: the attribute on the root element.
|
|
495
502
|
if (view.attr) await send('Runtime.evaluate', { expression: `document.documentElement.setAttribute('data-theme', ${JSON.stringify(view.attr)})` }, S);
|
|
496
503
|
await sleep(700); // entrance animations (and a theme change) settle
|
|
504
|
+
await send('Runtime.evaluate', { expression: SETTLE_ANIMATIONS, awaitPromise: true }, S).catch(() => null);
|
|
497
505
|
const r = await send('Runtime.evaluate', { expression: AUDIT(view.width, sharpFor(view)), returnByValue: true }, S);
|
|
498
506
|
if (r.exceptionDetails) throw new Error(`audit failed in ${view.name}: ${r.exceptionDetails.text}`);
|
|
499
507
|
const audit = r.result.value;
|
|
@@ -550,6 +558,7 @@ try {
|
|
|
550
558
|
await loaded.catch(() => {});
|
|
551
559
|
await send('Runtime.evaluate', { expression: 'document.fonts && document.fonts.ready', awaitPromise: true }, S).catch(() => null);
|
|
552
560
|
await sleep(1200);
|
|
561
|
+
await send('Runtime.evaluate', { expression: SETTLE_ANIMATIONS, awaitPromise: true }, S).catch(() => null);
|
|
553
562
|
// The window stays one screen tall, and what is below it is captured beyond it: a hero of 100vh is one screen,
|
|
554
563
|
// as on a real one, not the whole page stretched. A page longer than PAGE_CAP is cut there, and said to be.
|
|
555
564
|
let height = v.height;
|
|
@@ -157,6 +157,13 @@ const toBrowser = child.stdio[3], fromBrowser = child.stdio[4];
|
|
|
157
157
|
let exited = false;
|
|
158
158
|
child.on('exit', () => { exited = true; });
|
|
159
159
|
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
160
|
+
/** Waits, in the page, for every CSS animation or transition still running that has an end — an entrance that
|
|
161
|
+
* holds its captions back until a typed line is done (2.5 s) outlasted the fixed settle and was measured as hidden
|
|
162
|
+
* for good. Ones that never end (a loop, a breathing icon) are not waited for; nothing waits past 5 s. */
|
|
163
|
+
const SETTLE_ANIMATIONS = `Promise.race([
|
|
164
|
+
Promise.all(document.getAnimations().filter((a) => { const t = a.effect && a.effect.getComputedTiming && a.effect.getComputedTiming(); return a.playState === 'running' && t && Number.isFinite(t.endTime); }).map((a) => a.finished.catch(() => null))),
|
|
165
|
+
new Promise((r) => setTimeout(r, 5000)),
|
|
166
|
+
]).then(() => new Promise((r) => setTimeout(r, 100)))`;
|
|
160
167
|
function killTree() {
|
|
161
168
|
if (exited) return;
|
|
162
169
|
try {
|
|
@@ -494,6 +501,7 @@ try {
|
|
|
494
501
|
// The app's own theme choice, as a host sets it on a loaded page: the attribute on the root element.
|
|
495
502
|
if (view.attr) await send('Runtime.evaluate', { expression: `document.documentElement.setAttribute('data-theme', ${JSON.stringify(view.attr)})` }, S);
|
|
496
503
|
await sleep(700); // entrance animations (and a theme change) settle
|
|
504
|
+
await send('Runtime.evaluate', { expression: SETTLE_ANIMATIONS, awaitPromise: true }, S).catch(() => null);
|
|
497
505
|
const r = await send('Runtime.evaluate', { expression: AUDIT(view.width, sharpFor(view)), returnByValue: true }, S);
|
|
498
506
|
if (r.exceptionDetails) throw new Error(`audit failed in ${view.name}: ${r.exceptionDetails.text}`);
|
|
499
507
|
const audit = r.result.value;
|
|
@@ -550,6 +558,7 @@ try {
|
|
|
550
558
|
await loaded.catch(() => {});
|
|
551
559
|
await send('Runtime.evaluate', { expression: 'document.fonts && document.fonts.ready', awaitPromise: true }, S).catch(() => null);
|
|
552
560
|
await sleep(1200);
|
|
561
|
+
await send('Runtime.evaluate', { expression: SETTLE_ANIMATIONS, awaitPromise: true }, S).catch(() => null);
|
|
553
562
|
// The window stays one screen tall, and what is below it is captured beyond it: a hero of 100vh is one screen,
|
|
554
563
|
// as on a real one, not the whole page stretched. A page longer than PAGE_CAP is cut there, and said to be.
|
|
555
564
|
let height = v.height;
|
|
@@ -157,6 +157,13 @@ const toBrowser = child.stdio[3], fromBrowser = child.stdio[4];
|
|
|
157
157
|
let exited = false;
|
|
158
158
|
child.on('exit', () => { exited = true; });
|
|
159
159
|
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
160
|
+
/** Waits, in the page, for every CSS animation or transition still running that has an end — an entrance that
|
|
161
|
+
* holds its captions back until a typed line is done (2.5 s) outlasted the fixed settle and was measured as hidden
|
|
162
|
+
* for good. Ones that never end (a loop, a breathing icon) are not waited for; nothing waits past 5 s. */
|
|
163
|
+
const SETTLE_ANIMATIONS = `Promise.race([
|
|
164
|
+
Promise.all(document.getAnimations().filter((a) => { const t = a.effect && a.effect.getComputedTiming && a.effect.getComputedTiming(); return a.playState === 'running' && t && Number.isFinite(t.endTime); }).map((a) => a.finished.catch(() => null))),
|
|
165
|
+
new Promise((r) => setTimeout(r, 5000)),
|
|
166
|
+
]).then(() => new Promise((r) => setTimeout(r, 100)))`;
|
|
160
167
|
function killTree() {
|
|
161
168
|
if (exited) return;
|
|
162
169
|
try {
|
|
@@ -494,6 +501,7 @@ try {
|
|
|
494
501
|
// The app's own theme choice, as a host sets it on a loaded page: the attribute on the root element.
|
|
495
502
|
if (view.attr) await send('Runtime.evaluate', { expression: `document.documentElement.setAttribute('data-theme', ${JSON.stringify(view.attr)})` }, S);
|
|
496
503
|
await sleep(700); // entrance animations (and a theme change) settle
|
|
504
|
+
await send('Runtime.evaluate', { expression: SETTLE_ANIMATIONS, awaitPromise: true }, S).catch(() => null);
|
|
497
505
|
const r = await send('Runtime.evaluate', { expression: AUDIT(view.width, sharpFor(view)), returnByValue: true }, S);
|
|
498
506
|
if (r.exceptionDetails) throw new Error(`audit failed in ${view.name}: ${r.exceptionDetails.text}`);
|
|
499
507
|
const audit = r.result.value;
|
|
@@ -550,6 +558,7 @@ try {
|
|
|
550
558
|
await loaded.catch(() => {});
|
|
551
559
|
await send('Runtime.evaluate', { expression: 'document.fonts && document.fonts.ready', awaitPromise: true }, S).catch(() => null);
|
|
552
560
|
await sleep(1200);
|
|
561
|
+
await send('Runtime.evaluate', { expression: SETTLE_ANIMATIONS, awaitPromise: true }, S).catch(() => null);
|
|
553
562
|
// The window stays one screen tall, and what is below it is captured beyond it: a hero of 100vh is one screen,
|
|
554
563
|
// as on a real one, not the whole page stretched. A page longer than PAGE_CAP is cut there, and said to be.
|
|
555
564
|
let height = v.height;
|
|
@@ -157,6 +157,13 @@ const toBrowser = child.stdio[3], fromBrowser = child.stdio[4];
|
|
|
157
157
|
let exited = false;
|
|
158
158
|
child.on('exit', () => { exited = true; });
|
|
159
159
|
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
160
|
+
/** Waits, in the page, for every CSS animation or transition still running that has an end — an entrance that
|
|
161
|
+
* holds its captions back until a typed line is done (2.5 s) outlasted the fixed settle and was measured as hidden
|
|
162
|
+
* for good. Ones that never end (a loop, a breathing icon) are not waited for; nothing waits past 5 s. */
|
|
163
|
+
const SETTLE_ANIMATIONS = `Promise.race([
|
|
164
|
+
Promise.all(document.getAnimations().filter((a) => { const t = a.effect && a.effect.getComputedTiming && a.effect.getComputedTiming(); return a.playState === 'running' && t && Number.isFinite(t.endTime); }).map((a) => a.finished.catch(() => null))),
|
|
165
|
+
new Promise((r) => setTimeout(r, 5000)),
|
|
166
|
+
]).then(() => new Promise((r) => setTimeout(r, 100)))`;
|
|
160
167
|
function killTree() {
|
|
161
168
|
if (exited) return;
|
|
162
169
|
try {
|
|
@@ -494,6 +501,7 @@ try {
|
|
|
494
501
|
// The app's own theme choice, as a host sets it on a loaded page: the attribute on the root element.
|
|
495
502
|
if (view.attr) await send('Runtime.evaluate', { expression: `document.documentElement.setAttribute('data-theme', ${JSON.stringify(view.attr)})` }, S);
|
|
496
503
|
await sleep(700); // entrance animations (and a theme change) settle
|
|
504
|
+
await send('Runtime.evaluate', { expression: SETTLE_ANIMATIONS, awaitPromise: true }, S).catch(() => null);
|
|
497
505
|
const r = await send('Runtime.evaluate', { expression: AUDIT(view.width, sharpFor(view)), returnByValue: true }, S);
|
|
498
506
|
if (r.exceptionDetails) throw new Error(`audit failed in ${view.name}: ${r.exceptionDetails.text}`);
|
|
499
507
|
const audit = r.result.value;
|
|
@@ -550,6 +558,7 @@ try {
|
|
|
550
558
|
await loaded.catch(() => {});
|
|
551
559
|
await send('Runtime.evaluate', { expression: 'document.fonts && document.fonts.ready', awaitPromise: true }, S).catch(() => null);
|
|
552
560
|
await sleep(1200);
|
|
561
|
+
await send('Runtime.evaluate', { expression: SETTLE_ANIMATIONS, awaitPromise: true }, S).catch(() => null);
|
|
553
562
|
// The window stays one screen tall, and what is below it is captured beyond it: a hero of 100vh is one screen,
|
|
554
563
|
// as on a real one, not the whole page stretched. A page longer than PAGE_CAP is cut there, and said to be.
|
|
555
564
|
let height = v.height;
|
|
@@ -60,7 +60,7 @@ video; a sound we make (`generate_music`, `synthesize_speech`) is theirs.
|
|
|
60
60
|
| A real-world picture (a street, food, an office, nature) | `find_photo` (Unsplash or Pexels, free for commercial use) → restyle to the video's look with `edit_image` → animate it (next row) or slow-zoom it in `render_edl` | photo free; restyle and animation paid |
|
|
61
61
|
| A made-up shot | `generate_image` keyframe (say "vertical 9:16" in the prompt), then `generate_video` with `first_frame_image`, `aspect_ratio: "9:16"`, a `camera_move` from `list_camera_moves` | see the price gate |
|
|
62
62
|
| The same character in every beat | `reflection_save` once, then `@name` in every prompt | — |
|
|
63
|
-
| A trick in one beat (turn to dust, clones, earth zoom, bullet time, a transition) | `list_effects` → `apply_effect`; use it as a **2-second beat inside the story**, never as the whole video — effect-only clips are everywhere and feeds now push recombined, low-effort clips down | about $0.
|
|
63
|
+
| A trick in one beat (turn to dust, clones, earth zoom, bullet time, a transition) | `list_effects` → `apply_effect`; use it as a **2-second beat inside the story**, never as the whole video — effect-only clips are everywhere and feeds now push recombined, low-effort clips down | about $0.001–2.10 a render (most $0.20–0.50; a face swap on a picture $0.001; Dance Like This is priced by the length of the dance video) |
|
|
64
64
|
| A shot that must go on longer | `extend_video` on its `job_id` | per second |
|
|
65
65
|
| A voice | the person's own recording; or `synthesize_speech` (ElevenLabs — `app_voice` checks the key) | paid |
|
|
66
66
|
| Music | `generate_music` sized to the cut, or none and the trending sound added in the app | paid |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tesseract-help
|
|
3
3
|
description: Answer questions about Tesseract itself and operate the app for the person — what it and you can do (every skill and feature) and how, settings and appearance, engines, models and run modes, API keys (Tesseract's own for plugins and code too), using Tesseract from claude.ai, ChatGPT or a shell, skills, plugins and MCP connectors, machines, OS permissions, updates, troubleshooting a stuck or broken app, and filing a bug report. Use whenever the question or request is about the Tesseract app rather than the person's own work, and whenever someone asks what you can do, what you are capable of or what they can use you for. Being shown around the app on screen — the guided tour — is tutorials.
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.17
|
|
5
5
|
metadata:
|
|
6
6
|
tesseract.summary: "Questions about Tesseract, the app you run in, and what you can do; its theme, settings, engines. Tour: tutorials."
|
|
7
7
|
tesseract.category: tesseract
|
|
@@ -103,7 +103,7 @@ panel — `tesseract://settings/<section>` with `appearance`, `editor`, `runners
|
|
|
103
103
|
| Find or add a skill | `skill_find` first; library: `extensions.search_skills` or `search_marketplace` → **`extensions.marketplace_security`** (show the verdict; do not install a flagged item) → `install_skill` |
|
|
104
104
|
| Plugin | `search_marketplace {family: "code-plugin"}` → `marketplace_security` → `install_plugin` with an exact version |
|
|
105
105
|
| MCP connector | `extensions.add_mcp_server` — local `command` + `args`, or remote `url` + `transport`; name secret env vars/headers in `secret_keys`, never their values; the person enters them in Settings → Extensions → Connectors (MCP tab). New conversations get its tools. Pin package versions (no `@latest`), and ask before adding a local command — it runs with the person's permissions. OAuth sign-in for connectors is **not** available yet |
|
|
106
|
-
| "Give me an API key" (a script, my own code) | Open `navigation.open_settings {section: "account"}`. Under **API keys** they type a name after where it will be used, press **Make key**, then **Copy**: the key is shown only this once (lost → revoke it and make another). Each key spends this account's allowance and balance, at most its **monthly limit** — the number beside the key, $20 to start; they change it to anything from $0 to $100,000, or empty it for no limit, and it is saved when they leave the field. **Revoke**, then **Revoke it**, stops the key at once. Pictures, clips, long videos and
|
|
106
|
+
| "Give me an API key" (a script, my own code) | Open `navigation.open_settings {section: "account"}`. Under **API keys** they type a name after where it will be used, press **Make key**, then **Copy**: the key is shown only this once (lost → revoke it and make another). Each key spends this account's allowance and balance, at most its **monthly limit** — the number beside the key, $20 to start; they change it to anything from $0 to $100,000, or empty it for no limit, and it is saved when they leave the field. **Revoke**, then **Revoke it**, stops the key at once. Pictures, clips, long videos and 257 effects can be made with a key; each can be priced first for free |
|
|
107
107
|
| "Use Tesseract from claude.ai" | In claude.ai: **Settings → Connectors → Add custom connector**. Name `Tesseract`, URL `https://app.tesseract.dev/api/core/tesseract/mcp`, leave the advanced settings empty, **Add**, then **Connect**. A Tesseract page opens: they sign in, check it names Claude and sends them back to claude.ai, and press **Approve**. Then they turn Tesseract on under the chat's tools button and ask for a picture, an effect or a video. On a Team or Enterprise plan an owner adds it once for everyone |
|
|
108
108
|
| "Use Tesseract from ChatGPT" | In ChatGPT, developer mode has to be on (**Settings → Apps & Connectors → Advanced settings**; a workspace admin may have to allow custom connectors). Then **Create**: name `Tesseract`, the same URL, authentication **OAuth**, tick that they trust it, **Create**, sign in to Tesseract, check it names ChatGPT, **Approve**. In a chat they pick Tesseract from the tools. ChatGPT moves these labels between versions — if one is not there, look for the nearest match. Any other app that connects to MCP servers by URL with sign-in works the same way |
|
|
109
109
|
| What a connected app costs, its limit, disconnect it | `navigation.open_settings {section: "account"}` → **Connected apps** (under the API keys): each app with what it spent this month and its **monthly limit** ($20 when connected; $0–$100,000, or empty for none). **Disconnect**, then **Disconnect it**, stops it on its next call. The work runs on Tesseract's servers and is charged to this account as in the app; the person's computer need not be on |
|
|
@@ -27,11 +27,12 @@ recording edited with `video-editing`.
|
|
|
27
27
|
|
|
28
28
|
## A. Showing someone around Tesseract
|
|
29
29
|
|
|
30
|
-
The app's tour is
|
|
31
|
-
box), `build-things` (the idea cards
|
|
32
|
-
including a Claude, ChatGPT or Gemini
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
The app's tour is eight cards, about a minute, on Home: `intro` (a welcome — what the app makes),
|
|
31
|
+
`chat-input` (the message box), `build-things` (the idea cards, and the blank document or slides further
|
|
32
|
+
down), `ai-choice` (the model chip — any AI, including a Claude, ChatGPT or Gemini plan they already pay
|
|
33
|
+
for), `conversations` (the files panel, where everything it makes is kept), `browser` (the built-in browser,
|
|
34
|
+
brought to the front), `help` (the `?` that calls the guide) and `first-job` (back to the message box —
|
|
35
|
+
**Try it** sends a first request from it). The narrator speaks their voice language (else the app's), and they can talk over it.
|
|
35
36
|
|
|
36
37
|
- `tour.start` (optionally `stepId` to jump to a part), `tour.state` before you move it — never
|
|
37
38
|
assume where it is — then `tour.control` with `tour_move {by: 1}` / `{to: "<step>"}`,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: video-editing
|
|
3
3
|
description: Edit the user's own video and audio files with Tesseract's video-editing tools — cut silences, trim and join clips, burn in captions, reframe to vertical following the subject, swap or restyle what is in a clip with AI, relight it, split voice from music, add music or a voice-over, replace or dub a voice (with the lips matched to the new language), upscale and restore, apply one-tap effects, export subtitles and chapters. Use when the person already has footage to change; for making new footage from a prompt use video-generation, and for a brand's short post clip made from a still picture use social-posts.
|
|
4
4
|
license: Apache-2.0 AND MIT
|
|
5
|
-
version: 1.7.
|
|
5
|
+
version: 1.7.5
|
|
6
6
|
metadata:
|
|
7
7
|
tesseract.summary: "Edit existing footage — cuts, captions, reframes, music, voice-over, dubbing. A still made a brand clip: social-posts."
|
|
8
8
|
tesseract.category: media
|
|
@@ -41,7 +41,7 @@ look it up with `tool_find` and run it with `tool_call`.
|
|
|
41
41
|
| `edit_video_ai` | A clip **changed by an instruction**, keeping its motion, camera and sound: swap a person, product or outfit for a reference picture or `@card`, restyle it, remove something, change the scene | fal.ai: "best" Kling 4.0 Edit (3–30 s, about $0.19/s of clip at 720p) or "cheaper" Kling O3 Edit (3–15 s, $0.126/s); Tesseract's account or their own fal key |
|
|
42
42
|
| `relight_video` | A clip **relit** in a named look (golden hour, soft studio, neon, moonlight…), the main light moved if asked; motion, people and sound kept | fal.ai, MiniMax H3 Max Relight: $0.08/s at 768p, $0.16/s at 1080p; 2.4–14.3 s |
|
|
43
43
|
| `list_upscale_models`, `enhance_video` | Restore / upscale | `ffmpeg` free; `realesrgan` local GPU; `fal-topaz` paid |
|
|
44
|
-
| `list_effects`, `apply_effect` | About 250 one-tap effects (animate a photo, hugs and other two-person moments, transformations, fantasy, camera moves, seasonal looks, pets, preset dances, styles, toys, outfits, product and food ads, transitions, chains, karaoke captions, velocity edit) | hosted effects: fal.ai, about $0.
|
|
44
|
+
| `list_effects`, `apply_effect` | About 250 one-tap effects (animate a photo, hugs and other two-person moments, transformations, fantasy, camera moves, seasonal looks, pets, preset dances, styles, toys, outfits, product and food ads, transitions, chains, karaoke captions, velocity edit) | hosted effects: fal.ai, about $0.001–2.10 per render (most $0.20–0.50; a face swap on a picture $0.001; Dance Like This about $0.70 per 10 s of the dance video, up to 30 s), on Tesseract's account or the person's own fal key; anime / figurine / outfit stills: the Google image key; karaoke captions and velocity edit: local and free (karaoke hears the words with the Google key) |
|
|
45
45
|
| `image_inspect` | Look at a frame and answer a question about it | the conversation's own model |
|
|
46
46
|
|
|
47
47
|
Every path argument must be **absolute**. Outputs go to the conversation's own asset folder, so the
|
|
@@ -120,7 +120,7 @@ Step-by-step versions are in [references/recipes.md](references/recipes.md).
|
|
|
120
120
|
tunnel, morph, bubbles, paint, walker; say what each makes and its price before spending), with `seconds` and
|
|
121
121
|
`aspect` to match the footage, and cut the result between them with `render_edl`. On an open timeline
|
|
122
122
|
the `aiTransition` command does all of that at a cut, and a person has the same button under
|
|
123
|
-
Transitions in the clip inspector: `aiTransitions` lists the kinds and the price. With
|
|
123
|
+
Transitions in the clip inspector: `aiTransitions` lists the kinds and the price. With 262 effects on offer, narrow by `category` (seasonal, transform,
|
|
124
124
|
fantasy, camera, affection, pet, dance, restyle, toy, wardrobe, product, food, transition) and
|
|
125
125
|
offer two or three `ready` ones first.
|
|
126
126
|
|
|
@@ -153,7 +153,7 @@ Step-by-step versions are in [references/recipes.md](references/recipes.md).
|
|
|
153
153
|
another way: no installing or running other separation models or tools (Demucs, Spleeter and the like), whose
|
|
154
154
|
weights carry no clear licence.
|
|
155
155
|
- Each `list_effects` entry has a `status`: `ready` effects did what their card says on a live
|
|
156
|
-
run, at the price shown; `seed` ones (
|
|
156
|
+
run, at the price shown; `seed` ones (99, among them `inflate`) have no proven
|
|
157
157
|
run: say so before spending, and offer a ready one. Effects that failed their card on a live run
|
|
158
158
|
are not listed, and `apply_effect` refuses them by id.
|
|
159
159
|
No hosted effect has a measured failure rate yet, so a failed render is reported, not retried
|
|
Binary file
|