diff --git a/CHANGELOG.md b/CHANGELOG.md index bf8ef753..057d0dd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,12 @@ All notable changes to `yoagent` are documented here. The format loosely follows [Keep a Changelog](https://keepachangelog.com/), and the project adheres to [Semantic Versioning](https://semver.org/). -## Unreleased - -### yoagent +## 0.25.7 (2026-10-16) - **`McpToolAdapter::with_prefix` / `from_client_with_prefix` now name the tool** `__` (as `OpenApiConfig::with_name_prefix` does for OpenAPI tools). The prefix was stored but never used, so two servers offering a tool of the same name, or a server tool named like a built-in, still gave the agent duplicate tool names, which a provider rejects. The server is still called with its own tool name. The MCP guide now shows how (the `with_mcp_server_*` helpers add no prefix). Reported by the yobuild session. +- Docs: the agent skill's plugin numbers follow the re-measured compatibility matrix (2026-10-16: pi 12 of 20, DSH 3 of 20; no verdict changed, a usable DSH plugin left the npm top 20), and the moved examples' stubs link to yobuild's `examples/`. + ## 0.25.6 (2026-10-16) - **DeepSeek is priced** (after `prices::enable_bundled()`): `deepseek-flash`, `deepseek-v4-pro` and the legacy `deepseek-v4-flash` (billed as Flash), from DeepSeek's pricing page. **At the peak rate:** DeepSeek bills half of it off-peak (all hours but 01:00–04:00 and 06:00–10:00 UTC on weekdays), and a `CostConfig` has no time of day, so costs are an upper bound — off-peak they read up to twice the bill, and a `Budget` stops early rather than late. Install the off-peak rates as an override to count those instead (`docs/concepts/pricing.md`). `ModelConfig::deepseek(..)` for those ids now has a `cost`; `Budget::for_model` works for them. The price audit checks the rates as exactly twice models.dev's off-peak ones, and models.dev data (`enable_live`, a fetch or a price cache written by an earlier version) never brings DeepSeek's off-peak rates back over the bundled peak ones. `examples/llm_compaction_live.rs` reads DeepSeek's rates from the snapshot instead of its own literals. diff --git a/Cargo.toml b/Cargo.toml index b18157d9..b9e27d5f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "yoagent" -version = "0.25.6" +version = "0.25.7" edition = "2021" # MSRV-aware dependency resolution (cargo 1.84+): prefer dependency versions # whose own rust-version fits ours. Without it CI re-resolves to whatever is diff --git a/skills/yoagent/SKILL.md b/skills/yoagent/SKILL.md index 43f1440d..aae265e8 100644 --- a/skills/yoagent/SKILL.md +++ b/skills/yoagent/SKILL.md @@ -5,7 +5,7 @@ description: Use when building, extending or upgrading an agent on the yoagent R # yoagent: which feature for which job -Written for **yoagent 0.25.6** (and yoagent-rutis 0.4.0); the recipes +Written for **yoagent 0.25.7** (and yoagent-rutis 0.4.0); the recipes below are compiled by `tests/skill_test.rs`, line for line. Check what you build against: `cargo tree -p yoagent` or `Cargo.lock`. If you are on an older version, read [What changed](#what-changed) first. @@ -198,6 +198,10 @@ and its examples. Newest first; the full list is `CHANGELOG.md`. +- **0.25.7** — `McpToolAdapter::with_prefix` / `from_client_with_prefix` + name the tool `__` (the prefix was ignored); the server is + still called with its own name. The `with_mcp_server_*` helpers add no + prefix: wrap a server yourself when two offer the same tool name. - **0.25.6** — DeepSeek is priced (after `prices::enable_bundled()`): `deepseek-flash`, `deepseek-v4-pro`, `deepseek-v4-flash`, at the **peak** rate (off-peak is half; a flat price has no time of day), so its costs are diff --git a/tests/skill_test.rs b/tests/skill_test.rs index 8604be5f..e5e3bf5d 100644 --- a/tests/skill_test.rs +++ b/tests/skill_test.rs @@ -288,6 +288,11 @@ fn prose_names() { let _ = Agent::with_mcp_server_stdio; let _ = Agent::with_mcp_server_http; let _ = Agent::with_mcp_server_http_transport; + let _ = |a: yoagent::mcp::McpToolAdapter| a.with_prefix("docs"); + async fn prefixed(client: std::sync::Arc>) { + let _ = yoagent::mcp::McpToolAdapter::from_client_with_prefix(client, "docs").await; + } + let _ = prefixed; async fn structured(a: &mut Agent) { let _ = a .prompt_structured::("x", serde_json::json!({}))