Skip to content

Commit d5c536c

Browse files
authored
Merge branch 'main' into devin/eng-3014-dd-hql
2 parents 0f2028b + ad56701 commit d5c536c

File tree

229 files changed

+18508
-8200
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

229 files changed

+18508
-8200
lines changed

.claude/settings.local.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
"Bash(gh run list:*)",
4141
"Bash(gh run view:*)",
4242
"Bash(gh run watch:*)",
43+
"Bash(curl:*)",
44+
"Bash(yarn lint:*)",
4345
"mcp__linear-server__list_comments"
4446
],
4547
"deny": []
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
name: ClickHouse Wrapper Tests
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
- devin/eng-3012-ci
8+
pull_request:
9+
branches:
10+
- main
11+
paths:
12+
# ClickHouse wrapper and database implementation files
13+
- "valhalla/jawn/src/lib/db/ClickhouseWrapper.ts"
14+
- "valhalla/jawn/src/managers/HeliconeSqlManager.ts"
15+
# ClickHouse wrapper test files
16+
- "valhalla/jawn/src/lib/db/test/TestClickhouseWrapper.test.ts"
17+
- "valhalla/jawn/src/lib/db/test/TestClickhouseWrapper.ts"
18+
- "valhalla/jawn/src/lib/db/test/clickhouseMockData.ts"
19+
# Workflow file itself
20+
- ".github/workflows/hql-clickhouse-tests.yml"
21+
22+
jobs:
23+
hql-clickhouse-wrapper-tests:
24+
name: HQL ClickHouse Wrapper Tests
25+
runs-on: ubuntu-latest
26+
defaults:
27+
run:
28+
working-directory: valhalla/jawn
29+
services:
30+
clickhouse:
31+
image: clickhouse/clickhouse-server:latest
32+
ports:
33+
- 8123:8123
34+
- 9000:9000
35+
options: >-
36+
--health-cmd "wget --no-verbose --tries=1 --spider http://localhost:8123/ping || exit 1"
37+
--health-interval 10s
38+
--health-timeout 5s
39+
--health-retries 5
40+
steps:
41+
- uses: actions/checkout@v4
42+
43+
- name: Setup Node.js
44+
uses: actions/setup-node@v4
45+
with:
46+
node-version: "20"
47+
cache: "yarn"
48+
cache-dependency-path: "**/yarn.lock"
49+
50+
- name: Install dependencies
51+
run: |
52+
# Retry logic for yarn install with fallback to npm
53+
for i in 1 2 3; do
54+
echo "Attempt $i: Installing dependencies..."
55+
if yarn install --frozen-lockfile --network-timeout 100000; then
56+
echo "✓ Successfully installed dependencies"
57+
exit 0
58+
fi
59+
echo "Attempt $i failed, waiting 5 seconds..."
60+
sleep 5
61+
done
62+
# Fallback to npm if yarn fails
63+
echo "Yarn failed, using npm install..."
64+
npm install
65+
66+
- name: Wait for ClickHouse
67+
run: |
68+
for i in {1..30}; do
69+
if curl -s http://localhost:8123/ping > /dev/null; then
70+
echo "ClickHouse is ready"
71+
break
72+
fi
73+
echo "Waiting for ClickHouse... ($i/30)"
74+
sleep 2
75+
if [ $i -eq 30 ]; then
76+
echo "ClickHouse failed to start after 30 attempts"
77+
exit 1
78+
fi
79+
done
80+
81+
- name: Run ClickHouse Wrapper Tests
82+
run: yarn test:jawn TestClickhouseWrapper.test.ts
83+
env:
84+
NODE_ENV: test
85+
CLICKHOUSE_HOST: localhost
86+
CLICKHOUSE_PORT: 8123
87+
CLICKHOUSE_USER: default
88+
CLICKHOUSE_PASSWORD: ""
89+
CLICKHOUSE_DATABASE: default
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
name: HQL Security Tests
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
pull_request:
8+
branches:
9+
- main
10+
paths:
11+
# HQL security-related implementation files
12+
- "valhalla/jawn/src/lib/stores/HqlStore.ts"
13+
- "valhalla/jawn/src/lib/errors/HqlErrors.ts"
14+
- "valhalla/jawn/src/managers/HqlQueryManager.ts"
15+
- "valhalla/jawn/src/controllers/public/heliconeSqlController.ts"
16+
# HQL security test files
17+
- "valhalla/jawn/src/lib/db/test/hqlSecurityTests.test.ts"
18+
- "valhalla/jawn/src/lib/db/test/MockClickhouseWrapper.ts"
19+
- "valhalla/jawn/src/controllers/public/__tests__/heliconeSqlController.test.ts"
20+
# Web HQL files
21+
- "web/lib/api/hql/**"
22+
# Workflow file itself
23+
- ".github/workflows/hql-security-tests.yml"
24+
25+
jobs:
26+
hql-security-tests:
27+
hql-security-tests:
28+
name: Run HQL Security Tests
29+
defaults:
30+
run:
31+
working-directory: valhalla/jawn
32+
steps:
33+
- uses: actions/checkout@v4
34+
35+
- name: Setup Node.js
36+
uses: actions/setup-node@v4
37+
with:
38+
node-version: "20"
39+
cache: "yarn"
40+
cache-dependency-path: "**/yarn.lock"
41+
42+
- name: Install dependencies
43+
run: |
44+
# Retry logic for yarn install with fallback to npm
45+
for i in 1 2 3; do
46+
echo "Attempt $i: Installing dependencies..."
47+
if yarn install --frozen-lockfile --network-timeout 100000; then
48+
echo "✓ Successfully installed dependencies"
49+
exit 0
50+
fi
51+
echo "Attempt $i failed, waiting 5 seconds..."
52+
sleep 5
53+
done
54+
# Fallback to npm if yarn fails
55+
echo "Yarn failed, using npm install..."
56+
npm install
57+
58+
- name: Run HQL Security Tests
59+
run: yarn test:jawn hqlSecurityTests.test.ts
60+
env:
61+
NODE_ENV: test
62+
63+
# Note: API integration tests are skipped in CI because they require
64+
# the full Jawn server to be running on port 8585.
65+
# These tests should be run locally or in a more complete E2E test environment.
66+
# To run locally:
67+
# 1. Start the Jawn server: yarn start
68+
# 2. Run tests: yarn test:jawn heliconeSqlController.test.ts

.github/workflows/packages-test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,6 @@ jobs:
3232
run: yarn install --frozen-lockfile
3333
working-directory: packages
3434

35-
- name: Run llm-mapper tests
35+
- name: Run packages tests
3636
run: npx jest __tests__/
3737
working-directory: packages

.github/workflows/worker-test.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ on:
44
workflow_dispatch: # Manual trigger for testing iterations!
55
push:
66
branches:
7-
- "**" # Run on ALL branches for every push
7+
- main
8+
pull_request:
9+
branches:
10+
- main
811

912
jobs:
1013
worker-ai-gateway-tests:

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
scripts/
2+
!valhalla/jawn/scripts/
23
dist/
34
server.py
45

@@ -48,3 +49,4 @@ override.tf.json
4849
settings.local.json
4950
examples/**/*/package-lock.json
5051
examples/**/*/yarn.lock
52+
coverage/
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"title": "The Helicone AI Gateway, Now On The Cloud!",
3+
"title1": "The Helicone AI Gateway, Now On The Cloud!",
4+
"title2": "The Helicone AI Gateway, Now On The Cloud!",
5+
"description": "The Helicone AI Gateway now includes passthrough billing directly from your dashboard. Observability embedded by default, you can query any model through the OpenAI API.",
6+
"images": "/static/blog/ptb-gateway-launch/thumbnail.webp",
7+
"time": "2 minute read",
8+
"author": "Juliette Chevalier",
9+
"date": "September 10, 2025",
10+
"badge": "AI Gateway"
11+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
Around 50%+ of engineers say integrating and managing multiple models is their #1 AI pain point. At the same time, over 90% of AI teams run 5+ models in production.
2+
3+
This means:
4+
- API keys everywhere
5+
- Custom logic for provider fallbacks
6+
- Zero visibility when things break
7+
- Different handling for rate limits, caching, and tracing
8+
- Constantly updating code every time a new model is released
9+
10+
**Engineers are spending too much time integrating infrastructure instead of shipping features.**
11+
12+
That ends today.
13+
14+
<img src="/static/blog/ptb-gateway-launch/graph.webp" alt="Pain points of multi-provider integrations" />
15+
16+
Built by engineers who've felt the pain of multi-provider integrations, the Helicone AI Gateway is the missing infrastructure layer that every AI team eventually ends up building internally.
17+
18+
We abstract away all complexity, so you can focus on shipping by picking only your favorite models.
19+
20+
<CallToAction
21+
title="Request Early Access ⚡️"
22+
description="We're releasing access to customers every week! Join the waitlist to become an early tester today."
23+
primaryButtonText="Join here"
24+
primaryLink="https://helicone.ai/credits"
25+
/>
26+
27+
## One API. 100+ models. Zero configuration, 0% markup.
28+
29+
Through the OpenAI API, the Helicone AI Gateway routes to 100+ models across all major providers - with observability embedded by default so never miss a trace.
30+
31+
```typescript
32+
// ❌ OLD WAY - multiple SDKs and endpoints
33+
const openai = new OpenAI({ baseURL: "https://oai.helicone.ai/v1" });
34+
const anthropic = new Anthropic({ baseURL: "https://anthropic.helicone.ai" });
35+
36+
const openaiResponse = await openai.chat.completions.create({
37+
model: "gpt-4o",
38+
messages: [...]
39+
});
40+
41+
const anthropicResponse = await anthropic.messages.create({
42+
model: "claude-3.5-sonnet",
43+
messages: [...] // Different message format!
44+
});
45+
46+
// ✅ NEW WAY - one SDK, all providers
47+
const client = new OpenAI({
48+
baseURL: "https://ai-gateway.helicone.ai",
49+
apiKey: process.env.HELICONE_API_KEY // The only API key you need
50+
});
51+
52+
const response = await client.chat.completions.create({
53+
model: "gpt-4o-mini", // Works with any model: claude-sonnet-4, gemini-2.5-flash, etc.
54+
messages: [{ role: "user", content: "Hello!" }]
55+
});
56+
```
57+
58+
## What makes this different
59+
60+
You can see the Helicone AI Gateway as your one-stop model concierge.
61+
62+
- We handle **provider authentication**, so you don't have to worry about so many API keys and permissions.
63+
- 99.99% uptime with **automatic fallbacks** routed to other providers offering the same model.
64+
- We are constantly checking for model pricing and route you to the **cheapest provider**.
65+
- **Observability** is embedded by default, so you never miss a trace again.
66+
- Configure **rate limits, caching, and guardrails** under one unified platform.
67+
- We protect you from **prompt injections & data exfiltrations** so your product is always protected against attacks.
68+
69+
All under a **single unified bill** you can top-up as needed, or bring your own key (BYOK).
70+
71+
## Why Now?
72+
73+
The AI infrastructure landscape is consolidating around a few key patterns:
74+
75+
- **Multi-provider is the new normal:** Teams use OpenAI for chat, Claude for coding, and Gemini for image generation and interpretation. Single-provider architectures are increasingly rare (support coming soon!).
76+
- **Reliability is non-negotiable:** AI is becoming mission-critical for products today. Downtime is both frustrating and expensive.
77+
- **Developer experience matters:** Engineers want to ship features, not maintain infrastructure. Tools need to be easy to integrate, use, and maintain.
78+
79+
## Get Started
80+
81+
The AI Gateway is available now in private beta.
82+
83+
- Existing customers get priority access to the cloud service.
84+
- New teams are added to the waitlist weekly.
85+
86+
<CallToAction
87+
title="Request Early Access ⚡️"
88+
description="We're releasing access to customers every week! Join the waitlist to become an early tester today."
89+
primaryButtonText="Join here"
90+
primaryLink="https://helicone.ai/credits"
91+
/>

bifrost/app/blog/page.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,11 @@ export type BlogStructure =
219219
};
220220

221221
export const BLOG_CONTENT: BlogStructure[] = [
222+
{
223+
dynmaicEntry: {
224+
folderName: "ptb-gateway-launch",
225+
},
226+
},
222227
{
223228
dynmaicEntry: {
224229
folderName: "how-ai-gateways-enhance-app-reliability",

bifrost/app/components/Layout.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import Footer from "@/components/layout/footer";
22
import NavBar from "@/components/layout/navbar";
3-
// import Banner from "@/components/home/Banner";
3+
import Banner from "@/components/home/Banner";
44
import { getMetadata } from "@/components/templates/blog/getMetaData";
55
import { BLOG_CONTENT } from "../blog/page";
66

77
export const Layout = async ({
88
children,
99
hideFooter,
10+
noNavbarMargin,
1011
}: {
1112
children: React.ReactNode;
1213
hideFooter?: boolean;
14+
noNavbarMargin?: boolean;
1315
}) => {
1416
const githubResponse = await fetch(
1517
"https://api.github.com/repos/helicone/helicone"
@@ -22,12 +24,17 @@ export const Layout = async ({
2224

2325
return (
2426
<>
25-
{/* <Banner /> */}
27+
<Banner />
2628

27-
<NavBar stars={stars} featuredBlogMetadata={featuredBlogMetadata || {
28-
title: "Check out our latest blog",
29-
description: "Open-source LLM observability and monitoring platform for developers",
30-
}} featuredBlogFolderName={featuredBlogFolderName} />
29+
<NavBar
30+
stars={stars}
31+
featuredBlogMetadata={featuredBlogMetadata || {
32+
title: "Check out our latest blog",
33+
description: "Open-source LLM observability and monitoring platform for developers",
34+
}}
35+
featuredBlogFolderName={featuredBlogFolderName}
36+
noMargin={noNavbarMargin}
37+
/>
3138
{children}
3239
{!hideFooter && <Footer />}
3340
</>

0 commit comments

Comments
 (0)