General-purpose AI token optimization library for PHP & Laravel.
Compress context, cut token usage by up to 80%, and call any AI provider through one fluent API for any domain.
composer require yourusername/token-squeezer
- Fluent chain API β readable, intuitive, testable
- Multi-provider β OpenAI, Claude, Gemini, Kimi, Mimo, Ollama, or your own driver
- Smart compression β 4 built-in modes (including RTK log compression) + plugin support
- Caveman Mode β force models to output highly compressed replies to save output tokens
- Auto-caching β context-hash keys, pluggable drivers (array / file / redis / laravel)
- Schema enforcement β define expected JSON keys, auto-fill missing
- Token monitoring β usage tracking, cost estimation, latency stats
- Zero Laravel dependency β works in plain PHP too
- Dry-run / inspect β preview prompt + compression without calling AI
composer require kabdullah27/php-token-squeezerphp artisan vendor:publish --tag=token-squeezer-configAdd to your .env:
TSQ_PROVIDER=openai
OPENAI_API_KEY=sk-...
TSQ_CACHE_DRIVER=laraveluse TokenSqueezer\TokenSqueezer;
use TokenSqueezer\CompressMode;
TokenSqueezer::configure([
'default_provider' => 'openai',
'providers' => [
'openai' => [
'api_key' => getenv('OPENAI_API_KEY'),
'model' => 'gpt-4o-mini',
],
],
'cache' => ['driver' => 'file'],
'monitor' => true,
]);$result = TokenSqueezer::analyze()
->context([
'symbol' => 'BTCUSDT',
'price' => 104500,
'rsi' => 74,
'macd' => 'cross_up',
'trend' => 'bullish',
'volume_spike' => true,
])
->compress(CompressMode::AGGRESSIVE)
->schema(['trend', 'risk', 'action'])
->temperature(0.1)
->maxTokens(80)
->cache(ttl: 60)
->via('openai')
->run();
// ['trend' => 'bullish', 'risk' => 'medium', 'action' => 'wait breakout confirmation']$result = TokenSqueezer::analyze()
->context([
'product' => 'Nike Air Max 90',
'price' => 1200000,
'stock' => 3,
'rating' => 4.7,
'reviews' => 842,
'category' => 'sneakers',
'discount' => 15,
])
->compress(CompressMode::BALANCED)
->schema(['score', 'label', 'recommendation'])
->temperature(0.2)
->maxTokens(100)
->cache(ttl: 600)
->via('gemini')
->run();$result = TokenSqueezer::analyze()
->context([
'subject' => 'Cannot login after password reset',
'tier' => 'premium',
'age_days' => 2,
'tags' => 'auth, reset, blocked',
])
->compress(CompressMode::BALANCED)
->prompt('Triage this support ticket: {{context}}. Assign priority and team.')
->schema(['priority', 'team', 'estimated_resolution_hours'])
->temperature(0.1)
->maxTokens(80)
->cache(ttl: 120)
->run();$result = TokenSqueezer::analyze()
->context([
'text' => substr($userComment, 0, 200),
'user_age' => 17,
'platform' => 'forum',
'lang' => 'id',
])
->compress(CompressMode::MINIMAL)
->schema(['safe', 'category', 'action'])
->temperature(0.0)
->maxTokens(60)
->via('claude')
->run();$result = TokenSqueezer::analyze()
->context([
'title_len' => 62,
'meta_len' => 148,
'h1_count' => 1,
'word_count' => 1450,
'keyword_density' => 1.8,
'readability' => 'grade_8',
'images_alt' => false,
])
->compress(CompressMode::AGGRESSIVE)
->schema(['seo_score', 'issues', 'priority_fix'])
->temperature(0.1)
->maxTokens(120)
->cache(ttl: 3600)
->run();$result = TokenSqueezer::analyze()
->context([
'role' => 'Backend Engineer',
'years_exp' => 4,
'skills' => 'PHP, Laravel, MySQL, Redis, Docker',
'education' => 'S1 Informatika',
'english_level' => 'intermediate',
'location' => 'Jakarta',
'salary_expect' => 15000000,
])
->compress(CompressMode::BALANCED)
->schema(['fit_score', 'strengths', 'gaps', 'proceed'])
->temperature(0.2)
->maxTokens(150)
->via('openai', 'gpt-4o-mini')
->run();$result = TokenSqueezer::analyze()
->context([
'system_logs' => "error: connection failed\nerror: connection failed\nerror: connection failed",
])
->compress(CompressMode::RTK) // π‘ Deduplicates repeating logs & comment lines (RTK logic)
->caveman(true) // π‘ Instructs AI to reply in extremely brief "caveman" format
->via('mimo') // π‘ Uses Xiaomi Mimo provider
->run();TokenSqueezer::analyze()
->context(['risk_score' => 87, 'country' => 'ID', 'amount' => 500_000_000])
->system('You are a fraud detection engine. Be conservative. Always return JSON.')
->schema(['fraud_likelihood', 'flags', 'block'])
->temperature(0.0)
->maxTokens(80)
->run();TokenSqueezer::analyze()
->context(['order_id' => 'ORD-9182', 'status' => 'pending', 'delay_days' => 4])
->prompt('Summarize this order situation: {{context}}. What should we tell the customer?')
->asText() // plain text instead of JSON
->temperature(0.3)
->maxTokens(80)
->run();$info = TokenSqueezer::analyze()
->context(['symbol' => 'ETH', 'rsi' => 68, 'trend' => 'bullish'])
->compress(CompressMode::AGGRESSIVE)
->schema(['trend', 'risk'])
->inspect();
// $info['estimated_reduction'] => "72% (from 124 to 35 chars)"
// $info['compressed_context'] => "SMBL=ETH|RSI=68|TRND=BULL"
// $info['prompt'] => [...]use TokenSqueezer\Contracts\CompressorInterface;
class MyDomainCompressor implements CompressorInterface
{
public function compress(array $context): string
{
// your custom logic
return implode(' ', array_map(
fn($k, $v) => strtoupper($k[0]) . ":{$v}",
array_keys($context),
$context
));
}
}
TokenSqueezer::analyze()
->context($data)
->compress(CompressMode::CUSTOM)
->addCompressor(new MyDomainCompressor())
->schema(['result'])
->run();use TokenSqueezer\Providers\ProviderFactory;
ProviderFactory::extend('deepseek', MyDeepSeekProvider::class);
TokenSqueezer::analyze()
->context($data)
->via('deepseek', 'deepseek-chat')
->run();// After multiple requests:
$usage = TokenSqueezer::usage();
// $usage:
// [
// 'total_requests' => 42,
// 'cache_hits' => 31,
// 'cache_hit_rate' => '73.8%',
// 'total_input_tokens' => 1840,
// 'total_output_tokens' => 430,
// 'avg_latency_ms' => 487,
// 'estimated_cost_usd' => '$0.0004',
// 'by_provider' => ['openai' => [...], 'claude' => [...]],
// ]
TokenSqueezer::resetUsage();| Mode | What it does | Reduction |
|---|---|---|
MINIMAL |
Normalize whitespace, stringify booleans | ~20% |
BALANCED |
+ strip stopwords, abbreviate common phrases | ~50% |
AGGRESSIVE |
+ encode to shortcodes, max density, drop all vowels in keys | ~75-80% |
RTK |
+ deduplicate repeating log lines, strip whitespace & comments | ~80-90% |
CUSTOM |
Only your plugins run β full control | You decide |
| Use Case | Suggested TTL |
|---|---|
| Real-time data | 30β60 sec |
| Per-request scores | 2β5 min |
| Product catalog | 10β30 min |
| Static analysis | 1β24 hours |
| Provider | Default Model | Notes |
|---|---|---|
openai |
gpt-4o-mini |
Cheapest, fastest |
claude |
claude-haiku-4-5-* |
Great for structured JSON |
gemini |
gemini-1.5-flash |
Free tier available |
kimi |
moonshot-v1-8k |
OpenAI-compatible |
mimo |
mimo-v2.5 |
Low cost, OpenAI-compatible |
ollama |
llama3 |
Local, zero API cost |
| custom | Your driver | Implement ProviderInterface |
TSQ_PROVIDER=openai
TSQ_CACHE_ENABLED=true
TSQ_CACHE_DRIVER=laravel # array | file | redis | laravel
TSQ_CACHE_TTL=300
TSQ_CACHE_PREFIX=tsq:
TSQ_MONITOR=true
OPENAI_API_KEY=sk-...
OPENAI_MODEL=gpt-4o-mini
ANTHROPIC_API_KEY=...
CLAUDE_MODEL=claude-haiku-4-5-20251001
GEMINI_API_KEY=...
KIMI_API_KEY=...
MIMO_API_KEY=...
MIMO_MODEL=mimo-v2.5
MIMO_BASE_URL=https://api.xiaomimimo.com/v1/chat/completions
OLLAMA_URL=http://localhost:11434/api/chat
OLLAMA_MODEL=llama3MIT