summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorFrank <[email protected]>2026-04-15 09:19:26 -0400
committerFrank <[email protected]>2026-04-15 09:19:28 -0400
commit47af00b2452ef7374cdda8769910799938d1303c (patch)
tree68ff3c8e3bd69cb630eb35b6943b1b38a992a589
parent004a9284afb09b31105cb2bc26d993af0726585b (diff)
downloadopencode-47af00b2452ef7374cdda8769910799938d1303c.tar.gz
opencode-47af00b2452ef7374cdda8769910799938d1303c.zip
zen: better error
-rw-r--r--packages/console/app/src/routes/zen/util/handler.ts25
-rw-r--r--packages/console/core/src/model.ts1
2 files changed, 14 insertions, 12 deletions
diff --git a/packages/console/app/src/routes/zen/util/handler.ts b/packages/console/app/src/routes/zen/util/handler.ts
index 46d843522..58df61809 100644
--- a/packages/console/app/src/routes/zen/util/handler.ts
+++ b/packages/console/app/src/routes/zen/util/handler.ts
@@ -222,22 +222,23 @@ export async function handler(
logger.debug("STATUS: " + res.status + " " + res.statusText)
// Handle non-streaming response
- if (!isStream) {
+ if (!isStream || res.status === 429) {
const json = await res.json()
- const usageInfo = providerInfo.normalizeUsage(json.usage)
- const costInfo = calculateCost(modelInfo, usageInfo)
- await trialLimiter?.track(usageInfo)
await rateLimiter?.track()
- await trackUsage(sessionId, billingSource, authInfo, modelInfo, providerInfo, usageInfo, costInfo)
- await reload(billingSource, authInfo, costInfo)
+ if (json.usage) {
+ const usageInfo = providerInfo.normalizeUsage(json.usage)
+ const costInfo = calculateCost(modelInfo, usageInfo)
+ await trialLimiter?.track(usageInfo)
+ await trackUsage(sessionId, billingSource, authInfo, modelInfo, providerInfo, usageInfo, costInfo)
+ await reload(billingSource, authInfo, costInfo)
+ json.cost = calculateOccurredCost(billingSource, costInfo)
+ }
+ if (json.error?.message) {
+ json.error.message = `Error from provider${providerInfo.displayName ? ` (${providerInfo.displayName})` : ""}: ${json.error.message}`
+ }
const responseConverter = createResponseConverter(providerInfo.format, opts.format)
- const body = JSON.stringify(
- responseConverter({
- ...json,
- cost: calculateOccurredCost(billingSource, costInfo),
- }),
- )
+ const body = JSON.stringify(responseConverter(json))
logger.metric({ response_length: body.length })
logger.debug("RESPONSE: " + body)
dataDumper?.provideResponse(body)
diff --git a/packages/console/core/src/model.ts b/packages/console/core/src/model.ts
index b4149373f..3d614d303 100644
--- a/packages/console/core/src/model.ts
+++ b/packages/console/core/src/model.ts
@@ -44,6 +44,7 @@ export namespace ZenData {
})
const ProviderSchema = z.object({
+ displayName: z.string().optional(),
api: z.string(),
apiKey: z.union([z.string(), z.record(z.string(), z.string())]),
format: FormatSchema.optional(),