| Recommend this page to a friend! |
| Info | Documentation | Reputation | Support forum | Blog | Links |
| Last Updated | Ratings | Unique User Downloads | Download Rankings | |||||
| 2025-11-16 (22 days ago) | Not yet rated by the users | Total: Not yet counted | Not yet ranked | |||||
| Version | License | PHP version | Categories | |||
| laraveltoon 1.0 | BSD License | 8 | Web services, Data types, PHP 8 |
| Description | Authors Alberto Rial Barreiro Contributor | |||
This package can encode and decode values in the TOON format. Innovation Award
|
Please read this document to learn how to encode and decode data in the TOON format.
use Squareetlabs\LaravelToon\Facades\Toon;
$userData = [
'id' => 1,
'name' => 'John Garcia',
'email' => 'john@example.com',
'roles' => ['admin', 'user', 'moderator'],
'profile' => [
'bio' => 'Laravel Developer',
'country' => 'USA',
'verified' => true,
],
];
// Readable format (recommended)
$toonReadable = Toon::encode($userData);
// user: John Garcia
// id: 1
// email: john@example.com
// roles[3]: admin,user,moderator
// profile:
// bio: Laravel Developer
// country: USA
// verified: true
// Compact format (maximum compression)
$toonCompact = Toon::encodeCompact($userData);
// Tabular format (for uniform arrays)
$toonTabular = Toon::encodeTabular($userData);
$toon = <<<TOON
id: 1
name: John Garcia
email: john@example.com
TOON;
$decoded = Toon::decode($toon);
// Returns:
// ['id' => 1, 'name' => 'John Garcia', 'email' => 'john@example.com']
// Use helpers for more concise code
$data = [...];
$readable = toon_readable($data); // Readable
$compact = toon_compact($data); // Compact
$tabular = toon_tabular($data); // Tabular
$decoded = toon_decode($toon); // Decode
use Squareetlabs\LaravelToon\Services\TokenAnalyzer;
$analyzer = app(TokenAnalyzer::class);
$content = "This is a long content with many words...";
// Estimate tokens in content
$tokens = $analyzer->estimate($content);
// 125
// Detailed analysis
$analysis = $analyzer->analyze($content);
// [
// 'length_chars' => 312,
// 'length_words' => 45,
// 'tokens_estimated' => 125,
// 'chars_per_token' => 2.5,
// ]
$data = [
'users' => [
['id' => 1, 'name' => 'John'],
['id' => 2, 'name' => 'Maria'],
['id' => 3, 'name' => 'Carlos'],
],
];
$comparison = $analyzer->compareJsonVsToon($data);
// [
// 'json_tokens' => 245,
// 'toon_tokens' => 98,
// 'tokens_saved' => 147,
// 'percent_saved' => 60.0,
// 'efficiency_ratio' => 0.4,
// ]
// Does it fit in 10,000 tokens?
$budget = $analyzer->budgetTokens(10000, $largeDataset);
if ($budget['within_budget']) {
// Process
} else {
echo "You need ".$budget['tokens_used']." tokens";
echo "Available: ".$budget['tokens_available'];
}
use Squareetlabs\LaravelToon\Adapters\OpenAIAdapter;
$openai = new OpenAIAdapter();
if (!$openai->isEnabled()) {
throw new Exception('OpenAI is not configured');
}
// Send compressed message
$response = $openai->sendMessage(
'Analyze this dataset: '.json_encode($largeData),
'gpt-4o',
['temperature' => 0.7, 'max_tokens' => 2000]
);
if ($response['success']) {
echo "Tokens saved: ".$response['original_message_tokens']
- $response['compressed_message_tokens'];
}
use Squareetlabs\LaravelToon\Adapters\AnthropicAdapter;
$claude = new AnthropicAdapter();
// Multi-turn compressed chat
$messages = [
['role' => 'user', 'content' => 'First question with lots of context...'],
['role' => 'assistant', 'content' => 'First response...'],
['role' => 'user', 'content' => 'Second question...'],
];
$response = $claude->chat(
$messages,
'claude-3-sonnet-20240229'
);
echo "Compressed messages: ".$response['messages_count'];
echo "Tokens saved: ".$response['tokens_saved'];
use Squareetlabs\LaravelToon\Adapters\GeminiAdapter;
$gemini = new GeminiAdapter();
$response = $gemini->sendMessage(
'Process this JSON: '.json_encode($data),
'gemini-pro'
);
// Gemini automatically receives compressed format
use Squareetlabs\LaravelToon\Services\CostCalculator;
$calculator = app(CostCalculator::class);
$dataset = [...]; // Large data
// Estimate cost for GPT-4o
$cost = $calculator->estimateCost('gpt-4o', $dataset, 'input');
echo "Tokens: ".$cost['tokens'];
echo "Cost: ".$cost['cost_formatted']; // $0.0625
// Output:
// [
// 'model' => 'gpt-4o',
// 'tokens' => 2500,
// 'cost_per_million' => 0.0025,
// 'cost' => 0.00625,
// 'cost_formatted' => '$0.0063',
// ]
$comparison = $calculator->compareModels($dataset, 'input');
// Returns models sorted by cost (lowest to highest)
// [
// 'gpt-3.5-turbo' => ['cost' => 0.001],
// 'claude-3-haiku' => ['cost' => 0.0006],
// 'gemini-pro' => ['cost' => 0.0003],
// 'gpt-4o' => ['cost' => 0.00625],
// ]
echo "Cheapest model: ".$comparison['cheapest'];
echo "Most expensive: ".$comparison['most_expensive'];
// Compare cost using JSON vs TOON
$jsonVsToon = $calculator->estimateWithJsonComparison(
'gpt-4o',
$largeDataset,
'input'
);
// [
// 'json' => ['tokens' => 5000, 'cost' => 0.0125],
// 'toon' => ['tokens' => 1500, 'cost' => 0.00375],
// 'savings' => ['tokens' => 3500, 'cost' => 0.00875, 'percent' => 70.0],
// ]
echo "You save: ".$jsonVsToon['savings']['cost_formatted'];
// How many requests can I make with $100?
$budget = $calculator->budgetAnalysis(
'gpt-4o',
100, // $100 budget
$dataset,
'input'
);
// [
// 'budget' => 100.0,
// 'cost_per_request' => 0.00625,
// 'requests_affordable' => 16000,
// 'percent_budget_per_request' => 0.00625,
// ]
echo "I can make ".$budget['requests_affordable']." requests";
use Squareetlabs\LaravelToon\Traits\HasToonEncoding;
class User extends Model
{
use HasToonEncoding;
}
$user = User::with('posts', 'comments')->first();
// Convert to TOON
$toon = $user->toToon('readable');
// Compact format
$compact = $user->toToonCompact();
// Get metrics
$metrics = $user->getToonMetrics();
echo "Compression ratio: ".$metrics['compression_ratio'];
use Squareetlabs\LaravelToon\Adapters\OpenAIAdapter;
$user = User::find(1);
$openai = new OpenAIAdapter();
// Send compressed model
$response = $openai->sendMessage(
"Analyze this user: ".$user->toToonCompact(),
'gpt-4o'
);
In app/Http/Kernel.php:
protected $middleware = [
// ...
];
protected $routeMiddleware = [
// ...
'compress' => \Squareetlabs\LaravelToon\Middleware\CompressResponse::class,
];
Route::get('/api/data', function () {
return User::all();
})->middleware('compress');
.env# In config/laravel-toon.php
LARAVEL_TOON_AUTO_COMPRESS=true
LARAVEL_TOON_MIN_RESPONSE_SIZE=1024
LARAVEL_TOON_COMPRESSION_THRESHOLD=50 # Minimum % to activate
class RecommendationController extends Controller
{
public function getRecommendations(Request $request)
{
$user = auth()->user();
$userHistory = $user->purchaseHistory()->limit(100)->get();
$similarUsers = $this->findSimilarUsers($user);
// Compress data
$contextData = toon_compact([
'user' => $user->toArray(),
'history' => $userHistory->toArray(),
'similar_users' => $similarUsers->toArray(),
]);
// Estimate cost
$cost = toon_cost_estimate('gpt-4o', $contextData);
if ($cost['cost'] > 0.01) {
// Reduce context
$contextData = toon_compact([
'user_summary' => $user->only(['id', 'name', 'preferences']),
'recent_purchases' => $userHistory->take(20)->toArray(),
]);
}
// Use adapter
$ai = new OpenAIAdapter();
$recommendations = $ai->sendMessage(
"Based on this user: $contextData, recommend 5 products",
'gpt-4o'
);
return $recommendations;
}
}
class LogAnalyzerController extends Controller
{
public function analyzeLogs(Request $request)
{
$logs = Log::whereBetween('created_at', [
now()->subDays(7),
now()
])->get();
// Group and compress
$logsCompressed = toon_compact([
'errors' => $logs->where('level', 'error')->groupBy('message'),
'warnings' => $logs->where('level', 'warning')->count(),
'stats' => [
'total' => $logs->count(),
'timespan' => '7 days',
],
]);
// Analyze with Claude (better for long analysis)
$claude = new AnthropicAdapter();
$analysis = $claude->sendMessage(
"Analyze these logs: $logsCompressed\n\nProvide insights and recommendations",
'claude-3-sonnet-20240229'
);
return [
'original_size' => strlen(json_encode($logs)),
'compressed_size' => strlen($logsCompressed),
'analysis' => $analysis,
'cost_saved' => toon_cost_with_json_comparison(
'claude-3-sonnet-20240229',
$logs->toArray()
),
];
}
}
class RAGController extends Controller
{
public function query(Request $request)
{
$query = $request->input('query');
// Search relevant documents
$documents = Document::search($query)->take(20)->get();
// Compress context
$context = toon_compact(
$documents->map(fn($doc) => [
'title' => $doc->title,
'content' => substr($doc->content, 0, 500),
'relevance' => $doc->relevance_score,
])->toArray()
);
// Check if fits in budget
$budget = toon_budget_analysis(
'gpt-4o',
0.50, // $0.50 budget
['context' => $context, 'query' => $query]
);
if (!$budget['within_budget']) {
// Reduce number of documents
$documents = $documents->take(5);
$context = toon_compact($documents->toArray());
}
// Generate response
$openai = new OpenAIAdapter();
$answer = $openai->sendMessage(
"Based on this context: $context\n\nAnswer: $query",
'gpt-4o'
);
return $answer;
}
}
class OptimizationController extends Controller
{
public function benchmark(Request $request)
{
$data = $request->input('data');
$metrics = app(\Squareetlabs\LaravelToon\Services\CompressionMetrics::class)
->full($data);
return [
'summary' => [
'json_size' => $metrics['compression']['json_size_bytes'],
'toon_size' => $metrics['compression']['toon_size_bytes'],
'reduction_percent' => $metrics['compression']['percent_reduced'],
],
'tokens' => [
'json' => $metrics['tokens']['json_tokens'],
'toon' => $metrics['tokens']['toon_tokens'],
'saved' => $metrics['tokens']['tokens_saved'],
'saved_percent' => $metrics['tokens']['percent_saved'],
],
'recommendations' => $metrics['recommendations'],
'formats' => [
'json' => $metrics['content']['original_json'],
'toon' => $metrics['content']['compressed_toon'],
],
];
}
}
These are complete examples! For more help, check: - README - Installation - CHANGELOG - ---
LaravelToon v1.0.0 - November 14, 2025
Token-Optimized Object Notation for Laravel Compress your AI prompts, reduce API costs, and optimize LLM contexts seamlessly.
<p align="center"> <a href="https://scrutinizer-ci.com/g/squareetlabs/LaravelToon/"><img src="https://scrutinizer-ci.com/g/squareetlabs/LaravelToon/badges/quality-score.png?b=main" alt="Quality Score"></a> <a href="https://scrutinizer-ci.com/g/squareetlabs/LaravelToon/"><img src="https://scrutinizer-ci.com/g/squareetlabs/LaravelToon/badges/build.png?b=main" alt="Build Status"></a> <a href="https://scrutinizer-ci.com/g/squareetlabs/LaravelToon/"><img src="https://scrutinizer-ci.com/g/squareetlabs/LaravelToon/badges/code-intelligence.svg?b=main" alt="Code Intelligence"></a> <a href="https://packagist.org/packages/squareetlabs/laravel-toon"><img class="latest_stable_version_img" src="https://poser.pugx.org/squareetlabs/laravel-toon/v/stable" alt="Latest Stable Version"></a> <a href="https://packagist.org/packages/squareetlabs/laravel-toon"><img class="license_img" src="https://poser.pugx.org/squareetlabs/laravel-toon/license" alt="License"></a> </p>
LaravelToon is a native Laravel package that integrates TOON (Token-Oriented Object Notation) a compact and readable format designed to optimize token usage in LLM contexts.
composer require squareetlabs/laravel-toon
php artisan vendor:publish --provider="Squareetlabs\LaravelToon\LaravelToonServiceProvider" --tag=laravel-toon-config
use Squareetlabs\LaravelToon\Facades\Toon;
// Convert to TOON
$data = [
'user' => 'John',
'email' => 'john@example.com',
'roles' => ['admin', 'user']
];
$toon = Toon::encode($data);
echo $toon;
// user: John
// email: john@example.com
// roles[2]: admin,user
// Or use helpers
echo toon_readable($data); // Readable format
echo toon_compact($data); // Compact format
echo toon_tabular($data); // Tabular format
// Complete compression analysis
$metrics = Toon::getMetrics($data);
echo "Bytes saved: " . $metrics['bytes_saved'] . "\n";
echo "Tokens saved: " . $metrics['tokens_saved'] . "\n";
echo "Ratio: " . $metrics['compression_ratio'] . "\n";
// Compare with JSON
$comparison = Toon::compareWithJson($data);
use Squareetlabs\LaravelToon\Services\TokenAnalyzer;
$analyzer = app(TokenAnalyzer::class);
// Estimate tokens
$tokens = $analyzer->estimate($content);
$comparison = $analyzer->compareJsonVsToon($data);
// Token budget
$budget = $analyzer->budgetTokens(10000, $data);
// ['max_tokens' => 10000, 'tokens_used' => 2500, 'within_budget' => true]
use Squareetlabs\LaravelToon\Services\CostCalculator;
$calculator = app(CostCalculator::class);
// Estimate cost for GPT-4o
$cost = $calculator->estimateCost('gpt-4o', $data, 'input');
// ['tokens' => 2500, 'cost' => 0.0625, 'cost_formatted' => '$0.0625']
// Compare JSON vs TOON cost
$comparison = $calculator->estimateWithJsonComparison('gpt-4o', $data);
// Compare prices across models
$models = $calculator->compareModels($data);
use Squareetlabs\LaravelToon\Adapters\OpenAIAdapter;
$openai = new OpenAIAdapter();
// Send compressed message to OpenAI
$response = $openai->sendMessage(
'Analyze this compressed JSON...',
'gpt-4o',
['temperature' => 0.7]
);
// Chat with compressed messages
$messages = [
['role' => 'user', 'content' => 'First message'],
['role' => 'assistant', 'content' => 'Response'],
];
$chatResponse = $openai->chat($messages, 'gpt-4o');
Converts JSON files to TOON or vice versa.
# JSON to TOON
php artisan toon:convert data.json --format=readable
# TOON to JSON (decode)
php artisan toon:convert data.toon --decode --pretty
# Save to file
php artisan toon:convert data.json --output=compressed.toon
Analyzes compression and efficiency.
php artisan toon:analyze data.json --verbose
Shows: - JSON vs TOON size - Estimated tokens - Reduction percentage - Recommendations
Runs performance and cost estimation benchmarks.
php artisan toon:benchmark data.json --iterations=100 --model=gpt-4o
Shows: - Encoding/decoding time - Size comparison - Cost estimation
Interactive dashboard to explore LaravelToon.
php artisan toon:dashboard
Allows: - Convert JSON TOON - Analyze compression - Estimate costs - View model prices
// Encoding
toon($data) // Readable format
toon_compact($data) // Compact format
toon_readable($data) // Readable format
toon_tabular($data) // Tabular format
toon_convert($data, 'compact') // With specified format
// Decoding
toon_decode($toon) // TOON to PHP
// Compression and Metrics
toon_compress($data) // Full compression
toon_metrics($data) // Detailed metrics
toon_compression_summary($data) // Summary
// Tokens
toon_estimate_tokens($content) // Estimate tokens
toon_compare_json_vs_toon($data) // Compare JSON vs TOON
toon_analyze($content) // Detailed analysis
// Benchmark
toon_benchmark($data, 100) // Performance benchmark
// Costs
toon_cost_estimate('gpt-4o', $data) // Estimate cost
toon_cost_compare_models($data) // Compare models
toon_cost_with_json_comparison('gpt-4o', $data) // With JSON comparison
toon_budget_analysis('gpt-4o', 100, $data) // Budget analysis
use Squareetlabs\LaravelToon\Traits\HasToonEncoding;
class User extends Model
{
use HasToonEncoding;
}
$user = User::first();
// Convert to TOON
echo $user->toToon(); // Readable format
echo $user->toToonCompact(); // Compact format
// Get metrics
$metrics = $user->getToonMetrics();
$ratio = $user->getToonCompressionRatio();
use Squareetlabs\LaravelToon\Rules\ValidToonFormat;
$request->validate([
'compressed_data' => [new ValidToonFormat()],
]);
The config/laravel-toon.php file allows you to configure:
return [
// Encoding options
'encoding' => [
'indent' => 2,
'delimiter' => ',',
'min_rows_to_tabular' => 2,
],
// Token analysis
'token_analysis' => [
'enabled' => true,
'estimate_method' => 'character_ratio',
'cache_results' => true,
],
// LLM model prices
'cost_calculation' => [
'models' => [
'gpt-4o' => ['input' => 0.0025, 'output' => 0.010],
'claude-3-sonnet' => ['input' => 0.003, 'output' => 0.015],
// ... more models
],
],
// Compression middleware
'middleware' => [
'auto_compress' => false,
'min_response_size' => 1024,
],
];
$prompt = "Analyze this dataset with millions of records...";
$data = $largeDataset;
$optimized = [
'system_message' => 'You are an expert data analyst',
'user_prompt' => $prompt,
'data' => toon_compact($data),
];
// Save 60% of tokens
$tokens = toon_estimate_tokens(json_encode($optimized));
$contextData = $database->search('query', 1000);
$ragPrompt = [
'context' => toon_compact($contextData),
'query' => 'User question',
];
$cost = toon_cost_estimate('gpt-4o', $ragPrompt);
// Significantly reduces costs
// In your controller
public function sendToAI(Request $request)
{
$data = $request->validated();
$budget = toon_budget_analysis('gpt-4o', 100, $data);
if (!$budget['within_budget']) {
return response()->json([
'error' => 'Exceeds token budget'
]);
}
// Proceed...
}
use Squareetlabs\LaravelToon\Facades\Toon;
class ToonTest extends TestCase
{
public function test_compression_ratio()
{
$data = ['users' => range(1, 1000)];
$ratio = Toon::calculateCompressionRatio($data);
$this->assertLessThan(0.4, $ratio); // Less than 40%
}
}
# LLM APIs
OPENAI_API_KEY=sk-...
OPENAI_API_BASE=https://api.openai.com/v1
ANTHROPIC_API_KEY=sk-ant-...
GEMINI_API_KEY=AIzaSy...
MISTRAL_API_KEY=...
# LaravelToon
LARAVEL_TOON_ENABLED=true
Contributions are welcome! Please:
Distributed under the MIT License. See LICENSE for more information.
LaravelToon is developed and maintained by SquareetLabs
For support, create an issue in the repository or contact labs@squareet.com
LaravelToon v1.0.0 - November 14, 2025
| File | Role | Description | ||
|---|---|---|---|---|
| Data | Auxiliary data | |||
| Data | Auxiliary data | |||
| Data | Auxiliary data | |||
| Doc. | Documentation | |||
| Doc. | Documentation | |||
| Data | Auxiliary data | |||
| Data | Auxiliary data | |||
| Data | Auxiliary data | |||
| Doc. | Documentation | |||
| Doc. | Documentation | |||
| Doc. | Documentation | |||
| / | src |
| File | Role | Description | ||
|---|---|---|---|---|
| |
Class | Class source | ||
| / | src | / | Adapters |
| File | Role | Description |
|---|---|---|
| |
Class | Class source |
| |
Class | Class source |
| |
Class | Class source |
| |
Class | Class source |
| |
Class | Class source |
| / | src | / | Console | / | Commands |
| File | Role | Description |
|---|---|---|
| |
Class | Class source |
| |
Class | Class source |
| |
Class | Class source |
| |
Class | Class source |
| / | src | / | Services |
| File | Role | Description |
|---|---|---|
| |
Class | Class source |
| |
Class | Class source |
| |
Class | Class source |
| |
Class | Class source |
| / | src | / | Toon |
| File | Role | Description |
|---|---|---|
| |
Class | Class source |
| |
Class | Class source |
| |
Class | Class source |
| |
Class | Class source |
| |
Class | Class source |
| |
Class | Class source |
| |
Class | Class source |
| The PHP Classes site has supported package installation using the Composer tool since 2013, as you may verify by reading this instructions page. |
| Version Control | Unique User Downloads | |||||||
| 100% |
|
| Applications that use this package |
If you know an application of this package, send a message to the author to add a link here.