diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 3fd65e81a2..0f3a203c83 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -141,7 +141,7 @@ External packages installed for runtime use or distributed inside the prebuilt b pnpm applies local patches to the following packages at install time, so shipped artifacts carry modified copies; each patch file is the complete record of the modification: -- `@earendil-works/pi-ai@1.0.2` — [`patches/@earendil-works__pi-ai@1.0.2.patch`](patches/@earendil-works__pi-ai@1.0.2.patch) +- `@earendil-works/pi-ai@1.1.0` — [`patches/@earendil-works__pi-ai@1.1.0.patch`](patches/@earendil-works__pi-ai@1.1.0.patch) - `@electron/osx-sign@1.3.3` — [`patches/@electron__osx-sign@1.3.3.patch`](patches/@electron__osx-sign@1.3.3.patch) - `@fortune-sheet/core@1.0.4` — [`patches/@fortune-sheet__core@1.0.4.patch`](patches/@fortune-sheet__core@1.0.4.patch) - `@fortune-sheet/react@1.0.4` — [`patches/@fortune-sheet__react@1.0.4.patch`](patches/@fortune-sheet__react@1.0.4.patch) diff --git a/docs/upgrade-guide/v0.2.1-alpha.2/pi-ai-azure-provider/guide.i18n.yaml b/docs/upgrade-guide/v0.2.1-alpha.2/pi-ai-azure-provider/guide.i18n.yaml new file mode 100644 index 0000000000..46b8b3fcd7 --- /dev/null +++ b/docs/upgrade-guide/v0.2.1-alpha.2/pi-ai-azure-provider/guide.i18n.yaml @@ -0,0 +1,16 @@ +# Bilingual-pair consistency record for guide.md (docs/i18n/README.md): per heading +# section, a hash of its English and Chinese blocks outside code blocks and generated regions. +# After editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write docs/upgrade-guide/v0.2.1-alpha.2/pi-ai-azure-provider/guide.md +/: + en: 51d5b5b4d2fb1b8a + zh: 4dc9af2458a8fcac +/azure-provider-route-rename: + en: 105c73820d057e28 + zh: 91a7bfc5c282e164 +/azure-provider-route-rename/change: + en: d5ce9089d8aa7119 + zh: f337926f85b01bc1 +/azure-provider-route-rename/migration: + en: 8fb23fbb8184fa00 + zh: 8c44fb293a8dd70a diff --git a/docs/upgrade-guide/v0.2.1-alpha.2/pi-ai-azure-provider/guide.md b/docs/upgrade-guide/v0.2.1-alpha.2/pi-ai-azure-provider/guide.md new file mode 100644 index 0000000000..1b4119f4d7 --- /dev/null +++ b/docs/upgrade-guide/v0.2.1-alpha.2/pi-ai-azure-provider/guide.md @@ -0,0 +1,19 @@ +--- +kind: upgrade-guide +description: "The pi-ai Azure provider route is renamed from azure-openai-responses to azure." +--- + +# Azure provider route rename + +English | [中文](guide.zh.md) + +## Change + +The installed pi-ai catalog identifies the Azure provider as `azure` instead of `azure-openai-responses`. The `azure` route includes both Responses and Chat Completions models. The Responses API identifier remains `azure-openai-responses`, and the `AZURE_OPENAI_*` environment variables keep their names. Configurations and model selections that use the old provider key no longer resolve the Azure catalog. + +## Migration + +1. In the `llm-pi-ai` configuration in `$DSH_HOME/profiles//cordis.patch.yml` or another supplying layer, rename `config.providers.azure-openai-responses` to `config.providers.azure`. Preserve its existing fields and any `apiKeyEnv` reference. +2. Use catalog model IDs under `models`; map a custom Azure deployment name with `AZURE_OPENAI_DEPLOYMENT_NAME_MAP`. The mixed catalog cannot infer a protocol for a model ID absent from the catalog. An explicit route-level `api` overrides every model on that route; it does not select the Azure provider. +3. Update explicit request/default provider selections to `azure`, and reselect an Azure model when continuing an existing Session. Configure the new Azure entry in Settings → Models if its key was stored for the old entry. Do not edit historical Session events. +4. Confirm that Settings → Models offers `azure` and lists the expected models, then send a short request using the configured deployment. diff --git a/docs/upgrade-guide/v0.2.1-alpha.2/pi-ai-azure-provider/guide.zh.md b/docs/upgrade-guide/v0.2.1-alpha.2/pi-ai-azure-provider/guide.zh.md new file mode 100644 index 0000000000..ad62892268 --- /dev/null +++ b/docs/upgrade-guide/v0.2.1-alpha.2/pi-ai-azure-provider/guide.zh.md @@ -0,0 +1,19 @@ +--- +kind: upgrade-guide +description: "pi-ai 的 Azure 提供方路由从 azure-openai-responses 更名为 azure。" +--- + +# Azure 提供方路由更名 + +[English](guide.md) | 中文 + +## 变更 + +已安装的 pi-ai 目录使用 `azure` 标识 Azure 提供方,替代 `azure-openai-responses`。`azure` 路由同时包含 Responses 和 Chat Completions 模型。Responses API 标识仍为 `azure-openai-responses`,`AZURE_OPENAI_*` 环境变量名称也保持不变。使用旧提供方键的配置和模型选择无法再解析 Azure 目录。 + +## 迁移 + +1. 在 `$DSH_HOME/profiles//cordis.patch.yml` 或其他提供配置的层中,找到 `llm-pi-ai` 配置,将 `config.providers.azure-openai-responses` 改为 `config.providers.azure`。保留原有字段及任何 `apiKeyEnv` 引用。 +2. 在 `models` 中使用目录模型 ID;自定义 Azure 部署名称通过 `AZURE_OPENAI_DEPLOYMENT_NAME_MAP` 映射。混合协议目录无法为目录外的模型 ID 推断协议。显式设置路由级 `api` 会覆盖该路由所有模型的协议,并不表示选择 Azure 提供方。 +3. 将显式请求及默认模型配置中的提供方改为 `azure`,继续现有 Session 时重新选择 Azure 模型。若密钥存储在旧条目下,请在“设置 → 模型”中配置新的 Azure 条目。不要修改历史 Session 事件。 +4. 确认“设置 → 模型”提供 `azure` 且列出预期模型,再向所配置的部署发送一条简短请求。 diff --git a/packages/llm/llm-pi-ai/README.i18n.yaml b/packages/llm/llm-pi-ai/README.i18n.yaml index 1844fa2884..064203d767 100644 --- a/packages/llm/llm-pi-ai/README.i18n.yaml +++ b/packages/llm/llm-pi-ai/README.i18n.yaml @@ -87,8 +87,8 @@ en: b6bd570c0159ba08 zh: 7d2d91eea6a8d830 /deepseek-ai-dsh-llm-pi-ai/known-limitations-and-deferred-work: - en: 552281e47ba3980f - zh: 4af4dff3d9fa52d5 + en: de6e60be33ddcd82 + zh: dfd0f00289200b77 /deepseek-ai-dsh-llm-pi-ai/known-limitations-and-deferred-work/dev-note: en: 3678dd0f6642c2a5 zh: 75cbdd064cc64282 diff --git a/packages/llm/llm-pi-ai/README.md b/packages/llm/llm-pi-ai/README.md index 95d4257e2a..3666cd251d 100644 --- a/packages/llm/llm-pi-ai/README.md +++ b/packages/llm/llm-pi-ai/README.md @@ -229,7 +229,7 @@ These limits define where the adapter stops and future work begins. They are cur - **`headers` can carry a credential the redactor never sees** — profile resolution rejects names and values Fetch cannot represent, but the dict remains plain strings; store credentials as `apiKeyEnv` references. - **Discovery does not change configured models** — adopt discovery results explicitly into the route configuration. - **Anthropic discovery reads at most 1,000 models** — the request uses the API's maximum page size but does not traverse `has_more`; entries beyond the first page must be added by hand. -- **One wire protocol per route** — a mixed-protocol catalog route cannot host a model of the other protocol; splitting the provider across two route keys is the workaround. +- **Uncataloged models need an unambiguous protocol** — catalog routes preserve each model's protocol, including both Azure APIs under `azure`. A model absent from a mixed-protocol catalog needs an explicit route-level `api`, which overrides every model on the route and must be one of the supported custom protocols. For Azure deployment names, keep the catalog model ID and set `AZURE_OPENAI_DEPLOYMENT_NAME_MAP`. - **A modality declaration is not verified** — a model declaring `image` its gateway does not serve is refused by the provider after prompt admission. The durable image remains in history and the same misdeclared model can fail again; switching to a text-only model remains possible because the shared LLM runtime projects image references into stable text for that request. - **An unauthenticated route depends on its protocol** — a route naming no credential resolves as configured-but-keyless, but pi-ai's OpenAI-compatible implementation still requires an API key or an `Authorization` header, so a keyless local server needs a placeholder credential referenced by `apiKeyEnv` or an `Authorization` entry in `headers`. - **`GenerateOptions.stop` is unsupported** — pi-ai's common stream options cannot guarantee stop-sequence behavior across providers. @@ -237,7 +237,7 @@ These limits define where the adapter stops and future work begins. They are cur - **Images are accepted only in user and tool-result messages** — images in system, developer, or assistant history fail with `UNSUPPORTED_CONTENT` on both conversion paths. - **Provider HTTP status is unavailable** — pi-ai error events do not expose a stable HTTP status across providers. - **Retry policy is provider-owned, not an SDK retry** — pi-ai SDK retries stay disabled so durable agent steps and `llm/retry` events own every visible attempt, and direct `ctx.llm.stream()` calls remain single-attempt. -- **Streamed tool-call arguments are parsed once, when the call ends** — the installed pi-ai carries [`patches/@earendil-works__pi-ai@1.0.2.patch`](../../../patches/@earendil-works__pi-ai@1.0.2.patch), which removes the per-delta re-parse of the whole accumulated argument JSON in every stream adapter (upstream [earendil-works/pi#9265](https://github.com/earendil-works/pi/issues/9265)); unpatched, a multi-megabyte argument stream costs O(n²) CPU on the event loop and stalls every session in the process. Until `toolcall_end`, a pi-ai partial's tool-call `arguments` stays `{}`; this adapter reads only the delta strings and the finalized arguments. Re-apply or retire the patch on every pi-ai upgrade. +- **Streamed tool-call arguments are parsed once, when the call ends** — the installed pi-ai carries [`patches/@earendil-works__pi-ai@1.1.0.patch`](../../../patches/@earendil-works__pi-ai@1.1.0.patch), which removes the per-delta re-parse of the whole accumulated argument JSON in every stream adapter (upstream [earendil-works/pi#9265](https://github.com/earendil-works/pi/issues/9265)); unpatched, a multi-megabyte argument stream costs O(n²) CPU on the event loop and stalls every session in the process. Until `toolcall_end`, a pi-ai partial's tool-call `arguments` stays `{}`; this adapter reads only the delta strings and the finalized arguments. Re-apply or retire the patch on every pi-ai upgrade. ### Dev Note diff --git a/packages/llm/llm-pi-ai/README.zh.md b/packages/llm/llm-pi-ai/README.zh.md index 3eb1039ee6..64cbf97155 100644 --- a/packages/llm/llm-pi-ai/README.zh.md +++ b/packages/llm/llm-pi-ai/README.zh.md @@ -229,7 +229,7 @@ pi-ai 事件变成 harness 的推理、文本、工具调用、用量与 finish - **`headers` 可以携带 redactor 永远看不到的凭据**——profile 解析会拒绝 Fetch 无法表示的名称与值,但该字典仍是纯字符串;以 `apiKeyEnv` 引用存储凭据。 - **发现操作不更改已配置模型**——需显式将发现结果采纳到路由配置中。 - **Anthropic 模型发现最多读取 1,000 个模型**——请求使用 API 的最大页大小,但不会遍历 `has_more`;第一页之外的条目需要手工添加。 -- **每条路由一种协议格式**——混合协议目录路由无法承载另一协议格式的模型;把提供方拆到两个路由键是变通办法。 +- **目录外模型需要明确的协议**——目录路由保留每个模型的协议,包括 `azure` 下的两种 Azure API。混合协议目录中不存在的模型需要显式设置路由级 `api`;该设置覆盖路由上的所有模型,且必须属于受支持的自定义协议。Azure 部署名称应通过 `AZURE_OPENAI_DEPLOYMENT_NAME_MAP` 设置,模型 ID 保持为目录中的 ID。 - **模态声明不受校验**——声明 `image` 而其网关不支持的模型会在提示词准入后被提供方拒绝。持久图片仍留在历史中,同一误声明模型可能再次失败;切换到纯文本模型仍然可行,因为共享 LLM 运行时会针对该请求把图片引用投影为稳定文本。 - **未认证路由取决于其协议**——不点名凭据的路由解析为已配置但无密钥,但 pi-ai 的 OpenAI 兼容实现仍要求 API 密钥或 `Authorization` 标头,因此无密钥本地服务器需要由 `apiKeyEnv` 引用或 `headers` 中的 `Authorization` 条目提供的占位凭据。 - **不支持 `GenerateOptions.stop`**——pi-ai 的通用流式选项无法跨提供方保证停止序列行为。 @@ -237,7 +237,7 @@ pi-ai 事件变成 harness 的推理、文本、工具调用、用量与 finish - **图片只在 user 与工具结果消息中被接受**——system、developer 或 assistant 历史中的图片在两条转换路径上都会以 `UNSUPPORTED_CONTENT` 失败。 - **提供方 HTTP 状态不可用**——pi-ai 错误事件不跨提供方暴露稳定 HTTP 状态。 - **重试策略由提供方自有,而非 SDK 重试**——pi-ai SDK 重试保持禁用,因此持久 agent(智能体)步骤与 `llm/retry` 事件拥有每个可见尝试,直接 `ctx.llm.stream()` 调用仍是单次尝试。 -- **流式工具调用参数只在调用结束时解析一次**——安装的 pi-ai 带有 [`patches/@earendil-works__pi-ai@1.0.2.patch`](../../../patches/@earendil-works__pi-ai@1.0.2.patch),它移除了每个流适配器中对整段累计参数 JSON 的逐 delta 重新解析(上游 [earendil-works/pi#9265](https://github.com/earendil-works/pi/issues/9265));未打补丁时,数 MB 的参数流会在事件循环上消耗 O(n²) CPU,并使进程内所有会话停滞。在 `toolcall_end` 之前,pi-ai partial 的工具调用 `arguments` 保持为 `{}`;本适配器只读取 delta 字符串与最终参数。每次升级 pi-ai 时都要重新应用或撤销该补丁。 +- **流式工具调用参数只在调用结束时解析一次**——安装的 pi-ai 带有 [`patches/@earendil-works__pi-ai@1.1.0.patch`](../../../patches/@earendil-works__pi-ai@1.1.0.patch),它移除了每个流适配器中对整段累计参数 JSON 的逐 delta 重新解析(上游 [earendil-works/pi#9265](https://github.com/earendil-works/pi/issues/9265));未打补丁时,数 MB 的参数流会在事件循环上消耗 O(n²) CPU,并使进程内所有会话停滞。在 `toolcall_end` 之前,pi-ai partial 的工具调用 `arguments` 保持为 `{}`;本适配器只读取 delta 字符串与最终参数。每次升级 pi-ai 时都要重新应用或撤销该补丁。 ### 开发备注 diff --git a/packages/llm/llm-pi-ai/package.json b/packages/llm/llm-pi-ai/package.json index 351ed0a2c3..e95eba07fc 100644 --- a/packages/llm/llm-pi-ai/package.json +++ b/packages/llm/llm-pi-ai/package.json @@ -43,7 +43,7 @@ "@deepseek-ai/dsh-brand": "workspace:*", "@deepseek-ai/dsh-util-values": "workspace:*", "@deepseek-ai/schemastery": "workspace:~", - "@earendil-works/pi-ai": "^1.0.2" + "@earendil-works/pi-ai": "^1.1.0" }, "devDependencies": { "@deepseek-ai/cordis": "workspace:~", diff --git a/packages/llm/llm-pi-ai/tests/catalog.spec.ts b/packages/llm/llm-pi-ai/tests/catalog.spec.ts index 06ba2a356f..342c1d7703 100644 --- a/packages/llm/llm-pi-ai/tests/catalog.spec.ts +++ b/packages/llm/llm-pi-ai/tests/catalog.spec.ts @@ -440,6 +440,48 @@ describe('hand-declared providers', () => { }) describe('catalog routes with per-model configuration', () => { + it('keeps both Azure protocols under the azure catalog route', () => { + const provider = resolveProfiles({ azure: {} }).get('azure')?.piProvider + const models = provider?.getModels() + + expect(provider?.id).toBe('azure') + expect(models).toEqual(expect.arrayContaining([ + expect.objectContaining({ provider: 'azure', api: 'azure-openai-responses', id: 'gpt-6.1-sol' }), + expect.objectContaining({ provider: 'azure', api: 'openai-completions', id: 'deepseek-v4-pro' }), + ])) + expect(catalogProvider('azure-openai-responses')).toBeUndefined() + }) + + it('requires a protocol for an uncataloged model on the mixed Azure route', () => { + expect(() => resolveProfiles({ azure: { models: [{ id: 'private-deployment' }] } })) + .toThrow(/needs an api/) + }) + + it.each(['azure-openai-responses', 'openai-completions'])( + 'sends Azure %s requests with the configured deployment name', + async (api) => { + const events = api === 'openai-completions' ? textEvents : [ + '{"type":"response.created","response":{"id":"resp_azure"}}', + '{"type":"response.completed","response":{"id":"resp_azure","status":"completed","output":[],"usage":{"input_tokens":3,"output_tokens":1,"total_tokens":4}}}', + ] + const server = await mockServer([{ events }]) + const provider = resolveProfiles({ azure: {} }).get('azure')!.piProvider! + const model = provider.getModels().find(model => model.api === api)! + const stream = provider.streamSimple(model, normalizeContext({ messages: [] }), { + apiKey: 'test-key', + env: { + AZURE_OPENAI_BASE_URL: server.url, + AZURE_OPENAI_API_VERSION: 'v1', + AZURE_OPENAI_DEPLOYMENT_NAME_MAP: `${model.id}=private-deployment`, + }, + }) + + expect(await stream.result()).toMatchObject({ provider: 'azure', stopReason: 'stop' }) + expect(server.requests).toEqual([expect.objectContaining({ model: 'private-deployment' })]) + expect(server.paths).toEqual([api === 'openai-completions' ? '/chat/completions' : '/responses?api-version=v1']) + }, + ) + it('serves the installed catalog untouched when the profile lists no models', async () => { const server = await mockServer([]) const ctx = await harness({ providers: { deepseek: { baseURL: server.url } } }) @@ -1079,10 +1121,11 @@ describe('compat switches', () => { it('serves the Responses compat type on every protocol pi-ai gives it to', () => { // pi-ai types azure-openai-responses and openai-codex-responses with the // same OpenAIResponsesCompat, so a switch settable on one is settable on all. - for (const route of ['azure-openai-responses', 'openai-codex']) { + for (const route of ['azure', 'openai-codex']) { const models = modelsOf({ [route]: { compat: { supportsDeveloperRole: false } } }, route) - const [first] = [...models.values()] - expect((first?.compat as { supportsDeveloperRole?: boolean }).supportsDeveloperRole).toBe(false) + const model = [...models.values()].find(model => model.api === (route === 'azure' ? 'azure-openai-responses' : 'openai-codex-responses')) + expect(model).toBeDefined() + expect(model?.compat).toMatchObject({ supportsDeveloperRole: false }) } }) @@ -1237,6 +1280,8 @@ describe('configurable-provider directory', () => { expect(offered).toContain('openai-codex') expect(offered).toContain('anthropic') expect(offered).toContain('openai') + expect(offered).toContain('azure') + expect(offered).not.toContain('azure-openai-responses') }) it('leaves out an installed catalog route that ships no chat model', async () => { diff --git a/patches/@earendil-works__pi-ai@1.0.2.patch b/patches/@earendil-works__pi-ai@1.1.0.patch similarity index 95% rename from patches/@earendil-works__pi-ai@1.0.2.patch rename to patches/@earendil-works__pi-ai@1.1.0.patch index b7190cc213..d1a3b542c2 100644 --- a/patches/@earendil-works__pi-ai@1.0.2.patch +++ b/patches/@earendil-works__pi-ai@1.1.0.patch @@ -11,7 +11,7 @@ index 38571b31e143e913c2bf59dad73382982e93664a..950e546197d8e84cb3edfca0012939f1 type: "toolcall_delta", contentIndex: index, diff --git a/dist/api/bedrock-converse-stream.js b/dist/api/bedrock-converse-stream.js -index 428af807620993a4c90ceb1a1a120d553844be32..d81d290d8b8b97f8e2cdd97cff1ebaf019c5733e 100644 +index ca40f1b4a4e99f441503cf364822073a7a6c478a..14c204261b3f6c47f8950cf44f0fb9f86cf2cda7 100644 --- a/dist/api/bedrock-converse-stream.js +++ b/dist/api/bedrock-converse-stream.js @@ -461,7 +461,6 @@ function handleContentBlockDelta(event, blocks, output, stream) { @@ -23,7 +23,7 @@ index 428af807620993a4c90ceb1a1a120d553844be32..d81d290d8b8b97f8e2cdd97cff1ebaf0 } else if (delta?.reasoningContent) { diff --git a/dist/api/mistral-conversations.js b/dist/api/mistral-conversations.js -index fbcc5e25ee6752a9c5461b41fa8544a090a17b3f..f540825c4f934f342200db72190599fe95f01d0c 100644 +index 2fc3ad343af090a919f5b71454b29f23b009fc21..64aa8a4ab2461484f22066913455518f69157857 100644 --- a/dist/api/mistral-conversations.js +++ b/dist/api/mistral-conversations.js @@ -554,7 +554,6 @@ async function consumeChatStream(model, output, stream, mistralStream, onProvide diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9624ebcac4..b9d4740100 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ overrides: '@deepseek-ai/schemastery': link:vendor/schemastery patchedDependencies: - '@earendil-works/pi-ai@1.0.2': 1cc211bc358d30cb58bd975f39c03e296f8a277c3de845514d12f9ae77ebab5f + '@earendil-works/pi-ai@1.1.0': 66eaf960054f10441b93ac3857114e96c1901f6d183713e2f21437b007111644 '@electron/osx-sign@1.3.3': 280e7b2816caf01423097d24e79107a66afeb563a348630ce9928ae8499a5861 '@fortune-sheet/core@1.0.4': 8791a230763dbf853fd65d627c68c31de37209992851377855e16cf08ea70532 '@fortune-sheet/react@1.0.4': 2932e52e79afcd4ced08cfa123b5eded786c85043da32f622f3e80af6fc96c37 @@ -10617,8 +10617,8 @@ importers: specifier: link:../../../vendor/schemastery version: link:../../../vendor/schemastery '@earendil-works/pi-ai': - specifier: ^1.0.2 - version: 1.0.2(patch_hash=1cc211bc358d30cb58bd975f39c03e296f8a277c3de845514d12f9ae77ebab5f)(@aws-sdk/credential-provider-node@3.972.84)(@modelcontextprotocol/sdk@1.31.0(supports-color@9.4.0)(zod@4.4.3))(@smithy/signature-v4@5.7.4)(supports-color@9.4.0)(undici@8.11.2)(ws@8.21.3)(zod@4.4.3) + specifier: ^1.1.0 + version: 1.1.0(patch_hash=66eaf960054f10441b93ac3857114e96c1901f6d183713e2f21437b007111644)(@aws-sdk/credential-provider-node@3.972.84)(@modelcontextprotocol/sdk@1.31.0(supports-color@9.4.0)(zod@4.4.3))(@smithy/signature-v4@5.7.4)(supports-color@9.4.0)(undici@8.11.2)(ws@8.21.3)(zod@4.4.3) devDependencies: '@deepseek-ai/cordis': specifier: workspace:~ @@ -15961,13 +15961,13 @@ packages: search-insights: optional: true - '@earendil-works/pi-ai@1.0.2': - resolution: {integrity: sha512-JP59xGlSAQ/HhQ6EHN5qmneBlWfDyu6FPPryAvAaSo8A38ubAsEpS9YisCM5Jbbns0srrDffLZonE0OXorHI5A==} + '@earendil-works/pi-ai@1.1.0': + resolution: {integrity: sha512-1T7LAkc/5Bvc0v6w4vAGVdCrli0o/E0pEmYKTnixu95vSFArBjvbhS/G4ZwI0RUePgf0Imcu0VyqlM4EcXxqfw==} engines: {node: '>=22.19.0'} hasBin: true - '@earendil-works/pi-telemetry@1.0.2': - resolution: {integrity: sha512-Ev5h9TE8nEXHCfRKhWj0qpUFhQgVqNteS95vsM2KNGRGm533vOO2ruDPaEwImBKPMBKXy4omz3D6V2cm41gLOQ==} + '@earendil-works/pi-telemetry@1.1.0': + resolution: {integrity: sha512-8gAK05/2pPozZZz6hCLOi8x2vsqzvsmO9gG92kbvuvTPm0qMHaFlaXX98ndXsrOi5pmzha7vNLguuG4+0Rgxjw==} engines: {node: '>=22.19.0'} '@electron-internal/extract-zip@1.0.5': @@ -23697,11 +23697,11 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@earendil-works/pi-ai@1.0.2(patch_hash=1cc211bc358d30cb58bd975f39c03e296f8a277c3de845514d12f9ae77ebab5f)(@aws-sdk/credential-provider-node@3.972.84)(@modelcontextprotocol/sdk@1.31.0(supports-color@9.4.0)(zod@4.4.3))(@smithy/signature-v4@5.7.4)(supports-color@9.4.0)(undici@8.11.2)(ws@8.21.3)(zod@4.4.3)': + '@earendil-works/pi-ai@1.1.0(patch_hash=66eaf960054f10441b93ac3857114e96c1901f6d183713e2f21437b007111644)(@aws-sdk/credential-provider-node@3.972.84)(@modelcontextprotocol/sdk@1.31.0(supports-color@9.4.0)(zod@4.4.3))(@smithy/signature-v4@5.7.4)(supports-color@9.4.0)(undici@8.11.2)(ws@8.21.3)(zod@4.4.3)': dependencies: '@anthropic-ai/sdk': 0.129.0(zod@4.4.3) '@aws-sdk/client-bedrock-runtime': 3.1127.0 - '@earendil-works/pi-telemetry': 1.0.2 + '@earendil-works/pi-telemetry': 1.1.0 '@google/genai': 2.21.0(@modelcontextprotocol/sdk@1.31.0(supports-color@9.4.0)(zod@4.4.3))(supports-color@9.4.0) '@smithy/node-http-handler': 4.12.1 http-proxy-agent: 9.1.0(supports-color@9.4.0) @@ -23722,7 +23722,7 @@ snapshots: - ws - zod - '@earendil-works/pi-telemetry@1.0.2': {} + '@earendil-works/pi-telemetry@1.1.0': {} '@electron-internal/extract-zip@1.0.5': {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 98e9be027b..d3852ad5d6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -64,8 +64,8 @@ minimumReleaseAgeExclude: - '@deepseek-ai/libreoffice-kit-wasm@0.1.5' # Fresh pi-ai releases carry the model catalog updates that are the whole # point of bumping it; waiting out the release age would defeat that. - - '@earendil-works/pi-ai@1.0.2' - - '@earendil-works/pi-telemetry@1.0.2' + - '@earendil-works/pi-ai@1.1.0' + - '@earendil-works/pi-telemetry@1.1.0' # This addon release recognizes the Electron 44.7.0 Node/V8 fingerprint used by Desktop. - node-addon-native-custom-loader@0.1.9 - node-addon-require-builtin-darwin-arm64@0.1.9 @@ -106,7 +106,7 @@ minimumReleaseAgeExclude: # Desktop packaging requires this Electron fingerprint with node-addon-require-builtin 0.1.9. - electron@44.7.0 patchedDependencies: - '@earendil-works/pi-ai@1.0.2': patches/@earendil-works__pi-ai@1.0.2.patch + '@earendil-works/pi-ai@1.1.0': patches/@earendil-works__pi-ai@1.1.0.patch '@electron/osx-sign@1.3.3': patches/@electron__osx-sign@1.3.3.patch '@fortune-sheet/core@1.0.4': patches/@fortune-sheet__core@1.0.4.patch '@fortune-sheet/react@1.0.4': patches/@fortune-sheet__react@1.0.4.patch