summaryrefslogtreecommitdiffhomepage
path: root/cloud/app/src/routes
diff options
context:
space:
mode:
authorFrank <[email protected]>2025-09-12 11:57:12 -0400
committerFrank <[email protected]>2025-09-12 11:57:14 -0400
commitc294a181559185dedf6a65e00e1db597721a815b (patch)
tree3a9569986462b8d399d903092451dcb534f4dcb0 /cloud/app/src/routes
parentc3dc6d6df647f8e21dfcd9aeaf4d69bc45580020 (diff)
downloadopencode-c294a181559185dedf6a65e00e1db597721a815b.tar.gz
opencode-c294a181559185dedf6a65e00e1db597721a815b.zip
wip: zen
Diffstat (limited to 'cloud/app/src/routes')
-rw-r--r--cloud/app/src/routes/zen/v1/chat/completions.ts28
-rw-r--r--cloud/app/src/routes/zen/v1/messages.ts6
-rw-r--r--cloud/app/src/routes/zen/v1/responses.ts26
3 files changed, 45 insertions, 15 deletions
diff --git a/cloud/app/src/routes/zen/v1/chat/completions.ts b/cloud/app/src/routes/zen/v1/chat/completions.ts
index dc69bb514..13a75a4a4 100644
--- a/cloud/app/src/routes/zen/v1/chat/completions.ts
+++ b/cloud/app/src/routes/zen/v1/chat/completions.ts
@@ -1,8 +1,26 @@
import type { APIEvent } from "@solidjs/start/server"
import { handler } from "~/util/zen"
+type Usage = {
+ prompt_tokens?: number
+ completion_tokens?: number
+ total_tokens?: number
+ prompt_tokens_details?: {
+ text_tokens?: number
+ audio_tokens?: number
+ image_tokens?: number
+ cached_tokens?: number
+ }
+ completion_tokens_details?: {
+ reasoning_tokens?: number
+ audio_tokens?: number
+ accepted_prediction_tokens?: number
+ rejected_prediction_tokens?: number
+ }
+}
+
export function POST(input: APIEvent) {
- let usage: any
+ let usage: Usage
return handler(input, {
modifyBody: (body: any) => ({
...body,
@@ -17,7 +35,7 @@ export function POST(input: APIEvent) {
let json
try {
- json = JSON.parse(chunk.slice(6))
+ json = JSON.parse(chunk.slice(6)) as { usage?: Usage }
} catch (e) {
return
}
@@ -26,11 +44,11 @@ export function POST(input: APIEvent) {
usage = json.usage
},
getStreamUsage: () => usage,
- normalizeUsage: (usage: any) => ({
+ normalizeUsage: (usage: Usage) => ({
inputTokens: usage.prompt_tokens ?? 0,
outputTokens: usage.completion_tokens ?? 0,
- reasoningTokens: usage.completion_tokens_details?.reasoning_tokens ?? 0,
- cacheReadTokens: usage.prompt_tokens_details?.cached_tokens ?? 0,
+ reasoningTokens: usage.completion_tokens_details?.reasoning_tokens ?? undefined,
+ cacheReadTokens: usage.prompt_tokens_details?.cached_tokens ?? undefined,
}),
})
}
diff --git a/cloud/app/src/routes/zen/v1/messages.ts b/cloud/app/src/routes/zen/v1/messages.ts
index ff399b034..b2e9e275a 100644
--- a/cloud/app/src/routes/zen/v1/messages.ts
+++ b/cloud/app/src/routes/zen/v1/messages.ts
@@ -53,9 +53,9 @@ export function POST(input: APIEvent) {
normalizeUsage: (usage: Usage) => ({
inputTokens: usage.input_tokens ?? 0,
outputTokens: usage.output_tokens ?? 0,
- cacheReadTokens: usage.cache_read_input_tokens ?? 0,
- cacheWrite5mTokens: usage.cache_creation?.ephemeral_5m_input_tokens,
- cacheWrite1hTokens: usage.cache_creation?.ephemeral_1h_input_tokens,
+ 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,
}),
})
}
diff --git a/cloud/app/src/routes/zen/v1/responses.ts b/cloud/app/src/routes/zen/v1/responses.ts
index 518a431ab..1bca91f52 100644
--- a/cloud/app/src/routes/zen/v1/responses.ts
+++ b/cloud/app/src/routes/zen/v1/responses.ts
@@ -1,8 +1,20 @@
import type { APIEvent } from "@solidjs/start/server"
import { handler } from "~/util/zen"
+type Usage = {
+ input_tokens?: number
+ input_tokens_details?: {
+ cached_tokens?: number
+ }
+ output_tokens?: number
+ output_tokens_details?: {
+ reasoning_tokens?: number
+ }
+ total_tokens?: number
+}
+
export function POST(input: APIEvent) {
- let usage: any
+ let usage: Usage
return handler(input, {
setAuthHeader: (headers: Headers, apiKey: string) => {
headers.set("authorization", `Bearer ${apiKey}`)
@@ -15,7 +27,7 @@ export function POST(input: APIEvent) {
let json
try {
- json = JSON.parse(data.slice(6))
+ json = JSON.parse(data.slice(6)) as { response?: { usage?: Usage } }
} catch (e) {
return
}
@@ -24,14 +36,14 @@ export function POST(input: APIEvent) {
usage = json.response.usage
},
getStreamUsage: () => usage,
- normalizeUsage: (usage: any) => {
+ normalizeUsage: (usage: Usage) => {
const inputTokens = usage.input_tokens ?? 0
const outputTokens = usage.output_tokens ?? 0
- const reasoningTokens = usage.output_tokens_details?.reasoning_tokens ?? 0
- const cacheReadTokens = usage.input_tokens_details?.cached_tokens ?? 0
+ const reasoningTokens = usage.output_tokens_details?.reasoning_tokens ?? undefined
+ const cacheReadTokens = usage.input_tokens_details?.cached_tokens ?? undefined
return {
- inputTokens: inputTokens - cacheReadTokens,
- outputTokens: outputTokens - reasoningTokens,
+ inputTokens: inputTokens - (cacheReadTokens ?? 0),
+ outputTokens: outputTokens - (reasoningTokens ?? 0),
reasoningTokens,
cacheReadTokens,
}