Skip to content

Commit 3e04a3b

Browse files
committed
Release version 1.19.0
1 parent 68b81e0 commit 3e04a3b

File tree

119 files changed

+1138
-721
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

119 files changed

+1138
-721
lines changed

docs-build/getting-started.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Get structured data from LLMs in under 5 minutes.
77

88
## Prerequisites
99

10-
- PHP 8.2 or higher
10+
- PHP 8.3 or higher
1111
- Composer
1212
- An API key from any [supported LLM provider](/packages/instructor/misc/llm_providers)
1313

docs-build/index.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ title: 'Instructor for PHP'
33
---
44

55

6-
Instructor for PHP is a lightweight library that makes it easy to get structured outputs from Large Language Models (LLMs). Built on top of modern PHP 8.2+ features, it provides a simple, type-safe way to work with AI models.
6+
Instructor for PHP is a lightweight library that makes it easy to get structured outputs from Large Language Models (LLMs). Built on top of modern PHP 8.3+ features, it provides a simple, type-safe way to work with AI models.
77

88
## Key Features
99

10-
- **Type Safety**: Full PHP 8.2+ type system support with strict typing
10+
- **Type Safety**: Full PHP 8.3+ type system support with strict typing
1111
- **Multiple LLM Support**: Works with OpenAI, Anthropic, Gemini, Cohere, and more
1212
- **Validation**: Built-in validation with custom rules and LLM-powered validation
1313
- **Streaming**: Real-time partial object updates for better UX

docs-build/mint.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
"group": "Release Notes",
6565
"pages": [
6666
"release-notes/versions",
67+
"release-notes/v1.19.0",
6768
"release-notes/v1.18.4",
6869
"release-notes/v1.18.3",
6970
"release-notes/v1.18.2",

docs-build/packages/http/1-overview.mdx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ HttpClient
9494
└── withRequest() - Create pending request for execution
9595
└── pool() - Execute multiple requests concurrently
9696
└── withPool() - Create pending pool for deferred execution
97-
// @doctest id="087f"
97+
// @doctest id="ced1"
9898
```
9999

100100
### Middleware Layer
@@ -105,7 +105,7 @@ The middleware system allows for processing requests and responses through a cha
105105
Request -> Middleware 1 -> Middleware 2 -> ... -> Driver -> External API
106106
107107
Response <- Middleware 1 <- Middleware 2 <- ... <- Driver <- HTTP Response
108-
// @doctest id="c94b"
108+
// @doctest id="15a8"
109109
```
110110

111111
Key components:
@@ -123,7 +123,7 @@ CanHandleHttpRequest (interface)
123123
├── SymfonyDriver
124124
├── LaravelDriver
125125
└── MockHttpDriver (for testing)
126-
// @doctest id="e0a2"
126+
// @doctest id="4d33"
127127
```
128128

129129
### Adapter Layer
@@ -136,7 +136,7 @@ HttpResponse (interface)
136136
├── SymfonyHttpResponse
137137
├── LaravelHttpResponse
138138
└── MockHttpResponse
139-
// @doctest id="2174"
139+
// @doctest id="7257"
140140
```
141141

142142
## Supported HTTP Clients

docs-build/packages/http/10-middleware.mdx

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ interface HttpMiddleware
3434
{
3535
public function handle(HttpClientRequest $request, CanHandleHttpRequest $next): HttpResponse;
3636
}
37-
// @doctest id="7ce6"
37+
// @doctest id="bf64"
3838
```
3939

4040
The `handle` method takes two parameters:
@@ -85,7 +85,7 @@ abstract class BaseMiddleware implements HttpMiddleware
8585
return $response;
8686
}
8787
}
88-
// @doctest id="4187"
88+
// @doctest id="bd17"
8989
```
9090

9191
By extending `BaseMiddleware`, you only need to override the methods relevant to your middleware's functionality, making the code more focused and maintainable.
@@ -120,7 +120,7 @@ $client->withMiddleware(
120120
new RetryMiddleware(),
121121
new TimeoutMiddleware()
122122
);
123-
// @doctest id="936a"
123+
// @doctest id="4e9c"
124124
```
125125

126126
Named middleware are useful when you need to reference them later, for example, to remove or replace them.
@@ -132,7 +132,7 @@ You can remove middleware from the stack by name:
132132
```php
133133
// Remove a middleware by name
134134
$client->middleware()->remove('cache');
135-
// @doctest id="546e"
135+
// @doctest id="4c99"
136136
```
137137

138138
### Replacing Middleware
@@ -142,7 +142,7 @@ You can replace a middleware with another one:
142142
```php
143143
// Replace a middleware with a new one
144144
$client->middleware()->replace('cache', new ImprovedCachingMiddleware());
145-
// @doctest id="e09b"
145+
// @doctest id="519a"
146146
```
147147

148148
### Clearing Middleware
@@ -152,7 +152,7 @@ You can remove all middleware from the stack:
152152
```php
153153
// Clear all middleware
154154
$client->middleware()->clear();
155-
// @doctest id="d35e"
155+
// @doctest id="320a"
156156
```
157157

158158
### Checking Middleware
@@ -164,7 +164,7 @@ You can check if a middleware exists in the stack:
164164
if ($client->middleware()->has('rate-limit')) {
165165
// The 'rate-limit' middleware exists
166166
}
167-
// @doctest id="f521"
167+
// @doctest id="8295"
168168
```
169169

170170
### Getting Middleware
@@ -177,7 +177,7 @@ $rateLimitMiddleware = $client->middleware()->get('rate-limit');
177177

178178
// Get a middleware by index
179179
$firstMiddleware = $client->middleware()->get(0);
180-
// @doctest id="9545"
180+
// @doctest id="7e96"
181181
```
182182

183183
### Middleware Order
@@ -229,7 +229,7 @@ $request = new HttpRequest(
229229
// 6. RetryMiddleware processes the response (may retry on certain status codes)
230230
// 7. LoggingMiddleware processes the response (logs incoming response)
231231
$response = $client->withRequest($request)->get();
232-
// @doctest id="251e"
232+
// @doctest id="675f"
233233
```
234234

235235
## Built-in Middleware
@@ -248,7 +248,7 @@ $client->withMiddleware(new DebugMiddleware());
248248

249249
// Or use the convenience method
250250
$client->withDebugPreset('on');
251-
// @doctest id="0580"
251+
// @doctest id="19cf"
252252
```
253253

254254
The debug middleware logs:
@@ -275,7 +275,7 @@ return [
275275
'responseStreamByLine' => true, // Dump stream as full lines or raw chunks
276276
],
277277
];
278-
// @doctest id="2fbe"
278+
// @doctest id="fe5c"
279279
```
280280

281281
### StreamByLine Middleware
@@ -287,7 +287,7 @@ use Cognesy\Http\Middleware\ServerSideEvents\StreamSSEsMiddleware;
287287

288288
// Add stream by line middleware
289289
$client->withMiddleware(new StreamSSEsMiddleware());
290-
// @doctest id="981c"
290+
// @doctest id="238b"
291291
```
292292

293293
You can customize how lines are processed by providing a parser function:
@@ -302,7 +302,7 @@ $lineParser = function (string $line) {
302302
};
303303

304304
$client->withMiddleware(new StreamByLineMiddleware($lineParser));
305-
// @doctest id="eb69"
305+
// @doctest id="4bfc"
306306
```
307307

308308

@@ -318,7 +318,7 @@ $client->withMiddleware(
318318
new BufferResponseMiddleware(), // Buffer responses for reuse
319319
new DebugMiddleware() // Log requests and responses
320320
);
321-
// @doctest id="a691"
321+
// @doctest id="7afe"
322322
```
323323

324324
#### API Client Setup
@@ -331,7 +331,7 @@ $client->withMiddleware(
331331
new RateLimitingMiddleware(maxRequests: 100), // Respect rate limits
332332
new LoggingMiddleware() // Log API interactions
333333
);
334-
// @doctest id="1dcc"
334+
// @doctest id="add3"
335335
```
336336

337337
#### Testing Setup
@@ -341,7 +341,7 @@ $client = new HttpClient();
341341
$client->withMiddleware(
342342
new RecordReplayMiddleware(RecordReplayMiddleware::MODE_REPLAY) // Replay recorded responses
343343
);
344-
// @doctest id="5c6b"
344+
// @doctest id="b6b8"
345345
```
346346

347347
#### Streaming Setup
@@ -352,7 +352,7 @@ $client->withMiddleware(
352352
new StreamByLineMiddleware(), // Process streaming responses line by line
353353
new BufferResponseMiddleware() // Buffer responses for reuse
354354
);
355-
// @doctest id="c429"
355+
// @doctest id="1e22"
356356
```
357357

358358
By combining middleware components, you can create a highly customized HTTP client that handles complex requirements while keeping your application code clean and focused.

docs-build/packages/http/11-processing-with-middleware.mdx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ $client->withMiddleware(new class implements HttpMiddleware {
7070
return $response;
7171
}
7272
});
73-
// @doctest id="b1d0"
73+
// @doctest id="280e"
7474
```
7575

7676
This approach is concise but less reusable than defining a named class.
@@ -131,7 +131,7 @@ Then add the middleware to your client:
131131
```php
132132
$client = new HttpClient();
133133
$client->withMiddleware(new JsonStreamMiddleware());
134-
// @doctest id="cd7a"
134+
// @doctest id="a70d"
135135
```
136136

137137
### Response Decoration for Transforming Content
@@ -169,7 +169,7 @@ class XmlToJsonDecorator extends BaseResponseDecorator
169169
return $headers;
170170
}
171171
}
172-
// @doctest id="97da"
172+
// @doctest id="266d"
173173
```
174174

175175
And the corresponding middleware:
@@ -199,7 +199,7 @@ class XmlToJsonMiddleware extends BaseMiddleware
199199
return new XmlToJsonDecorator($request, $response);
200200
}
201201
}
202-
// @doctest id="6aed"
202+
// @doctest id="c546"
203203
```
204204

205205
## Advanced Middleware Examples
@@ -257,7 +257,7 @@ class AnalyticsMiddleware extends BaseMiddleware
257257
return $response;
258258
}
259259
}
260-
// @doctest id="6bcc"
260+
// @doctest id="3573"
261261
```
262262

263263
### Circuit Breaker Middleware
@@ -347,7 +347,7 @@ class CircuitBreakerMiddleware extends BaseMiddleware
347347
}
348348
}
349349
}
350-
// @doctest id="6e4d"
350+
// @doctest id="c5f1"
351351
```
352352

353353
### Conditional Middleware
@@ -387,7 +387,7 @@ class ConditionalMiddleware implements HttpMiddleware
387387
return $next->handle($request);
388388
}
389389
}
390-
// @doctest id="e738"
390+
// @doctest id="e092"
391391
```
392392

393393
Usage example:
@@ -401,7 +401,7 @@ $conditionalCaching = new ConditionalMiddleware(
401401
);
402402

403403
$client->withMiddleware($conditionalCaching);
404-
// @doctest id="195c"
404+
// @doctest id="75b7"
405405
```
406406

407407
### Request ID Middleware
@@ -454,7 +454,7 @@ class RequestIdMiddleware extends BaseMiddleware
454454
return $response;
455455
}
456456
}
457-
// @doctest id="404e"
457+
// @doctest id="d7f0"
458458
```
459459

460460
### OpenTelemetry Tracing Middleware
@@ -537,7 +537,7 @@ class TracingMiddleware extends BaseMiddleware
537537
}
538538
}
539539
}
540-
// @doctest id="7fe2"
540+
// @doctest id="9847"
541541
```
542542

543543
### Customizing Middleware for LLM APIs
@@ -643,7 +643,7 @@ class LlmStreamingMiddleware extends BaseMiddleware
643643
};
644644
}
645645
}
646-
// @doctest id="0948"
646+
// @doctest id="033d"
647647
```
648648

649649
### Combining Multiple Middleware Components
@@ -687,7 +687,7 @@ $client->withMiddleware(
687687

688688
// Now the client is ready to use with a complete middleware pipeline
689689
$response = $client->withRequest($request)->get();
690-
// @doctest id="2909"
690+
// @doctest id="2bc3"
691691
```
692692

693693
With this setup, requests and responses flow through the middleware in the following order:

0 commit comments

Comments
 (0)