diff --git a/packages/core/src/plugin/provider/google-vertex.ts b/packages/core/src/plugin/provider/google-vertex.ts index 964f15fd7e4..28ff1e22428 100644 --- a/packages/core/src/plugin/provider/google-vertex.ts +++ b/packages/core/src/plugin/provider/google-vertex.ts @@ -14,7 +14,7 @@ const decodeADCFile = Schema.decodeUnknownOption( Schema.fromJsonString(Schema.Struct({ quota_project_id: Schema.optional(Schema.String) })), ) -function resolveProject(options: Record) { +function resolveProject(options: Record) { // models.dev advertises GOOGLE_VERTEX_PROJECT for Vertex, while Google SDKs // and ADC examples commonly use the broader Google Cloud project aliases. const project = @@ -26,7 +26,7 @@ function resolveProject(options: Record) { return typeof project === "string" ? project : undefined } -function resolveLocation(options: Record) { +function resolveLocation(options: Record) { const location = options.location ?? process.env.GOOGLE_VERTEX_LOCATION ?? @@ -203,10 +203,11 @@ export const GoogleVertexPlugin = define({ const location = resolveLocation(settings) ?? "global" for (const model of models.list(item.provider.id)) { if (typeof model.settings?.baseURL !== "string") continue + const baseURL = replaceVertexVars(model.settings.baseURL, project, location) models.update(item.provider.id, model.id, (draft) => { draft.settings = { ...draft.settings, - baseURL: replaceVertexVars(String(draft.settings?.baseURL), project, location), + baseURL, } }) } diff --git a/packages/core/src/plugin/provider/xai.ts b/packages/core/src/plugin/provider/xai.ts index 8b826f79188..0c267fcb82c 100644 --- a/packages/core/src/plugin/provider/xai.ts +++ b/packages/core/src/plugin/provider/xai.ts @@ -70,7 +70,7 @@ const device = (app: App.Info) => ), ), ), - refresh: (value) => refresh(deviceMethodID, Credential.OAuth.make({ ...value, methodID: deviceMethodID }), app), + refresh: (value) => refresh(deviceMethodID, value, app), }) satisfies IntegrationOAuthMethodRegistration export const XAIPlugin = define({ diff --git a/packages/core/src/session/projector.ts b/packages/core/src/session/projector.ts index 041bfe86bde..f7602eafda7 100644 --- a/packages/core/src/session/projector.ts +++ b/packages/core/src/session/projector.ts @@ -17,6 +17,7 @@ import { InstructionEntry } from "./instruction-entry.js" import { Slug } from "../util/slug.js" import { FSUtil } from "@opencode/util/fs-util" import { Money } from "@opencode/schema/money" +import type { TokenUsage } from "@opencode/schema/token-usage" import { Worktree } from "@opencode/schema/worktree" import { Project } from "@opencode/schema/project" import { AbsolutePath, RelativePath } from "../schema.js" @@ -36,12 +37,7 @@ export class SessionAlreadyProjected extends Error {} type Usage = { cost: number - tokens: { - input: number - output: number - reasoning: number - cache: { read: number; write: number } - } + tokens: TokenUsage.Info } const ForkBatchSize = 500 diff --git a/packages/core/src/session/stats.ts b/packages/core/src/session/stats.ts index 17a51576ec8..4b4418845dc 100644 --- a/packages/core/src/session/stats.ts +++ b/packages/core/src/session/stats.ts @@ -1,6 +1,6 @@ export * as SessionStats from "./stats.js" -import { DateTime, Effect, Option, Schema } from "effect" +import { DateTime, Effect, Option, Schema, type Types } from "effect" import { and, eq, gte, inArray, lt, sql } from "drizzle-orm" import { Model } from "@opencode/schema/model" import { Money } from "@opencode/schema/money" @@ -22,12 +22,7 @@ type Input = { readonly tools?: ToolMode } -type Tokens = { - input: number - output: number - reasoning: number - cache: { read: number; write: number } -} +type Tokens = Types.DeepMutable type MessageRow = { sessionID: string @@ -375,7 +370,7 @@ function emptyTokens(): Tokens { return { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } } } -function addTokens(target: Tokens, source: Tokens) { +function addTokens(target: Tokens, source: TokenUsage.Info) { target.input += source.input target.output += source.output target.reasoning += source.reasoning