Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 0 additions & 34 deletions .changeset/usage-provenance-and-response-id.md

This file was deleted.

2 changes: 1 addition & 1 deletion dotnet/core/src/SmooAI.SmoothOperator.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<!-- NuGet package metadata -->
<PropertyGroup>
<PackageId>SmooAI.SmoothOperator.Core</PackageId>
<Version>1.9.0</Version>
<Version>1.10.0</Version>
<Authors>SmooAI</Authors>
<Company>SmooAI</Company>
<Description>Native C# implementation of the smooth-operator agent engine — the in-process, Microsoft.Extensions.AI-based sibling of the Rust smooai-smooth-operator-core. Drive an agentic tool-calling loop over any IChatClient; author tools from ordinary C# methods with AIFunctionFactory. Learns from Microsoft Agent Framework idioms.</Description>
Expand Down
2 changes: 1 addition & 1 deletion go/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ package e2e
// language artifacts. The real Go "publish" is a git tag (go/v<Version>); this
// constant is the anchor that scripts/sync-versions.mjs keeps in sync with the
// canonical npm version on every changeset release.
const Version = "1.9.0"
const Version = "1.10.0"
2 changes: 1 addition & 1 deletion python/core/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "smooai-smooth-operator-core"
version = "1.9.0"
version = "1.10.0"
description = "Native Python implementation of the smooth-operator agent engine — an in-process, OpenAI-compatible agentic tool-calling loop with knowledge grounding. The Python sibling of the Rust reference engine and the C# core."
readme = "README.md"
license = { text = "MIT" }
Expand Down
2 changes: 1 addition & 1 deletion python/core/uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion rust/smooth-operator-core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "smooai-smooth-operator-core"
version = "1.9.0"
version = "1.10.0"
edition = "2021"
license = "MIT"
repository = "https://github.com/SmooAI/smooth-operator-core"
Expand Down
2 changes: 1 addition & 1 deletion rust/smooth-operator-temporal/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "smooai-smooth-operator-temporal"
version = "1.9.0"
version = "1.10.0"
edition = "2021"
description = "Optional Temporal-backed durable execution backend for the smooth-operator agent engine (ADR-030)."
license = "MIT"
Expand Down
35 changes: 35 additions & 0 deletions typescript/core/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,40 @@
# @smooai/smooth-operator-core

## 1.10.0

### Minor Changes

- 418d996: Carry cost/usage provenance and the gateway response id out of the engine, so nothing downstream can
publish a fabricated number as a measurement.

`collect_stream` invents a usage struct whenever a response carries no usage chunk — which LiteLLM
does for every `smooth-*` alias — hardcoding `prompt_tokens = 0` and estimating `completion_tokens`
as `content.len() / 4`. The estimate is kept, because budget enforcement needs something to multiply,
but it is now flagged: `LlmResponse.usage_estimated`, aggregated onto `AgentEvent::Completed` as
`usage_estimated`. This is what let production record `input_tokens = 0` on every streamed turn
beside an output count that only ever tracked the reply's length. The old comment there claimed the
estimate would "produce a real cost number against ModelPricing"; it does not, and it now says so.

`AgentEvent::Completed` also gains `cost_estimated` — true once any call in the run was priced from
the local `ModelPricing` table instead of the gateway's own figure. That table cannot price aliased
routes and returns the free tier for anything it does not recognise, so a tainted total may be a wild
under-count while looking exact. Cost and usage provenance are tracked separately on purpose: the
gateway reports cost on an HTTP header and usage on an SSE chunk, so either can be authoritative
while the other is a guess.

Finally, the gateway's response id (`chatcmpl-…`, or `msg_…` on the Anthropic-native path) is now
captured off both the streaming and non-streaming paths and surfaced as `LlmResponse.response_id` and
`AgentEvent::Completed.response_id`. It was previously discarded at deserialization. It is the join
key to `LiteLLM_SpendLogs.request_id`, whose row carries the gateway's authoritative dollars **and**
its real prompt/completion counts — the only trustworthy source for either while the flags above can
be set.

All three fields cross the Temporal activity boundary via `ModelCallOutput`, so a durable replay
cannot silently launder an estimate back into a measurement. `smooth-operator-temporal`'s core
requirement moves 1.8 -> 1.9 accordingly.

Note for consumers matching exhaustively on `StreamEvent`: this adds a `ResponseId` variant.

## 1.9.0

### Minor Changes
Expand Down
2 changes: 1 addition & 1 deletion typescript/core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@smooai/smooth-operator-core",
"version": "1.9.0",
"version": "1.10.0",
"description": "Native TypeScript implementation of the smooth-operator agent engine — an in-process, OpenAI-compatible agentic tool-calling loop with knowledge grounding. The TypeScript sibling of the Rust reference engine, the C# core, and the Python core.",
"type": "module",
"license": "MIT",
Expand Down
7 changes: 7 additions & 0 deletions typescript/temporal/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# @smooai/smooth-operator-temporal

## 1.9.3

### Patch Changes

- Updated dependencies [418d996]
- @smooai/smooth-operator-core@1.10.0

## 1.9.2

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion typescript/temporal/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@smooai/smooth-operator-temporal",
"version": "1.9.2",
"version": "1.9.3",
"description": "Optional Temporal-backed durable execution backend for the smooth-operator agent engine (ADR-030). The TypeScript sibling of the Rust `smooth-operator-temporal` crate — an agent turn runs as a Temporal workflow whose model call and tool invocations are activities, driving the same `driveTurn` loop as the in-process executor.",
"type": "module",
"license": "MIT",
Expand Down
Loading