# ElizaOS Developer Update - 2025-07-15

## Core Framework

The ElizaOS framework underwent significant architectural improvements this week with the addition of several foundational capabilities:

### Action Chaining

We've implemented a robust action chaining system that enables agents to execute multiple actions within a single run:

```typescript
// Action state is stored on State object and passed down
// Return values preserved for subsequent actions in the same run
export async function yourAction(state: ActionState, ...): Promise<ActionResult> {
  // Access previous action results
  const previousResult = state.getActionResult('previousAction');
  
  // Store data for next action
  return {
    success: true,
    data: { key: 'value' },
    // Use callback to send intermediate messages to user
    callback: "Working on your request now..."
  };
}
```

The implementation includes proper state management, intermediary messaging through a callback system, and comprehensive error handling. PR [#5436](https://github.com/elizaOS/eliza/pull/5436) and [#5490](https://github.com/elizaOS/eliza/pull/5490) provide full details.

### Test Utilities Package

We've consolidated our testing infrastructure into a dedicated `@elizaos/test-utils` package ([#5507](https://github.com/elizaOS/eliza/pull/5507)), featuring a standardized `MockRuntime` for plugin testing:

```typescript
import { createMockRuntime } from '@elizaos/test-utils';

describe('Your Plugin Tests', () => {
  it('should test your action', async () => {
    const runtime = createMockRuntime();
    // Test implementation with standardized mock runtime
  });
});
```

This replaces the various custom mock implementations previously duplicated across plugins.

### Shared Configuration Package

The new `@elizaos/configs` package ([#5508](https://github.com/elizaOS/eliza/pull/5508)) provides unified ESLint, TypeScript, and Prettier configurations for all plugins and projects, reducing boilerplate and ensuring consistency across the ecosystem.

## New Features

### Forms Plugin

We've introduced a powerful Forms plugin ([#5487](https://github.com/elizaOS/eliza/pull/5487)) that enables agents to build dynamic user interfaces:

```typescript
import { createForm } from '@elizaos/plugin-forms';

// Create a form with Zod validation
const form = await createForm({
  id: 'project-setup',
  title: 'Configure Your Project',
  description: 'Enter details to set up your new project',
  schema: z.object({
    projectName: z.string().min(3),
    description: z.string(),
    features: z.array(z.string())
  }),
  fields: [
    { type: 'text', name: 'projectName', label: 'Project Name' },
    { type: 'textarea', name: 'description', label: 'Description' },
    { type: 'checkbox', name: 'features', label: 'Features', options: [
      { label: 'API Integration', value: 'api' },
      { label: 'Database', value: 'db' }
    ]}
  ]
});

// Form data is persisted and can be accessed later
const formData = await getFormData(formId);
```

The implementation includes database persistence, transaction safety, Zod validation, and comprehensive error handling. Forms can be updated, canceled, and submitted through a standardized API.

### Image Generation

The agent pipeline now supports image generation via a new `generateImageAction` ([#5446](https://github.com/elizaOS/eliza/pull/5446)):

```typescript
// The agent can now generate images based on conversational context
// using providers that implement ModelType.IMAGE
<actions>GENERATE_IMAGE</actions>
<image_prompt>A detailed oil painting of a futuristic city with flying cars</image_prompt>
```

### V1 to V2 Character Conversion

We've added automatic V1 to V2 character conversion during JSON import ([#5536](https://github.com/elizaOS/eliza/pull/5536)), providing seamless backward compatibility:

```typescript
// The useConvertCharacter hook handles all the conversion logic
const { convertCharacter } = useConvertCharacter();

// Converts V1 format to V2, including plugin mapping
const v2Character = convertCharacter(v1CharacterJson);

// Plugin identifiers are automatically mapped from V1 to V2 equivalents
// e.g., "llama_local" → "@elizaos/plugin-ollama"
```

## Bug Fixes

### Windows Plugin Loading

We've resolved a critical issue affecting Windows users ([#5407](https://github.com/elizaOS/eliza/issues/5407), [#5437](https://github.com/elizaOS/eliza/pull/5437)) where plugins would fail to load properly:

```
[ERROR] Failed to load plugin module '@elizaos/plugin-openai' using all relevant strategies.
```

The fix addresses path normalization and localhost resolution issues specific to Windows environments.

### Database Extension Issues

Fixed a bug in the advisory lock acquisition mechanism ([#5572](https://github.com/elizaOS/eliza/pull/5572)) that was causing sporadic database errors:

```typescript
// Previous implementation had a race condition
const lockResult = await db.query('SELECT pg_try_advisory_lock($1)', [lockKey]);
const acquired = lockResult.rows[0].pg_try_advisory_lock;

// Fixed implementation properly handles boolean results
const acquired = !!lockResult.rows[0].pg_try_advisory_lock;
```

### UX Improvements

- Fixed streaming text animation ([#5495](https://github.com/elizaOS/eliza/pull/5495)) to provide smooth progressive reveal
- Improved textarea auto-resizing ([#5546](https://github.com/elizaOS/eliza/pull/5546)) for better chat input experience
- Enhanced secret panel UX for global environment variables ([#5501](https://github.com/elizaOS/eliza/pull/5501))

## API Changes

### Action Result Structure

We've standardized the `ActionResult` type across the codebase ([#5512](https://github.com/elizaOS/eliza/pull/5512)) to ensure consistency:

```typescript
// All action handlers now strictly return Promise<ActionResult>
export async function myAction(...): Promise<ActionResult> {
  return {
    success: true,
    data: {
      // Type-safe result data
    },
    error: undefined,
    callback: undefined
  };
}
```

### Environment Variable Controls

Added new environment variables to control ElizaOS behavior:

- `ELIZA_UI_ENABLE`: Toggle web UI availability in production ([#5304](https://github.com/elizaOS/eliza/pull/5304))
- `LOG_TIMESTAMPS`: Control timestamp display in logs ([#5430](https://github.com/elizaOS/eliza/pull/5430))

## Social Media Integrations

### Twitter Plugin Update

Twitter plugin v1.2.1 has been released with important configuration changes:

- Updated `TWITTER_ACTION_INTERVAL` to use seconds instead of milliseconds (recommended setting: 30)
- Fixed issues with Twitter API rate limiting for Pro tier users
- Updated documentation to clarify that the free tier is not supported

**Note**: We're still waiting for X to restore our suspended Twitter/X account. Resolution is in sight, but we're awaiting execution from the X team.

## Model Provider Updates

### Ollama Integration Improvements

The Ollama integration has been enhanced to provide better error handling and model compatibility:

- Added better endpoint configuration detection (now supports `http://0.0.0.0:11434`)
- Improved model recommendation (gemma3:27b now suggested for best results)
- Better error messages when models are locally available but connection fails

### Google Generative AI Fix

Fixed the Google Generative AI plugin installation during project creation ([#5503](https://github.com/elizaOS/eliza/pull/5503)):

```typescript
// Previously tried to install non-existent package
"@elizaos/plugin-google"

// Now correctly installs
"@elizaos/plugin-google-ai"
```

## Breaking Changes

### V1 to V2 Migration Notes

While we've added automatic V1 to V2 character conversion for imports, developers should be aware of the following changes:

1. Provider mapping has been implemented to automatically convert V1 provider names:
   - `llama_local` → `@elizaos/plugin-ollama`
   - Other mappings are available in [#5582](https://github.com/elizaOS/eliza/pull/5582)

2. The action result structure now strictly enforces `Promise<ActionResult>` return types.

3. For plugin developers, we've moved to a standardized test framework via `@elizaos/test-utils`.

Our upcoming release, "Stoic beta," is launching soon with additional changes. Please review our comprehensive documentation overhaul ([#5401](https://github.com/elizaOS/eliza/pull/5401)) for detailed migration guides.