La biblioteca de PHP de Anthropic proporciona acceso conveniente a la API REST de Anthropic desde cualquier aplicación PHP 8.1.0+.
El SDK de PHP se encuentra actualmente en beta. Las API podrían cambiar entre versiones.
Para la documentación de las funcionalidades de la API con ejemplos de código, consulta la referencia de la API. Esta página cubre las funcionalidades y la configuración del SDK específicas de PHP.
El SDK usa PSR-18 para HTTP y descubre automáticamente cualquier cliente PSR-18 instalado. Se recomienda Guzzle porque el SDK lo configura para streaming sin configuración adicional:
composer require "anthropic-ai/sdk" "guzzlehttp/guzzle:^7"PHP 8.1.0 o superior.
Esta biblioteca usa parámetros con nombre para especificar argumentos opcionales. Los parámetros con un valor predeterminado deben establecerse por nombre.
$client = new Client();
$message = $client->messages->create(
maxTokens: 1024,
messages: [['role' => 'user', 'content' => 'Hello, Claude']],
model: 'claude-opus-5',
);
$textBlock = array_find($message->content, static fn ($block): bool => $block->type === 'text');
echo $textBlock->text;Para conocer las opciones de autenticación, incluida Workload Identity Federation, consulta Autenticación.
Se recomienda usar el constructor estático with Base64ImageSource::with(data: "U3RhaW5sZXNzIHJvY2tz", ...) y parámetros con nombre para inicializar objetos de valor.
Sin embargo, también se proporcionan builders (new Base64ImageSource)->withData("U3RhaW5sZXNzIHJvY2tz").
El SDK proporciona soporte para respuestas en streaming usando "Server-Sent Events" (eventos enviados por el servidor), o SSE.
$client = new Client();
$stream = $client->messages->createStream(
maxTokens: 1024,
messages: [['role' => 'user', 'content' => 'Hello, Claude']],
model: 'claude-opus-5',
);
foreach ($stream as $event) {
echo $event->type . PHP_EOL;
}El streaming requiere un cliente HTTP que devuelva el cuerpo de la respuesta de forma incremental. Cuando Guzzle es el cliente PSR-18 descubierto, el SDK lo configura automáticamente para streaming. Con un cliente con búfer, el bucle foreach produce todos los eventos a la vez cuando la respuesta se completa en lugar de hacerlo de forma incremental; si observas ese síntoma, instala Guzzle o proporciona un cliente PSR-18 con capacidad de streaming a través de la opción de solicitud streamingTransporter:
$client = new Anthropic\Client(
requestOptions: Anthropic\RequestOptions::with(streamingTransporter: $myStreamingClient),
);Cuando la biblioteca no puede conectarse a la API, o si la API devuelve un código de estado no exitoso (es decir, una respuesta 4xx o 5xx), se lanza una subclase de Anthropic\Core\Exceptions\APIException:
<?php
use Anthropic\Core\Exceptions\APIConnectionException;
use Anthropic\Core\Exceptions\APIStatusException;
use Anthropic\Core\Exceptions\RateLimitException;
try {
$message = $client->messages->create(
maxTokens: 1024,
messages: [['role' => 'user', 'content' => 'Hello, Claude']],
model: 'claude-opus-5',
);
} catch (APIConnectionException $e) {
echo "The server could not be reached", PHP_EOL;
echo $e->getPrevious()?->getMessage(), PHP_EOL;
} catch (RateLimitException $_) {
echo "A 429 status code was received; we should back off a bit.", PHP_EOL;
} catch (APIStatusException $e) {
echo "Another non-200-range status code was received", PHP_EOL;
echo $e->getMessage();
}Los códigos de error son los siguientes:
| Causa | Tipo de error |
|---|---|
| HTTP 400 | BadRequestException |
| HTTP 401 | AuthenticationException |
| HTTP 403 | PermissionDeniedException |
| HTTP 404 | NotFoundException |
| HTTP 409 | ConflictException |
| HTTP 422 | UnprocessableEntityException |
| HTTP 429 | RateLimitException |
| HTTP >= 500 | InternalServerException |
| Otro error HTTP | APIStatusException |
| Timeout | APITimeoutException |
| Error de red | APIConnectionException |
Ciertos errores se reintentan automáticamente dos veces de forma predeterminada, con un breve "exponential backoff" (retroceso exponencial).
Los errores de conexión (por ejemplo, debido a un problema de conectividad de red), 408 Request Timeout, 409 Conflict, 429 Rate Limit, errores internos >=500 y los timeouts se reintentan de forma predeterminada.
Puedes usar la opción maxRetries para configurar o deshabilitar esto:
use Anthropic\RequestOptions;
// Configura el valor predeterminado para todas las solicitudes:
$client = new Client(requestOptions: RequestOptions::with(maxRetries: 0));
// O configura por solicitud:
$result = $client->messages->create(
maxTokens: 1024,
messages: [['role' => 'user', 'content' => 'Hello, Claude']],
model: 'claude-opus-5',
requestOptions: RequestOptions::with(maxRetries: 5),
);Los métodos de lista en la API de Claude están paginados.
Esta biblioteca proporciona iteradores con paginación automática con cada respuesta de lista, por lo que no tienes que solicitar páginas sucesivas manualmente:
$client = new Client();
$page = $client->beta->messages->batches->list(limit: 20);
// obtener los elementos de la página actual
foreach ($page->getItems() as $item) {
echo $item->id, PHP_EOL;
}
// realizar solicitudes de red adicionales para obtener los elementos de todas las páginas, incluida la actual y las siguientes
foreach ($page->pagingEachItem() as $item) {
echo $item->id, PHP_EOL;
}Puedes enviar parámetros no documentados a cualquier endpoint y leer propiedades de respuesta no documentadas, de la siguiente manera:
Los parámetros extra* con el mismo nombre anulan los parámetros documentados.
<?php
use Anthropic\RequestOptions;
$message = $client->messages->create(
maxTokens: 1024,
messages: [['role' => 'user', 'content' => 'Hello, Claude']],
model: 'claude-opus-5',
requestOptions: RequestOptions::with(
extraQueryParams: ['my_query_parameter' => 'value'],
extraBodyParams: ['my_body_parameter' => 'value'],
extraHeaders: ['my-header' => 'value'],
),
);Si deseas enviar explícitamente un parámetro adicional, puedes hacerlo con las opciones extraQueryParams, extraBodyParams y extraHeaders bajo RequestOptions::with() al realizar una solicitud, como se ve en el ejemplo anterior.
Para realizar solicitudes a endpoints no documentados mientras conservas el beneficio de la autenticación, los reintentos y otras funcionalidades del cliente, puedes realizar solicitudes usando client->request, de la siguiente manera:
$client = new Client();
$response = $client->request(
method: "post",
path: '/undocumented/endpoint',
query: ['dog' => 'woof'],
headers: ['useful-header' => 'interesting-value'],
body: ['hello' => 'world']
);Para guías detalladas de configuración de plataformas con ejemplos de código, consulta:
El SDK de PHP admite las siguientes plataformas:
Anthropic\Vertex\Client. Usa ::fromEnvironment().Anthropic\Bedrock\MantleClient. Usa new MantleClient(awsRegion: ...).Anthropic\Bedrock\Client. Usa ::fromEnvironment() o ::withCredentials().Anthropic\Aws\Client (requiere aws/aws-sdk-php como dependencia opcional). Usa new Anthropic\Aws\Client(workspaceId: ...) o establece ANTHROPIC_AWS_WORKSPACE_ID. Disponible en beta.Anthropic\Foundry\Client. Usa ::withCredentials().Usa MantleClient para proyectos nuevos; Anthropic\Bedrock\Client permanece para aplicaciones existentes que usan la API InvokeModel de Bedrock.
Este paquete sigue las convenciones de SemVer. Como la biblioteca está en desarrollo inicial y tiene una versión principal de 0, las API podrían cambiar en cualquier momento.
Este paquete considera que las mejoras a las definiciones de tipos de PHPDoc (que no son de tiempo de ejecución) son cambios no disruptivos.
Was this page helpful?