PHPackages                             cognesy/instructor-messages - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. cognesy/instructor-messages

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

cognesy/instructor-messages
===========================

Message and message lists handling for Instructor PHP library

v2.3.1(1mo ago)0577MITPHPPHP ^8.3

Since Jul 16Pushed 1mo agoCompare

[ Source](https://github.com/cognesy/instructor-messages)[ Packagist](https://packagist.org/packages/cognesy/instructor-messages)[ Docs](https://instructorphp.com)[ RSS](/packages/cognesy-instructor-messages/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (10)Dependencies (16)Versions (42)Used By (7)

Messages
========

[](#messages)

Utilities for representing chat messages, multimodal content parts, and message stores. The API is immutable and designed for composing OpenAI-compatible message payloads.

Canonical content-part shape
----------------------------

[](#canonical-content-part-shape)

Non-text parts are emitted in nested form. Legacy flat inputs are accepted and normalized on output. Content stores parts in a `ContentParts` collection. Use `partsList()` if you need the value object. You can also build content directly from a `ContentParts` collection via `Content::fromParts()`. `parts()` remains for backward compatibility but is deprecated.

Messages now use an internal `MessageList` collection for immutable operations while keeping the public API unchanged. Use `messageList()` if you need the value object. You can construct a `Messages` instance from a `MessageList` via `Messages::fromList()`. Use `headList()` / `tailList()` when you need MessageList for partitions. `head()` and `tail()` remain for backward compatibility but are deprecated. `all()` remains for backward compatibility but is deprecated.

```
// text
['type' => 'text', 'text' => 'hello']

// image
['type' => 'image_url', 'image_url' => ['url' => 'https://example.com/image.jpg']]

// audio
['type' => 'input_audio', 'input_audio' => ['data' => '...base64...', 'format' => 'wav']]

// file
['type' => 'file', 'file' => ['file_data' => 'data:...base64...', 'file_name' => 'report.pdf', 'file_id' => 'file-...']]
```

Quick example
-------------

[](#quick-example)

```
use Cognesy\Messages\Content;
use Cognesy\Messages\Message;
use Cognesy\Messages\ContentPart;
use Cognesy\Messages\MessageSessionId;
use Cognesy\Messages\Utils\Image;
use Cognesy\Messages\MessageStore\Storage\InMemoryStorage;

$message = new Message('user', Content::text('Describe this image:'));
$message = $message->addContentPart(ContentPart::image(Image::fromUrl('https://example.com/cat.jpg', 'image/jpeg')));

$messageId = $message->id(); // MessageId value object
$messageIdString = $messageId->toString(); // boundary serialization

$payload = $message->toArray();

$storage = new InMemoryStorage();
$sessionId = $storage->createSession(MessageSessionId::generate());
$storage->append($sessionId, 'messages', $message);
```

Migration notes (2026-01-05)
----------------------------

[](#migration-notes-2026-01-05)

- Non-text content parts are now emitted in nested form (e.g. `image_url`, `file`, `input_audio`). Flat legacy inputs are still accepted but normalized on output.
- File payloads use `file_name` (nested under `file`) as the canonical key.
- `Messages::filter()` with no callback now returns all non-empty messages (previously it returned an empty collection).

###  Health Score

46

—

FairBetter than 93% of packages

Maintenance91

Actively maintained with recent releases

Popularity8

Limited adoption so far

Community15

Small or concentrated contributor base

Maturity63

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~6 days

Total

41

Last Release

43d ago

Major Versions

v1.22.0 → v2.0.02026-03-13

PHP version history (2 changes)v1.0.0-RC21PHP ^8.2

v1.19.0PHP ^8.3

### Community

Maintainers

![](https://www.gravatar.com/avatar/d11593cece5bb65ba5eea704a91e1dda72362e86f8fe0e99295f291ba7628cac?d=identicon)[ddebowczyk](/maintainers/ddebowczyk)

---

Top Contributors

[![ddebowczyk](https://avatars.githubusercontent.com/u/184133?v=4)](https://github.com/ddebowczyk "ddebowczyk (91 commits)")

###  Code Quality

TestsPest

Static AnalysisPHPStan, Psalm

Type Coverage Yes

### Embed Badge

![Health badge](/badges/cognesy-instructor-messages/health.svg)

```
[![Health](https://phpackages.com/badges/cognesy-instructor-messages/health.svg)](https://phpackages.com/packages/cognesy-instructor-messages)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
