# ElizaOS Developer Update - July 16, 2025

## Core Framework
This week marks significant architectural enhancements to the ElizaOS framework with the implementation of **standardized service types** ([PR #5565](https://github.com/elizaOS/eliza/pull/5565)). This long-awaited feature enables plugins to discover capabilities using the new `getServicesByType()` method, facilitating more modular and abstract plugin development.

```typescript
// Example: Get all web search services
const searchServices = runtime.getServicesByType<WebSearchService>(ServiceType.WEB_SEARCH);
if (searchServices.length > 0) {
  const results = await searchServices[0].search("ElizaOS documentation");
  // Process search results
}
```

We've also introduced **action chaining** ([PR #5436](https://github.com/elizaOS/eliza/pull/5436)), allowing sequential execution of actions with state management:

```typescript
// Define chained actions
const createForm = async (state: State): Promise<ActionResult> => {
  // First action logic
  state.actionState.set('formId', generatedId);
  return { success: true };
};

const updateForm = async (state: State): Promise<ActionResult> => {
  // Second action can access state from first action
  const formId = state.actionState.get('formId');
  // Continue processing with this value
  return { success: true };
};
```

## New Features
**Plugin Quick-Starter Template** ([PR #5589](https://github.com/elizaOS/eliza/pull/5589)) provides a streamlined option for creating backend-only plugins:

```bash
# Create a backend-only plugin quickly
elizaos create my-plugin --type plugin-quick
```

**Image Generation Action** ([PR #5446](https://github.com/elizaOS/eliza/pull/5446)) has been added to the agent pipeline, enabling image generation within conversations:

```typescript
// Inside your plugin
const result = await runtime.generateImageAction({
  prompt: "A tranquil lake surrounded by mountains at dawn",
  modelId: "dall-e-3",
  size: "1024x1024"
});
```

**V1 to V2 Character Conversion** ([PR #5536](https://github.com/elizaOS/eliza/pull/5536)) enables seamless backward compatibility when importing character configurations:

```javascript
import { useConvertCharacter } from './hooks/use-character-convert';

// Inside your component
const { convertCharacterIfNeeded } = useConvertCharacter();
const importCharacter = (json) => {
  const converted = convertCharacterIfNeeded(json);
  // Process the character (guaranteed to be V2 format)
};
```

## Bug Fixes
Several critical issues have been resolved this week:

- Fixed **environment variable formatting** causing Ollama integration errors ([Issue #5590](https://github.com/elizaOS/eliza/issues/5590)). Quotes around model names in `.env` files were causing HTTP request errors.

```diff
- OLLAMA_MODEL_NAME="llama3"
+ OLLAMA_MODEL_NAME=llama3
```

- Corrected **custom plugin schema migration issues** in ElizaOS v1.2.5 with PostgreSQL and Drizzle ORM ([Issue #5588](https://github.com/elizaOS/eliza/issues/5588)).

- Resolved the problem where **Ollama was required even when not in character file** ([PR #5587](https://github.com/elizaOS/eliza/pull/5587)):

```typescript
// Only include Ollama as fallback if no other LLM exists
if (!hasAnyLlmPlugin && process.env.OLLAMA_API_ENDPOINT) {
  plugins.push('@elizaos/plugin-ollama');
}
```

- Fixed the **dev server not terminating correctly** with Cmd+C ([PR #5562](https://github.com/elizaOS/eliza/pull/5562)), adding proper signal handling:

```typescript
process.on("SIGINT", async () => {
  console.log("Shutting down dev server...");
  await stopServer();
  process.exit(0);
});
```

## API Changes

We've implemented a major architectural improvement in how services are defined and discovered:

```typescript
// New service type definition
export enum ServiceType {
  WEB_SEARCH = "web-search",
  BROWSER = "browser",
  PDF = "pdf",
  EMAIL = "email",
  TRANSCRIPTION = "transcription",
  VIDEO = "video"
}

// Service interface with type property
export interface Service {
  name: string;
  type: ServiceType | string;
}

// Implementing a service with the new type system
export class MySearchService implements WebSearchService {
  name = "my-search";
  type = ServiceType.WEB_SEARCH;
  
  async search(query: string): Promise<SearchResult[]> {
    // Implementation
  }
}
```

## Social Media Integrations
The **Twitter plugin v1.2.16** has been released with significant improvements:
- New discovery service for finding conversations
- Fixed auto-posting issues
- Added a weighted discovery algorithm
- Recommended setting: `TWITTER_ACTION_INTERVAL=30`

Unfortunately, there are reports that ElizaOS's Twitter/X account was suspended. Community members speculate this may be related to competition with Elon Musk's Grok AI, with reports of X charging $50k/month for company API fees.

## Model Provider Updates
We've improved model selection and configuration:

- Made **Ollama integration conditional** based on the `OLLAMA_API_ENDPOINT` environment variable ([PR #5594](https://github.com/elizaOS/eliza/pull/5594))
- Enhanced **local model resolution** to properly map to the appropriate plugins ([PR #5598](https://github.com/elizaOS/eliza/pull/5598))
- Fixed the LLM provider selection prompt to **reduce unnecessary provider use** ([PR #5526](https://github.com/elizaOS/eliza/pull/5526))
- Added env var `LOG_TIMESTAMPS=false` option to disable timestamps in logs for cleaner output ([PR #5430](https://github.com/elizaOS/eliza/pull/5430))

## Breaking Changes
When migrating from V1 to V2, be aware of these potential issues:

1. Character import now automatically converts V1 to V2 format ([PR #5536](https://github.com/elizaOS/eliza/pull/5536)), but you should verify plugin mappings after conversion.

2. If using action chaining, the new syntax requires state management:

```typescript
// V1: Simple return
return { success: true };

// V2: Use state for sharing data between chained actions
state.actionState.set('key', value);
return { success: true };
```

3. The Knowledge plugin is experiencing an issue where agent responses aren't reaching the client side. As a workaround, use the local CLI with the latest develop branch until fixed.

4. Plugin dependencies have been updated. If you're experiencing strange behavior after updating, try clearing your `.eliza` directory and rebuilding.