entroplain 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/26.0.1 +0 -0
- package/CONTRIBUTING.md +103 -103
- package/DEPLOY.md +41 -0
- package/README.md +478 -389
- package/dist/entroplain-0.2.2-py3-none-any.whl +0 -0
- package/dist/entroplain-0.2.2.tar.gz +0 -0
- package/dist/entroplain-0.2.3-py3-none-any.whl +0 -0
- package/dist/entroplain-0.2.3.tar.gz +0 -0
- package/docs/AGENT_USAGE.md +178 -178
- package/docs/USAGE.md +302 -302
- package/entroplain/__init__.py +32 -33
- package/entroplain/cost_tracker.py +231 -0
- package/entroplain/dashboard.py +480 -0
- package/entroplain/monitor.py +390 -272
- package/entroplain/providers.py +626 -626
- package/entroplain/proxy.py +561 -278
- package/entroplain/shared_state.py +72 -0
- package/entroplain-proxy +0 -0
- package/package.json +47 -44
- package/paper.md +299 -0
- package/pip +0 -0
- package/pyproject.toml +96 -89
- package/scripts/setup.bat +89 -0
- package/scripts/setup.sh +98 -0
- package/test_nvidia.py +56 -0
- package/test_proxy.py +16 -0
- package/vercel.json +6 -0
- package/website/README.md +14 -0
- package/website/app/globals.css +88 -0
- package/website/app/layout.tsx +34 -0
- package/website/app/page.tsx +537 -0
- package/website/package-lock.json +520 -0
- package/website/package.json +25 -0
- package/website/tsconfig.json +40 -0
- package/website/vercel.json +3 -0
- package/dist/entroplain-0.1.1-py3-none-any.whl +0 -0
- package/dist/entroplain-0.1.1.tar.gz +0 -0
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
export default function Home() {
|
|
2
|
+
// Inspired by Vercel + Linear + Stripe design systems
|
|
3
|
+
const colors = {
|
|
4
|
+
// Vercel-inspired near-black (not pure black)
|
|
5
|
+
black: '#171717',
|
|
6
|
+
white: '#ffffff',
|
|
7
|
+
|
|
8
|
+
// Linear-inspired dark surfaces
|
|
9
|
+
darkBg: '#0a0a0a',
|
|
10
|
+
darkSurface: '#111111',
|
|
11
|
+
|
|
12
|
+
// Stripe-inspired deep navy for headings
|
|
13
|
+
navy: '#0a1628',
|
|
14
|
+
|
|
15
|
+
// Text hierarchy (Linear-style)
|
|
16
|
+
textPrimary: '#f7f8f8',
|
|
17
|
+
textSecondary: '#a0a0a0',
|
|
18
|
+
textMuted: '#666666',
|
|
19
|
+
|
|
20
|
+
// Brand accent - keeping green for Entroplain
|
|
21
|
+
accent: '#22c55e',
|
|
22
|
+
accentLight: '#4ade80',
|
|
23
|
+
accentDark: '#16a34a',
|
|
24
|
+
accentGlow: 'rgba(34, 197, 94, 0.15)',
|
|
25
|
+
|
|
26
|
+
// Stripe-inspired blue-tinted shadows
|
|
27
|
+
shadowBlue: 'rgba(50, 50, 93, 0.15)',
|
|
28
|
+
shadowAmbient: 'rgba(0, 0, 0, 0.08)',
|
|
29
|
+
|
|
30
|
+
// Vercel shadow-as-border
|
|
31
|
+
shadowBorder: 'rgba(0, 0, 0, 0.06) 0px 0px 0px 1px',
|
|
32
|
+
shadowCard: 'rgba(50, 50, 93, 0.12) 0px 8px 24px, rgba(0, 0, 0, 0.08) 0px 0px 0px 1px',
|
|
33
|
+
shadowCardHover: 'rgba(50, 50, 93, 0.18) 0px 12px 40px, rgba(0, 0, 0, 0.12) 0px 0px 0px 1px',
|
|
34
|
+
|
|
35
|
+
// Linear-style borders
|
|
36
|
+
borderSubtle: 'rgba(255, 255, 255, 0.06)',
|
|
37
|
+
borderLight: 'rgba(0, 0, 0, 0.06)',
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<main style={{ minHeight: '100vh', background: colors.darkBg, color: colors.textPrimary, fontFamily: 'Inter, -apple-system, system-ui, sans-serif' }}>
|
|
42
|
+
{/* Ambient gradient background - inspired by Linear */}
|
|
43
|
+
<div style={{
|
|
44
|
+
position: 'fixed',
|
|
45
|
+
top: 0,
|
|
46
|
+
left: 0,
|
|
47
|
+
right: 0,
|
|
48
|
+
bottom: 0,
|
|
49
|
+
background: `
|
|
50
|
+
radial-gradient(ellipse 80% 50% at 50% -20%, rgba(34, 197, 94, 0.15), transparent),
|
|
51
|
+
radial-gradient(ellipse 60% 40% at 100% 0%, rgba(59, 130, 246, 0.08), transparent),
|
|
52
|
+
radial-gradient(ellipse 50% 30% at 0% 100%, rgba(168, 85, 247, 0.05), transparent)
|
|
53
|
+
`,
|
|
54
|
+
pointerEvents: 'none',
|
|
55
|
+
zIndex: 0,
|
|
56
|
+
}} />
|
|
57
|
+
|
|
58
|
+
{/* Navigation - Linear-inspired sticky */}
|
|
59
|
+
<nav style={{
|
|
60
|
+
position: 'sticky',
|
|
61
|
+
top: 0,
|
|
62
|
+
background: 'rgba(10, 10, 10, 0.8)',
|
|
63
|
+
backdropFilter: 'blur(20px)',
|
|
64
|
+
borderBottom: `1px solid ${colors.borderSubtle}`,
|
|
65
|
+
padding: '0 24px',
|
|
66
|
+
height: '72px',
|
|
67
|
+
display: 'flex',
|
|
68
|
+
alignItems: 'center',
|
|
69
|
+
justifyContent: 'space-between',
|
|
70
|
+
zIndex: 100,
|
|
71
|
+
}}>
|
|
72
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>
|
|
73
|
+
<div style={{
|
|
74
|
+
width: '36px',
|
|
75
|
+
height: '36px',
|
|
76
|
+
borderRadius: '8px',
|
|
77
|
+
background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentLight})`,
|
|
78
|
+
display: 'flex',
|
|
79
|
+
alignItems: 'center',
|
|
80
|
+
justifyContent: 'center',
|
|
81
|
+
boxShadow: `0 4px 12px rgba(34, 197, 94, 0.3)`,
|
|
82
|
+
}}>
|
|
83
|
+
<span style={{ color: 'white', fontWeight: 700, fontSize: '16px' }}>E</span>
|
|
84
|
+
</div>
|
|
85
|
+
<span style={{ fontWeight: 600, fontSize: '18px', letterSpacing: '-0.03em' }}>Entroplain</span>
|
|
86
|
+
</div>
|
|
87
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: '40px' }}>
|
|
88
|
+
<a href="#how" style={{ color: colors.textSecondary, textDecoration: 'none', fontSize: '15px', fontWeight: 500, transition: 'color 0.2s' }}>How it works</a>
|
|
89
|
+
<a href="#features" style={{ color: colors.textSecondary, textDecoration: 'none', fontSize: '15px', fontWeight: 500, transition: 'color 0.2s' }}>Features</a>
|
|
90
|
+
<a href="https://github.com/entroplain/entroplain" style={{ color: colors.textSecondary, textDecoration: 'none', fontSize: '15px', fontWeight: 500, transition: 'color 0.2s' }}>GitHub</a>
|
|
91
|
+
<a href="https://pypi.org/project/entroplain/" style={{
|
|
92
|
+
padding: '10px 20px',
|
|
93
|
+
background: colors.accent,
|
|
94
|
+
color: 'white',
|
|
95
|
+
borderRadius: '8px',
|
|
96
|
+
textDecoration: 'none',
|
|
97
|
+
fontSize: '15px',
|
|
98
|
+
fontWeight: 600,
|
|
99
|
+
transition: 'all 0.2s',
|
|
100
|
+
boxShadow: `0 4px 12px rgba(34, 197, 94, 0.25)`,
|
|
101
|
+
}}>Get Started</a>
|
|
102
|
+
</div>
|
|
103
|
+
</nav>
|
|
104
|
+
|
|
105
|
+
{/* Hero - Stripe-inspired light headlines */}
|
|
106
|
+
<section style={{
|
|
107
|
+
position: 'relative',
|
|
108
|
+
maxWidth: '1200px',
|
|
109
|
+
margin: '0 auto',
|
|
110
|
+
padding: '140px 24px 180px',
|
|
111
|
+
textAlign: 'center',
|
|
112
|
+
zIndex: 1,
|
|
113
|
+
}}>
|
|
114
|
+
{/* Badge - Linear-style pill */}
|
|
115
|
+
<div style={{
|
|
116
|
+
display: 'inline-flex',
|
|
117
|
+
alignItems: 'center',
|
|
118
|
+
gap: '8px',
|
|
119
|
+
padding: '8px 16px',
|
|
120
|
+
borderRadius: '100px',
|
|
121
|
+
background: colors.accentGlow,
|
|
122
|
+
border: `1px solid rgba(34, 197, 94, 0.2)`,
|
|
123
|
+
marginBottom: '40px',
|
|
124
|
+
}}>
|
|
125
|
+
<span style={{ width: '8px', height: '8px', borderRadius: '50%', background: colors.accent, boxShadow: `0 0 8px ${colors.accent}` }} />
|
|
126
|
+
<span style={{ color: colors.accentLight, fontSize: '14px', fontWeight: 500, letterSpacing: '0.02em' }}>Save up to 50% on API costs</span>
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
{/* Headline - Stripe weight 300 + Vercel tight tracking */}
|
|
130
|
+
<h1 style={{
|
|
131
|
+
fontSize: '80px',
|
|
132
|
+
fontWeight: 300,
|
|
133
|
+
letterSpacing: '-0.05em',
|
|
134
|
+
lineHeight: 1.0,
|
|
135
|
+
margin: '0 0 16px 0',
|
|
136
|
+
color: colors.textPrimary,
|
|
137
|
+
}}>
|
|
138
|
+
Stop wasting tokens.
|
|
139
|
+
</h1>
|
|
140
|
+
<h1 style={{
|
|
141
|
+
fontSize: '80px',
|
|
142
|
+
fontWeight: 300,
|
|
143
|
+
letterSpacing: '-0.05em',
|
|
144
|
+
lineHeight: 1.0,
|
|
145
|
+
margin: '0 0 48px 0',
|
|
146
|
+
background: `linear-gradient(135deg, ${colors.textSecondary}, ${colors.textMuted})`,
|
|
147
|
+
WebkitBackgroundClip: 'text',
|
|
148
|
+
WebkitTextFillColor: 'transparent',
|
|
149
|
+
}}>
|
|
150
|
+
Exit early when confident.
|
|
151
|
+
</h1>
|
|
152
|
+
|
|
153
|
+
{/* Subtitle */}
|
|
154
|
+
<p style={{
|
|
155
|
+
fontSize: '22px',
|
|
156
|
+
fontWeight: 400,
|
|
157
|
+
color: colors.textSecondary,
|
|
158
|
+
lineHeight: 1.6,
|
|
159
|
+
maxWidth: '680px',
|
|
160
|
+
margin: '0 auto 56px',
|
|
161
|
+
}}>
|
|
162
|
+
Entroplain monitors LLM reasoning entropy in real-time. When the model
|
|
163
|
+
confidently knows the answer, it exits — saving tokens without sacrificing quality.
|
|
164
|
+
</p>
|
|
165
|
+
|
|
166
|
+
{/* CTAs */}
|
|
167
|
+
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '20px' }}>
|
|
168
|
+
<a href="https://pypi.org/project/entroplain/" style={{
|
|
169
|
+
padding: '18px 36px',
|
|
170
|
+
background: colors.accent,
|
|
171
|
+
color: 'white',
|
|
172
|
+
borderRadius: '10px',
|
|
173
|
+
textDecoration: 'none',
|
|
174
|
+
fontSize: '17px',
|
|
175
|
+
fontWeight: 600,
|
|
176
|
+
boxShadow: `0 8px 24px rgba(34, 197, 94, 0.35)`,
|
|
177
|
+
transition: 'all 0.2s',
|
|
178
|
+
}}>
|
|
179
|
+
pip install entroplain
|
|
180
|
+
</a>
|
|
181
|
+
<a href="https://github.com/entroplain/entroplain" style={{
|
|
182
|
+
padding: '18px 36px',
|
|
183
|
+
background: 'rgba(255, 255, 255, 0.04)',
|
|
184
|
+
color: colors.textPrimary,
|
|
185
|
+
borderRadius: '10px',
|
|
186
|
+
textDecoration: 'none',
|
|
187
|
+
fontSize: '17px',
|
|
188
|
+
fontWeight: 500,
|
|
189
|
+
border: `1px solid ${colors.borderSubtle}`,
|
|
190
|
+
transition: 'all 0.2s',
|
|
191
|
+
}}>
|
|
192
|
+
View on GitHub
|
|
193
|
+
</a>
|
|
194
|
+
</div>
|
|
195
|
+
|
|
196
|
+
{/* Trust indicators - Linear-style */}
|
|
197
|
+
<div style={{
|
|
198
|
+
display: 'flex',
|
|
199
|
+
alignItems: 'center',
|
|
200
|
+
justifyContent: 'center',
|
|
201
|
+
gap: '56px',
|
|
202
|
+
marginTop: '80px',
|
|
203
|
+
color: colors.textMuted,
|
|
204
|
+
fontSize: '15px',
|
|
205
|
+
}}>
|
|
206
|
+
{['Works with any LLM', 'Zero code changes', 'Real-time dashboard'].map((text, i) => (
|
|
207
|
+
<span key={i} style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>
|
|
208
|
+
<svg width="18" height="18" fill="none" stroke={colors.accent} strokeWidth="2.5" viewBox="0 0 24 24">
|
|
209
|
+
<path d="M5 13l4 4L19 7" />
|
|
210
|
+
</svg>
|
|
211
|
+
{text}
|
|
212
|
+
</span>
|
|
213
|
+
))}
|
|
214
|
+
</div>
|
|
215
|
+
</section>
|
|
216
|
+
|
|
217
|
+
{/* Terminal Demo - Linear-inspired */}
|
|
218
|
+
<section style={{
|
|
219
|
+
position: 'relative',
|
|
220
|
+
maxWidth: '960px',
|
|
221
|
+
margin: '0 auto 180px',
|
|
222
|
+
padding: '0 24px',
|
|
223
|
+
zIndex: 1,
|
|
224
|
+
}}>
|
|
225
|
+
<div style={{
|
|
226
|
+
borderRadius: '16px',
|
|
227
|
+
overflow: 'hidden',
|
|
228
|
+
background: colors.darkSurface,
|
|
229
|
+
boxShadow: colors.shadowCard,
|
|
230
|
+
border: `1px solid ${colors.borderSubtle}`,
|
|
231
|
+
}}>
|
|
232
|
+
{/* Terminal header */}
|
|
233
|
+
<div style={{
|
|
234
|
+
padding: '16px 20px',
|
|
235
|
+
display: 'flex',
|
|
236
|
+
alignItems: 'center',
|
|
237
|
+
gap: '10px',
|
|
238
|
+
borderBottom: `1px solid ${colors.borderSubtle}`,
|
|
239
|
+
}}>
|
|
240
|
+
<div style={{ width: '12px', height: '12px', borderRadius: '50%', background: '#ff5f56' }} />
|
|
241
|
+
<div style={{ width: '12px', height: '12px', borderRadius: '50%', background: '#ffbd2e' }} />
|
|
242
|
+
<div style={{ width: '12px', height: '12px', borderRadius: '50%', background: '#27c93f' }} />
|
|
243
|
+
<span style={{ marginLeft: '16px', color: colors.textMuted, fontSize: '13px', fontFamily: 'monospace' }}>terminal</span>
|
|
244
|
+
</div>
|
|
245
|
+
{/* Terminal content */}
|
|
246
|
+
<div style={{
|
|
247
|
+
padding: '32px',
|
|
248
|
+
fontFamily: '"SF Mono", "Fira Code", Consolas, monospace',
|
|
249
|
+
fontSize: '15px',
|
|
250
|
+
lineHeight: 2,
|
|
251
|
+
color: colors.textSecondary,
|
|
252
|
+
}}>
|
|
253
|
+
<div><span style={{ color: colors.accent }}>$</span> pip install entroplain</div>
|
|
254
|
+
<div style={{ marginTop: '20px' }}><span style={{ color: colors.accent }}>$</span> entroplain-proxy --port 8765 --provider openai</div>
|
|
255
|
+
<div style={{ marginTop: '12px', color: colors.textMuted }}>→ Proxy running on http://localhost:8765</div>
|
|
256
|
+
<div style={{ marginTop: '8px', color: colors.textMuted }}>→ Dashboard at http://localhost:8765/dashboard</div>
|
|
257
|
+
<div style={{ marginTop: '20px' }}><span style={{ color: colors.accent }}>$</span> export OPENAI_BASE_URL=http://localhost:8765</div>
|
|
258
|
+
<div style={{ marginTop: '20px', color: colors.accentLight }}>✓ Your agent now exits early when confident</div>
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
</section>
|
|
262
|
+
|
|
263
|
+
{/* How it Works */}
|
|
264
|
+
<section id="how" style={{
|
|
265
|
+
position: 'relative',
|
|
266
|
+
background: `linear-gradient(180deg, transparent, rgba(34, 197, 94, 0.02), transparent)`,
|
|
267
|
+
padding: '180px 24px',
|
|
268
|
+
zIndex: 1,
|
|
269
|
+
}}>
|
|
270
|
+
<div style={{ maxWidth: '1200px', margin: '0 auto' }}>
|
|
271
|
+
<h2 style={{
|
|
272
|
+
fontSize: '56px',
|
|
273
|
+
fontWeight: 300,
|
|
274
|
+
letterSpacing: '-0.04em',
|
|
275
|
+
textAlign: 'center',
|
|
276
|
+
marginBottom: '96px',
|
|
277
|
+
color: colors.textPrimary,
|
|
278
|
+
}}>How it works</h2>
|
|
279
|
+
|
|
280
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: '32px' }}>
|
|
281
|
+
{[
|
|
282
|
+
{ num: '01', title: 'Monitor entropy', desc: 'Track token-level entropy in real-time. Low entropy means high confidence — the model knows the answer.', color: colors.accent },
|
|
283
|
+
{ num: '02', title: 'Detect valleys', desc: 'When entropy drops into a sustained valley, the model has converged on a confident, stable answer.', color: '#3b82f6' },
|
|
284
|
+
{ num: '03', title: 'Exit early', desc: 'Stop generation once confidence is established. Save up to 50% tokens without quality loss.', color: '#a855f7' },
|
|
285
|
+
].map((step, i) => (
|
|
286
|
+
<div key={i} style={{
|
|
287
|
+
background: colors.darkSurface,
|
|
288
|
+
borderRadius: '16px',
|
|
289
|
+
padding: '48px 36px',
|
|
290
|
+
border: `1px solid ${colors.borderSubtle}`,
|
|
291
|
+
transition: 'all 0.3s',
|
|
292
|
+
}}>
|
|
293
|
+
<div style={{
|
|
294
|
+
fontSize: '13px',
|
|
295
|
+
fontWeight: 600,
|
|
296
|
+
color: step.color,
|
|
297
|
+
marginBottom: '20px',
|
|
298
|
+
fontFamily: 'monospace',
|
|
299
|
+
letterSpacing: '0.05em',
|
|
300
|
+
}}>{step.num}</div>
|
|
301
|
+
<h3 style={{
|
|
302
|
+
fontSize: '28px',
|
|
303
|
+
fontWeight: 500,
|
|
304
|
+
letterSpacing: '-0.02em',
|
|
305
|
+
marginBottom: '20px',
|
|
306
|
+
color: colors.textPrimary,
|
|
307
|
+
}}>{step.title}</h3>
|
|
308
|
+
<p style={{ color: colors.textSecondary, lineHeight: 1.7, margin: 0, fontSize: '16px' }}>{step.desc}</p>
|
|
309
|
+
</div>
|
|
310
|
+
))}
|
|
311
|
+
</div>
|
|
312
|
+
</div>
|
|
313
|
+
</section>
|
|
314
|
+
|
|
315
|
+
{/* Features */}
|
|
316
|
+
<section id="features" style={{
|
|
317
|
+
position: 'relative',
|
|
318
|
+
maxWidth: '1200px',
|
|
319
|
+
margin: '0 auto',
|
|
320
|
+
padding: '180px 24px',
|
|
321
|
+
zIndex: 1,
|
|
322
|
+
}}>
|
|
323
|
+
<h2 style={{
|
|
324
|
+
fontSize: '56px',
|
|
325
|
+
fontWeight: 300,
|
|
326
|
+
letterSpacing: '-0.04em',
|
|
327
|
+
textAlign: 'center',
|
|
328
|
+
marginBottom: '96px',
|
|
329
|
+
color: colors.textPrimary,
|
|
330
|
+
}}>Features</h2>
|
|
331
|
+
|
|
332
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)', gap: '24px' }}>
|
|
333
|
+
{[
|
|
334
|
+
{ title: 'Proxy-based integration', desc: 'Works with any agent — Claude Code, Cursor, OpenAI, any framework. Zero code changes needed.' },
|
|
335
|
+
{ title: 'Real-time dashboard', desc: 'Watch entropy visualization live. See exactly when and why early exit triggered.' },
|
|
336
|
+
{ title: 'Cost tracking', desc: 'Know exactly how much you saved. Token counts, costs, and savings per request.' },
|
|
337
|
+
{ title: 'Multiple exit strategies', desc: 'Valleys, velocity, confidence threshold, repetition detection. Pick your strategy.' },
|
|
338
|
+
{ title: 'Multi-provider support', desc: 'OpenAI, Anthropic, NVIDIA, Google Gemini, OpenRouter, local models via Ollama.' },
|
|
339
|
+
{ title: 'Python + Node.js', desc: 'Available on PyPI and npm. Use it wherever your agent runs.' },
|
|
340
|
+
].map((f, i) => (
|
|
341
|
+
<div key={i} style={{
|
|
342
|
+
background: colors.darkSurface,
|
|
343
|
+
borderRadius: '14px',
|
|
344
|
+
padding: '36px',
|
|
345
|
+
border: `1px solid ${colors.borderSubtle}`,
|
|
346
|
+
transition: 'all 0.3s',
|
|
347
|
+
}}>
|
|
348
|
+
<h3 style={{
|
|
349
|
+
fontSize: '20px',
|
|
350
|
+
fontWeight: 600,
|
|
351
|
+
letterSpacing: '-0.01em',
|
|
352
|
+
marginBottom: '12px',
|
|
353
|
+
color: colors.textPrimary,
|
|
354
|
+
}}>{f.title}</h3>
|
|
355
|
+
<p style={{ color: colors.textSecondary, lineHeight: 1.65, margin: 0, fontSize: '15px' }}>{f.desc}</p>
|
|
356
|
+
</div>
|
|
357
|
+
))}
|
|
358
|
+
</div>
|
|
359
|
+
</section>
|
|
360
|
+
|
|
361
|
+
{/* Stats - Linear-style gradient section */}
|
|
362
|
+
<section style={{
|
|
363
|
+
position: 'relative',
|
|
364
|
+
background: `linear-gradient(135deg, ${colors.darkSurface} 0%, #0f1015 100%)`,
|
|
365
|
+
padding: '140px 24px',
|
|
366
|
+
zIndex: 1,
|
|
367
|
+
borderTop: `1px solid ${colors.borderSubtle}`,
|
|
368
|
+
borderBottom: `1px solid ${colors.borderSubtle}`,
|
|
369
|
+
}}>
|
|
370
|
+
<div style={{
|
|
371
|
+
maxWidth: '1100px',
|
|
372
|
+
margin: '0 auto',
|
|
373
|
+
display: 'grid',
|
|
374
|
+
gridTemplateColumns: 'repeat(3, 1fr)',
|
|
375
|
+
gap: '80px',
|
|
376
|
+
textAlign: 'center',
|
|
377
|
+
}}>
|
|
378
|
+
<div>
|
|
379
|
+
<div style={{ fontSize: '96px', fontWeight: 300, letterSpacing: '-0.05em', color: colors.accentLight, marginBottom: '12px', whiteSpace: 'nowrap' }}>50%</div>
|
|
380
|
+
<div style={{ color: colors.textSecondary, fontSize: '18px', letterSpacing: '0.02em' }}>Token savings</div>
|
|
381
|
+
</div>
|
|
382
|
+
<div>
|
|
383
|
+
<div style={{ fontSize: '96px', fontWeight: 300, letterSpacing: '-0.05em', color: colors.textPrimary, marginBottom: '12px', whiteSpace: 'nowrap' }}>0</div>
|
|
384
|
+
<div style={{ color: colors.textSecondary, fontSize: '18px', letterSpacing: '0.02em' }}>Code changes</div>
|
|
385
|
+
</div>
|
|
386
|
+
<div>
|
|
387
|
+
<div style={{ fontSize: '96px', fontWeight: 300, letterSpacing: '-0.05em', color: colors.textPrimary, marginBottom: '12px', whiteSpace: 'nowrap' }}>6+</div>
|
|
388
|
+
<div style={{ color: colors.textSecondary, fontSize: '18px', letterSpacing: '0.02em' }}>LLM providers</div>
|
|
389
|
+
</div>
|
|
390
|
+
</div>
|
|
391
|
+
</section>
|
|
392
|
+
|
|
393
|
+
{/* Supported Providers */}
|
|
394
|
+
<section style={{
|
|
395
|
+
position: 'relative',
|
|
396
|
+
maxWidth: '1200px',
|
|
397
|
+
margin: '0 auto',
|
|
398
|
+
padding: '140px 24px',
|
|
399
|
+
textAlign: 'center',
|
|
400
|
+
zIndex: 1,
|
|
401
|
+
}}>
|
|
402
|
+
<h3 style={{
|
|
403
|
+
fontSize: '13px',
|
|
404
|
+
fontWeight: 600,
|
|
405
|
+
color: colors.textMuted,
|
|
406
|
+
marginBottom: '40px',
|
|
407
|
+
textTransform: 'uppercase',
|
|
408
|
+
letterSpacing: '0.15em',
|
|
409
|
+
}}>Works with any provider that exposes logprobs</h3>
|
|
410
|
+
|
|
411
|
+
<div style={{
|
|
412
|
+
display: 'flex',
|
|
413
|
+
flexWrap: 'wrap',
|
|
414
|
+
justifyContent: 'center',
|
|
415
|
+
gap: '16px',
|
|
416
|
+
}}>
|
|
417
|
+
{['OpenAI', 'Anthropic Claude', 'NVIDIA NIM', 'Google Gemini', 'OpenRouter', 'Ollama', 'Together AI', 'Groq'].map((p) => (
|
|
418
|
+
<div key={p} style={{
|
|
419
|
+
padding: '12px 24px',
|
|
420
|
+
background: colors.darkSurface,
|
|
421
|
+
borderRadius: '10px',
|
|
422
|
+
border: `1px solid ${colors.borderSubtle}`,
|
|
423
|
+
color: colors.textSecondary,
|
|
424
|
+
fontSize: '15px',
|
|
425
|
+
fontWeight: 500,
|
|
426
|
+
}}>{p}</div>
|
|
427
|
+
))}
|
|
428
|
+
</div>
|
|
429
|
+
</section>
|
|
430
|
+
|
|
431
|
+
{/* Final CTA - Linear-inspired gradient */}
|
|
432
|
+
<section style={{
|
|
433
|
+
position: 'relative',
|
|
434
|
+
maxWidth: '960px',
|
|
435
|
+
margin: '0 auto 140px',
|
|
436
|
+
padding: '0 24px',
|
|
437
|
+
zIndex: 1,
|
|
438
|
+
}}>
|
|
439
|
+
<div style={{
|
|
440
|
+
background: `linear-gradient(135deg, rgba(34, 197, 94, 0.15) 0%, rgba(59, 130, 246, 0.1) 100%)`,
|
|
441
|
+
borderRadius: '28px',
|
|
442
|
+
padding: '100px 72px',
|
|
443
|
+
textAlign: 'center',
|
|
444
|
+
border: `1px solid rgba(34, 197, 94, 0.15)`,
|
|
445
|
+
position: 'relative',
|
|
446
|
+
overflow: 'hidden',
|
|
447
|
+
}}>
|
|
448
|
+
{/* Subtle gradient overlay */}
|
|
449
|
+
<div style={{
|
|
450
|
+
position: 'absolute',
|
|
451
|
+
top: 0,
|
|
452
|
+
left: 0,
|
|
453
|
+
right: 0,
|
|
454
|
+
bottom: 0,
|
|
455
|
+
background: 'radial-gradient(ellipse at center, rgba(34, 197, 94, 0.1), transparent 70%)',
|
|
456
|
+
pointerEvents: 'none',
|
|
457
|
+
}} />
|
|
458
|
+
<h2 style={{
|
|
459
|
+
position: 'relative',
|
|
460
|
+
fontSize: '48px',
|
|
461
|
+
fontWeight: 300,
|
|
462
|
+
letterSpacing: '-0.03em',
|
|
463
|
+
color: colors.textPrimary,
|
|
464
|
+
marginBottom: '20px',
|
|
465
|
+
}}>Start saving tokens today</h2>
|
|
466
|
+
<p style={{
|
|
467
|
+
position: 'relative',
|
|
468
|
+
color: colors.textSecondary,
|
|
469
|
+
marginBottom: '40px',
|
|
470
|
+
fontSize: '20px',
|
|
471
|
+
}}>
|
|
472
|
+
Install in 30 seconds. No code changes. Works with your existing agent setup.
|
|
473
|
+
</p>
|
|
474
|
+
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '20px', position: 'relative' }}>
|
|
475
|
+
<a href="https://pypi.org/project/entroplain/" style={{
|
|
476
|
+
padding: '18px 40px',
|
|
477
|
+
background: colors.accent,
|
|
478
|
+
color: 'white',
|
|
479
|
+
borderRadius: '10px',
|
|
480
|
+
textDecoration: 'none',
|
|
481
|
+
fontSize: '17px',
|
|
482
|
+
fontWeight: 600,
|
|
483
|
+
boxShadow: `0 8px 24px rgba(34, 197, 94, 0.35)`,
|
|
484
|
+
}}>pip install entroplain</a>
|
|
485
|
+
<a href="https://github.com/entroplain/entroplain" style={{
|
|
486
|
+
padding: '18px 40px',
|
|
487
|
+
background: 'rgba(255, 255, 255, 0.05)',
|
|
488
|
+
color: colors.textPrimary,
|
|
489
|
+
borderRadius: '10px',
|
|
490
|
+
textDecoration: 'none',
|
|
491
|
+
fontSize: '17px',
|
|
492
|
+
fontWeight: 500,
|
|
493
|
+
border: `1px solid ${colors.borderSubtle}`,
|
|
494
|
+
}}>View on GitHub</a>
|
|
495
|
+
</div>
|
|
496
|
+
</div>
|
|
497
|
+
</section>
|
|
498
|
+
|
|
499
|
+
{/* Footer */}
|
|
500
|
+
<footer style={{
|
|
501
|
+
position: 'relative',
|
|
502
|
+
borderTop: `1px solid ${colors.borderSubtle}`,
|
|
503
|
+
padding: '56px 24px',
|
|
504
|
+
zIndex: 1,
|
|
505
|
+
}}>
|
|
506
|
+
<div style={{
|
|
507
|
+
maxWidth: '1200px',
|
|
508
|
+
margin: '0 auto',
|
|
509
|
+
display: 'flex',
|
|
510
|
+
alignItems: 'center',
|
|
511
|
+
justifyContent: 'space-between',
|
|
512
|
+
}}>
|
|
513
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>
|
|
514
|
+
<div style={{
|
|
515
|
+
width: '28px',
|
|
516
|
+
height: '28px',
|
|
517
|
+
borderRadius: '6px',
|
|
518
|
+
background: `linear-gradient(135deg, ${colors.accent}, ${colors.accentLight})`,
|
|
519
|
+
display: 'flex',
|
|
520
|
+
alignItems: 'center',
|
|
521
|
+
justifyContent: 'center',
|
|
522
|
+
}}>
|
|
523
|
+
<span style={{ color: 'white', fontWeight: 700, fontSize: '12px' }}>E</span>
|
|
524
|
+
</div>
|
|
525
|
+
<span style={{ fontWeight: 500, fontSize: '16px', letterSpacing: '-0.02em' }}>Entroplain</span>
|
|
526
|
+
</div>
|
|
527
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: '40px' }}>
|
|
528
|
+
<a href="https://github.com/entroplain/entroplain" style={{ color: colors.textMuted, textDecoration: 'none', fontSize: '15px', transition: 'color 0.2s' }}>GitHub</a>
|
|
529
|
+
<a href="https://pypi.org/project/entroplain/" style={{ color: colors.textMuted, textDecoration: 'none', fontSize: '15px', transition: 'color 0.2s' }}>PyPI</a>
|
|
530
|
+
<a href="https://www.npmjs.com/package/entroplain" style={{ color: colors.textMuted, textDecoration: 'none', fontSize: '15px', transition: 'color 0.2s' }}>npm</a>
|
|
531
|
+
<a href="https://github.com/entroplain/entroplain/blob/main/LICENSE" style={{ color: colors.textMuted, textDecoration: 'none', fontSize: '15px', transition: 'color 0.2s' }}>MIT License</a>
|
|
532
|
+
</div>
|
|
533
|
+
</div>
|
|
534
|
+
</footer>
|
|
535
|
+
</main>
|
|
536
|
+
)
|
|
537
|
+
}
|