62 lines
1.7 KiB
TypeScript
62 lines
1.7 KiB
TypeScript
import type { APIEvent } from "@solidjs/start/server"
|
|
import { handler } from "~/util/zen"
|
|
|
|
type Usage = {
|
|
cache_creation?: {
|
|
ephemeral_5m_input_tokens?: number
|
|
ephemeral_1h_input_tokens?: number
|
|
}
|
|
cache_creation_input_tokens?: number
|
|
cache_read_input_tokens?: number
|
|
input_tokens?: number
|
|
output_tokens?: number
|
|
server_tool_use?: {
|
|
web_search_requests?: number
|
|
}
|
|
}
|
|
|
|
export function POST(input: APIEvent) {
|
|
let usage: Usage
|
|
return handler(input, {
|
|
modifyBody: (body: any) => ({
|
|
...body,
|
|
service_tier: "standard_only",
|
|
}),
|
|
setAuthHeader: (headers: Headers, apiKey: string) => headers.set("x-api-key", apiKey),
|
|
parseApiKey: (headers: Headers) => headers.get("x-api-key") ?? undefined,
|
|
onStreamPart: (chunk: string) => {
|
|
const data = chunk.split("\n")[1]
|
|
if (!data.startsWith("data: ")) return
|
|
|
|
let json
|
|
try {
|
|
json = JSON.parse(data.slice(6)) as { usage?: Usage }
|
|
} catch (e) {
|
|
return
|
|
}
|
|
|
|
if (!json.usage) return
|
|
usage = {
|
|
...usage,
|
|
...json.usage,
|
|
cache_creation: {
|
|
...usage?.cache_creation,
|
|
...json.usage.cache_creation,
|
|
},
|
|
server_tool_use: {
|
|
...usage?.server_tool_use,
|
|
...json.usage.server_tool_use,
|
|
},
|
|
}
|
|
},
|
|
getStreamUsage: () => usage,
|
|
normalizeUsage: (usage: Usage) => ({
|
|
inputTokens: usage.input_tokens ?? 0,
|
|
outputTokens: usage.output_tokens ?? 0,
|
|
cacheReadTokens: usage.cache_read_input_tokens ?? undefined,
|
|
cacheWrite5mTokens: usage.cache_creation?.ephemeral_5m_input_tokens ?? undefined,
|
|
cacheWrite1hTokens: usage.cache_creation?.ephemeral_1h_input_tokens ?? undefined,
|
|
}),
|
|
})
|
|
}
|