rodiumai / laravel-sdk
Laravel/PHP SDK for the RodiumAI API — multi-model AI with Mobile Money payments
Requires
- php: ^8.1
- guzzlehttp/guzzle: ^7.0
- illuminate/support: ^8.0|^9.0|^10.0|^11.0|^12.0|^13.0
Requires (Dev)
- guzzlehttp/psr7: ^2.0
- orchestra/testbench: ^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
- phpunit/phpunit: ^9.0|^10.0|^11.0|^12.0
README
Official PHP / Laravel SDK for the Rodium AI API — unified access to AI models (OpenAI, Anthropic, Google, DeepSeek, MiniMax…) with RODI credit billing and Mobile Money top-ups.
OpenAI-compatible REST API: same endpoints and payloads as documented at rodiumai.io/docs.
Links
| Resource | URL |
|---|---|
| Packagist (Composer install) | packagist.org/packages/rodiumai/laravel-sdk |
| Source code | github.com/lecodeur228/rodiumai-laravel-sdk |
| API documentation | rodiumai.io/docs |
| Dashboard & API keys | rodiumai.io/dashboard |
| Model catalogue | rodiumai.io/models |
Table of contents
- Official documentation
- Requirements
- Installation
- Configuration
- Quick start
- Dynamic models (API)
- Multilingual
- Chat parameters
- Streaming (SSE)
- Listing models
- Error handling
- SDK reference
- Testing & development
- Contributing
- License
Official documentation
| Topic | Rodium AI link |
|---|---|
| Quickstart | rodiumai.io/docs |
| API overview | docs/api/overview |
| Chat completions | docs/api/chat-completions |
| Streaming SSE | docs/api/streaming |
| Models | docs/api/models · Catalogue |
| HTTP errors | docs/api/errors |
Detailed SDK ↔ API mapping: docs/api-alignment.md.
Requirements
- PHP 8.1+ with the
jsonextension - Laravel 10, 11, 12, or 13 (optional — the client works in plain PHP)
- Laravel 12+: PHP 8.2+ → use
^0.1.1minimum - Rodium AI account + API key: dashboard
Installation
Install from Packagist:
composer require rodiumai/laravel-sdk
For Laravel 12 and 13 (PHP 8.2+):
composer require rodiumai/laravel-sdk:^0.1.1
After installation
- Publish config (optional but recommended):
php artisan vendor:publish --tag=rodiumai-config
-
Add your API key to
.env(see Configuration). -
The
ServiceProviderandRodiumAIFacade are auto-discovered — nothing to register inbootstrap/providers.php.
Plain PHP (no Laravel)
Same Composer command. Then instantiate RodiumAI\RodiumAIClient directly (see Quick start).
Configuration
.env file:
RODIUMAI_API_KEY=rd_sk_your_secret_key RODIUMAI_DEFAULT_MODEL=openai/gpt-4o RODIUMAI_TIMEOUT=30 # RODIUMAI_LOCALE=fr # optional — SDK error hints only
The SDK always uses https://api.rodiumai.io/v1 (not configurable).
Never commit .env or API keys to the repository.
Quick start
Laravel (Facade)
use RodiumAI\Facades\RodiumAI; $catalogue = RodiumAI::models(); $modelId = $catalogue->chatModels()[0]->id; $response = RodiumAI::model($modelId) ->temperature(0.7) ->maxTokens(300) ->chat('Explain Rodium AI in two sentences.'); echo $response->content;
Plain PHP
use RodiumAI\RodiumAIClient; $client = new RodiumAIClient(apiKey: getenv('RODIUMAI_API_KEY')); $catalogue = $client->models(); $modelId = $catalogue->chatModels()[0]->id; $response = $client->model($modelId)->chat('Hello!'); echo $response->content;
Equivalent to the cURL / OpenAI SDK quickstart: POST https://api.rodiumai.io/v1/chat/completions with Authorization: Bearer {RODIUMAI_API_KEY}.
Dynamic models (API)
Models are fetched live from GET /v1/models — always up to date with the platform catalogue:
$catalogue = RodiumAI::models(); $catalogue->ids(); // all model IDs $catalogue->chatModels(); // text/chat-capable only $catalogue->providerPrefixes(); // ['anthropic', 'google', 'openai', …] $catalogue->byProvider('anthropic'); // filter by provider prefix $catalogue->findById('openai/gpt-4o'); // ?ModelInfo foreach ($catalogue->chatModels() as $info) { echo $info->id . ' — ' . $info->contextWindow . PHP_EOL; }
Pass any id from the API to ->model('openai/gpt-4o').
Multilingual (optional)
Language is never required. By default, SDK error hints are in English and the AI follows the user's message language.
Optional — localized error hints via config:
RODIUMAI_LOCALE=fr
Optional — force AI responses in a specific language:
RodiumAI::language('fr') // only when you need it ->model('openai/gpt-4o') ->chat('Bonjour !');
Supported: en (default), fr, es.
Chat parameters
Aligned with chat-completions:
| API parameter | SDK |
|---|---|
model |
->model('openai/gpt-4o') / $options['model'] / IDs from models() |
messages |
Array of {role, content} or string (→ user message) |
max_tokens |
->maxTokens() / $options['max_tokens'] |
temperature (0–2) |
->temperature() / $options['temperature'] |
top_p (0–1) |
->topP() / $options['top_p'] |
stop |
$options['stop'] |
stream |
Set automatically by ->stream() |
use RodiumAI\Data\ChatMessage; $messages = [ ChatMessage::system('You are a Laravel assistant.'), ChatMessage::user('What is a Service Provider?'), ]; $response = RodiumAI::model('openai/gpt-4o') ->temperature(0.5) ->topP(0.9) ->maxTokens(500) ->chat($messages);
Streaming (SSE)
Follows docs/api/streaming: data: … lines, end with data: [DONE].
foreach (RodiumAI::model('openai/gpt-4o')->stream('Tell a short story.') as $delta) { echo $delta; }
Laravel — StreamedResponse
use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\StreamedResponse; use RodiumAI\Facades\RodiumAI; public function streamChat(Request $request): StreamedResponse { return response()->stream(function () use ($request) { foreach (RodiumAI::stream($request->string('message')) as $delta) { echo 'data: ' . json_encode(['delta' => $delta]) . "\n\n"; ob_flush(); flush(); } echo "data: [DONE]\n\n"; }, 200, [ 'Content-Type' => 'text/event-stream', 'Cache-Control' => 'no-cache', 'X-Accel-Buffering' => 'no', ]); }
Listing models
GET /v1/models — RODI pricing and metadata:
$models = RodiumAI::models(); foreach ($models->ids() as $id) { echo $id . PHP_EOL; } $anthropic = $models->byProvider('anthropic');
Error handling
See docs/api/errors.
| HTTP | SDK exception | Suggested action |
|---|---|---|
| 401 | UnauthorizedException |
Check RODIUMAI_API_KEY |
| 402 | InsufficientCreditsException |
Top up RODI credits (dashboard) |
| 429 | RateLimitException |
Exponential backoff, then retry |
| 422 | ValidationException |
Fix model / messages |
| 500+ | RodiumAIException |
Retry once, then contact support |
use RodiumAI\Exceptions\InsufficientCreditsException; use RodiumAI\Exceptions\RodiumAIException; use RodiumAI\Facades\RodiumAI; try { $response = RodiumAI::chat('Test'); } catch (InsufficientCreditsException $e) { logger()->warning('Insufficient RODI', ['body' => $e->responseBody()]); } catch (RodiumAIException $e) { logger()->error('Rodium AI', ['code' => $e->getCode(), 'body' => $e->responseBody()]); }
SDK reference
| Method | Returns | Description |
|---|---|---|
chat($messages, $options = []) |
ChatResponse |
Non-streaming completion |
stream($messages, $options = []) |
Generator<string> |
SSE text deltas |
models() |
ModelCollection |
Catalogue + pricing |
model($id) |
static |
Fluent: model |
temperature($f) |
static |
Fluent: 0–2 |
topP($f) |
static |
Fluent: 0–1 |
maxTokens($n) |
static |
Fluent: token limit |
systemPrompt($s) |
static |
Fluent: system message |
DTOs: ChatResponse, ChatMessage, ModelCollection.
Versions
| Version | Notes |
|---|---|
| v0.1.1 | Laravel 12 support (illuminate/support ^12) |
| v0.1.0 | Initial release: chat, stream, models, enums, Facade |
Full history: CHANGELOG.md.
Testing & development
composer install composer test # PHPUnit (mocked HTTP) export RODIUMAI_API_KEY="…" php bin/smoke-test.php # Live API walkthrough in the terminal
Contributing
See CONTRIBUTING.md and docs/architecture.md.
Maintainers: docs/PUBLISHING.md (tags, Packagist).
License
MIT — see LICENSE.