|
1
|
## 1.3.3 |
|
2
|
|
|
3
|
### Cargo workspace |
|
4
|
|
|
5
|
* `onde` is now a hybrid root-package Cargo workspace. Members are the root `onde` crate, the `uniffi-bindgen` helper, `sdk/dart/rust`, and `sdk/react-native/rust`; the React Native example app is excluded. No files moved, and the root package is still the publishable crate. |
|
6
|
* Shared dependency versions (`log`, `serde`, `serde_json`, `thiserror`, `tokio`, `uniffi`, `smbcloud-gresiq-sdk`) are hoisted into `[workspace.dependencies]`. Each member opts in with `workspace = true` and keeps its own feature list, so only the version requirement is shared. Resolved versions are unchanged. |
|
7
|
|
|
8
|
### Packaging |
|
9
|
|
|
10
|
* No public API changes: the published `onde` crate surface is identical to `1.3.2`. |
|
11
|
* Completes the `1.3.2` version propagation that release commit `f45253b` missed and that never reached the tagged commit — `sdk/react-native/rust/Cargo.toml`, the React Native changelog, and the `onde-react-native` entry in the root lockfile were still on `1.3.1` at tag `1.3.2`. All version sources are aligned on `1.3.3` here. |
|
12
|
|
|
13
|
## 1.3.2 |
|
14
|
|
|
15
|
### Stateless tool calling (Rust-native only) |
|
16
|
|
|
17
|
* Added `ChatEngine::complete(turns, tools, sampling)`, which runs the loaded model on a conversation the caller supplies instead of the engine's history. `turns` is a list of `ChatTurn`s (system, user, assistant with its tool calls, tool result) and is the whole conversation: the engine's history and system prompt are neither read nor changed. Hosts that keep their own conversation, such as an ACP agent that persists and reloads sessions, can now use on-device tool calling. Previously only the stateful `send_message_with_tools` and `send_tool_results` could, and `push_history` can't restore tool calls or tool results. |
|
18
|
* `complete` returns a `CompletionResult` with the reply text, the tool calls, the finish reason, prompt and completion token counts, and the model's reasoning. Reasoning comes from the model's reasoning output or, for Qwen3 thinking models, from a leading `<think>…</think>` block, which is removed from the reply text. |
|
19
|
* `GgufModelConfig::from_supported_model_id` is now public, so a host can load a model from `models::TOOL_CALLING_MODELS` or `models::SUPPORTED_MODELS` by its ID. |
|
20
|
* `ToolCallRequest` now implements `PartialEq` and `Eq`. |
|
21
|
|
|
22
|
## 1.3.1 |
|
23
|
|
|
24
|
### Fixes |
|
25
|
|
|
26
|
* Fixed a panic when logging a chat message or reply longer than 100 bytes whose 100th byte fell inside a multi-byte UTF-8 character. The log preview sliced the string at a fixed byte index, so text with accented letters, CJK, or emoji at that position could abort `send_message` and the streaming paths. The preview now cuts at the nearest character boundary at or below the limit. |
|
27
|
|
|
28
|
### Packaging |
|
29
|
|
|
30
|
* Release metadata is aligned for Rust, Swift, Kotlin, Flutter/Dart, and React Native SDKs under version `1.3.1`. |
|
31
|
|
|
32
|
## 1.3.0 |
|
33
|
|
|
34
|
### Pulse document telemetry |
|
35
|
|
|
36
|
* Added opt-in dual-write to the GresIQ document gateway for attributed model-load and inference events. Documents are scoped by Onde app and edge identities so retries remain idempotent and separate installations cannot overwrite one another. |
|
37
|
* Streaming inference now reports Pulse events, including measured time to first token. Setup and mid-stream failures report `error`, dropped receivers report `cancelled`, and unmeasured TTFT stays absent instead of becoming a misleading zero. |
|
38
|
* Edge documents now carry a last-seen timestamp so readers can derive liveness from recency instead of a durable `online` value. |
|
39
|
|
|
40
|
### Privacy-preserving geography |
|
41
|
|
|
42
|
* Added `ChatEngine::with_pulse_country()` and the `ONDE_PULSE_COUNTRY` host setting for an optional, device-declared ISO 3166-1 alpha-2 country. |
|
43
|
* Country observations are limited to one app-scoped edge document per UTC day. Invalid or user-assigned codes are ignored, no network-derived location is used, and `ONDE_DISABLE_PULSE_GEOGRAPHY` disables geography without stopping other telemetry. |
|
44
|
|
|
45
|
### Packaging |
|
46
|
|
|
47
|
* Release metadata is aligned for Rust, Swift, Kotlin, Flutter/Dart, and React Native SDKs under version `1.3.0`. |
|
48
|
|
|
49
|
## 1.2.5 |
|
50
|
|
|
51
|
### Tool calling (Rust-native only) |
|
52
|
|
|
53
|
* `ChatEngine::tool_calling_support()` reports whether the loaded model is one Onde has verified for structured tool calls. `Supported` means catalogued and tested. `Unsupported` means catalogued and not tested, which is a statement about Onde's coverage rather than the model's capability: some of those models ship tool-call templates and may well work. `Unknown` means the repository is not in the catalogue at all. An engine with nothing loaded answers `Unsupported`. |
|
54
|
* `models::tool_calling_support()` and `models::TOOL_CALLING_MODELS` give the same answer without an engine. Matching is exact, so a custom repository whose name resembles a catalogued one stays `Unknown` rather than inheriting a verification it never had. |
|
55
|
* `ChatEngine::record_tool_results()` appends tool results to history without starting another inference round. Agent hosts need it when a turn is cancelled after the assistant has already asked for tools. It records only results answering a call the assistant actually made and has not already been answered, and returns how many it kept, because a tool result with no matching request builds a message sequence the model cannot read. |
|
56
|
* `ToolCallingSupport` is exported from `onde::inference`. |
|
57
|
|
|
58
|
None of this reaches the UniFFI surface yet, so the Swift, Kotlin, Flutter/Dart, and React Native packages gain no new API in this release. |
|
59
|
|
|
60
|
### Release automation |
|
61
|
|
|
62
|
* The React Native package publishes through npm trusted publishing (OIDC) instead of a long-lived `NPM_TOKEN`. The publish job requests `id-token: write` and upgrades npm before publishing, since Node 22 still ships npm 10 and trusted publishing needs 11.5.1 or newer. The trusted publisher configured on npmjs.com has to keep matching what the job declares, or npm answers the publish with a 404. |
|
63
|
* The npm workflow runs a preflight gate before the publish step. |
|
64
|
* Fixed the crates.io publish guard. It asked `cargo info onde@$VERSION`, which resolves against the local workspace rather than the registry when run from inside the repo, so it reported every version as already published and skipped the upload while exiting green. That is why 1.2.3 and 1.2.4 were tagged, showed a passing release run, and never reached crates.io. The check now queries the sparse index through `scripts/crates-io-published.py`, and the workflow asserts the version is actually on the index after publishing. |
|
65
|
* `sync-release-version.py --check` now gates on the root `CHANGELOG.md` as well as the Dart and React Native ones, so a release cannot be tagged without notes here. |
|
66
|
|
|
67
|
### Packaging |
|
68
|
|
|
69
|
* Release metadata is aligned for Rust, Swift, Kotlin, Flutter/Dart, and React Native SDKs under version `1.2.5`. |
|
70
|
|
|
71
|
## 1.1.1 |
|
72
|
|
|
73
|
### Apple SDK compatibility |
|
74
|
|
|
75
|
* Swift XCFramework and Kotlin macOS/JVM builds now honor explicit Apple deployment targets instead of inheriting the newest runner SDK defaults. |
|
76
|
* This fixes downstream macOS app integration warnings caused by the macOS static library slice being built with a newer minimum OS than consumer apps target. |
|
77
|
|
|
78
|
### Packaging |
|
79
|
|
|
80
|
* Release metadata is aligned for Rust, Swift, Kotlin, Flutter/Dart, and React Native SDKs under version `1.1.1`. |
|
81
|
|
|
82
|
## 1.1.0 |
|
83
|
|
|
84
|
### Swift / UniFFI runtime stability |
|
85
|
|
|
86
|
* Added `#[uniffi::export(async_runtime = "tokio")]` to the Swift/Kotlin FFI export surface so async UniFFI calls consistently run on the Tokio runtime. |
|
87
|
* Made pulse telemetry initialization lazy and panic-safe on Apple platforms. The GresIQ client is no longer created from the synchronous UniFFI constructor path, and telemetry now gracefully disables itself instead of crashing if a Tokio reactor is unavailable. |
|
88
|
* Added a one-time Rust panic hook so panics are logged through the host logger instead of relying on stderr in iOS/tvOS simulator and device contexts. |
|
89
|
|
|
90
|
### Telemetry |
|
91
|
|
|
92
|
* Added `ONDE_DISABLE_PULSE=1` as an explicit runtime kill switch for pulse telemetry during local validation and host-app debugging. |
|
93
|
* Hardened `model_loaded` and `inference_event` telemetry writes so they never require a current Tokio handle on the calling thread. |
|
94
|
|
|
95
|
### Packaging |
|
96
|
|
|
97
|
* Release metadata is aligned for Rust, Swift, Kotlin, Flutter/Dart, and React Native SDKs under version `1.1.0`. |
|
98
|
|
|
99
|
## 1.0.0 |
|
100
|
|
|
101
|
Onde has already been running in real Splitfire AB apps on the App Store for months, so keeping it on `0.x` no longer felt accurate. |
|
102
|
|
|
103
|
### Assigned model loading (FFI) |
|
104
|
|
|
105
|
`load_assigned_model` is now exposed through the UniFFI layer. Swift and Kotlin consumers can call it directly. The method hardcodes `Environment::Production`, so SDK consumers do not need to know about the internal environment enum. Pass your `app_id` and `app_secret` from [ondeinference.com](https://ondeinference.com), and the SDK will fetch the model assigned in the dashboard. If nothing has been assigned yet, it falls back to the platform default. |
|
106
|
|
|
107
|
### New models |
|
108
|
|
|
109
|
* Qwen 3 1.7B, 4B, 8B, and 14B (GGUF Q4_K_M) |
|
110
|
* Qwen 2.5 Coder 1.5B, 3B, and 7B (GGUF Q4_K_M) |
|
111
|
* DeepSeek Coder 6.7B (GGUF Q4_K_M) — ships with a bundled chat template since the GGUF doesn't include one |
|
112
|
|
|
113
|
### Type changes |
|
114
|
|
|
115
|
* `GgufModelConfig` now has a `chat_template: Option<String>` field for models that need a custom template. |
|
116
|
* `InferenceResult` now carries `tool_calls: Vec<ToolCallInfo>`. It will be empty for most responses, but when a model requests a tool call, you now get structured data instead of raw markup in `text`. |
|
117
|
* New types: `ToolCallInfo`, `ToolDefinition`, and `ToolResult`. The last two are Rust-only for now. They will reach the FFI surface once `send_message_with_tools` is wired up. |
|
118
|
|
|
119
|
### Engine |
|
120
|
|
|
121
|
* Model weights are now dropped outside the write lock during model swaps, so status queries no longer block while the old model's memory is being freed. |
|
122
|
* `platform_default()` now returns Coder variants, Qwen 2.5 Coder 1.5B on mobile and Coder 3B on desktop. |
|
123
|
|
|
124
|
### Tool calling (Rust-native only) |
|
125
|
|
|
126
|
* `send_message_with_tools`, `send_tool_results`, and `stream_tool_results` are now available on `ChatEngine`. These are available to direct Rust consumers, like [siGit](https://github.com/smbcloud/sigit), but are not exposed through UniFFI yet. The types already cross the FFI boundary on the output side through `InferenceResult.tool_calls`, just not on the input side yet. |
|
127
|
|
|
128
|
### Dependencies |
|
129
|
|
|
130
|
* Switched from the git-based `mistralrs` dependency to the published `onde-mistralrs 0.8.2` crates on crates.io. That means no more `[patch.crates-io]` gymnastics for `cargo publish`. |
|
131
|
|
|
132
|
### Cross-platform |
|
133
|
|
|
134
|
* Linux and Windows CPU builds now work properly too, thanks to a `TokenSource` fix for non-Darwin platforms. |
|
135
|
* Added cross-compile CI for all supported targets. |
|
136
|
|
|
137
|
## 0.1.8 |
|
138
|
|
|
139
|
* Published to crates.io with `onde-mistralrs 0.8.2` registry dependencies (replacing git refs that `cargo publish` strips). |
|
140
|
|
|
141
|
## 0.1.7 |
|
142
|
|
|
143
|
* Qwen 3 4B GGUF model with OpenAI-compatible tool calling. |
|
144
|
* `GgufModelConfig::qwen3_4b()` constructor. |
|
145
|
|
|
146
|
## 0.1.6 |
|
147
|
|
|
148
|
* License fix: canonical MIT text so crates.io recognizes the license correctly. |
|
149
|
|
|
150
|
## 0.1.5 |
|
151
|
|
|
152
|
* `ChatEngine::load_assigned_model()` — Rust-native API for fetching operator-assigned models from the GresIQ backend. |
|
153
|
* GresIQ pulse telemetry client (build-time credential embedding via `dotenvy`). |
|
154
|
* watchOS and visionOS platform support. |
|
155
|
|
|
156
|
## 0.1.4 |
|
157
|
|
|
158
|
* Switched all `mistralrs` dependencies to the `fix/all-platform-fixes` fork for cross-platform stability. |
|
159
|
* Dual-licensed MIT OR Apache-2.0. |
|
160
|
|
|
161
|
## 0.1.3 |
|
162
|
|
|
163
|
* Added watchOS and visionOS targets. |
|
164
|
|
|
165
|
## 0.1.2 |
|
166
|
|
|
167
|
* HF cache sandbox workaround for iOS and Android (`GLOBAL_HF_CACHE` seeding). |
|
168
|
* `configure_cache_dir` free function for sandboxed platforms. |
|
169
|
|
|
170
|
## 0.1.1 |
|
171
|
|
|
172
|
* CI/CD: `release-sdk-swift.yml` builds the XCFramework and auto-updates `onde-swift` on tag push. |
|
173
|
|
|
174
|
## 0.1.0 |
|
175
|
|
|
176
|
* Initial release. |
|
177
|
* Multi-turn chat with Qwen 2.5 1.5B and 3B GGUF models. |
|
178
|
* Metal on iOS/macOS, CPU on Android/Linux/Windows. |
|
179
|
* Streaming inference via `tokio::sync::mpsc`. |
|
180
|
* Conversation history management. |
|
181
|
* One-shot `generate()` API. |
|
182
|
* Configurable sampling with presets. |
|
183
|
* UniFFI bindings for Swift/Kotlin. |