diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 5283da6a3..16579ed40 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -338,6 +338,9 @@ export namespace Provider { const s = await state() const pkg = model.provider?.npm ?? provider.npm ?? provider.id const options = { ...s.providers[provider.id]?.options } + if (pkg.includes("@ai-sdk/openai-compatible") && options["includeUsage"] === undefined) { + options["includeUsage"] = true + } const key = Bun.hash.xxHash32(JSON.stringify({ pkg, options })) const existing = s.sdk.get(key) if (existing) return existing diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 63219e9ae..3232a5f17 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -98,8 +98,8 @@ export namespace ProviderTransform { } if (providerID === "opencode") { result["promptCacheKey"] = sessionID - // result["include"] = ["reasoning.encrypted_content"] - // result["reasoningSummary"] = "auto" + result["include"] = ["reasoning.encrypted_content"] + result["reasoningSummary"] = "detailed" } } return result diff --git a/packages/opencode/src/session/message-v2.ts b/packages/opencode/src/session/message-v2.ts index d92dc3048..538200567 100644 --- a/packages/opencode/src/session/message-v2.ts +++ b/packages/opencode/src/session/message-v2.ts @@ -117,6 +117,7 @@ export namespace MessageV2 { end: z.number().optional(), }) .optional(), + metadata: z.record(z.string(), z.any()).optional(), }).meta({ ref: "TextPart", }) @@ -140,6 +141,7 @@ export namespace MessageV2 { callID: z.string(), tool: z.string(), state: ToolState, + metadata: z.record(z.string(), z.any()).optional(), }).meta({ ref: "ToolPart", }) @@ -524,6 +526,7 @@ export namespace MessageV2 { { type: "text", text: part.text, + providerMetadata: part.metadata, }, ] if (part.type === "step-start") @@ -541,6 +544,7 @@ export namespace MessageV2 { toolCallId: part.callID, input: part.state.input, output: part.state.time.compacted ? "[Old tool result content cleared]" : part.state.output, + callProviderMetadata: part.metadata, }, ] if (part.state.status === "error") @@ -551,6 +555,7 @@ export namespace MessageV2 { toolCallId: part.callID, input: part.state.input, errorText: part.state.error, + callProviderMetadata: part.metadata, }, ] } diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 420eb104d..75ad6891a 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -892,6 +892,7 @@ export namespace SessionPrompt { time: { start: Date.now(), }, + metadata: value.providerMetadata, } break @@ -913,6 +914,7 @@ export namespace SessionPrompt { ...part.time, end: Date.now(), } + if (value.providerMetadata) part.metadata = value.providerMetadata await Session.updatePart(part) delete reasoningMap[value.id] } @@ -954,6 +956,7 @@ export namespace SessionPrompt { start: Date.now(), }, }, + metadata: value.providerMetadata, }) toolcalls[value.toolCallId] = part as MessageV2.ToolPart } @@ -1042,12 +1045,14 @@ export namespace SessionPrompt { time: { start: Date.now(), }, + metadata: value.providerMetadata, } break case "text-delta": if (currentText) { currentText.text += value.text + if (value.providerMetadata) currentText.metadata = value.providerMetadata if (currentText.text) await Session.updatePart(currentText) } break @@ -1059,6 +1064,7 @@ export namespace SessionPrompt { start: Date.now(), end: Date.now(), } + if (value.providerMetadata) currentText.metadata = value.providerMetadata await Session.updatePart(currentText) } currentText = undefined diff --git a/packages/tui/internal/tui/tui.go b/packages/tui/internal/tui/tui.go index c1bc73c7c..2de16eab1 100644 --- a/packages/tui/internal/tui/tui.go +++ b/packages/tui/internal/tui/tui.go @@ -956,10 +956,10 @@ func (a Model) home() (string, int, int) { muted := styles.NewStyle().Foreground(t.TextMuted()).Background(t.Background()).Render open := ` - -█▀▀█ █▀▀█ █▀▀█ █▀▀▄ -█░░█ █░░█ █▀▀▀ █░░█ -▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀ ▀` + +█▀▀█ █▀▀█ █▀▀█ █▀▀▄ +█░░█ █░░█ █▀▀▀ █░░█ +▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀ ▀ ` code := ` ▄ @@ -967,7 +967,6 @@ func (a Model) home() (string, int, int) { █░░░ █░░█ █░░█ █▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀` - logo := lipgloss.JoinHorizontal( lipgloss.Top, muted(open), @@ -1043,7 +1042,7 @@ func (a Model) home() (string, int, int) { ) editorX := max(0, (effectiveWidth-editorWidth)/2) - editorY := (a.height / 2) + (mainHeight / 2) - 2 + editorY := (a.height / 2) + (mainHeight / 2) - 3 if editorLines > 1 { content := a.editor.Content()