# ElizaOS Developer Update — Week of 2025-12-29 to 2026-01-04

This update summarizes core/runtime changes, plugin work, and developer-facing issues discussed/raised during the week ending 2026-01-04 (compiled on 2026-01-05).

---

## 1) Core Framework

### Parallelized provider execution in MultiStep runtime
The agent runtime’s MultiStep execution path was refactored to run provider fetches concurrently (fault-tolerant) rather than sequentially:

- **Merged PR:** `refactor(default-message-service): optimize provider handling in MultiStep`  
  https://github.com/elizaos/eliza/pull/6263

**What changed**
- `runMultiStepCore` now executes provider requests in parallel using `Promise.allSettled(...)`.
- This reduces end-to-end latency when MultiStep orchestration requires multiple providers to resolve before continuing.

**Developer implications**
- If you had plugins/providers implicitly depending on side effects from *execution order*, you should treat provider execution as **unordered** now.
- Any provider that requires strict sequencing should enforce it internally (or via a single orchestrating provider) rather than relying on runtime order.

**Practical guidance**
- Ensure providers are idempotent and safe to run concurrently.
- Avoid shared mutable state between providers unless synchronized.

---

## 2) New Features

### Multi-model agent configuration (community-recommended pattern)
In Discord, developers discussed running multiple models in a single agent (e.g., Anthropic for forecasting/calculation-like tasks and OpenAI for general reasoning). The recommended approach is to use the **OpenRouter plugin** and select provider/model via environment configuration.

- Discord context (Jan 3): multi-model agent setups via OpenRouter, model selection in env.

**Example: environment-based model selection**
```bash
# .env
OPENROUTER_API_KEY=...
# Example: choose model per task or per agent profile
OPENROUTER_MODEL=openai/gpt-4.1-mini
# or
OPENROUTER_MODEL=anthropic/claude-3.5-sonnet
```

**Example: “two models” via two agents or two runtimes**
If you want strict separation (recommended), run two ElizaOS agents with different env/model settings and route tasks at the application layer:

```ts
// Pseudocode: router that delegates to two ElizaOS agent endpoints
async function handleTask(task: { type: "forecast" | "reason"; input: string }) {
  const endpoint =
    task.type === "forecast"
      ? process.env.FORECAST_AGENT_URL
      : process.env.REASON_AGENT_URL;

  return fetch(`${endpoint}/chat`, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ message: task.input }),
  }).then(r => r.json());
}
```

**Why this matters**
- It preserves observability and avoids mixing tool/memory policies for fundamentally different workloads (forecasting vs. reasoning).
- It minimizes coupling to provider-specific behavior.

---

## 3) Bug Fixes

### Critical: PostgreSQL `SET LOCAL` broke data isolation mode (fix pending merge)
A critical bug was identified and fixed in `plugin-sql` for PostgreSQL when **data isolation** is enabled.

- **PR (opened):** `fix(plugin-sql): use sql.raw() for SET LOCAL to avoid parameterization…`  
  https://github.com/elizaos/eliza/pull/6316

**Root cause**
- PostgreSQL `SET` / `SET LOCAL` statements **do not support parameterized queries**.
- The prior implementation used Drizzle’s parameterized `sql\`...\`` template, producing errors like:
  - `syntax error at or near $1`
- This effectively broke database operations when `ENABLE_DATA_ISOLATION=true`.

**Fix approach**
- Switch from parameterized template to `sql.raw()` with an inline value for `SET LOCAL app.entity_id = ...`.
- Add both unit tests and a real PostgreSQL integration test covering `withEntityContext`.

**Action for developers**
- If you rely on `ENABLE_DATA_ISOLATION=true`, track this PR closely and plan to upgrade as soon as it merges.
- Until then, either disable data isolation in production or pin to a known-good commit/build (if your deployment pipeline supports it).

---

## 4) API Changes

### Provider execution semantics in MultiStep: ordering no longer guaranteed
While not a signature-level API change, the **behavioral contract** effectively changed after PR #6263:
- Providers may complete in any order.
- Any code that assumed “Provider A runs before Provider B” may behave differently.

**Recommendation**
- Treat MultiStep provider calls as a parallel map operation.
- Make dependencies explicit (e.g., merge provider results deterministically by provider name, not completion time).

### Standardized internal server routing (from prior week’s merged work, still impacting current integrators)
If you maintain custom gateways or internal integrations, note that server communication routes were standardized recently:

- https://github.com/elizaos/eliza/pull/6285

If you have hardcoded internal endpoints, re-check after upgrading.

---

## 5) Social Media Integrations

### Twitter plugin: OAuth2 PKCE implementation in progress
Work continues to improve Twitter/X authentication security by moving to OAuth2 PKCE.

- **PR (opened):** https://github.com/elizaos-plugins/plugin-twitter/pull/46

**Why it matters**
- PKCE reduces the risk surface vs. older OAuth flows (especially for public clients).
- Expect configuration changes once merged (e.g., redirect URI handling, code verifier/challenge management).

### Telegram + Discord: messaging API refactors underway
Both plugins have ongoing refactors aimed at aligning with newer core messaging patterns:

- Telegram unified messaging API refactor: https://github.com/elizaos-plugins/plugin-telegram/pull/22  
- Discord message handling refactor: https://github.com/elizaos-plugins/plugin-discord/pull/32  

**Developer note**
- If you maintain downstream forks of these plugins, avoid large rebases until these PRs land to reduce churn.

### Farcaster
A self-hosted Farcaster “local hub” plugin exists in the registry (from recent ongoing ecosystem work):
- Registry addition: https://github.com/elizaos-plugins/registry/pull/243

---

## 6) Model Provider Updates

### OpenAI plugin: media handling + caching improvements (in review)
Work is in progress to improve image description handling and introduce caching for audio/image handlers:

- https://github.com/elizaos-plugins/plugin-openai/pull/23

### Streaming support initiatives (cross-provider)
Streaming remains an active multi-repo initiative (work opened previously, still relevant for builders targeting low-latency UIs):

- OpenAI streaming: https://github.com/elizaos-plugins/plugin-openai/pull/21  
- Anthropic streaming: https://github.com/elizaos-plugins/plugin-anthropic/pull/12  
- OpenRouter streaming: https://github.com/elizaos-plugins/plugin-openrouter/pull/21  

**Developer implications**
- If your UI assumes a single “final response” event, you may want to start preparing for chunked token streams.
- Plugin APIs may expose streaming callbacks/events once these land; keep your adapters loosely coupled.

---

## 7) Breaking Changes (V1 → V2 Migration Warnings)

### 1) MultiStep provider ordering assumptions (behavioral breaking change)
After https://github.com/elizaos/eliza/pull/6263, any V1-era code that relied on provider call order may break subtly:
- Race conditions
- Non-deterministic tool/provider side-effects
- Different “winner” results when merging outputs

**Mitigation**
- Make provider dependencies explicit.
- Gate side-effecting providers behind a single orchestrator.

### 2) Messaging API alignment across plugins (upcoming breaking surface)
With Telegram/Discord refactors in flight:
- Expect renamed handlers, normalized message envelopes, or routing changes as plugins converge on a unified messaging interface.

Track:
- https://github.com/elizaos-plugins/plugin-telegram/pull/22
- https://github.com/elizaos-plugins/plugin-discord/pull/32

### 3) Data isolation mode can currently hard-fail in Postgres until PR #6316 merges
If you are migrating to V2 and turning on isolation flags as part of hardening, beware the current failure mode described in:
- https://github.com/elizaos/eliza/pull/6316

---

## Reference: Key Issues Raised This Week (Product/Dev-Impacting)
Several new issues were filed in `elizaos/eliza` that may affect public-agent UX and gating logic:

- Separate public agent states (unauthenticated / authenticated-non-owner / owner): https://github.com/elizaos/eliza/issues/6313  
- Public agent cards should show chat number: https://github.com/elizaos/eliza/issues/6314  
- Limit unauthenticated users to ~2–3 messages: https://github.com/elizaos/eliza/issues/6312  
- Improve chat summaries UX: https://github.com/elizaos/eliza/issues/6311  
- Change free credits from $5 to $1: https://github.com/elizaos/eliza/issues/6315  

---

## Docs / Tracking
- Main docs repo (community often references this for onboarding): https://github.com/elizaos/docs  
- Core repo PRs/issues: https://github.com/elizaos/eliza/pulls / https://github.com/elizaos/eliza/issues