llmapi-v2 2.1.0
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/.env.example +40 -0
- package/Dockerfile +17 -0
- package/dist/config.d.ts +48 -0
- package/dist/config.js +98 -0
- package/dist/config.js.map +1 -0
- package/dist/converter/request.d.ts +6 -0
- package/dist/converter/request.js +184 -0
- package/dist/converter/request.js.map +1 -0
- package/dist/converter/response.d.ts +6 -0
- package/dist/converter/response.js +76 -0
- package/dist/converter/response.js.map +1 -0
- package/dist/converter/stream.d.ts +54 -0
- package/dist/converter/stream.js +318 -0
- package/dist/converter/stream.js.map +1 -0
- package/dist/converter/types.d.ts +239 -0
- package/dist/converter/types.js +6 -0
- package/dist/converter/types.js.map +1 -0
- package/dist/data/posts.d.ts +19 -0
- package/dist/data/posts.js +462 -0
- package/dist/data/posts.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +233 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/api-key-auth.d.ts +6 -0
- package/dist/middleware/api-key-auth.js +76 -0
- package/dist/middleware/api-key-auth.js.map +1 -0
- package/dist/middleware/quota-guard.d.ts +10 -0
- package/dist/middleware/quota-guard.js +27 -0
- package/dist/middleware/quota-guard.js.map +1 -0
- package/dist/middleware/rate-limiter.d.ts +5 -0
- package/dist/middleware/rate-limiter.js +50 -0
- package/dist/middleware/rate-limiter.js.map +1 -0
- package/dist/middleware/request-logger.d.ts +6 -0
- package/dist/middleware/request-logger.js +37 -0
- package/dist/middleware/request-logger.js.map +1 -0
- package/dist/middleware/session-auth.d.ts +19 -0
- package/dist/middleware/session-auth.js +99 -0
- package/dist/middleware/session-auth.js.map +1 -0
- package/dist/providers/aliyun.d.ts +13 -0
- package/dist/providers/aliyun.js +20 -0
- package/dist/providers/aliyun.js.map +1 -0
- package/dist/providers/base-provider.d.ts +36 -0
- package/dist/providers/base-provider.js +133 -0
- package/dist/providers/base-provider.js.map +1 -0
- package/dist/providers/deepseek.d.ts +11 -0
- package/dist/providers/deepseek.js +18 -0
- package/dist/providers/deepseek.js.map +1 -0
- package/dist/providers/registry.d.ts +18 -0
- package/dist/providers/registry.js +98 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +17 -0
- package/dist/providers/types.js +3 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/routes/admin.d.ts +1 -0
- package/dist/routes/admin.js +153 -0
- package/dist/routes/admin.js.map +1 -0
- package/dist/routes/auth.d.ts +2 -0
- package/dist/routes/auth.js +318 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/blog.d.ts +1 -0
- package/dist/routes/blog.js +29 -0
- package/dist/routes/blog.js.map +1 -0
- package/dist/routes/dashboard.d.ts +1 -0
- package/dist/routes/dashboard.js +184 -0
- package/dist/routes/dashboard.js.map +1 -0
- package/dist/routes/messages.d.ts +1 -0
- package/dist/routes/messages.js +309 -0
- package/dist/routes/messages.js.map +1 -0
- package/dist/routes/models.d.ts +1 -0
- package/dist/routes/models.js +39 -0
- package/dist/routes/models.js.map +1 -0
- package/dist/routes/payment.d.ts +1 -0
- package/dist/routes/payment.js +150 -0
- package/dist/routes/payment.js.map +1 -0
- package/dist/routes/sitemap.d.ts +1 -0
- package/dist/routes/sitemap.js +38 -0
- package/dist/routes/sitemap.js.map +1 -0
- package/dist/services/alipay.d.ts +27 -0
- package/dist/services/alipay.js +106 -0
- package/dist/services/alipay.js.map +1 -0
- package/dist/services/database.d.ts +4 -0
- package/dist/services/database.js +170 -0
- package/dist/services/database.js.map +1 -0
- package/dist/services/health-checker.d.ts +13 -0
- package/dist/services/health-checker.js +95 -0
- package/dist/services/health-checker.js.map +1 -0
- package/dist/services/mailer.d.ts +3 -0
- package/dist/services/mailer.js +91 -0
- package/dist/services/mailer.js.map +1 -0
- package/dist/services/metrics.d.ts +56 -0
- package/dist/services/metrics.js +94 -0
- package/dist/services/metrics.js.map +1 -0
- package/dist/services/remote-control.d.ts +20 -0
- package/dist/services/remote-control.js +209 -0
- package/dist/services/remote-control.js.map +1 -0
- package/dist/services/remote-ws.d.ts +5 -0
- package/dist/services/remote-ws.js +143 -0
- package/dist/services/remote-ws.js.map +1 -0
- package/dist/services/usage.d.ts +13 -0
- package/dist/services/usage.js +39 -0
- package/dist/services/usage.js.map +1 -0
- package/dist/utils/errors.d.ts +27 -0
- package/dist/utils/errors.js +48 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +2 -0
- package/dist/utils/logger.js +14 -0
- package/dist/utils/logger.js.map +1 -0
- package/docker-compose.yml +19 -0
- package/package.json +39 -0
- package/public/robots.txt +8 -0
- package/src/config.ts +140 -0
- package/src/converter/request.ts +207 -0
- package/src/converter/response.ts +85 -0
- package/src/converter/stream.ts +373 -0
- package/src/converter/types.ts +257 -0
- package/src/data/posts.ts +474 -0
- package/src/index.ts +219 -0
- package/src/middleware/api-key-auth.ts +82 -0
- package/src/middleware/quota-guard.ts +28 -0
- package/src/middleware/rate-limiter.ts +61 -0
- package/src/middleware/request-logger.ts +36 -0
- package/src/middleware/session-auth.ts +91 -0
- package/src/providers/aliyun.ts +16 -0
- package/src/providers/base-provider.ts +148 -0
- package/src/providers/deepseek.ts +14 -0
- package/src/providers/registry.ts +111 -0
- package/src/providers/types.ts +26 -0
- package/src/routes/admin.ts +169 -0
- package/src/routes/auth.ts +369 -0
- package/src/routes/blog.ts +28 -0
- package/src/routes/dashboard.ts +208 -0
- package/src/routes/messages.ts +346 -0
- package/src/routes/models.ts +37 -0
- package/src/routes/payment.ts +189 -0
- package/src/routes/sitemap.ts +40 -0
- package/src/services/alipay.ts +116 -0
- package/src/services/database.ts +187 -0
- package/src/services/health-checker.ts +115 -0
- package/src/services/mailer.ts +90 -0
- package/src/services/metrics.ts +104 -0
- package/src/services/remote-control.ts +226 -0
- package/src/services/remote-ws.ts +145 -0
- package/src/services/usage.ts +57 -0
- package/src/types/express.d.ts +46 -0
- package/src/utils/errors.ts +44 -0
- package/src/utils/logger.ts +8 -0
- package/tsconfig.json +17 -0
- package/views/pages/404.ejs +14 -0
- package/views/pages/admin.ejs +307 -0
- package/views/pages/blog-post.ejs +378 -0
- package/views/pages/blog.ejs +148 -0
- package/views/pages/dashboard.ejs +441 -0
- package/views/pages/docs.ejs +807 -0
- package/views/pages/index.ejs +416 -0
- package/views/pages/login.ejs +170 -0
- package/views/pages/orders.ejs +111 -0
- package/views/pages/pricing.ejs +379 -0
- package/views/pages/register.ejs +397 -0
- package/views/pages/remote.ejs +334 -0
- package/views/pages/settings.ejs +373 -0
- package/views/partials/header.ejs +70 -0
- package/views/partials/nav.ejs +140 -0
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
<%- include('../partials/header') %>
|
|
2
|
+
|
|
3
|
+
<%- include('../partials/nav') %>
|
|
4
|
+
|
|
5
|
+
<!-- Hero Section -->
|
|
6
|
+
<section class="relative overflow-hidden">
|
|
7
|
+
<div class="absolute inset-0 bg-gradient-to-b from-claude-cream via-white to-claude-cream"></div>
|
|
8
|
+
<div class="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 pt-20 pb-20 sm:pt-28 sm:pb-28">
|
|
9
|
+
<div class="text-center max-w-4xl mx-auto">
|
|
10
|
+
<h1 class="text-5xl sm:text-6xl lg:text-7xl font-bold text-claude-dark tracking-tight leading-[1.1]">
|
|
11
|
+
Claude Code.<br>
|
|
12
|
+
<span class="text-claude-orange">90% Less.</span>
|
|
13
|
+
</h1>
|
|
14
|
+
<p class="mt-6 text-lg sm:text-xl text-gray-500 leading-relaxed max-w-2xl mx-auto">
|
|
15
|
+
The same powerful CLI. The same tool support. A fraction of the cost.<br class="hidden sm:block">
|
|
16
|
+
Set two environment variables and start coding.
|
|
17
|
+
</p>
|
|
18
|
+
<div class="mt-10 flex flex-col sm:flex-row items-center justify-center gap-4">
|
|
19
|
+
<a href="/register" class="w-full sm:w-auto inline-flex items-center justify-center px-8 py-3.5 text-base font-semibold text-white bg-claude-orange rounded-xl hover:bg-claude-orange-hover transition-all shadow-md hover:shadow-lg">
|
|
20
|
+
Get Free API Key
|
|
21
|
+
<svg class="ml-2 w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/></svg>
|
|
22
|
+
</a>
|
|
23
|
+
<a href="/docs" class="w-full sm:w-auto inline-flex items-center justify-center px-8 py-3.5 text-base font-semibold text-claude-dark bg-white rounded-xl border border-gray-200 hover:border-gray-300 hover:shadow transition-all">
|
|
24
|
+
Read the Docs
|
|
25
|
+
</a>
|
|
26
|
+
</div>
|
|
27
|
+
<div class="mt-12 flex items-center justify-center gap-6 sm:gap-10 text-sm text-gray-400 font-medium">
|
|
28
|
+
<span class="flex items-center gap-2">
|
|
29
|
+
<svg class="w-4 h-4 text-green-500" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/></svg>
|
|
30
|
+
Full Tool Support
|
|
31
|
+
</span>
|
|
32
|
+
<span class="flex items-center gap-2">
|
|
33
|
+
<svg class="w-4 h-4 text-green-500" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/></svg>
|
|
34
|
+
Streaming SSE
|
|
35
|
+
</span>
|
|
36
|
+
<span class="flex items-center gap-2">
|
|
37
|
+
<svg class="w-4 h-4 text-green-500" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/></svg>
|
|
38
|
+
99.9% Uptime
|
|
39
|
+
</span>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</section>
|
|
44
|
+
|
|
45
|
+
<!-- The Problem Section -->
|
|
46
|
+
<section class="bg-claude-dark py-20 sm:py-28">
|
|
47
|
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
48
|
+
<div class="text-center mb-16">
|
|
49
|
+
<h2 class="text-3xl sm:text-4xl font-bold text-white tracking-tight">The problem with Claude Code today</h2>
|
|
50
|
+
</div>
|
|
51
|
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-8 max-w-5xl mx-auto">
|
|
52
|
+
<!-- Pain Point 1 -->
|
|
53
|
+
<div class="bg-white/5 border border-white/10 rounded-2xl p-8 text-center">
|
|
54
|
+
<div class="w-14 h-14 mx-auto mb-5 rounded-xl bg-red-500/10 flex items-center justify-center">
|
|
55
|
+
<svg class="w-7 h-7 text-red-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>
|
|
56
|
+
</div>
|
|
57
|
+
<h3 class="text-lg font-semibold text-white mb-2">API costs $100-200/month</h3>
|
|
58
|
+
<p class="text-gray-400 text-sm leading-relaxed">Average developer spends $6/day on Claude API tokens. That adds up fast.</p>
|
|
59
|
+
</div>
|
|
60
|
+
<!-- Pain Point 2 -->
|
|
61
|
+
<div class="bg-white/5 border border-white/10 rounded-2xl p-8 text-center">
|
|
62
|
+
<div class="w-14 h-14 mx-auto mb-5 rounded-xl bg-yellow-500/10 flex items-center justify-center">
|
|
63
|
+
<svg class="w-7 h-7 text-yellow-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>
|
|
64
|
+
</div>
|
|
65
|
+
<h3 class="text-lg font-semibold text-white mb-2">Pro plan runs out in 45 min</h3>
|
|
66
|
+
<p class="text-gray-400 text-sm leading-relaxed">Rate limits kill your flow. You hit the cap right when you need it most.</p>
|
|
67
|
+
</div>
|
|
68
|
+
<!-- Pain Point 3 -->
|
|
69
|
+
<div class="bg-white/5 border border-white/10 rounded-2xl p-8 text-center">
|
|
70
|
+
<div class="w-14 h-14 mx-auto mb-5 rounded-xl bg-orange-500/10 flex items-center justify-center">
|
|
71
|
+
<svg class="w-7 h-7 text-orange-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636"/></svg>
|
|
72
|
+
</div>
|
|
73
|
+
<h3 class="text-lg font-semibold text-white mb-2">Alternatives are a nightmare</h3>
|
|
74
|
+
<p class="text-gray-400 text-sm leading-relaxed">LiteLLM breaks, proxies fail, tool calling doesn't work. Hours wasted debugging.</p>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
<div class="text-center mt-14">
|
|
78
|
+
<p class="text-2xl sm:text-3xl font-bold text-white">We solved all three.</p>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
</section>
|
|
82
|
+
|
|
83
|
+
<!-- How It Works Section -->
|
|
84
|
+
<section class="py-20 sm:py-28 bg-claude-cream">
|
|
85
|
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
86
|
+
<div class="text-center mb-16">
|
|
87
|
+
<h2 class="text-3xl sm:text-4xl font-bold text-claude-dark tracking-tight">Up and running in 60 seconds</h2>
|
|
88
|
+
<p class="mt-4 text-lg text-gray-500">Three steps. No configuration files. No proxy servers.</p>
|
|
89
|
+
</div>
|
|
90
|
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-8 max-w-5xl mx-auto">
|
|
91
|
+
<!-- Step 1 -->
|
|
92
|
+
<div class="text-center">
|
|
93
|
+
<div class="w-12 h-12 mx-auto mb-5 rounded-full bg-claude-orange text-white flex items-center justify-center text-xl font-bold">1</div>
|
|
94
|
+
<h3 class="text-lg font-semibold text-claude-dark mb-2">Sign up</h3>
|
|
95
|
+
<p class="text-gray-500 text-sm">Get your API key in 30 seconds. Free tier included.</p>
|
|
96
|
+
</div>
|
|
97
|
+
<!-- Step 2 -->
|
|
98
|
+
<div class="text-center">
|
|
99
|
+
<div class="w-12 h-12 mx-auto mb-5 rounded-full bg-claude-orange text-white flex items-center justify-center text-xl font-bold">2</div>
|
|
100
|
+
<h3 class="text-lg font-semibold text-claude-dark mb-2">Set two variables</h3>
|
|
101
|
+
<p class="text-gray-500 text-sm mb-4">Add these to your shell and you're done.</p>
|
|
102
|
+
</div>
|
|
103
|
+
<!-- Step 3 -->
|
|
104
|
+
<div class="text-center">
|
|
105
|
+
<div class="w-12 h-12 mx-auto mb-5 rounded-full bg-claude-orange text-white flex items-center justify-center text-xl font-bold">3</div>
|
|
106
|
+
<h3 class="text-lg font-semibold text-claude-dark mb-2">Code as usual</h3>
|
|
107
|
+
<p class="text-gray-500 text-sm">Claude Code works exactly the same. No changes needed.</p>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
<!-- Code Snippet -->
|
|
111
|
+
<div class="max-w-2xl mx-auto mt-12">
|
|
112
|
+
<div class="bg-claude-dark rounded-2xl overflow-hidden shadow-xl">
|
|
113
|
+
<div class="flex items-center gap-2 px-5 py-3 border-b border-white/10">
|
|
114
|
+
<span class="w-3 h-3 rounded-full bg-red-500/70"></span>
|
|
115
|
+
<span class="w-3 h-3 rounded-full bg-yellow-500/70"></span>
|
|
116
|
+
<span class="w-3 h-3 rounded-full bg-green-500/70"></span>
|
|
117
|
+
<span class="ml-3 text-xs text-gray-500 font-mono">terminal</span>
|
|
118
|
+
</div>
|
|
119
|
+
<div class="p-6 font-mono text-sm leading-relaxed">
|
|
120
|
+
<p class="text-gray-400"># Point Claude Code to LLM API</p>
|
|
121
|
+
<p class="text-green-400 mt-1"><span class="text-gray-500">$</span> export ANTHROPIC_BASE_URL=https://llmapi.pro</p>
|
|
122
|
+
<p class="text-green-400 mt-1"><span class="text-gray-500">$</span> export ANTHROPIC_API_KEY=your-key</p>
|
|
123
|
+
<p class="text-gray-400 mt-4"># That's it. Start coding.</p>
|
|
124
|
+
<p class="text-green-400 mt-1"><span class="text-gray-500">$</span> claude</p>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
</div>
|
|
129
|
+
</section>
|
|
130
|
+
|
|
131
|
+
<!-- What's Included Section -->
|
|
132
|
+
<section class="py-20 sm:py-28 bg-white">
|
|
133
|
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
134
|
+
<div class="text-center mb-16">
|
|
135
|
+
<h2 class="text-3xl sm:text-4xl font-bold text-claude-dark tracking-tight">Everything you need</h2>
|
|
136
|
+
<p class="mt-4 text-lg text-gray-500">Built for Claude Code from the ground up.</p>
|
|
137
|
+
</div>
|
|
138
|
+
<div class="grid grid-cols-1 sm:grid-cols-2 gap-6 max-w-4xl mx-auto">
|
|
139
|
+
<!-- Card 1 -->
|
|
140
|
+
<div class="bg-claude-cream rounded-2xl p-8 border border-gray-100">
|
|
141
|
+
<div class="w-12 h-12 mb-5 rounded-xl bg-claude-orange/10 flex items-center justify-center">
|
|
142
|
+
<svg class="w-6 h-6 text-claude-orange" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>
|
|
143
|
+
</div>
|
|
144
|
+
<h3 class="text-lg font-semibold text-claude-dark mb-2">Full Anthropic API</h3>
|
|
145
|
+
<p class="text-gray-500 text-sm leading-relaxed">Every endpoint Claude Code uses. Messages, streaming, tool calling, extended thinking. Complete compatibility.</p>
|
|
146
|
+
</div>
|
|
147
|
+
<!-- Card 2 -->
|
|
148
|
+
<div class="bg-claude-cream rounded-2xl p-8 border border-gray-100">
|
|
149
|
+
<div class="w-12 h-12 mb-5 rounded-xl bg-claude-orange/10 flex items-center justify-center">
|
|
150
|
+
<svg class="w-6 h-6 text-claude-orange" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M13 10V3L4 14h7v7l9-11h-7z"/></svg>
|
|
151
|
+
</div>
|
|
152
|
+
<h3 class="text-lg font-semibold text-claude-dark mb-2">Smart Routing</h3>
|
|
153
|
+
<p class="text-gray-500 text-sm leading-relaxed">Requests automatically routed to the fastest available model. No configuration needed.</p>
|
|
154
|
+
</div>
|
|
155
|
+
<!-- Card 3 -->
|
|
156
|
+
<div class="bg-claude-cream rounded-2xl p-8 border border-gray-100">
|
|
157
|
+
<div class="w-12 h-12 mb-5 rounded-xl bg-claude-orange/10 flex items-center justify-center">
|
|
158
|
+
<svg class="w-6 h-6 text-claude-orange" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"/></svg>
|
|
159
|
+
</div>
|
|
160
|
+
<h3 class="text-lg font-semibold text-claude-dark mb-2">Usage Dashboard</h3>
|
|
161
|
+
<p class="text-gray-500 text-sm leading-relaxed">Track tokens, monitor costs, manage API keys. All in one place.</p>
|
|
162
|
+
</div>
|
|
163
|
+
<!-- Card 4 -->
|
|
164
|
+
<div class="bg-claude-cream rounded-2xl p-8 border border-gray-100">
|
|
165
|
+
<div class="w-12 h-12 mb-5 rounded-xl bg-claude-orange/10 flex items-center justify-center">
|
|
166
|
+
<svg class="w-6 h-6 text-claude-orange" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/></svg>
|
|
167
|
+
</div>
|
|
168
|
+
<h3 class="text-lg font-semibold text-claude-dark mb-2">Always On</h3>
|
|
169
|
+
<p class="text-gray-500 text-sm leading-relaxed">Multi-provider failover. If one backend goes down, we switch automatically. Your work never stops.</p>
|
|
170
|
+
</div>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
</section>
|
|
174
|
+
|
|
175
|
+
<!-- Pricing Section -->
|
|
176
|
+
<section id="pricing" class="py-20 sm:py-28 bg-claude-cream">
|
|
177
|
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
178
|
+
<div class="text-center mb-16">
|
|
179
|
+
<h2 class="text-3xl sm:text-4xl font-bold text-claude-dark tracking-tight">Simple, honest pricing</h2>
|
|
180
|
+
<p class="mt-4 text-lg text-gray-500">No per-token surprises. Pick a plan and code.</p>
|
|
181
|
+
</div>
|
|
182
|
+
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6 max-w-5xl mx-auto">
|
|
183
|
+
<!-- Free -->
|
|
184
|
+
<div class="bg-white rounded-2xl p-7 border border-gray-200 flex flex-col">
|
|
185
|
+
<h3 class="text-base font-semibold text-claude-dark">Free</h3>
|
|
186
|
+
<div class="mt-3 mb-1"><span class="text-4xl font-bold text-claude-dark">$0</span></div>
|
|
187
|
+
<p class="text-sm text-gray-400 mb-5">50K tokens/mo</p>
|
|
188
|
+
<p class="text-sm text-gray-500 mb-6">3-4 conversations to try</p>
|
|
189
|
+
<a href="/register" class="mt-auto block text-center px-5 py-2.5 text-sm font-semibold rounded-xl border border-gray-200 text-claude-dark hover:border-claude-orange hover:text-claude-orange transition-colors">Get Started</a>
|
|
190
|
+
</div>
|
|
191
|
+
<!-- Starter -->
|
|
192
|
+
<div class="bg-white rounded-2xl p-7 border border-gray-200 flex flex-col">
|
|
193
|
+
<h3 class="text-base font-semibold text-claude-dark">Starter</h3>
|
|
194
|
+
<div class="mt-3 mb-1"><span class="text-4xl font-bold text-claude-dark">$9</span><span class="text-sm text-gray-400">/mo</span></div>
|
|
195
|
+
<p class="text-sm text-gray-400 mb-5">2M tokens/mo</p>
|
|
196
|
+
<p class="text-sm text-gray-500 mb-6">~130 conversations</p>
|
|
197
|
+
<a href="/register" class="mt-auto block text-center px-5 py-2.5 text-sm font-semibold rounded-xl border border-gray-200 text-claude-dark hover:border-claude-orange hover:text-claude-orange transition-colors">Get Started</a>
|
|
198
|
+
</div>
|
|
199
|
+
<!-- Pro (highlighted) -->
|
|
200
|
+
<div class="bg-claude-dark rounded-2xl p-7 border-2 border-claude-orange flex flex-col relative shadow-lg">
|
|
201
|
+
<span class="absolute -top-3 left-1/2 -translate-x-1/2 px-3 py-0.5 text-xs font-semibold bg-claude-orange text-white rounded-full">Most Popular</span>
|
|
202
|
+
<h3 class="text-base font-semibold text-white">Pro</h3>
|
|
203
|
+
<div class="mt-3 mb-1"><span class="text-4xl font-bold text-white">$29</span><span class="text-sm text-gray-400">/mo</span></div>
|
|
204
|
+
<p class="text-sm text-gray-400 mb-5">10M tokens/mo</p>
|
|
205
|
+
<p class="text-sm text-gray-300 mb-6">~650 conversations</p>
|
|
206
|
+
<a href="/register" class="mt-auto block text-center px-5 py-2.5 text-sm font-semibold rounded-xl bg-claude-orange text-white hover:bg-claude-orange-hover transition-colors">Get Started</a>
|
|
207
|
+
</div>
|
|
208
|
+
<!-- Team -->
|
|
209
|
+
<div class="bg-white rounded-2xl p-7 border border-gray-200 flex flex-col">
|
|
210
|
+
<h3 class="text-base font-semibold text-claude-dark">Team</h3>
|
|
211
|
+
<div class="mt-3 mb-1"><span class="text-4xl font-bold text-claude-dark">$99</span><span class="text-sm text-gray-400">/mo</span></div>
|
|
212
|
+
<p class="text-sm text-gray-400 mb-5">50M tokens/mo</p>
|
|
213
|
+
<p class="text-sm text-gray-500 mb-6">~3,250 conversations</p>
|
|
214
|
+
<a href="/register" class="mt-auto block text-center px-5 py-2.5 text-sm font-semibold rounded-xl border border-gray-200 text-claude-dark hover:border-claude-orange hover:text-claude-orange transition-colors">Get Started</a>
|
|
215
|
+
</div>
|
|
216
|
+
</div>
|
|
217
|
+
<div class="text-center mt-10">
|
|
218
|
+
<p class="text-gray-500 text-sm">1 typical Claude Code conversation uses ~15K tokens</p>
|
|
219
|
+
<p class="text-gray-500 text-sm mt-1">Claude Code Max costs <span class="font-semibold text-claude-dark">$200/month</span> for similar usage. Our Pro plan is <span class="font-semibold text-claude-orange">$29</span>.</p>
|
|
220
|
+
</div>
|
|
221
|
+
</div>
|
|
222
|
+
</section>
|
|
223
|
+
|
|
224
|
+
<!-- Social Proof Section -->
|
|
225
|
+
<section class="py-20 sm:py-28 bg-white">
|
|
226
|
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
227
|
+
<div class="text-center mb-16">
|
|
228
|
+
<h2 class="text-3xl sm:text-4xl font-bold text-claude-dark tracking-tight">What developers say</h2>
|
|
229
|
+
</div>
|
|
230
|
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-8 max-w-5xl mx-auto">
|
|
231
|
+
<!-- Testimonial 1 -->
|
|
232
|
+
<div class="bg-claude-cream rounded-2xl p-8 border border-gray-100">
|
|
233
|
+
<div class="flex items-center gap-1 mb-4">
|
|
234
|
+
<svg class="w-4 h-4 text-claude-orange" fill="currentColor" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/></svg>
|
|
235
|
+
<svg class="w-4 h-4 text-claude-orange" fill="currentColor" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/></svg>
|
|
236
|
+
<svg class="w-4 h-4 text-claude-orange" fill="currentColor" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/></svg>
|
|
237
|
+
<svg class="w-4 h-4 text-claude-orange" fill="currentColor" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/></svg>
|
|
238
|
+
<svg class="w-4 h-4 text-claude-orange" fill="currentColor" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/></svg>
|
|
239
|
+
</div>
|
|
240
|
+
<p class="text-gray-600 text-sm leading-relaxed mb-5">"Switched from the official API and saved $150 in the first month. Setup took literally two minutes. Everything just works."</p>
|
|
241
|
+
<div class="flex items-center gap-3">
|
|
242
|
+
<div class="w-9 h-9 rounded-full bg-claude-orange/10 text-claude-orange flex items-center justify-center text-sm font-bold">M</div>
|
|
243
|
+
<div>
|
|
244
|
+
<p class="text-sm font-semibold text-claude-dark">Marcus T.</p>
|
|
245
|
+
<p class="text-xs text-gray-400">Full-stack Developer</p>
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
</div>
|
|
249
|
+
<!-- Testimonial 2 -->
|
|
250
|
+
<div class="bg-claude-cream rounded-2xl p-8 border border-gray-100">
|
|
251
|
+
<div class="flex items-center gap-1 mb-4">
|
|
252
|
+
<svg class="w-4 h-4 text-claude-orange" fill="currentColor" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/></svg>
|
|
253
|
+
<svg class="w-4 h-4 text-claude-orange" fill="currentColor" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/></svg>
|
|
254
|
+
<svg class="w-4 h-4 text-claude-orange" fill="currentColor" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/></svg>
|
|
255
|
+
<svg class="w-4 h-4 text-claude-orange" fill="currentColor" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/></svg>
|
|
256
|
+
<svg class="w-4 h-4 text-claude-orange" fill="currentColor" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/></svg>
|
|
257
|
+
</div>
|
|
258
|
+
<p class="text-gray-600 text-sm leading-relaxed mb-5">"I was burning through my Pro plan in under an hour. Now I code all day without worrying about limits. The tool support is flawless."</p>
|
|
259
|
+
<div class="flex items-center gap-3">
|
|
260
|
+
<div class="w-9 h-9 rounded-full bg-claude-orange/10 text-claude-orange flex items-center justify-center text-sm font-bold">S</div>
|
|
261
|
+
<div>
|
|
262
|
+
<p class="text-sm font-semibold text-claude-dark">Sarah K.</p>
|
|
263
|
+
<p class="text-xs text-gray-400">Backend Engineer</p>
|
|
264
|
+
</div>
|
|
265
|
+
</div>
|
|
266
|
+
</div>
|
|
267
|
+
<!-- Testimonial 3 -->
|
|
268
|
+
<div class="bg-claude-cream rounded-2xl p-8 border border-gray-100">
|
|
269
|
+
<div class="flex items-center gap-1 mb-4">
|
|
270
|
+
<svg class="w-4 h-4 text-claude-orange" fill="currentColor" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/></svg>
|
|
271
|
+
<svg class="w-4 h-4 text-claude-orange" fill="currentColor" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/></svg>
|
|
272
|
+
<svg class="w-4 h-4 text-claude-orange" fill="currentColor" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/></svg>
|
|
273
|
+
<svg class="w-4 h-4 text-claude-orange" fill="currentColor" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/></svg>
|
|
274
|
+
<svg class="w-4 h-4 text-claude-orange" fill="currentColor" viewBox="0 0 20 20"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/></svg>
|
|
275
|
+
</div>
|
|
276
|
+
<p class="text-gray-600 text-sm leading-relaxed mb-5">"Our team of 4 moved to the Team plan. We went from $800/month combined to $99. The failover means we've had zero downtime."</p>
|
|
277
|
+
<div class="flex items-center gap-3">
|
|
278
|
+
<div class="w-9 h-9 rounded-full bg-claude-orange/10 text-claude-orange flex items-center justify-center text-sm font-bold">J</div>
|
|
279
|
+
<div>
|
|
280
|
+
<p class="text-sm font-semibold text-claude-dark">James R.</p>
|
|
281
|
+
<p class="text-xs text-gray-400">Engineering Lead</p>
|
|
282
|
+
</div>
|
|
283
|
+
</div>
|
|
284
|
+
</div>
|
|
285
|
+
</div>
|
|
286
|
+
</div>
|
|
287
|
+
</section>
|
|
288
|
+
|
|
289
|
+
<!-- FAQ Section -->
|
|
290
|
+
<section class="py-20 sm:py-28 bg-claude-cream">
|
|
291
|
+
<div class="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
292
|
+
<div class="text-center mb-16">
|
|
293
|
+
<h2 class="text-3xl sm:text-4xl font-bold text-claude-dark tracking-tight">Frequently asked questions</h2>
|
|
294
|
+
</div>
|
|
295
|
+
<div class="space-y-4">
|
|
296
|
+
<!-- FAQ 1 -->
|
|
297
|
+
<details class="group bg-white rounded-2xl border border-gray-100 overflow-hidden">
|
|
298
|
+
<summary class="flex items-center justify-between cursor-pointer px-7 py-5 text-base font-semibold text-claude-dark hover:text-claude-orange transition-colors list-none [&::-webkit-details-marker]:hidden">
|
|
299
|
+
Is this the real Claude?
|
|
300
|
+
<svg class="w-5 h-5 text-gray-400 group-open:rotate-45 transition-transform flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6v12m6-6H6"/></svg>
|
|
301
|
+
</summary>
|
|
302
|
+
<div class="px-7 pb-6 text-sm text-gray-500 leading-relaxed">
|
|
303
|
+
We provide a Claude Code-compatible API endpoint. Your Claude Code CLI connects to our infrastructure, which runs state-of-the-art coding models optimized for tool use and code generation. The experience is the same — the tools, the streaming, the workflow — all identical.
|
|
304
|
+
</div>
|
|
305
|
+
</details>
|
|
306
|
+
<!-- FAQ 2 -->
|
|
307
|
+
<details class="group bg-white rounded-2xl border border-gray-100 overflow-hidden">
|
|
308
|
+
<summary class="flex items-center justify-between cursor-pointer px-7 py-5 text-base font-semibold text-claude-dark hover:text-claude-orange transition-colors list-none [&::-webkit-details-marker]:hidden">
|
|
309
|
+
Will my tools work?
|
|
310
|
+
<svg class="w-5 h-5 text-gray-400 group-open:rotate-45 transition-transform flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6v12m6-6H6"/></svg>
|
|
311
|
+
</summary>
|
|
312
|
+
<div class="px-7 pb-6 text-sm text-gray-500 leading-relaxed">
|
|
313
|
+
Yes. Read, Write, Edit, Bash, Grep, Glob — everything works. We support the full Anthropic tool-calling specification, so Claude Code behaves exactly as you'd expect.
|
|
314
|
+
</div>
|
|
315
|
+
</details>
|
|
316
|
+
<!-- FAQ 3 -->
|
|
317
|
+
<details class="group bg-white rounded-2xl border border-gray-100 overflow-hidden">
|
|
318
|
+
<summary class="flex items-center justify-between cursor-pointer px-7 py-5 text-base font-semibold text-claude-dark hover:text-claude-orange transition-colors list-none [&::-webkit-details-marker]:hidden">
|
|
319
|
+
How is this so cheap?
|
|
320
|
+
<svg class="w-5 h-5 text-gray-400 group-open:rotate-45 transition-transform flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6v12m6-6H6"/></svg>
|
|
321
|
+
</summary>
|
|
322
|
+
<div class="px-7 pb-6 text-sm text-gray-500 leading-relaxed">
|
|
323
|
+
We optimize infrastructure costs and pass the savings to you. Smart routing, efficient batching, and multi-provider partnerships let us offer top-tier coding models at a fraction of the direct API cost.
|
|
324
|
+
</div>
|
|
325
|
+
</details>
|
|
326
|
+
<!-- FAQ 4 -->
|
|
327
|
+
<details class="group bg-white rounded-2xl border border-gray-100 overflow-hidden">
|
|
328
|
+
<summary class="flex items-center justify-between cursor-pointer px-7 py-5 text-base font-semibold text-claude-dark hover:text-claude-orange transition-colors list-none [&::-webkit-details-marker]:hidden">
|
|
329
|
+
Can I switch back to official Claude?
|
|
330
|
+
<svg class="w-5 h-5 text-gray-400 group-open:rotate-45 transition-transform flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6v12m6-6H6"/></svg>
|
|
331
|
+
</summary>
|
|
332
|
+
<div class="px-7 pb-6 text-sm text-gray-500 leading-relaxed">
|
|
333
|
+
Anytime. Just remove the <code class="bg-gray-100 px-1.5 py-0.5 rounded text-xs font-mono">ANTHROPIC_BASE_URL</code> environment variable and Claude Code will connect to the official API again. No lock-in, ever.
|
|
334
|
+
</div>
|
|
335
|
+
</details>
|
|
336
|
+
<!-- FAQ 5 -->
|
|
337
|
+
<details class="group bg-white rounded-2xl border border-gray-100 overflow-hidden">
|
|
338
|
+
<summary class="flex items-center justify-between cursor-pointer px-7 py-5 text-base font-semibold text-claude-dark hover:text-claude-orange transition-colors list-none [&::-webkit-details-marker]:hidden">
|
|
339
|
+
Is my code safe?
|
|
340
|
+
<svg class="w-5 h-5 text-gray-400 group-open:rotate-45 transition-transform flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6v12m6-6H6"/></svg>
|
|
341
|
+
</summary>
|
|
342
|
+
<div class="px-7 pb-6 text-sm text-gray-500 leading-relaxed">
|
|
343
|
+
We don't store your code. Requests are proxied in real-time and not logged. Your intellectual property stays yours.
|
|
344
|
+
</div>
|
|
345
|
+
</details>
|
|
346
|
+
</div>
|
|
347
|
+
</div>
|
|
348
|
+
</section>
|
|
349
|
+
|
|
350
|
+
<!-- CTA Banner -->
|
|
351
|
+
<section class="py-20 sm:py-28 bg-claude-dark">
|
|
352
|
+
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
|
|
353
|
+
<h2 class="text-3xl sm:text-4xl font-bold text-white tracking-tight">Start coding for free</h2>
|
|
354
|
+
<p class="mt-4 text-lg text-gray-400">No credit card required. Set up in under a minute.</p>
|
|
355
|
+
<div class="mt-10">
|
|
356
|
+
<a href="/register" class="inline-flex items-center justify-center px-10 py-4 text-base font-semibold text-white bg-claude-orange rounded-xl hover:bg-claude-orange-hover transition-all shadow-md hover:shadow-lg">
|
|
357
|
+
Get Free API Key
|
|
358
|
+
<svg class="ml-2 w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/></svg>
|
|
359
|
+
</a>
|
|
360
|
+
</div>
|
|
361
|
+
</div>
|
|
362
|
+
</section>
|
|
363
|
+
|
|
364
|
+
<!-- Footer -->
|
|
365
|
+
<footer class="bg-claude-cream border-t border-gray-200/60 pt-16 pb-8">
|
|
366
|
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
367
|
+
<div class="grid grid-cols-2 md:grid-cols-4 gap-8 mb-12">
|
|
368
|
+
<!-- Brand -->
|
|
369
|
+
<div class="col-span-2 md:col-span-1">
|
|
370
|
+
<a href="/" class="flex items-center space-x-2 mb-4">
|
|
371
|
+
<svg class="w-7 h-7 text-claude-orange" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
372
|
+
<rect width="28" height="28" rx="6" fill="currentColor" fill-opacity="0.1"/>
|
|
373
|
+
<path d="M9 8l5 6-5 6" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
374
|
+
<path d="M16 18h4" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"/>
|
|
375
|
+
</svg>
|
|
376
|
+
<span class="text-xl font-bold text-claude-dark tracking-tight">LLM <span class="text-claude-orange">API</span></span>
|
|
377
|
+
</a>
|
|
378
|
+
<p class="text-sm text-gray-400 leading-relaxed">Claude Code compatible API.<br>Fast, reliable, affordable.</p>
|
|
379
|
+
</div>
|
|
380
|
+
<!-- Product -->
|
|
381
|
+
<div>
|
|
382
|
+
<h4 class="text-sm font-semibold text-claude-dark mb-4">Product</h4>
|
|
383
|
+
<ul class="space-y-2.5">
|
|
384
|
+
<li><a href="/pricing" class="text-sm text-gray-500 hover:text-claude-orange transition-colors">Pricing</a></li>
|
|
385
|
+
<li><a href="/docs" class="text-sm text-gray-500 hover:text-claude-orange transition-colors">Docs</a></li>
|
|
386
|
+
<li><a href="/blog" class="text-sm text-gray-500 hover:text-claude-orange transition-colors">Blog</a></li>
|
|
387
|
+
<li><a href="/dashboard" class="text-sm text-gray-500 hover:text-claude-orange transition-colors">Dashboard</a></li>
|
|
388
|
+
</ul>
|
|
389
|
+
</div>
|
|
390
|
+
<!-- Company -->
|
|
391
|
+
<div>
|
|
392
|
+
<h4 class="text-sm font-semibold text-claude-dark mb-4">Company</h4>
|
|
393
|
+
<ul class="space-y-2.5">
|
|
394
|
+
<li><a href="/about" class="text-sm text-gray-500 hover:text-claude-orange transition-colors">About</a></li>
|
|
395
|
+
<li><a href="/terms" class="text-sm text-gray-500 hover:text-claude-orange transition-colors">Terms</a></li>
|
|
396
|
+
<li><a href="/privacy" class="text-sm text-gray-500 hover:text-claude-orange transition-colors">Privacy</a></li>
|
|
397
|
+
</ul>
|
|
398
|
+
</div>
|
|
399
|
+
<!-- Developer -->
|
|
400
|
+
<div>
|
|
401
|
+
<h4 class="text-sm font-semibold text-claude-dark mb-4">Developer</h4>
|
|
402
|
+
<ul class="space-y-2.5">
|
|
403
|
+
<li><a href="/docs" class="text-sm text-gray-500 hover:text-claude-orange transition-colors">API Reference</a></li>
|
|
404
|
+
<li><a href="/status" class="text-sm text-gray-500 hover:text-claude-orange transition-colors">Status</a></li>
|
|
405
|
+
</ul>
|
|
406
|
+
</div>
|
|
407
|
+
</div>
|
|
408
|
+
<div class="border-t border-gray-200/60 pt-6 text-center">
|
|
409
|
+
<p class="text-xs text-gray-400">LLM API is an independent service and is not affiliated with Anthropic, PBC.</p>
|
|
410
|
+
<p class="text-xs text-gray-300 mt-2">© <%= new Date().getFullYear() %> LLM API. All rights reserved.</p>
|
|
411
|
+
</div>
|
|
412
|
+
</div>
|
|
413
|
+
</footer>
|
|
414
|
+
|
|
415
|
+
</body>
|
|
416
|
+
</html>
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
<%- include('../partials/header') %>
|
|
2
|
+
<%- include('../partials/nav') %>
|
|
3
|
+
|
|
4
|
+
<main class="min-h-[calc(100vh-4rem)] flex items-center justify-center px-4 py-12">
|
|
5
|
+
<div class="w-full max-w-md">
|
|
6
|
+
<div class="bg-white rounded-2xl shadow-sm border border-claude-dark/5 p-8">
|
|
7
|
+
<!-- Header -->
|
|
8
|
+
<div class="text-center mb-8">
|
|
9
|
+
<h1 class="text-2xl font-bold text-claude-dark">欢迎回来</h1>
|
|
10
|
+
<p class="mt-2 text-sm text-claude-dark/60">登录您的 LLM API 账户</p>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<!-- Google Sign-In -->
|
|
14
|
+
<script src="https://accounts.google.com/gsi/client" async></script>
|
|
15
|
+
<div id="g_id_onload"
|
|
16
|
+
data-client_id="128504392054-4rfrtk05umm9fvfpd83l9qn9r4qnaa98.apps.googleusercontent.com"
|
|
17
|
+
data-callback="handleGoogleCallback"
|
|
18
|
+
data-auto_prompt="false">
|
|
19
|
+
</div>
|
|
20
|
+
<div class="flex justify-center mb-6">
|
|
21
|
+
<div class="g_id_signin"
|
|
22
|
+
data-type="standard"
|
|
23
|
+
data-shape="rectangular"
|
|
24
|
+
data-theme="outline"
|
|
25
|
+
data-text="continue_with"
|
|
26
|
+
data-size="large"
|
|
27
|
+
data-width="400">
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<div class="relative mb-6">
|
|
32
|
+
<div class="absolute inset-0 flex items-center"><div class="w-full border-t border-claude-dark/10"></div></div>
|
|
33
|
+
<div class="relative flex justify-center text-xs"><span class="bg-white px-3 text-claude-dark/40">or</span></div>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<!-- Error Display -->
|
|
37
|
+
<div id="loginError" class="hidden mb-4 p-3 rounded-lg bg-red-50 border border-red-200 text-sm text-red-700"></div>
|
|
38
|
+
|
|
39
|
+
<!-- Login Form -->
|
|
40
|
+
<form id="loginForm" class="space-y-5" onsubmit="handleLogin(event)">
|
|
41
|
+
<div>
|
|
42
|
+
<label for="email" class="block text-sm font-medium text-claude-dark/80 mb-1.5">邮箱地址</label>
|
|
43
|
+
<input
|
|
44
|
+
type="email"
|
|
45
|
+
id="email"
|
|
46
|
+
name="email"
|
|
47
|
+
required
|
|
48
|
+
autocomplete="email"
|
|
49
|
+
placeholder="you@example.com"
|
|
50
|
+
class="w-full px-4 py-2.5 rounded-lg border border-claude-dark/15 bg-claude-cream/30 text-claude-dark placeholder-claude-dark/30 focus:outline-none focus:ring-2 focus:ring-claude-orange/30 focus:border-claude-orange transition-colors"
|
|
51
|
+
>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<div>
|
|
55
|
+
<label for="password" class="block text-sm font-medium text-claude-dark/80 mb-1.5">密码</label>
|
|
56
|
+
<div class="relative">
|
|
57
|
+
<input
|
|
58
|
+
type="password"
|
|
59
|
+
id="password"
|
|
60
|
+
name="password"
|
|
61
|
+
required
|
|
62
|
+
autocomplete="current-password"
|
|
63
|
+
placeholder="输入您的密码"
|
|
64
|
+
class="w-full px-4 py-2.5 rounded-lg border border-claude-dark/15 bg-claude-cream/30 text-claude-dark placeholder-claude-dark/30 focus:outline-none focus:ring-2 focus:ring-claude-orange/30 focus:border-claude-orange transition-colors"
|
|
65
|
+
>
|
|
66
|
+
<button
|
|
67
|
+
type="button"
|
|
68
|
+
onclick="togglePassword('password')"
|
|
69
|
+
class="absolute right-3 top-1/2 -translate-y-1/2 text-claude-dark/40 hover:text-claude-dark/70"
|
|
70
|
+
>
|
|
71
|
+
<svg id="password-eye" class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
72
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/>
|
|
73
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"/>
|
|
74
|
+
</svg>
|
|
75
|
+
</button>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<button
|
|
80
|
+
type="submit"
|
|
81
|
+
id="loginBtn"
|
|
82
|
+
class="w-full py-2.5 px-4 bg-claude-orange text-white font-medium rounded-lg hover:bg-claude-orange/90 transition-colors focus:outline-none focus:ring-2 focus:ring-claude-orange/30 disabled:opacity-50 disabled:cursor-not-allowed"
|
|
83
|
+
>
|
|
84
|
+
登录
|
|
85
|
+
</button>
|
|
86
|
+
</form>
|
|
87
|
+
|
|
88
|
+
<!-- Footer Links -->
|
|
89
|
+
<div class="mt-6 text-center">
|
|
90
|
+
<p class="text-sm text-claude-dark/60">
|
|
91
|
+
还没有账户?
|
|
92
|
+
<a href="/register" class="text-claude-orange hover:text-claude-orange/80 font-medium transition-colors">立即注册</a>
|
|
93
|
+
</p>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
</main>
|
|
98
|
+
|
|
99
|
+
<script>
|
|
100
|
+
function handleGoogleCallback(response) {
|
|
101
|
+
fetch('/api/auth/google/token', {
|
|
102
|
+
method: 'POST',
|
|
103
|
+
headers: { 'Content-Type': 'application/json' },
|
|
104
|
+
body: JSON.stringify({ idToken: response.credential }),
|
|
105
|
+
})
|
|
106
|
+
.then(function(r) { return r.json(); })
|
|
107
|
+
.then(function(data) {
|
|
108
|
+
if (data.success) window.location.href = '/dashboard';
|
|
109
|
+
else showError(data.error || 'Google login failed');
|
|
110
|
+
})
|
|
111
|
+
.catch(function() { showError('Google login failed'); });
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function togglePassword(fieldId) {
|
|
115
|
+
const input = document.getElementById(fieldId);
|
|
116
|
+
input.type = input.type === 'password' ? 'text' : 'password';
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function showError(msg) {
|
|
120
|
+
const el = document.getElementById('loginError');
|
|
121
|
+
el.textContent = msg;
|
|
122
|
+
el.classList.remove('hidden');
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function hideError() {
|
|
126
|
+
document.getElementById('loginError').classList.add('hidden');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async function handleLogin(e) {
|
|
130
|
+
e.preventDefault();
|
|
131
|
+
hideError();
|
|
132
|
+
|
|
133
|
+
const btn = document.getElementById('loginBtn');
|
|
134
|
+
const email = document.getElementById('email').value.trim();
|
|
135
|
+
const password = document.getElementById('password').value;
|
|
136
|
+
|
|
137
|
+
if (!email || !password) {
|
|
138
|
+
showError('请填写邮箱和密码');
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
btn.disabled = true;
|
|
143
|
+
btn.textContent = '登录中...';
|
|
144
|
+
|
|
145
|
+
try {
|
|
146
|
+
const res = await fetch('/api/auth/login', {
|
|
147
|
+
method: 'POST',
|
|
148
|
+
headers: { 'Content-Type': 'application/json' },
|
|
149
|
+
credentials: 'same-origin',
|
|
150
|
+
body: JSON.stringify({ email, password }),
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
const data = await res.json();
|
|
154
|
+
|
|
155
|
+
if (data.success) {
|
|
156
|
+
window.location.href = '/dashboard';
|
|
157
|
+
} else {
|
|
158
|
+
showError(data.error || '登录失败,请重试');
|
|
159
|
+
}
|
|
160
|
+
} catch (err) {
|
|
161
|
+
showError('网络错误,请检查连接后重试');
|
|
162
|
+
} finally {
|
|
163
|
+
btn.disabled = false;
|
|
164
|
+
btn.textContent = '登录';
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
</script>
|
|
168
|
+
|
|
169
|
+
</body>
|
|
170
|
+
</html>
|