@amd-gaia/gaia 0.3.0 → 0.3.2
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/CHANGELOG.md +573 -194
- package/README.md +71 -3
- package/SKILL.md +33 -11
- package/SPEC.md +162 -12
- package/binaries.lock.json +11 -11
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +30 -9
- package/dist/cli.js.map +1 -1
- package/dist/lifecycle.d.ts +2 -2
- package/dist/lifecycle.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,197 +6,387 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
redaction task that loaded the `document-extract` skill had its answer swapped
|
|
11
|
-
for a coverage warning about its own `redaction_log.csv`, and a task with two
|
|
12
|
-
named outputs only knew about the last one. Every file the request names, and
|
|
13
|
-
every file the turn wrote, is now an output and never a source; the skill
|
|
14
|
-
checks coverage only when the request names a source document or asks for
|
|
15
|
-
every item. No check replaces a non-empty answer any more: an unproven
|
|
16
|
-
save, test result or extraction keeps the answer and adds a short "I
|
|
17
|
-
couldn't confirm all of this" list after it; a turn that ends early keeps
|
|
18
|
-
what it said ahead of its report; and a tool that keeps failing ends with the
|
|
19
|
-
model's answer from what it found, then the failure. A failed image request
|
|
20
|
-
is no longer rewritten into advice to start GAIA with an `--sd` flag that
|
|
21
|
-
does not exist. `load_skill` no longer tells the model the extraction tools
|
|
22
|
-
cannot run when it is about to register them, and a rejected extractor reply
|
|
23
|
-
is now logged.
|
|
24
|
-
- **`run_python` works in the Agent UI without a project.** It ran from the
|
|
25
|
-
server's own folder, which is not an allowed path, so every approved snippet
|
|
26
|
-
was refused and the agent fell back to slower shell commands. With no project
|
|
27
|
-
and a working directory you did not allow, a snippet now runs in the agent's
|
|
28
|
-
scratch directory, and its result says so. A project outside the allowed
|
|
29
|
-
paths is still refused.
|
|
30
|
-
- **An "always" answer for a shell command no longer covers code in the
|
|
31
|
-
scratch folder.** A command run there or naming a path there — `cd` into it
|
|
32
|
-
then `python -m explore`, or `pytest`, `make`, `pip install`, `uv run` or
|
|
33
|
-
`go run` pointed at it — and a script handed a scratch path as an argument
|
|
34
|
-
now ask every time, with no `always_scope`, the same as a script there.
|
|
35
|
-
`always_scope` labels for commands that run code they do not show now say so:
|
|
36
|
-
`pytest (runs the test code it finds)`, `make (runs the Makefile's
|
|
37
|
-
commands)`, `python -m explore (runs that Python module)`.
|
|
38
|
-
- **Exploring data no longer asks twice per step.** Each step wrote a helper
|
|
39
|
-
script into the agent's own scratch folder and ran it, so a data task asked
|
|
40
|
-
for approval about 30 times. Writes inside that folder now run unasked
|
|
41
|
-
(writes anywhere else still ask). Running a script from it asks each time
|
|
42
|
-
and offers no `always_scope`, since what is in that folder changes without
|
|
43
|
-
a prompt.
|
|
44
|
-
- **A command no loaded skill grants asks you instead of failing.** `python
|
|
45
|
-
script.py`, `git commit` or `pip install` with no skill granting them used to
|
|
46
|
-
come back as "needs a skill grant … declares 'shell:execute:git' in its
|
|
47
|
-
SKILL.md", which nobody could act on. They now raise the approval prompt; a
|
|
48
|
-
skill grant still skips it for reads. A prompt's `summary` for a write or
|
|
49
|
-
code-running command ends with one plain line on what it can do, and the
|
|
50
|
-
`in <folder>` line also appears when an earlier `cd` moved the session. A
|
|
51
|
-
call you decline tells the agent not to reach the same result another way,
|
|
52
|
-
and a run nobody can answer refuses in one plain sentence.
|
|
53
|
-
- **Commands GAIA's checks don't cover ask once instead of failing.** `git
|
|
54
|
-
push`, `git fetch`, `python -c`, PowerShell the checks can't read, a line with
|
|
55
|
-
shell operators, or a path outside the allowed folders used to be refused
|
|
56
|
-
outright. They now raise a prompt whose `summary` is the exact line the shell
|
|
57
|
-
will run, its full folder and a risk sentence, with no `always_scope`; an
|
|
58
|
-
approval runs that line once. Still refused with no prompt: an encoded
|
|
59
|
-
PowerShell command or invisible characters, a line whose quoting can't be
|
|
60
|
-
split the way the shell would, such a line that also deletes or discards work
|
|
61
|
-
(`git push --force`, `git reset --hard`, `rm` outside the project), and
|
|
62
|
-
folders no approval can open.
|
|
63
|
-
- **`run_python` and `execute_python_file` work in the released binary.** The
|
|
64
|
-
binary has no Python interpreter, so it handed every script to its own
|
|
65
|
-
argument parser, which rejected it, and no calculation, chart or `.xlsx`
|
|
66
|
-
could be produced. It now runs scripts itself, with openpyxl, python-docx,
|
|
67
|
-
python-pptx, reportlab, pypdf, pandas, numpy, matplotlib and the full
|
|
68
|
-
standard library bundled for them. The Windows binary grows from 147 MB to
|
|
69
|
-
168 MB.
|
|
70
|
-
- **Long Python data jobs can finish.** `run_python` gave up after 60 s and
|
|
71
|
-
the agent abandoned `execute_python_file` at 180 s even when it had asked
|
|
72
|
-
for 15 minutes, while the script kept running and left a corrupt workbook
|
|
73
|
-
behind. Python runs now get 120 s by default and up to 1800 s on request,
|
|
74
|
-
the agent waits that long, and a run that runs out of time is killed with
|
|
75
|
-
every process it started; the result names the files that changed while it
|
|
76
|
-
ran so the agent checks them instead of reporting them finished.
|
|
77
|
-
- **Document search says when it could not search.** With the embedding
|
|
78
|
-
model or Lemonade Server down, `query_documents` and `query_specific_file`
|
|
79
|
-
answered "no relevant information found", so the agent told the user their
|
|
80
|
-
documents held nothing on the topic. They now return an error naming the
|
|
81
|
-
cause (Lemonade unreachable, or the embedding model failing) and how to fix
|
|
82
|
-
it. `index_document` and `index_directory` report the same cause, and
|
|
83
|
-
`index_directory` stops at the first such file and reports an error when no
|
|
84
|
-
file could be indexed. Hints for a missing optional package (RAG, PDF, Excel,
|
|
85
|
-
HTML parsing) say in a frozen build that it isn't bundled, and from source
|
|
86
|
-
give the install command for the running Python.
|
|
87
|
-
- **A failed tool call is reported as a failure.** `run_shell_command` returned
|
|
88
|
-
`status: success` for a command that exited non-zero, so the TUI and Agent UI
|
|
89
|
-
showed a failed build or test run as a passed step. It is now `status: error`
|
|
90
|
-
with an `error` naming the failing step, its exit code and the last stderr
|
|
91
|
-
line; `stdout`, `stderr` and `return_code` are unchanged. grep's no-match and
|
|
92
|
-
diff's "inputs differ" (exit 1) stay a success and say so in `expected_exit`.
|
|
93
|
-
An MCP tool that answers `isError`, a DuckDuckGo search that was blocked, a
|
|
94
|
-
`tasklist`/`wmctrl`/`osascript` window listing that failed, a notification
|
|
95
|
-
whose PowerShell died, and an `open_url` with no browser to open are errors
|
|
96
|
-
too. Install hints in a frozen build no longer name the binary as a Python to
|
|
97
|
-
run pip with.
|
|
98
|
-
- **Reviewing a few documents reads them in full.** `read_file` on a Word,
|
|
99
|
-
PDF or Excel file returned `[Binary file, N bytes]`, so to compare a term
|
|
100
|
-
sheet against a draft agreement the agent indexed them and ran a handful of
|
|
101
|
-
searches, and missed a closing date that differed between the two because no
|
|
102
|
-
search asked for it. `read_file` now returns the extracted text, in parts sized
|
|
103
|
-
to the model's budget that say where the next part starts, and the prompt
|
|
104
|
-
tells the agent to read a few documents in full for a review, comparison or
|
|
105
|
-
reconciliation and keep indexing for large collections and single lookups.
|
|
106
|
-
- **`fetch_page` no longer drops the middle of a long page.** Text past
|
|
107
|
-
`max_length` was cut to its head and tail, which is where a product page keeps
|
|
108
|
-
its menus and footer, not its price. It now returns the first part with a
|
|
109
|
-
marker naming the offset of the next, takes `offset` to continue and `find` to
|
|
110
|
-
jump to the passages containing a word, says so when a word is not on the
|
|
111
|
-
page, and flags a page with almost no static text as rendered by JavaScript.
|
|
112
|
-
`Length:` now reports the whole page rather than the excerpt.
|
|
113
|
-
- **Long desktop tasks finish with their deliverables instead of a bare "I
|
|
114
|
-
can't confirm this is done".** Picking a controller from nine datasheets and
|
|
115
|
-
pricing a 40-unit BOM ran out of its 50 steps while still searching for
|
|
116
|
-
prices, and the reply dropped the recommendation the agent had already
|
|
117
|
-
written. The agent's default step limit is now **150** (a `/query`
|
|
118
|
-
`max_steps` or `GAIA_AGENT_MAX_STEPS` still wins); at 20, 10 and 5 steps left
|
|
119
|
-
it is told to write the requested files from what it has, marking unverified
|
|
120
|
-
values, and a turn that still runs out keeps its findings and lists what is
|
|
121
|
-
missing after them.
|
|
122
|
-
- **The model notice is one line.** Switching or restoring a model printed a
|
|
123
|
-
four-sentence paragraph that named the model twice and said "via Lemonade".
|
|
124
|
-
It now reads like "Switched to **DeepSeek-V4.1-Flash** on the AMD LLM Gateway
|
|
125
|
-
(cloud). Your messages, and anything read from files or memory, are sent
|
|
126
|
-
there." The `/model` list drops "via Lemonade" from its headings and marks
|
|
127
|
-
the configured default model with `(default)`.
|
|
128
|
-
- **Single-file search results name their file.** `query_specific_file` put the
|
|
129
|
-
path only at the top of its result, so each chunk arrived with no source and
|
|
130
|
-
the chunk cards showed none. Every chunk now carries `source_file`, and the
|
|
131
|
-
result lists it in `source_files`, as `query_documents` already did.
|
|
132
|
-
- **The turn log counts the answer of a streamed turn.** With `GAIA_TURN_LOG`
|
|
133
|
-
set, a turn whose answer streamed out recorded `answer_chars: 0`. It now
|
|
134
|
-
records the length of the answer the user saw.
|
|
135
|
-
- **`run_python` and `execute_python_file` work in the released binary.** The
|
|
136
|
-
binary has no Python interpreter, so it handed every script to its own
|
|
137
|
-
argument parser, which rejected it, and no calculation, chart or `.xlsx`
|
|
138
|
-
could be produced. It now runs scripts itself, with pypdf, pymupdf,
|
|
139
|
-
python-docx, python-pptx, openpyxl, xlsxwriter, reportlab, pandas, numpy,
|
|
140
|
-
matplotlib and the full standard library bundled for them, and both tools
|
|
141
|
-
name those libraries to the model. A script that starts `sys.executable`
|
|
142
|
-
(`-m`, `-c`, a file) runs too; `-m pip` says packages can't be installed
|
|
143
|
-
and lists what is bundled. The Windows binary grows from 147 MB to 168 MB.
|
|
144
|
-
- **A Python script that fails is reported as a failure.** A non-zero exit
|
|
145
|
-
came back as `status: success`, so the TUI showed a failed run as
|
|
146
|
-
successful. It is now `status: error`, with an `error` naming the exit code
|
|
147
|
-
and the last stderr line; `stdout`, `stderr` and `return_code` are unchanged.
|
|
148
|
-
- **`GAIA_ALLOWED_PATHS` confines a run to the folders you name.** The agent
|
|
149
|
-
could read anything under the user's home and nothing narrowed that short of
|
|
150
|
-
embedding it, so an evaluation run could read the graders' answer keys. Set
|
|
151
|
-
to absolute folders, it narrows every file tool, search, index and shell path
|
|
152
|
-
check to them — it never widens, an invalid value stops startup, and code the
|
|
153
|
-
agent runs (`run_python`, shell) is not confined.
|
|
9
|
+
## [0.3.2]
|
|
154
10
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
- **
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
11
|
+
Released with GAIA 0.25.2, and requires the `gaia`
|
|
12
|
+
Python CLI 0.25.2+ on `PATH`. Integrators: the sidecar contract is now
|
|
13
|
+
**2.24**; clients built for 2.18 keep working, and the new
|
|
14
|
+
`/query` fields are refused with `422` by older binaries, so probe
|
|
15
|
+
`/version` before sending them.
|
|
16
|
+
|
|
17
|
+
- **Memory downloads its embedding model when it is missing.** On the first
|
|
18
|
+
start that uses memory, the agent now fetches the required embedding model
|
|
19
|
+
from Lemonade instead of silently running without memory; the initial
|
|
20
|
+
download can be about 300 MB.
|
|
21
|
+
- **Unknown or misplaced switches are refused.** `gaia --forse` and
|
|
22
|
+
`gaia fetch --developer-mode` now exit 2 instead of silently starting the TUI;
|
|
23
|
+
pass terminal-UI arguments after a bare `--`.
|
|
24
|
+
|
|
25
|
+
- **The Agent UI's "Under the hood" figures cover GAIA chats.** It said every
|
|
26
|
+
answer was "not measured", because only the agent saw its own step timings.
|
|
27
|
+
`final` now carries `performance` with them: the turn's model and tool
|
|
28
|
+
seconds and each model call's token counts. Older binaries never send it.
|
|
29
|
+
- **`GET /v1/gaia/skills` says where each skill came from.** Each skill now
|
|
30
|
+
carries a `source` (`agent-bundled`, `user` or `claude-import`; `null` for
|
|
31
|
+
any other root), so the Agent UI can group the Skills list by origin. An
|
|
32
|
+
older agent omits it and the UI shows the list flat.
|
|
33
|
+
- **One very long turn no longer vanishes from the conversation.** A turn
|
|
34
|
+
bigger than the whole history budget, like a pasted log or a long document
|
|
35
|
+
read, was dropped from what the model saw next, answer included, so "now
|
|
36
|
+
shorten that" ran with no record of it. It is now kept: long tool results
|
|
37
|
+
become a short note naming the tool, and its longest messages are cut with
|
|
38
|
+
a note saying how much.
|
|
39
|
+
- **Internet off also stops the mailbox and Agent Hub tools.** With a chat's
|
|
40
|
+
Internet switched off, GAIA could still read Gmail or Outlook and search or
|
|
41
|
+
install skills from the Agent Hub, because those tools carry no URL for the
|
|
42
|
+
check to see. They are now refused with the same message as a web search.
|
|
43
|
+
|
|
44
|
+
### For integrators: contract 2.24
|
|
45
|
+
|
|
46
|
+
- **Relative file paths use the chat workspace.** A new `working_directory` field
|
|
47
|
+
on `/query` tells the agent where bare file names resolve, separately from
|
|
48
|
+
`allowed_paths`. New and retained sessions use the same workspace for reads,
|
|
49
|
+
writes, edits and approval prompts. Send it only after `/version` reports
|
|
50
|
+
contract 2.24 or later.
|
|
51
|
+
|
|
52
|
+
### For integrators: contract 2.23
|
|
53
|
+
|
|
54
|
+
- **`/query` takes `internet_off`** (contract **2.23**, #5883). The Agent UI
|
|
55
|
+
never told the agent when a chat's Internet switch was off, so the switch
|
|
56
|
+
stayed locked in every GAIA chat on a standard install. `true` refuses web
|
|
57
|
+
search, page fetches, the browser, connector, mailbox and Agent Hub tools and
|
|
58
|
+
commands that contact another host, as it does when the agent runs inside the Agent UI. `false`
|
|
59
|
+
allows them, and omitting it leaves the agent as it is. A retained session
|
|
60
|
+
keeps the last value. Older binaries `422` the field.
|
|
61
|
+
- **`POST /v1/gaia/sessions/{session_id}/internet`** (contract **2.23**)
|
|
62
|
+
reaches a turn already running. Without it, a user who turned the internet
|
|
63
|
+
off mid-turn watched the agent keep searching until the turn ended. Body
|
|
64
|
+
`{"internet_off": bool}`; the session's next tool call follows it. An
|
|
65
|
+
unknown session is a `404`, as for `/bypass`. Post it only once `/query`
|
|
66
|
+
has answered: until then the turn's own `internet_off` replaces it.
|
|
67
|
+
|
|
68
|
+
### For integrators: contract 2.22
|
|
69
|
+
|
|
70
|
+
- **A client can show the model's reasoning.** Over `/query` the reasoning
|
|
71
|
+
only arrived folded into `status` lines, so the Agent UI showed none of it
|
|
72
|
+
for an installed GAIA. A request with `reasoning: true` now gets it as
|
|
73
|
+
`reasoning` events, `{ delta }`, kept apart from the answer. Without the
|
|
74
|
+
field nothing changes. Older binaries reject it with `422`.
|
|
75
|
+
|
|
76
|
+
### For integrators: contract 2.21
|
|
77
|
+
|
|
78
|
+
- **`final` says how full the model's window is** (contract **2.21**,
|
|
79
|
+
#5738). The Agent UI's Context panel and the meter beside its message box
|
|
80
|
+
stayed empty for every GAIA chat, because only the agent can measure its
|
|
81
|
+
own prompt, tools and window. `final` now carries `context` with that
|
|
82
|
+
measurement for the next call, or `context_error` when measuring failed.
|
|
83
|
+
A stopped or failed turn carries neither. Older binaries never send it.
|
|
84
|
+
- **A relayed write prompt names where the file lands.** When the model asks to
|
|
85
|
+
write `shop2.txt`, `needs_confirmation` now carries the absolute path the
|
|
86
|
+
write resolves to in `prompt_context.file_path`, so a front-end can show
|
|
87
|
+
`/Users/you/shop2.txt` instead of a bare name. `args` still holds exactly the
|
|
88
|
+
model's `file_path`.
|
|
89
|
+
- **A web search's results reach the client.** The Agent UI listed no Sources
|
|
90
|
+
for a GAIA web search, because a `search_web` `tool_result` carried only a
|
|
91
|
+
300-character summary. Its `data` now also carries `sources`, a list of
|
|
92
|
+
`{ title, url }` for each hit. Older binaries never send it.
|
|
93
|
+
|
|
94
|
+
- **An old failure in memory no longer stops a request you make now.** A note
|
|
95
|
+
like "this page returned 503, don't waste tool calls on it" was obeyed as a
|
|
96
|
+
standing ban, so the agent refused a URL you handed it. Memories now reach
|
|
97
|
+
the model as dated notes your request outranks, and a passing failure is
|
|
98
|
+
marked as one. A 429 or 502-504 "try later" failure is no longer saved as
|
|
99
|
+
an error memory at all.
|
|
100
|
+
- **Text from a file is not saved as your details.** The agent could save a
|
|
101
|
+
line from a document it read, or call it something you had saved. It now
|
|
102
|
+
saves text from a file, page or tool result only when you ask it to keep
|
|
103
|
+
something, and an empty memory search says that file text is not saved.
|
|
104
|
+
|
|
105
|
+
- **Pushed history that doesn't fit the model's window no longer overflows
|
|
106
|
+
it.** `/query` used the `context` you pushed as-is, but you size it without
|
|
107
|
+
seeing the agent's prompt and tools. On a 32K window the two together could
|
|
108
|
+
exceed the window and fail the turn. The agent now keeps the newest whole
|
|
109
|
+
turns that fit beside its prompt and streams a `status` event when older
|
|
110
|
+
ones drop out of view.
|
|
111
|
+
|
|
112
|
+
- **Homebrew tools are visible to the agent on a Mac.** An app opened from Finder
|
|
113
|
+
or the Dock starts with only the system folders on its search path, so the
|
|
114
|
+
agent could not run `gh`, `node` or anything else Homebrew installed, and its
|
|
115
|
+
prompt said they were "not installed". The agent now starts with the `PATH`
|
|
116
|
+
your login shell builds (only when opened that way: started from a terminal it
|
|
117
|
+
keeps the terminal's own `PATH`, so an activated virtualenv still wins), and a
|
|
118
|
+
tool it still cannot find is reported as not
|
|
119
|
+
reachable from its shell rather than missing from your machine. If your shell
|
|
120
|
+
startup is slow or fails, the agent logs a warning and keeps the old path.
|
|
121
|
+
|
|
122
|
+
### For integrators: contract 2.20
|
|
123
|
+
|
|
124
|
+
- **A failed model request says which endpoint failed, worded for your
|
|
125
|
+
front-end** (contract **2.20**, #5295). A headless caller of `/query` whose
|
|
126
|
+
hosted model returned HTTP 502 was told the "cloud request through Lemonade
|
|
127
|
+
failed" and to check "the TUI provider settings", though no TUI was
|
|
128
|
+
involved. The error now names the provider and the `host:port` the request
|
|
129
|
+
went through. A local model on a base URL you set is reported as "the model
|
|
130
|
+
server at `host:port`" instead of "Lemonade on this machine", since GAIA
|
|
131
|
+
can't tell what serves it. The advice follows the `surface` field: a caller
|
|
132
|
+
that omits it is pointed at the model server the GAIA host uses; `"tui"`,
|
|
133
|
+
`"agent_ui"` and `"cli"` keep their own settings screens. Older binaries
|
|
134
|
+
refuse the field with `422`, so probe `/version` before sending it.
|
|
135
|
+
Version skew: a front-end older than this release never sends `surface`, so
|
|
136
|
+
against this agent it gets the headless advice (the model server's
|
|
137
|
+
`LEMONADE_BASE_URL`) instead of its own settings screen. GAIA ships the TUI,
|
|
138
|
+
the Agent UI and this agent together, so this only shows when one of them is
|
|
139
|
+
updated without the others, or when the TUI's `/version` probe times out and
|
|
140
|
+
it can't confirm the agent takes the field.
|
|
141
|
+
- **Answers stream over `/query`.** The HTTP sidecar ran its agent with
|
|
142
|
+
streaming off, so a relayed turn (the Agent UI, and the TUI's later sessions)
|
|
143
|
+
showed "Waiting on the model" until the whole answer landed at once, Stop could
|
|
144
|
+
not cut a model call short, and a stopped turn kept no text. Every `/query`
|
|
145
|
+
turn now streams its model calls and sends the answer as `token` events before
|
|
146
|
+
`final`, the same as the stdio transport. A run cancelled mid-answer stops
|
|
147
|
+
within a token and ends with an empty `final`, as stdio does; text not yet
|
|
148
|
+
sent when the cancel lands is dropped.
|
|
149
|
+
### Fixed
|
|
150
|
+
|
|
151
|
+
- **"Save it to my Documents folder" saves to the user's Documents folder.**
|
|
152
|
+
The system prompt told GAIA that "my documents" meant its own documents
|
|
153
|
+
folder (`~/.gaia/documents`), so a new file the user asked for in Documents
|
|
154
|
+
went into GAIA's hidden folder, where they would never find it. Finding an
|
|
155
|
+
existing file still checks GAIA's folders first.
|
|
156
|
+
- **Secrets stay out of memory and the conversation log.** A bank PIN was saved
|
|
157
|
+
as a memory, because the filter knew passwords and API keys but not PINs. The
|
|
158
|
+
conversation log also kept the PIN, a password the agent had refused, a card
|
|
159
|
+
number and an SSN verbatim, where `search_past_conversations` read them back.
|
|
160
|
+
PINs, passcodes, card security codes, Luhn-valid card numbers and SSNs are now
|
|
161
|
+
refused as memories, and every credential-shaped span is replaced with
|
|
162
|
+
`[secret removed]` before a turn is logged.
|
|
163
|
+
- **"How much free disk space do I have?" gets the right number, first try.**
|
|
164
|
+
On a Mac, GAIA said a nearly full disk had ~233 GB free: its system-info
|
|
165
|
+
tool reported only the share the system volume uses, so 97.8% used read as
|
|
166
|
+
5%. It now reports free space as macOS counts it, and says it answers
|
|
167
|
+
free-space questions, so GAIA no longer tries a shell command that is refused.
|
|
168
|
+
- **Full access in the Agent UI asks before a gated shell command instead of
|
|
169
|
+
refusing it.** With `/sessions/{id}/bypass` on, a command such as a delete or
|
|
170
|
+
`git add` was refused outright, so a Full access chat could not run it at
|
|
171
|
+
all. On a run someone can answer it now emits `needs_confirmation` and runs
|
|
172
|
+
only on an allow from `/tool_decision`. The shell gates still stay on over
|
|
173
|
+
HTTP, commands that need no approval still run unasked, and a run nobody can
|
|
174
|
+
answer still refuses.
|
|
175
|
+
- **Local models with a large window can write longer replies.** The output
|
|
176
|
+
cap is a quarter of the loaded window (16K at 64K, between 8K and 32K)
|
|
177
|
+
instead of a flat 8K, and a reply cut off at the cap is told to write the
|
|
178
|
+
file in smaller parts.
|
|
179
|
+
- **`search_file_content` searches the workspace.** A relative or default
|
|
180
|
+
directory resolved against the sidecar's own folder and reported "0 files";
|
|
181
|
+
it now resolves against the workspace, searches text files of any extension,
|
|
182
|
+
and says when nothing was searched.
|
|
183
|
+
- **Token counts are exact in the published binary, offline too.** The binary
|
|
184
|
+
could not load its tokenizer, so every turn trimmed history and sized
|
|
185
|
+
context from an estimate that overcounts, and logged `Unknown encoding
|
|
186
|
+
cl100k_base`. The tokenizer and its data now ship inside the binary, so it
|
|
187
|
+
no longer downloads anything to count tokens.
|
|
188
|
+
|
|
189
|
+
### For integrators: contract 2.20
|
|
190
|
+
|
|
191
|
+
- **`/query` takes `surface`** (contract **2.20**): `"agent_ui"`, `"tui"` or
|
|
192
|
+
`"cli"`. Asked to run something on a schedule from the Agent UI, the agent
|
|
193
|
+
said it had no scheduler and sent the user to Windows Task Scheduler; with
|
|
194
|
+
`"agent_ui"` it points them at the **Scheduled tasks** page instead. Older
|
|
195
|
+
binaries `422` the field, so probe `/version` before sending it.
|
|
196
|
+
- **The agent knows which folders it can work in.** The system prompt now names
|
|
197
|
+
the session's folders and labels GAIA's documents folder, so "summarize X in
|
|
198
|
+
my documents folder" looks there first instead of trying `~/Documents` and
|
|
199
|
+
the home folder.
|
|
200
|
+
|
|
201
|
+
### For integrators
|
|
202
|
+
|
|
203
|
+
- **A tool result keeps the tool's own status.** When a tool's result had no
|
|
204
|
+
structured payload, the `tool_result` event's `data` carried only `summary`
|
|
205
|
+
and `success`, so a client could not tell a skipped `remember` (a private
|
|
206
|
+
chat saves nothing) from a saved one, and the Agent UI listed it as saved.
|
|
207
|
+
`data` now also carries `status` when the tool returned one. Additive, so
|
|
208
|
+
the contract version is unchanged.
|
|
209
|
+
|
|
210
|
+
- **An MCP tool call says which connector it used and what came back.** A Git
|
|
211
|
+
connector call reached a client as a bare `mcp_git_git_log`, and its result
|
|
212
|
+
as "Tool 'git_log' returned data". `tool_call` gains optional `mcp_server`,
|
|
213
|
+
`mcp_server_label` ("Git") and `mcp_tool` ("git_log"), and the result's
|
|
214
|
+
`data` carries the tool's text in `mcp_output` (`{ text, truncated }`, capped
|
|
215
|
+
at 16,000 characters). Clients that ignore the fields see the same events.
|
|
216
|
+
|
|
217
|
+
### For integrators: contract 2.19
|
|
218
|
+
|
|
219
|
+
- **`/query` can record a turn's file changes for undo** (contract **2.19**).
|
|
220
|
+
Desktop chats run in this agent and the Agent UI relays them, so a file the
|
|
221
|
+
agent wrote never reached the chat's Changes view or its Undo. With
|
|
222
|
+
`changes_turn_id` (and `session_id`), the agent copies each file before
|
|
223
|
+
changing it into the snapshot store the Agent UI reads, and finishes the
|
|
224
|
+
recording before the terminal event. Older binaries refuse the field with
|
|
225
|
+
`422`, so probe `/version` before sending it.
|
|
226
|
+
- **A confirmation's `args` are only what the model sent.** `needs_confirmation`
|
|
227
|
+
`args` also carried keys the agent adds to its own prompt — a risk note, a
|
|
228
|
+
scratch-folder marker, and the folder a shell call runs in — so a policy
|
|
229
|
+
client auto-approving on `args` matched fields the model never sent. `args`
|
|
230
|
+
is now exactly the call's arguments; the folder and risk note moved to a new
|
|
231
|
+
`prompt_context` object.
|
|
232
|
+
- **A tool result names the file it wrote.** When a tool's result carries
|
|
233
|
+
`file_path` or `image_path`, the `tool_result` event's `data` now keeps it, so
|
|
234
|
+
a client can list the files a turn produced.
|
|
235
|
+
|
|
236
|
+
## [0.3.1]
|
|
237
|
+
|
|
238
|
+
Released with GAIA 0.25.1, and requires it. Integrators: the sidecar
|
|
239
|
+
contract is now **2.18**; clients built for 2.17 keep working, and the new
|
|
240
|
+
`/query` fields are refused with `422` by older binaries, so probe
|
|
241
|
+
`/version` before sending them.
|
|
242
|
+
|
|
243
|
+
### Linux
|
|
244
|
+
|
|
245
|
+
- **The Linux agent runs on glibc 2.34 or newer.** The `linux-x64` agent is
|
|
246
|
+
now built against glibc 2.34 (#5545), so it starts on Ubuntu 22.04, Debian 12
|
|
247
|
+
and RHEL 9. Before, it needed glibc 2.38 and failed at launch on those.
|
|
248
|
+
|
|
249
|
+
### For integrators: contract 2.18
|
|
250
|
+
|
|
251
|
+
- **`/query` takes the chat's file scope and memory mode** (contract **2.18**).
|
|
252
|
+
`allowed_paths` lets the Agent UI hand the agent the same scope its session
|
|
253
|
+
panel shows. `memory` fixes private chats saving to memory: the relayed turn
|
|
254
|
+
never said the chat was private or that memory was off, so the agent went on
|
|
255
|
+
saving the errors and lessons it records on its own. `"private"` or `"off"`
|
|
256
|
+
now turns off every memory write for the turn.
|
|
257
|
+
- **A confirmation carries the call it asks about.** `needs_confirmation` now
|
|
258
|
+
has `args` (each value capped at 64,000 characters, with `args_truncated`
|
|
259
|
+
when one was cut) and `tool_label`, so a client can show all of the code it
|
|
260
|
+
is approving rather than the shortened `summary`, and word a path prompt for
|
|
261
|
+
a file or folder that exists.
|
|
262
|
+
- **A turn the model gave up on ends as failed, not done.** When the model
|
|
263
|
+
stopped responding or refused mid-turn (a stall, a 404, every retry spent),
|
|
264
|
+
the turn ended on the model's opening sentence and the Agent UI listed the
|
|
265
|
+
chat as done. The final answer now names the step, the provider and the
|
|
266
|
+
cause, what already ran, and what is unfinished, and the `final` event
|
|
267
|
+
carries `failed: true`.
|
|
268
|
+
- **A turn queued for the model says so on the stream.** When another process
|
|
269
|
+
or request is using the model, `/query` now sends `status` events with
|
|
270
|
+
`phase: "model_queue"` every ~2 s, carrying a `queue` object with the turn's
|
|
271
|
+
place in line, who holds the model and how long it has waited, then one
|
|
272
|
+
`granted` update. A turn queued this way leases ahead of background work, and
|
|
273
|
+
`/query/{run_id}/cancel` takes it out of the queue. Before, the stream went
|
|
274
|
+
silent for the whole wait, so a client could not tell a queued turn from a
|
|
275
|
+
dead one.
|
|
276
|
+
- **Needs core 0.25.1.** The chat agent this one builds on imports the
|
|
277
|
+
reasoning-effort tool, which first ships in core 0.25.1, so its
|
|
278
|
+
`amd-gaia` floor and `min_gaia_version` rise to 0.25.1 with that release.
|
|
279
|
+
|
|
280
|
+
### File access and privacy
|
|
281
|
+
|
|
282
|
+
- **Full access in the Agent UI grants the folders you name.** Turning it on
|
|
283
|
+
over `/sessions/{id}/bypass` refused every path outside the chat's scope with
|
|
284
|
+
nobody asked. On a run the caller can answer for, Full access now grants the
|
|
285
|
+
path without a prompt, as it does in-process; Ask mode asks. Unattended runs,
|
|
286
|
+
the home folder and drive roots are still refused.
|
|
287
|
+
- **No more approval prompts for files that aren't there.** Naming a missing
|
|
288
|
+
file or folder outside the allowed paths opened a 10-minute approval prompt,
|
|
289
|
+
and only after it did the agent learn the file didn't exist; a retry asked
|
|
290
|
+
again. The tool now says the file wasn't found straight away, without asking,
|
|
291
|
+
and names an allowed or attached file with the same name. `analyze_data_file`
|
|
292
|
+
given a bare file name uses the attached file of that name instead of asking
|
|
293
|
+
about one in the working folder. Secret and protected paths are refused
|
|
294
|
+
exactly as before, whether or not they exist.
|
|
295
|
+
- **A turn's file changes can be undone.** The agent saves a copy of every
|
|
296
|
+
file before a tool writes, edits, creates or deletes it, so the Agent UI
|
|
297
|
+
can show the turn's changes and put every file back, even after a restart.
|
|
298
|
+
A turn that also ran a shell command, Python or an MCP tool says undo may
|
|
299
|
+
be incomplete.
|
|
300
|
+
- **Saving a download asks about the file, not its folder.** A download into
|
|
301
|
+
the home folder failed without asking, because the agent asked to grant the
|
|
302
|
+
whole folder. It now asks about the one file it is about to create.
|
|
303
|
+
- **A document another program has open is re-indexed once it is free.** On
|
|
304
|
+
Windows, a watched file that Word, PowerPoint or another program held locked
|
|
305
|
+
was read once, reported as corrupted, and never re-indexed. It is now retried
|
|
306
|
+
a few times, and if it stays locked the log says to close the program and
|
|
307
|
+
save the file again.
|
|
308
|
+
|
|
309
|
+
### Long and busy turns finish
|
|
310
|
+
|
|
311
|
+
- **A context overflow no longer throws away the evidence.** A task that read
|
|
312
|
+
many documents used to fill a 32K–64K window, after which the overflow retry
|
|
313
|
+
dropped every older result and the answer was built on whatever was left
|
|
314
|
+
(#2780). The retry now keeps each result whole behind a handle the model can
|
|
315
|
+
re-read, and retries only when the request will then fit.
|
|
316
|
+
- **Token counts no longer undercount when the tokenizer data can't load.** On
|
|
317
|
+
an offline or locked-down machine the counter fell back to characters ÷ 4.28,
|
|
318
|
+
which undercounts JSON and CJK text, so history that should take half the
|
|
319
|
+
window could fill it (#5066). It now warns and counts at least one token per
|
|
320
|
+
three UTF-8 bytes.
|
|
321
|
+
- **Opening a session or switching its model no longer freezes the other
|
|
322
|
+
sessions.** The sidecar built a new session's agent, and ran a `/model`
|
|
323
|
+
switch (which builds a new client and checks its server), on its event
|
|
324
|
+
loop. Every other session's stream stopped for that long, heartbeats
|
|
325
|
+
included, so the TUI and the daemon relay saw an idle connection. That
|
|
326
|
+
setup now runs on a worker thread, and a request that goes away mid-setup
|
|
327
|
+
still releases its session.
|
|
328
|
+
- **Background memory upkeep no longer wipes the chat's cached prompt.**
|
|
329
|
+
Memory consolidation, reconciliation and skill distillation ran on the
|
|
330
|
+
model slot the conversation uses, so the next message re-read the whole
|
|
331
|
+
~19K-token prompt (~45 s on Gemma-4-E4B). They now run on the side slot,
|
|
332
|
+
as memory extraction already did.
|
|
333
|
+
- **A turn cut short by closing the TUI is saved as interrupted.** The session
|
|
334
|
+
history got a turn only once it ended, so closing the TUI mid-turn saved it
|
|
335
|
+
as an ordinary "stopped" answer, or, if the TUI had to kill the agent, lost
|
|
336
|
+
the question entirely. The question is now saved when the turn starts, and a
|
|
337
|
+
turn the TUI's closing cut short ends with "This answer was interrupted when
|
|
338
|
+
GAIA closed." A resumed session (`GAIA_HISTORY_FILE`) sees it. Questions
|
|
339
|
+
queued before the close are saved as they ended.
|
|
340
|
+
- **A busy, restarting or sleeping model server no longer fails the turn.**
|
|
341
|
+
The agent waits for a shared Lemonade that is loading another app's model,
|
|
342
|
+
waits up to 60 s for GAIA's own server to come back after a restart, and a
|
|
343
|
+
PC that sleeps mid-answer resumes instead of reporting a stall. A shared
|
|
344
|
+
KV-cache collision is no longer reported as "conversation too long".
|
|
345
|
+
- **Nothing a tool waits on can hang the turn for good.** A hung MCP server,
|
|
346
|
+
a web server sending one byte at a time (page fetches stop at 120 s,
|
|
347
|
+
downloads at 30 min) and a busy embedder during indexing (one 300 s wait
|
|
348
|
+
per batch, with a message saying why) all end with a clear error. One bad
|
|
349
|
+
batch of parallel tool calls no longer trips the failure breaker and ends
|
|
350
|
+
the task with no answer.
|
|
351
|
+
- **The agent's own scripts get time to run.** A script run through an
|
|
352
|
+
interpreter (`python analyze.py big.csv`) gets a 600 s default instead of
|
|
353
|
+
the 30 s kill for quick commands.
|
|
354
|
+
- **Web search survives DuckDuckGo rate limits.** A refused search is retried
|
|
355
|
+
with backoff and through DuckDuckGo's lite endpoint, or answered by Tavily
|
|
356
|
+
when that connector is set up, instead of failing and being saved to memory
|
|
357
|
+
as a known error.
|
|
358
|
+
|
|
359
|
+
### Memory you can trust
|
|
360
|
+
|
|
361
|
+
- **Memory keeps what the user says, and keeps it current.** Facts come only
|
|
362
|
+
from what the user says about themselves, a forgotten fact is not re-learned
|
|
363
|
+
from old chats, a newer fact outranks the one it replaced, and a write that
|
|
364
|
+
carries tool-call markup or model reasoning is refused instead of saved
|
|
365
|
+
corrupted. Relevant memories now surface in the chats they are about.
|
|
366
|
+
|
|
367
|
+
### Models and answers
|
|
368
|
+
|
|
369
|
+
- **gpt-oss 20B and 120B are supported models.** On a model that grades its
|
|
370
|
+
reasoning, the agent gets `set_reasoning_effort` (low, medium or high) to
|
|
371
|
+
choose how hard it thinks for the rest of the request; every new message
|
|
372
|
+
starts again at medium. It is not registered on other models, so the
|
|
373
|
+
agent's 95 tools on Gemma and Qwen are unchanged.
|
|
374
|
+
- **gpt-oss runs the agent.** Every array tool parameter now declares
|
|
375
|
+
`items`, without which gpt-oss's chat template rejected every request
|
|
376
|
+
with HTTP 500, and gpt-oss control markers inside a file or page the agent
|
|
377
|
+
reads are broken up so the model no longer answers with nothing.
|
|
378
|
+
- **Answers are checked more honestly.** A claim such as "all 55 tests pass"
|
|
379
|
+
is checked even when the same sentence says "but" or "not", and asking the
|
|
380
|
+
agent to run a shell command runs it rather than reading the shell's state.
|
|
381
|
+
|
|
382
|
+
### Diagnostics
|
|
383
|
+
|
|
384
|
+
- **The turn log says how busy the model server was.** With `GAIA_TURN_LOG`
|
|
385
|
+
set, each model call records the server's own prefill, decode and cache-reuse
|
|
386
|
+
figures and the time spent waiting on the model-slot lease, the slot lock and
|
|
387
|
+
the status probe; each turn records its server compute, its non-model time,
|
|
388
|
+
and what filled the gaps between model calls. `GET /v1/gaia/debug/turns`
|
|
389
|
+
returns the last records while recording is on (off the versioned contract).
|
|
200
390
|
|
|
201
391
|
## [0.3.0]
|
|
202
392
|
|
|
@@ -543,9 +733,198 @@ Released with GAIA 0.25.0, and requires it.
|
|
|
543
733
|
is nothing but a skill-granted CLI runs argv-only, so `>` there is refused
|
|
544
734
|
with an explanation instead of reaching the binary as text. See SPEC §5.5.
|
|
545
735
|
|
|
736
|
+
### Also in 0.3.0
|
|
737
|
+
|
|
738
|
+
These were still listed under Unreleased when 0.3.0 was tagged, so they
|
|
739
|
+
shipped in it.
|
|
740
|
+
|
|
741
|
+
- **Finished work is no longer replaced by "I can't confirm this is done".** A
|
|
742
|
+
redaction task that loaded the `document-extract` skill had its answer swapped
|
|
743
|
+
for a coverage warning about its own `redaction_log.csv`, and a task with two
|
|
744
|
+
named outputs only knew about the last one. Every file the request names, and
|
|
745
|
+
every file the turn wrote, is now an output and never a source; the skill
|
|
746
|
+
checks coverage only when the request names a source document or asks for
|
|
747
|
+
every item. No check replaces a non-empty answer any more: an unproven
|
|
748
|
+
save, test result or extraction keeps the answer and adds a short "I
|
|
749
|
+
couldn't confirm all of this" list after it; a turn that ends early keeps
|
|
750
|
+
what it said ahead of its report; and a tool that keeps failing ends with the
|
|
751
|
+
model's answer from what it found, then the failure. A failed image request
|
|
752
|
+
is no longer rewritten into advice to start GAIA with an `--sd` flag that
|
|
753
|
+
does not exist. `load_skill` no longer tells the model the extraction tools
|
|
754
|
+
cannot run when it is about to register them, and a rejected extractor reply
|
|
755
|
+
is now logged.
|
|
756
|
+
- **`run_python` works in the Agent UI without a project.** It ran from the
|
|
757
|
+
server's own folder, which is not an allowed path, so every approved snippet
|
|
758
|
+
was refused and the agent fell back to slower shell commands. With no project
|
|
759
|
+
and a working directory you did not allow, a snippet now runs in the agent's
|
|
760
|
+
scratch directory, and its result says so. A project outside the allowed
|
|
761
|
+
paths is still refused.
|
|
762
|
+
- **An "always" answer for a shell command no longer covers code in the
|
|
763
|
+
scratch folder.** A command run there or naming a path there — `cd` into it
|
|
764
|
+
then `python -m explore`, or `pytest`, `make`, `pip install`, `uv run` or
|
|
765
|
+
`go run` pointed at it — and a script handed a scratch path as an argument
|
|
766
|
+
now ask every time, with no `always_scope`, the same as a script there.
|
|
767
|
+
`always_scope` labels for commands that run code they do not show now say so:
|
|
768
|
+
`pytest (runs the test code it finds)`, `make (runs the Makefile's
|
|
769
|
+
commands)`, `python -m explore (runs that Python module)`.
|
|
770
|
+
- **Exploring data no longer asks twice per step.** Each step wrote a helper
|
|
771
|
+
script into the agent's own scratch folder and ran it, so a data task asked
|
|
772
|
+
for approval about 30 times. Writes inside that folder now run unasked
|
|
773
|
+
(writes anywhere else still ask). Running a script from it asks each time
|
|
774
|
+
and offers no `always_scope`, since what is in that folder changes without
|
|
775
|
+
a prompt.
|
|
776
|
+
- **A command no loaded skill grants asks you instead of failing.** `python
|
|
777
|
+
script.py`, `git commit` or `pip install` with no skill granting them used to
|
|
778
|
+
come back as "needs a skill grant … declares 'shell:execute:git' in its
|
|
779
|
+
SKILL.md", which nobody could act on. They now raise the approval prompt; a
|
|
780
|
+
skill grant still skips it for reads. A prompt's `summary` for a write or
|
|
781
|
+
code-running command ends with one plain line on what it can do, and the
|
|
782
|
+
`in <folder>` line also appears when an earlier `cd` moved the session. A
|
|
783
|
+
call you decline tells the agent not to reach the same result another way,
|
|
784
|
+
and a run nobody can answer refuses in one plain sentence.
|
|
785
|
+
- **Commands GAIA's checks don't cover ask once instead of failing.** `git
|
|
786
|
+
push`, `git fetch`, `python -c`, PowerShell the checks can't read, a line with
|
|
787
|
+
shell operators, or a path outside the allowed folders used to be refused
|
|
788
|
+
outright. They now raise a prompt whose `summary` is the exact line the shell
|
|
789
|
+
will run, its full folder and a risk sentence, with no `always_scope`; an
|
|
790
|
+
approval runs that line once. Still refused with no prompt: an encoded
|
|
791
|
+
PowerShell command or invisible characters, a line whose quoting can't be
|
|
792
|
+
split the way the shell would, such a line that also deletes or discards work
|
|
793
|
+
(`git push --force`, `git reset --hard`, `rm` outside the project), and
|
|
794
|
+
folders no approval can open.
|
|
795
|
+
- **Long Python data jobs can finish.** `run_python` gave up after 60 s and
|
|
796
|
+
the agent abandoned `execute_python_file` at 180 s even when it had asked
|
|
797
|
+
for 15 minutes, while the script kept running and left a corrupt workbook
|
|
798
|
+
behind. Python runs now get 120 s by default and up to 1800 s on request,
|
|
799
|
+
the agent waits that long, and a run that runs out of time is killed with
|
|
800
|
+
every process it started; the result names the files that changed while it
|
|
801
|
+
ran so the agent checks them instead of reporting them finished.
|
|
802
|
+
- **Document search says when it could not search.** With the embedding
|
|
803
|
+
model or Lemonade Server down, `query_documents` and `query_specific_file`
|
|
804
|
+
answered "no relevant information found", so the agent told the user their
|
|
805
|
+
documents held nothing on the topic. They now return an error naming the
|
|
806
|
+
cause (Lemonade unreachable, or the embedding model failing) and how to fix
|
|
807
|
+
it. `index_document` and `index_directory` report the same cause, and
|
|
808
|
+
`index_directory` stops at the first such file and reports an error when no
|
|
809
|
+
file could be indexed. Hints for a missing optional package (RAG, PDF, Excel,
|
|
810
|
+
HTML parsing) say in a frozen build that it isn't bundled, and from source
|
|
811
|
+
give the install command for the running Python.
|
|
812
|
+
- **A failed tool call is reported as a failure.** `run_shell_command` returned
|
|
813
|
+
`status: success` for a command that exited non-zero, so the TUI and Agent UI
|
|
814
|
+
showed a failed build or test run as a passed step. It is now `status: error`
|
|
815
|
+
with an `error` naming the failing step, its exit code and the last stderr
|
|
816
|
+
line; `stdout`, `stderr` and `return_code` are unchanged. grep's no-match and
|
|
817
|
+
diff's "inputs differ" (exit 1) stay a success and say so in `expected_exit`.
|
|
818
|
+
An MCP tool that answers `isError`, a DuckDuckGo search that was blocked, a
|
|
819
|
+
`tasklist`/`wmctrl`/`osascript` window listing that failed, a notification
|
|
820
|
+
whose PowerShell died, and an `open_url` with no browser to open are errors
|
|
821
|
+
too. Install hints in a frozen build no longer name the binary as a Python to
|
|
822
|
+
run pip with.
|
|
823
|
+
- **Reviewing a few documents reads them in full.** `read_file` on a Word,
|
|
824
|
+
PDF or Excel file returned `[Binary file, N bytes]`, so to compare a term
|
|
825
|
+
sheet against a draft agreement the agent indexed them and ran a handful of
|
|
826
|
+
searches, and missed a closing date that differed between the two because no
|
|
827
|
+
search asked for it. `read_file` now returns the extracted text, in parts sized
|
|
828
|
+
to the model's budget that say where the next part starts, and the prompt
|
|
829
|
+
tells the agent to read a few documents in full for a review, comparison or
|
|
830
|
+
reconciliation and keep indexing for large collections and single lookups.
|
|
831
|
+
- **`fetch_page` no longer drops the middle of a long page.** Text past
|
|
832
|
+
`max_length` was cut to its head and tail, which is where a product page keeps
|
|
833
|
+
its menus and footer, not its price. It now returns the first part with a
|
|
834
|
+
marker naming the offset of the next, takes `offset` to continue and `find` to
|
|
835
|
+
jump to the passages containing a word, says so when a word is not on the
|
|
836
|
+
page, and flags a page with almost no static text as rendered by JavaScript.
|
|
837
|
+
`Length:` now reports the whole page rather than the excerpt.
|
|
838
|
+
- **Long desktop tasks finish with their deliverables instead of a bare "I
|
|
839
|
+
can't confirm this is done".** Picking a controller from nine datasheets and
|
|
840
|
+
pricing a 40-unit BOM ran out of its 50 steps while still searching for
|
|
841
|
+
prices, and the reply dropped the recommendation the agent had already
|
|
842
|
+
written. The agent's default step limit is now **150** (a `/query`
|
|
843
|
+
`max_steps` or `GAIA_AGENT_MAX_STEPS` still wins); at 20, 10 and 5 steps left
|
|
844
|
+
it is told to write the requested files from what it has, marking unverified
|
|
845
|
+
values, and a turn that still runs out keeps its findings and lists what is
|
|
846
|
+
missing after them.
|
|
847
|
+
- **The model notice is one line.** Switching or restoring a model printed a
|
|
848
|
+
four-sentence paragraph that named the model twice and said "via Lemonade".
|
|
849
|
+
It now reads like "Switched to **DeepSeek-V4.1-Flash** on the AMD LLM Gateway
|
|
850
|
+
(cloud). Your messages, and anything read from files or memory, are sent
|
|
851
|
+
there." The `/model` list drops "via Lemonade" from its headings and marks
|
|
852
|
+
the configured default model with `(default)`.
|
|
853
|
+
- **Single-file search results name their file.** `query_specific_file` put the
|
|
854
|
+
path only at the top of its result, so each chunk arrived with no source and
|
|
855
|
+
the chunk cards showed none. Every chunk now carries `source_file`, and the
|
|
856
|
+
result lists it in `source_files`, as `query_documents` already did.
|
|
857
|
+
- **The turn log counts the answer of a streamed turn.** With `GAIA_TURN_LOG`
|
|
858
|
+
set, a turn whose answer streamed out recorded `answer_chars: 0`. It now
|
|
859
|
+
records the length of the answer the user saw.
|
|
860
|
+
- **`run_python` and `execute_python_file` work in the released binary.** The
|
|
861
|
+
binary has no Python interpreter, so it handed every script to its own
|
|
862
|
+
argument parser, which rejected it, and no calculation, chart or `.xlsx`
|
|
863
|
+
could be produced. It now runs scripts itself, with pypdf, pymupdf,
|
|
864
|
+
python-docx, python-pptx, openpyxl, xlsxwriter, reportlab, pandas, numpy,
|
|
865
|
+
matplotlib and the full standard library bundled for them, and both tools
|
|
866
|
+
name those libraries to the model. A script that starts `sys.executable`
|
|
867
|
+
(`-m`, `-c`, a file) runs too; `-m pip` says packages can't be installed
|
|
868
|
+
and lists what is bundled. The Windows binary grows from 147 MB to 168 MB.
|
|
869
|
+
- **A Python script that fails is reported as a failure.** A non-zero exit
|
|
870
|
+
came back as `status: success`, so the TUI showed a failed run as
|
|
871
|
+
successful. It is now `status: error`, with an `error` naming the exit code
|
|
872
|
+
and the last stderr line; `stdout`, `stderr` and `return_code` are unchanged.
|
|
873
|
+
- **`GAIA_ALLOWED_PATHS` confines a run to the folders you name.** The agent
|
|
874
|
+
could read anything under the user's home and nothing narrowed that short of
|
|
875
|
+
embedding it, so an evaluation run could read the graders' answer keys. Set
|
|
876
|
+
to absolute folders, it narrows every file tool, search, index and shell path
|
|
877
|
+
check to them — it never widens, an invalid value stops startup, and code the
|
|
878
|
+
agent runs (`run_python`, shell) is not confined.
|
|
879
|
+
- **The sidecar's start-up warm-up now makes the first question fast.** It
|
|
880
|
+
primed only the agent's own instructions, without the tool list or the rest
|
|
881
|
+
of the system prompt, so the first question re-read all ~19K prompt tokens
|
|
882
|
+
(34 s on Qwen3.6-35B-A3B). It now sends exactly what a turn sends, and the
|
|
883
|
+
first question reads only its own ~50 tokens (5 s). A warm-up that fails is
|
|
884
|
+
logged as a warning with its cause instead of an info line.
|
|
885
|
+
- **`/model` names the command that connects a cloud provider.** With no
|
|
886
|
+
Fireworks or AMD gateway connection, the list told users to "connect this
|
|
887
|
+
provider in the TUI provider settings", a screen with no obvious way in. It
|
|
888
|
+
now says to run `/provider`, the command that opens it.
|
|
889
|
+
- **The TUI's provider picker works after GAIA's Lemonade restarts.** When the
|
|
890
|
+
agent ran as the TUI's own child, its model-state ping kept naming the port
|
|
891
|
+
Lemonade started on, so after a restart the picker said "Lemonade did not
|
|
892
|
+
respond" while chat worked. With a local or cloud chat model the ping now
|
|
893
|
+
reports the port the agent talks to, and it still never starts a stopped
|
|
894
|
+
server. A Claude session still reports the port it started with.
|
|
895
|
+
- **The Agent UI's Skills settings list this agent's skills.** With the agent
|
|
896
|
+
installed from the Hub, the page said the agent package was not installed
|
|
897
|
+
and to run `gaia init`, which changed nothing: the bundled skills live
|
|
898
|
+
inside the binary, where the UI could not read them. `GET /v1/gaia/skills`
|
|
899
|
+
(contract **2.17**) now returns them.
|
|
900
|
+
- **A message sent right after Stop is answered instead of refused.** A stopped
|
|
901
|
+
turn holds its session until its model call returns, so the next `/query`
|
|
902
|
+
got `409 … is already running a turn` for as long as the stopped answer would
|
|
903
|
+
have taken — about 40 s for a long one. It now waits for the stopped turn to
|
|
904
|
+
finish (up to 240 s) and then runs. A turn that was not cancelled is still
|
|
905
|
+
refused at once.
|
|
906
|
+
- **Documents attached to a chat now reach the agent.** In the Agent UI, a
|
|
907
|
+
Hub-installed agent answered "no documents are indexed" about a file the user
|
|
908
|
+
had attached, because the relayed turn never carried the chat's files.
|
|
909
|
+
`/query` now takes a `documents` field (contract **2.16**): the agent indexes
|
|
910
|
+
them before the turn, granting each exact file and not its folder, including
|
|
911
|
+
a file attached partway through a conversation.
|
|
912
|
+
- **The first chat after the agent starts uses its own tools.** A session built
|
|
913
|
+
while the start-up warm-up was still building could end up running the
|
|
914
|
+
warm-up agent's tools, so a file it had just indexed read as access denied.
|
|
915
|
+
Agents are now built one at a time.
|
|
916
|
+
- **Web requests work behind a corporate TLS-inspecting proxy.** HTTPS now
|
|
917
|
+
trusts the operating system's certificate store, as pip does, instead of only
|
|
918
|
+
Python's bundled list, so a proxy root such as Zscaler's no longer fails every
|
|
919
|
+
fetch with `CERTIFICATE_VERIFY_FAILED`.
|
|
920
|
+
- **Starting the agent no longer downloads a model you skipped.** The HTTP
|
|
921
|
+
sidecar's start-up warm-up skips the default local model when it is not
|
|
922
|
+
downloaded, so someone using a cloud model is not handed a multi-GB download
|
|
923
|
+
they never asked for.
|
|
924
|
+
|
|
546
925
|
### Notes
|
|
547
926
|
|
|
548
|
-
- Tracks sidecar contract `apiVersion` **2.
|
|
927
|
+
- Tracks sidecar contract `apiVersion` **2.17**; a differing major raises
|
|
549
928
|
`VersionMismatchError`.
|
|
550
929
|
- `GET /v1/gaia/memory` (contract 2.13) answers the same read-only snapshot the
|
|
551
930
|
stdio transport's `/memory` sentinel produces, so a daemon-supervised
|
|
@@ -790,9 +1169,9 @@ the terminal UI meant building it from source.
|
|
|
790
1169
|
building its own TUI. Each terminal-hub artifact is additionally cross-checked
|
|
791
1170
|
against the hub's own server-side SHA-256 before its hash enters the lock.
|
|
792
1171
|
- Requires Node.js 18+ (built-in `fetch`), a running Lemonade Server for
|
|
793
|
-
inference, and the `gaia` Python CLI 0.25.
|
|
794
|
-
starts. 0.25.
|
|
795
|
-
the UI starts with nothing behind it.
|
|
1172
|
+
inference, and the `gaia` Python CLI 0.25.2+ on `PATH` for the daemon the TUI
|
|
1173
|
+
starts. 0.25.2 is the first core that can run the current release; on an
|
|
1174
|
+
earlier core the UI starts with nothing behind it.
|
|
796
1175
|
- The sidecar has no arm64 Linux or arm64 Windows build. On those platforms the
|
|
797
1176
|
run stops with an error naming the platform and the supported set rather than
|
|
798
1177
|
launching a UI with no agent behind it.
|