mozex / anthropic-php
Anthropic PHP 是一个经过增强的社区维护的 PHP API 客户端,允许您与 Anthropic API 进行交互。
Requires
- php: ^8.1.0
- php-http/discovery: ^1.19.4
- php-http/multipart-stream-builder: ^1.3.0
- psr/http-client: ^1.0.3
- psr/http-client-implementation: ^1.0.1
- psr/http-factory-implementation: *
- psr/http-message: ^1.1.0|^2.0.0
Requires (Dev)
- guzzlehttp/guzzle: ^7.8.1
- guzzlehttp/psr7: ^2.6.2
- laravel/pint: ^1.16.1
- mockery/mockery: ^1.6.12
- nunomaduro/collision: ^7.10.0
- pestphp/pest: ^2.34.7
- pestphp/pest-plugin-arch: ^2.7
- pestphp/pest-plugin-type-coverage: ^2.8.2
- phpstan/phpstan: ^1.11.2
- rector/rector: ^1.1.0
- spatie/ray: ^1.41
- symfony/var-dumper: ^6.4.7
This package is auto-updated.
Last update: 2024-09-15 11:35:55 UTC
README
Anthropic PHP 是一个社区维护的 PHP API 客户端,允许您与 Anthropic API 进行交互。本包基于 Nuno Maduro 和 Sandro Gehri 的出色工作。
注意:如果您想在 Laravel 中使用 Anthropic PHP,请查看 mozex/anthropic-laravel 仓库。
目录
支持我们
创建和维护开源项目需要大量的时间和精力。您的支持将帮助增强项目,并使进一步贡献 PHP 社区成为可能。
您可以通过 GitHub Sponsors 计划进行赞助。只需点击此仓库顶部的 "赞助" 按钮。任何金额都十分感激,即使是 1 美元的贡献也能产生重大影响,并将直接用于开发和完善此包。
感谢您考虑赞助。您的支持确实产生了影响!
入门
需要 PHP 8.1+
首先,通过 Composer 包管理器安装 Anthropic
composer require mozex/anthropic-php
确保允许 php-http/discovery
Composer 插件运行,或者在您的项目未集成 PSR-18 客户端的情况下手动安装客户端。
composer require guzzlehttp/guzzle
然后,与 Anthropic 的 API 进行交互
$yourApiKey = getenv('YOUR_API_KEY'); $client = Anthropic::client($yourApiKey); $result = $client->messages()->create([ 'model' => 'claude-3-opus-20240229', 'max_tokens' => 1024, 'messages' => [ ['role' => 'user', 'content' => 'Hello!'], ], ]); echo $result->content[0]->text; // Hello! How can I assist you today?
如果需要,可以配置和创建一个单独的客户端。
$yourApiKey = getenv('YOUR_API_KEY'); $client = Anthropic::factory() ->withApiKey($yourApiKey) ->withHttpHeader('anthropic-version', '2023-06-01') ->withBaseUri('anthropic.example.com/v1') // default: api.anthropic.com/v1 ->withHttpClient($client = new \GuzzleHttp\Client([])) // default: HTTP client found using PSR-18 HTTP Client Discovery ->withHttpHeader('X-My-Header', 'foo') ->withQueryParam('my-param', 'bar') ->withStreamHandler(fn (RequestInterface $request): ResponseInterface => $client->send($request, [ 'stream' => true // Allows to provide a custom stream handler for the http client. ])) ->make();
用法
Completions
资源
create
创建基于提供的提示和参数的补全。
$response = $client->completions()->create([ 'model' => 'claude-2.1', 'prompt' => '\n\nHuman: Hello, Claude\n\nAssistant:', 'max_tokens_to_sample' => 100, 'temperature' => 0 ]); $response->type; // 'completion' $response->id; // 'compl_01EKm5HZ9y6khqaSZjsX44fS' $response->completion; // ' Hello! Nice to meet you.' $response->stop_reason; // 'stop_sequence' $response->model; // 'claude-2.1' $response->stop; // '\n\nHuman:' $response->log_id; // 'compl_01EKm5HZ9y6khqaSZjsX44fS' $response->toArray(); // ['id' => 'compl_01EKm5HZ9y6khqaSZjsX44fS', ...]
create streamed
创建基于提供的提示和参数的流式补全。
$stream = $client->completions()->createStreamed([ 'model' => 'claude-2.1', 'prompt' => 'Hi', 'max_tokens_to_sample' => 70, ]); foreach($stream as $response){ $response->completion; } // 1. iteration => 'I' // 2. iteration => ' am' // 3. iteration => ' very' // 4. iteration => ' excited' // ...
Messages
资源
create
为结构化输入消息列表创建补全。
$response = $client->messages()->create([ 'model' => 'claude-3-opus-20240229', 'max_tokens' => 1024, 'messages' => [ ['role' => 'user', 'content' => 'Hello, world'], ], ]); $response->id; // 'msg_01BSy0WCV7QR2adFBauynAX7' $response->type; // 'message' $response->role; // 'assistant' $response->model; // 'claude-3-opus-20240229' $response->stop_sequence; // null $response->stop_reason; // 'end_turn' foreach ($response->content as $result) { $result->type; // 'text' $result->text; // 'Hello! It's nice to meet you. How can I assist you today?' } $response->usage->inputTokens; // 10, $response->usage->outputTokens; // 19, $response->toArray(); // ['id' => 'msg_01BSy0WCV7QR2adFBauynAX7', ...]
create streamed
为结构化输入消息列表创建流式补全。
$stream = $client->messages()->createStreamed([ 'model' => 'claude-3-haiku-20240307', 'max_tokens' => 1024, 'messages' => [ ['role' => 'user', 'content' => 'Hello!'], ], ]); foreach($stream as $response){ $response->toArray(); } // 1. iteration [ 'type' => 'message_start', 'message' => [ 'id' => 'msg_01SX1jLtTXgtJwB2EpSRNutG', 'type' => 'message', 'role' => 'assistant', 'content' => [], 'model' => 'claude-3-haiku-20240307', 'stop_reason' => null, 'stop_sequence' => null, ], 'usage' => [ 'input_tokens' => 9, 'output_tokens' => 1, ] ] // 2. iteration [ 'type' => 'content_block_delta', 'index' => 0, 'delta' => [ 'type' => 'text_delta', 'text' => 'Hello', ] ] // 3. iteration [ 'type' => 'content_block_delta', 'index' => 0, 'delta' => [ 'type' => 'text_delta', 'text' => '!', ] ] // ... // last iteration [ 'type' => 'message_delta', 'delta' => [ 'stop_reason' => 'end_turn', 'stop_sequence' => null, ], 'usage' => [ 'output_tokens' => 12, ] ]
元信息
在消息响应对象中,您可以通过 meta()
方法访问 API 返回的元信息。
$response = $client->messages()->create([ 'model' => 'claude-3-sonnet-20240229', 'max_tokens' => 1024, 'messages' => [ ['role' => 'user', 'content' => 'Hello, world'], ], ]); $meta = $response->meta(); $meta->requestId; // 'req_012nTzj6kLoP8vZ1SGANvcgR' $meta->requestLimit->limit; // 3000 $meta->requestLimit->remaining; // 2999 $meta->requestLimit->reset; // '2024-05-01T13:29:17Z' $meta->tokenLimit->limit; // 250000 $meta->tokenLimit->remaining; // 249984 $meta->tokenLimit->reset; // '2024-05-01T13:29:17Z'
toArray()
方法返回 API 原始返回的元信息形式。
$meta->toArray(); // [ // 'request-id' => 'req_012nTzj6kLoP8vZ1SGANvcgR', // 'anthropic-ratelimit-requests-limit' => 3000, // 'anthropic-ratelimit-requests-remaining' => 2999, // 'anthropic-ratelimit-requests-reset' => '2024-05-01T13:29:17Z', // 'anthropic-ratelimit-tokens-limit' => 250000, // 'anthropic-ratelimit-tokens-remaining' => 249983, // 'anthropic-ratelimit-tokens-reset' => '2024-05-01T13:29:17Z', // ]
在流式响应中,您可以在响应流对象上访问元信息。
$stream = $client->messages()->createStreamed([ 'model' => 'claude-3-sonnet-20240229', 'max_tokens' => 1024, 'messages' => [ ['role' => 'user', 'content' => 'Hello, world'], ], ]); $stream->meta();
有关配额限制以及如何处理配额限制的详细信息,请访问 Anthropic 文档。
故障排除
超时
在向 API 发送请求时可能会遇到超时。默认超时取决于使用的 HTTP 客户端。
您可以通过配置HTTP客户端并将其传递给工厂来增加超时时间。
以下示例说明了如何使用Guzzle增加超时时间。
Anthropic::factory() ->withApiKey($apiKey) ->withHttpHeader('anthropic-version', '2023-06-01') ->withHttpClient(new \GuzzleHttp\Client(['timeout' => $timeout])) ->make();
测试
该包提供了一个模拟实现,允许您模拟API响应的Anthropic\Client
类。
为了测试您的代码,请确保在测试用例中将Anthropic\Client
类替换为Anthropic\Testing\ClientFake
类。
模拟响应将按照创建模拟客户端时提供的顺序返回。
所有响应都包含一个fake()
方法,允许您仅通过提供与您的测试用例相关的参数来轻松创建响应对象。
use Anthropic\Testing\ClientFake; use Anthropic\Responses\Completions\CreateResponse; $client = new ClientFake([ CreateResponse::fake([ 'completion' => 'awesome!', ]), ]); $completion = $client->completions()->create([ 'model' => 'claude-2.1', 'prompt' => '\n\nHuman: PHP is \n\nAssistant:', 'max_tokens_to_sample' => 100, ]); expect($completion['completion'])->toBe('awesome!');
对于流式响应,您可以可选地提供一个包含模拟响应数据的资源。
use Anthropic\Testing\ClientFake; use Anthropic\Responses\Messages\CreateStreamedResponse; $client = new ClientFake([ CreateStreamedResponse::fake(fopen('file.txt', 'r');); ]); $completion = $client->messages()->createStreamed([ 'model' => 'claude-3-haiku-20240307', 'max_tokens' => 1024, 'messages' => [ ['role' => 'user', 'content' => 'Hello!'], ], ]); expect($response->getIterator()->current()) ->type->toBe('message_start');
在请求发送后,有各种方法可以确保已发送预期的请求。
// assert completion create request was sent $client->assertSent(Completions::class, function (string $method, array $parameters): bool { return $method === 'create' && $parameters['model'] === 'claude-2.1' && $parameters['prompt'] === 'PHP is '; }); // or $client->completions()->assertSent(function (string $method, array $parameters): bool { // ... }); // assert 2 completion create requests were sent $client->assertSent(Completions::class, 2); // assert no completion create requests were sent $client->assertNotSent(Completions::class); // or $client->completions()->assertNotSent(); // assert no requests were sent $client->assertNothingSent();
要编写期望API请求失败的测试,您可以将Throwable
对象作为响应提供。
$client = new ClientFake([ new \Anthropic\Exceptions\ErrorException([ 'message' => 'Overloaded', 'type' => 'overloaded_error', ]) ]); // the `ErrorException` will be thrown $completion = $client->completions()->create([ 'model' => 'claude-2.1', 'prompt' => '\n\nHuman: PHP is \n\nAssistant:', 'max_tokens_to_sample' => 100, ]);
变更日志
有关最近更改的更多信息,请参阅变更日志。
贡献
有关详细信息,请参阅贡献指南。
安全漏洞
请参阅我们的安全策略以了解如何报告安全漏洞。
致谢
许可协议
MIT许可证(MIT)。有关更多信息,请参阅许可文件。