Skip to content
Open
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
9 changes: 9 additions & 0 deletions .changeset/upgrade-pi-agent-core-openai.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
'@electric-ax/agents': patch
'@electric-ax/agents-runtime': patch
'@electric-ax/agents-server': patch
'@electric-ax/agents-server-conformance-tests': patch
'@electric-ax/agents-desktop': patch
---

Update the agents runtime to the renamed Earendil Works pi packages and latest OpenAI/Codex model catalog. Preserve custom provider id compatibility, move built-in Codex defaults to GPT-5.6 models, and remove deprecated direct pi-agent-core dependencies from agents examples.
1 change: 0 additions & 1 deletion examples/agents-chat-starter/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
"dependencies": {
"@durable-streams/state": "^0.3.1",
"@electric-ax/agents-runtime": "workspace:*",
"@mariozechner/pi-agent-core": "^0.57.1",
"@radix-ui/react-icons": "^1.3.0",
"@radix-ui/themes": "^3.3.0",
"@sinclair/typebox": "^0.34.0",
Expand Down
1 change: 0 additions & 1 deletion examples/deep-survey/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
"dependencies": {
"@durable-streams/state": "^0.3.1",
"@electric-ax/agents-runtime": "workspace:*",
"@mariozechner/pi-agent-core": "^0.70.2",
"@radix-ui/themes": "^3.3.0",
"@sinclair/typebox": "^0.34.0",
"@tanstack/db": "^0.6.6",
Expand Down
2 changes: 1 addition & 1 deletion examples/deep-survey/src/server/orchestrator.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type {
AgentTool,
EntityRegistry,
HandlerContext,
SharedStateHandle,
Expand All @@ -7,7 +8,6 @@ import { db } from '@electric-ax/agents-runtime'
import { queryOnce } from '@durable-streams/state/db'
import { Type } from '@sinclair/typebox'
import { exec, execFile } from 'node:child_process'
import type { AgentTool } from '@mariozechner/pi-agent-core'
import { swarmSharedSchema, type WikiEntry, type Xref } from './schema.js'
import { explorerSpawnArgs } from './explorer.js'
import { SURVEY_WORKER_ENTITY_TYPE } from './survey-worker.js'
Expand Down
2 changes: 1 addition & 1 deletion packages/agents-desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"type": "module",
"main": "./dist/main.cjs",
"scripts": {
"build": "pnpm --filter @electric-ax/agents build && pnpm --filter electric-ax build:desktop && pnpm --filter @electric-ax/agents-server-ui build:desktop && vite build",
"build": "pnpm --filter @electric-ax/agents-runtime build && pnpm --filter @electric-ax/agents build && pnpm --filter electric-ax build:desktop && pnpm --filter @electric-ax/agents-server-ui build:desktop && vite build",
"dev": "pnpm run ensure:electron && concurrently -k -n ui,desktop -c cyan,green \"pnpm run dev:ui\" \"pnpm run dev:desktop\"",
"dev:ui": "pnpm --filter @electric-ax/agents-server-ui dev:desktop",
"dev:desktop": "wait-on -d 200 http-get://localhost:${ELECTRIC_DESKTOP_UI_PORT:-5183} && vite",
Expand Down
4 changes: 2 additions & 2 deletions packages/agents-desktop/src/credentials/model-picker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ export const DEFAULT_ENABLED_MODEL_VALUES = [
`anthropic:claude-opus-4-7`,
`anthropic:claude-sonnet-4-6`,
`openai:gpt-5.5`,
`openai-codex:gpt-5.4`,
`openai-codex:gpt-5.5`,
`openai-codex:gpt-5.6-terra`,
`openai-codex:gpt-5.6-sol`,
`deepseek:deepseek-v4-flash`,
`deepseek:deepseek-v4-pro`,
`moonshot:kimi-k2.6`,
Expand Down
4 changes: 2 additions & 2 deletions packages/agents-runtime/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@
"@durable-streams/client": "^0.2.6",
"@durable-streams/state": "^0.3.1",
"@electric-ax/agents-mcp": "workspace:*",
"@mariozechner/pi-agent-core": "^0.70.2",
"@mariozechner/pi-ai": "^0.70.2",
"@earendil-works/pi-agent-core": "^0.80.5",
"@earendil-works/pi-ai": "^0.80.5",
"@mozilla/readability": "^0.6.0",
"@sinclair/typebox": "^0.34.48",
"@standard-schema/spec": "^1.1.0",
Expand Down
2 changes: 1 addition & 1 deletion packages/agents-runtime/src/compaction-summarize.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { completeSimple } from '@mariozechner/pi-ai'
import { completeSimple } from '@earendil-works/pi-ai/compat'
import { resolvePiModel, toAgentHistory } from './pi-adapter'
import {
COMPACTION_SUMMARIZATION_PROMPT,
Expand Down
8 changes: 4 additions & 4 deletions packages/agents-runtime/src/model-runner.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { readFileSync } from 'node:fs'
import { homedir } from 'node:os'
import { join } from 'node:path'
import { completeSimple, getModel } from '@mariozechner/pi-ai'
import { completeSimple, getModel } from '@earendil-works/pi-ai/compat'
import {
MOONSHOT_PROVIDER,
getMoonshotApiKey,
getMoonshotModel,
} from './moonshot-models'
import type { AgentConfig } from './types'
import type { KnownProvider } from '@mariozechner/pi-ai'
import type { KnownProvider } from '@earendil-works/pi-ai/compat'

export interface LowCostModelChoice {
provider: KnownProvider | string
Expand All @@ -29,7 +29,7 @@ export type LowCostModelConfig = Pick<
const PREFERRED_IDS_BY_PROVIDER: Record<string, Array<string>> = {
anthropic: [`claude-3-5-haiku-latest`, `claude-3-5-haiku-20241022`],
openai: [`gpt-4.1-nano`, `gpt-4o-mini`, `gpt-4.1-mini`],
'openai-codex': [`gpt-5.4-mini`, `gpt-5.1-codex-mini`],
'openai-codex': [`gpt-5.6-luna`, `gpt-5.4-mini`, `gpt-5.1-codex-mini`],
deepseek: [`deepseek-v4-flash`, `deepseek-v4-pro`],
moonshot: [`kimi-k2.6`, `kimi-k2.5`, `moonshot-v1-8k`],
}
Expand Down Expand Up @@ -92,7 +92,7 @@ function envCatalog(): LowCostModelCatalog {
if (providers.includes(`openai-codex`)) {
choices.push({
provider: `openai-codex`,
id: `gpt-5.4-mini`,
id: `gpt-5.6-luna`,
reasoning: false,
})
}
Expand Down
2 changes: 1 addition & 1 deletion packages/agents-runtime/src/moonshot-models.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { Model } from '@mariozechner/pi-ai'
import type { Model } from '@earendil-works/pi-ai/compat'

export const MOONSHOT_PROVIDER = `moonshot` as const
export type MoonshotProvider = typeof MOONSHOT_PROVIDER
Expand Down
75 changes: 53 additions & 22 deletions packages/agents-runtime/src/pi-adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
* - Delegating ID management and event writing to OutboundBridge
*/

import { Agent } from '@mariozechner/pi-agent-core'
import { getModel, streamSimple } from '@mariozechner/pi-ai'
import { Agent } from '@earendil-works/pi-agent-core'
import { getModel, streamSimple } from '@earendil-works/pi-ai/compat'
import { createOutboundBridge } from './outbound-bridge'
import { MOONSHOT_PROVIDER, getMoonshotModel } from './moonshot-models'
import { runtimeLog } from './log'
Expand All @@ -25,13 +25,13 @@ import type {
AgentMessage,
AgentTool,
StreamFn,
} from '@mariozechner/pi-agent-core'
} from '@earendil-works/pi-agent-core'
import type {
KnownProvider,
Model,
Provider,
ProviderId,
SimpleStreamOptions,
} from '@mariozechner/pi-ai'
} from '@earendil-works/pi-ai/compat'
import type { LLMContentBlock, LLMMessage, LLMMessageContent } from './types'

/**
Expand Down Expand Up @@ -68,7 +68,7 @@ function parseReasoningSummary(text: string): {
export interface PiAdapterOptions {
systemPrompt: string
model: string | Model<any>
provider?: Provider
provider?: ProviderId
tools: Array<AgentTool>
streamFn?: StreamFn
getApiKey?: (
Expand Down Expand Up @@ -120,7 +120,7 @@ type PiAgentAdapterFactory = (config: PiAgentAdapterConfig) => PiAgentHandle

export function resolvePiModel(opts: {
model: string | Model<any>
provider?: Provider
provider?: ProviderId
}): Model<any> {
if (typeof opts.model !== `string`) {
return opts.model
Expand Down Expand Up @@ -169,15 +169,55 @@ function toAgentContent(content: LLMMessageContent): Array<unknown> {
return content.map(toAgentContentBlock)
}

type AssistantAgentMessage = Extract<AgentMessage, { role: `assistant` }>

type HistoryModel = Pick<Model<any>, `api` | `provider` | `id`>

function createHistoryAssistantMessage(
content: Array<unknown>,
model?: HistoryModel
): AssistantAgentMessage {
return {
role: `assistant`,
content,
api: model?.api ?? `unknown`,
provider: model?.provider ?? `unknown`,
model: model?.id ?? `unknown`,
usage: {
input: 0,
output: 0,
cacheRead: 0,
cacheWrite: 0,
totalTokens: 0,
cost: {
input: 0,
output: 0,
cacheRead: 0,
cacheWrite: 0,
total: 0,
},
},
stopReason: `stop`,
timestamp: Date.now(),
} as AssistantAgentMessage
}

function isAssistantAgentMessage(
message: AgentMessage | undefined
): message is AssistantAgentMessage {
return message?.role === `assistant`
}

export function toAgentHistory(
messages: Array<LLMMessage>
messages: Array<LLMMessage>,
model?: HistoryModel
): Array<AgentMessage> {
const history: Array<AgentMessage> = []
const toolNamesById = new Map<string, string>()

const lastAssistant = (): AgentMessage | undefined => {
const lastAssistant = (): AssistantAgentMessage | undefined => {
const last = history[history.length - 1]
return last?.role === `assistant` ? last : undefined
return isAssistantAgentMessage(last) ? last : undefined
}

for (const message of messages) {
Expand Down Expand Up @@ -212,11 +252,7 @@ export function toAgentHistory(
prevContent.push(...content)
}
} else {
history.push({
role: `assistant`,
content,
timestamp: Date.now(),
} as AgentMessage)
history.push(createHistoryAssistantMessage(content, model))
}
break
}
Expand All @@ -234,11 +270,7 @@ export function toAgentHistory(
if (prev) {
;(prev.content as Array<unknown>).push(block)
} else {
history.push({
role: `assistant`,
content: [block],
timestamp: Date.now(),
} as AgentMessage)
history.push(createHistoryAssistantMessage([block], model))
}
break
}
Expand Down Expand Up @@ -272,8 +304,6 @@ export function createPiAgentAdapter(
config.writeEvent,
opts.onStepEnd ? { onStepEnd: opts.onStepEnd } : undefined
)
const history = toAgentHistory(config.messages)

let running = false
let disposed = false
let stepStartTime = 0
Expand All @@ -286,6 +316,7 @@ export function createPiAgentAdapter(
model: opts.model,
...(opts.provider && { provider: opts.provider }),
})
const history = toAgentHistory(config.messages, model)
const modelTimeoutMs = opts.modelTimeoutMs ?? DEFAULT_MODEL_TIMEOUT_MS
const modelMaxRetries = opts.modelMaxRetries ?? DEFAULT_MODEL_MAX_RETRIES

Expand Down
2 changes: 1 addition & 1 deletion packages/agents-runtime/src/tools/bash.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Type } from '@sinclair/typebox'
import type { Sandbox } from '../sandbox/types'
import type { AgentTool } from '@mariozechner/pi-agent-core'
import type { AgentTool } from '@earendil-works/pi-agent-core'

const DEFAULT_TIMEOUT_MS = 120_000
const MAX_TIMEOUT_MS = 600_000
Expand Down
2 changes: 1 addition & 1 deletion packages/agents-runtime/src/tools/brave-search.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Anthropic from '@anthropic-ai/sdk'
import { Type } from '@sinclair/typebox'
import type { AgentTool } from '@mariozechner/pi-agent-core'
import type { AgentTool } from '@earendil-works/pi-agent-core'

const BRAVE_API_URL = `https://api.search.brave.com/res/v1/web/search`
const SEARCH_FALLBACK_MODEL = `claude-haiku-4-5-20251001`
Expand Down
2 changes: 1 addition & 1 deletion packages/agents-runtime/src/tools/edit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { Type } from '@sinclair/typebox'
import { runtimeLog } from '../log'
import { SandboxError } from '../sandbox/types'
import type { Sandbox } from '../sandbox/types'
import type { AgentTool } from '@mariozechner/pi-agent-core'
import type { AgentTool } from '@earendil-works/pi-agent-core'

export function createEditTool(sandbox: Sandbox): AgentTool {
return {
Expand Down
2 changes: 1 addition & 1 deletion packages/agents-runtime/src/tools/fetch-url.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import TurndownService from 'turndown'
import { completeWithLowCostModel } from '../model-runner'
import { SandboxError } from '../sandbox/types'
import type { Sandbox } from '../sandbox/types'
import type { AgentTool } from '@mariozechner/pi-agent-core'
import type { AgentTool } from '@earendil-works/pi-agent-core'
import type { LowCostModelCatalog, LowCostModelConfig } from '../model-runner'

const MAX_RAW_CHARS = 100_000
Expand Down
2 changes: 1 addition & 1 deletion packages/agents-runtime/src/tools/read-file.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Type } from '@sinclair/typebox'
import { runtimeLog } from '../log'
import { SandboxError } from '../sandbox/types'
import type { Sandbox } from '../sandbox/types'
import type { AgentTool } from '@mariozechner/pi-agent-core'
import type { AgentTool } from '@earendil-works/pi-agent-core'

const MAX_FILE_SIZE = 512 * 1024 // 512 KB
const DEFAULT_READ_LIMIT_LINES = 2_000
Expand Down
2 changes: 1 addition & 1 deletion packages/agents-runtime/src/tools/schedules.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { randomUUID } from 'node:crypto'
import { Type } from '@sinclair/typebox'
import { runtimeLog } from '../log'
import type { AgentTool } from '@mariozechner/pi-agent-core'
import type { AgentTool } from '@earendil-works/pi-agent-core'
import type { EntityStreamDBWithActions } from '../entity-stream-db'

type ScheduleManifest = {
Expand Down
2 changes: 1 addition & 1 deletion packages/agents-runtime/src/tools/webhook-sources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
defaultWebhookSourceSubscriptionLifetime,
webhookSourceSubscriptionManifestKey,
} from '../webhook-sources'
import type { AgentTool } from '@mariozechner/pi-agent-core'
import type { AgentTool } from '@earendil-works/pi-agent-core'
import type { EntityStreamDBWithActions } from '../types'
import type {
WebhookSourceContract,
Expand Down
2 changes: 1 addition & 1 deletion packages/agents-runtime/src/tools/write.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { Type } from '@sinclair/typebox'
import { runtimeLog } from '../log'
import { SandboxError } from '../sandbox/types'
import type { Sandbox } from '../sandbox/types'
import type { AgentTool } from '@mariozechner/pi-agent-core'
import type { AgentTool } from '@earendil-works/pi-agent-core'

export function createWriteTool(sandbox: Sandbox): AgentTool {
return {
Expand Down
10 changes: 7 additions & 3 deletions packages/agents-runtime/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,12 @@ import type {
import type {
AgentTool as PiAgentTool,
StreamFn,
} from '@mariozechner/pi-agent-core'
import type { Model, Provider, SimpleStreamOptions } from '@mariozechner/pi-ai'
} from '@earendil-works/pi-agent-core'
import type {
Model,
ProviderId,
SimpleStreamOptions,
} from '@earendil-works/pi-ai/compat'
import type {
EntityStreamDB as RuntimeEntityStreamDB,
EntityStreamDBWithActions as RuntimeEntityStreamDBWithActions,
Expand Down Expand Up @@ -953,7 +957,7 @@ export type AgentModel = string | Model<any>
export interface AgentConfig {
systemPrompt: string
model: AgentModel
provider?: Provider
provider?: ProviderId
tools: Array<AgentTool>
streamFn?: StreamFn
getApiKey?: (
Expand Down
2 changes: 1 addition & 1 deletion packages/agents-runtime/test/compaction-trigger.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { afterEach, describe, expect, it } from 'vitest'
import { createAssistantMessageEventStream } from '@mariozechner/pi-ai'
import { createAssistantMessageEventStream } from '@earendil-works/pi-ai/compat'
import {
buildStreamFixture,
createTestHandlerContext,
Expand Down
2 changes: 1 addition & 1 deletion packages/agents-runtime/test/context-factory.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { describe, expect, it, vi } from 'vitest'
import { createAssistantMessageEventStream } from '@mariozechner/pi-ai'
import { createAssistantMessageEventStream } from '@earendil-works/pi-ai/compat'
import { getCronStreamPath } from '../src/cron-utils'
import { createHandlerContext } from '../src/context-factory'
import { ENTITY_COLLECTIONS } from '../src/entity-schema'
Expand Down
Loading
Loading