Installation
composer require squareetlabs/laravel-toon
php artisan vendor:publish --provider="SquareETLabs\LaravelToon\LaravelToonServiceProvider"
Publish the config file to config/toon.php and update your .env with API keys if needed.
First Use Case Convert a standard JSON payload to TOON format before sending to an LLM:
use SquareETLabs\LaravelToon\Facades\Toon;
$data = [
'user' => 'John Doe',
'context' => 'Analyze this user data for sentiment',
'metadata' => ['age' => 30, 'preferences' => ['tech', 'sports']]
];
$toonString = Toon::encode($data);
// Output: "U:John Doe,C:Analyze this user data for sentiment,M:{age:30,preferences:[tech,sports]}"
Where to Look First
SquareETLabs\LaravelToon\Facades\Toon (for quick encoding/decoding).config/toon.php (customize compression rules, token thresholds, or LLM-specific optimizations).php artisan toon:analyze (test token savings on existing JSON payloads).Prompt Optimization Pipeline
// Before sending to LLM (e.g., OpenAI)
$optimizedPrompt = Toon::encode($rawPrompt)
->compress() // Apply TOON rules
->setMaxTokens(1000) // Enforce budget
->toString();
Model Serialization/Deserialization
// Serialize Eloquent model to TOON for API payloads
$user = User::find(1);
$toonData = Toon::modelToToon($user, ['name', 'email', 'posts']);
// Later, decode back to array/object
$decodedData = Toon::decode($toonData);
Middleware for API Requests
// app/Http/Middleware/OptimizeLLMPayload.php
public function handle($request, Closure $next) {
if ($request->isLlmEndpoint()) {
$request->merge(['data' => Toon::encode($request->data)]);
}
return $next($request);
}
Batch Processing
// Optimize a collection of prompts (e.g., for batch LLM calls)
$prompts = Prompt::where('needs_optimization', true)->get();
$optimized = $prompts->map(fn($p) => Toon::encode($p->content));
LLM Service Integration:
Use the toon() helper in service classes to auto-optimize payloads:
class OpenAIService {
public function analyze($data) {
$optimized = Toon::encode($data);
return $this->client->chat()->create([
'messages' => [['content' => $optimized]],
]);
}
}
Caching Optimized Payloads: Cache TOON-encoded strings to avoid reprocessing:
$cacheKey = 'toon:prompt:' . md5($rawPrompt);
$optimized = Cache::remember($cacheKey, now()->addHours(1), function() use ($rawPrompt) {
return Toon::encode($rawPrompt);
});
Custom Rules: Extend default TOON rules via config or service providers:
// config/toon.php
'custom_rules' => [
'date' => fn($value) => $value->format('Y-m-d'), // Normalize dates
'array' => fn($value) => array_filter($value), // Remove empty values
],
Token Count Mismatches
$tokenCount = Toon::tokenCount($toonString); // Estimate
$actualCount = $llmClient->countTokens($toonString); // Verify
Toon::setMaxTokens() to enforce budgets pre-encoding.Data Loss in Compression
Toon::encode($data, ['keep_nulls' => ['id', 'created_at']]);
Performance Overhead
LLM-Specific Quirks
Toon::setLLM('claude')->encode($data);
Toon::debug($data); // Shows raw JSON + TOON + token counts
$analysis = Toon::analyze($data);
// Returns: ['original_tokens' => 1200, 'toon_tokens' => 400, 'savings' => 66.67]
Custom Encoders/Decoders:
// Register a custom encoder for your domain objects
Toon::extend('User', function($user) {
return Toon::encode([
'id' => $user->id,
'name' => $user->name,
'roles' => $user->roles->pluck('name'),
]);
});
Hooks for Pre/Post Processing:
Toon::macro('beforeEncode', function($callback) {
$this->data = $callback($this->data);
return $this;
});
// Usage:
Toon::encode($data)->beforeEncode(fn($d) => array_map('strtolower', $d));
Event Listeners:
Listen for toon.encoded/toon.decoded events to log or transform data:
Toon::listen('encoded', function($toonString, $originalData) {
Log::debug("TOON encoded", ['original_size' => strlen(json_encode($originalData))]);
});
config/toon.php ('compression_level'). Higher values = more aggressive token reduction but risk data loss.U: (user), C: (context). Avoid using these as array keys in your data.How can I help you explore Laravel packages today?