@lota-sdk/core 0.4.15 → 0.4.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lota-sdk/core",
3
- "version": "0.4.15",
3
+ "version": "0.4.16",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -31,7 +31,7 @@
31
31
  "@ai-sdk/openai": "^3.0.53",
32
32
  "@chat-adapter/slack": "^4.26.0",
33
33
  "@chat-adapter/state-ioredis": "^4.26.0",
34
- "@lota-sdk/shared": "0.4.15",
34
+ "@lota-sdk/shared": "0.4.16",
35
35
  "@mendable/firecrawl-js": "^4.18.3",
36
36
  "@surrealdb/node": "^3.0.3",
37
37
  "ai": "^6.0.168",
@@ -977,10 +977,26 @@ export type AiGatewayDeps = {
977
977
  runFork: AiGatewayRunFork
978
978
  }
979
979
 
980
+ let defaultAiGatewayDeps: AiGatewayDeps | undefined
981
+
982
+ export function setDefaultAiGatewayDeps(deps: AiGatewayDeps): void {
983
+ defaultAiGatewayDeps = deps
984
+ }
985
+
986
+ function resolveAiGatewayDeps(deps: AiGatewayDeps | undefined): AiGatewayDeps {
987
+ if (deps) return deps
988
+ if (defaultAiGatewayDeps) return defaultAiGatewayDeps
989
+
990
+ throw new Error(
991
+ '[ai-gateway] aiGatewayModel(...) was used before createLotaRuntime initialized the AI gateway. ' +
992
+ 'Create a LotaRuntime first, or use runtime.ai.model/chatModel/embeddingModel.',
993
+ )
994
+ }
995
+
980
996
  function createAiGatewayLanguageModelMiddleware(
981
997
  modelId: string,
982
998
  providerId: string,
983
- deps: AiGatewayDeps,
999
+ deps?: AiGatewayDeps,
984
1000
  ): LanguageModelMiddleware {
985
1001
  return {
986
1002
  specificationVersion: 'v3',
@@ -991,10 +1007,11 @@ function createAiGatewayLanguageModelMiddleware(
991
1007
  ),
992
1008
  ),
993
1009
  wrapGenerate: ({ params }) => {
994
- const model = resolveProviderModel(deps.gateway.provider, modelId, providerId)
995
- return deps.runPromise(
1010
+ const resolvedDeps = resolveAiGatewayDeps(deps)
1011
+ const model = resolveProviderModel(resolvedDeps.gateway.provider, modelId, providerId)
1012
+ return resolvedDeps.runPromise(
996
1013
  withAiGatewayConcurrency(
997
- executeGenerateAttemptPlan(deps.runtimeConfig, modelId, params, () => model.doGenerate(params)).pipe(
1014
+ executeGenerateAttemptPlan(resolvedDeps.runtimeConfig, modelId, params, () => model.doGenerate(params)).pipe(
998
1015
  Effect.map(({ result }) => ({
999
1016
  ...result,
1000
1017
  content: injectAiGatewayChatReasoningContent(
@@ -1003,14 +1020,15 @@ function createAiGatewayLanguageModelMiddleware(
1003
1020
  ),
1004
1021
  })),
1005
1022
  ),
1006
- ).pipe(Effect.provideService(AiGatewayTag, deps.gateway)),
1023
+ ).pipe(Effect.provideService(AiGatewayTag, resolvedDeps.gateway)),
1007
1024
  )
1008
1025
  },
1009
1026
  wrapStream: ({ params }) => {
1010
- const model = resolveProviderModel(deps.gateway.provider, modelId, providerId)
1011
- return deps.runPromise(
1027
+ const resolvedDeps = resolveAiGatewayDeps(deps)
1028
+ const model = resolveProviderModel(resolvedDeps.gateway.provider, modelId, providerId)
1029
+ return resolvedDeps.runPromise(
1012
1030
  withAiGatewayStreamConcurrency(
1013
- executeStreamAttemptPlan(deps.runtimeConfig, modelId, params, () => model.doStream(params)).pipe(
1031
+ executeStreamAttemptPlan(resolvedDeps.runtimeConfig, modelId, params, () => model.doStream(params)).pipe(
1014
1032
  Effect.map((attempt) => ({
1015
1033
  ...attempt,
1016
1034
  result: isReasoningEnabled(params)
@@ -1018,10 +1036,10 @@ function createAiGatewayLanguageModelMiddleware(
1018
1036
  : attempt.result,
1019
1037
  })),
1020
1038
  ),
1021
- deps.runFork,
1039
+ resolvedDeps.runFork,
1022
1040
  ).pipe(
1023
1041
  Effect.map(({ result }) => result),
1024
- Effect.provideService(AiGatewayTag, deps.gateway),
1042
+ Effect.provideService(AiGatewayTag, resolvedDeps.gateway),
1025
1043
  ),
1026
1044
  )
1027
1045
  },
@@ -1097,7 +1115,7 @@ function createAiGatewayEmbeddingModelPlaceholder(modelId: string): AiGatewayEmb
1097
1115
  }
1098
1116
  }
1099
1117
 
1100
- export function aiGatewayModel(modelId: string, deps: AiGatewayDeps) {
1118
+ export function aiGatewayModel(modelId: string, deps?: AiGatewayDeps) {
1101
1119
  if (isOpenRouterModel(modelId)) {
1102
1120
  return aiGatewayChatModel(modelId, deps)
1103
1121
  }
@@ -1110,11 +1128,11 @@ export function aiGatewayModel(modelId: string, deps: AiGatewayDeps) {
1110
1128
  )
1111
1129
  }
1112
1130
 
1113
- export function aiGatewayOpenRouterResponseHealingModel(modelId: string, deps: AiGatewayDeps) {
1131
+ export function aiGatewayOpenRouterResponseHealingModel(modelId: string, deps?: AiGatewayDeps) {
1114
1132
  return aiGatewayChatModel(modelId, deps)
1115
1133
  }
1116
1134
 
1117
- export function aiGatewayChatModel(modelId: string, deps: AiGatewayDeps) {
1135
+ export function aiGatewayChatModel(modelId: string, deps?: AiGatewayDeps) {
1118
1136
  return withAiGatewayDevTools(
1119
1137
  wrapLanguageModel({
1120
1138
  model: createAiGatewayLanguageModelPlaceholder(modelId, OPENAI_CHAT_PROVIDER_ID),
@@ -1123,14 +1141,15 @@ export function aiGatewayChatModel(modelId: string, deps: AiGatewayDeps) {
1123
1141
  )
1124
1142
  }
1125
1143
 
1126
- export function aiGatewayEmbeddingModel(modelId: string, deps: AiGatewayDeps) {
1144
+ export function aiGatewayEmbeddingModel(modelId: string, deps?: AiGatewayDeps) {
1127
1145
  return wrapEmbeddingModel({
1128
1146
  model: createAiGatewayEmbeddingModelPlaceholder(modelId),
1129
1147
  middleware: {
1130
1148
  specificationVersion: 'v3',
1131
1149
  wrapEmbed: ({ params }) => {
1132
- const embeddingModel = deps.gateway.provider.embeddingModel(modelId)
1133
- return deps.runPromise(
1150
+ const resolvedDeps = resolveAiGatewayDeps(deps)
1151
+ const embeddingModel = resolvedDeps.gateway.provider.embeddingModel(modelId)
1152
+ return resolvedDeps.runPromise(
1134
1153
  withAiGatewayConcurrency(
1135
1154
  withAiGatewayResilience(
1136
1155
  'ai-gateway.embed',
@@ -1139,7 +1158,7 @@ export function aiGatewayEmbeddingModel(modelId: string, deps: AiGatewayDeps) {
1139
1158
  catch: (cause) => classifyAiGatewayError('ai-gateway.embed', cause),
1140
1159
  }),
1141
1160
  ).pipe(Effect.withSpan('AiGateway.embed'), Effect.annotateSpans({ modelId })),
1142
- ).pipe(Effect.provideService(AiGatewayTag, deps.gateway)),
1161
+ ).pipe(Effect.provideService(AiGatewayTag, resolvedDeps.gateway)),
1143
1162
  )
1144
1163
  },
1145
1164
  },
@@ -8,6 +8,7 @@ import {
8
8
  RuntimeBridgeTag,
9
9
  createAiGatewayModels,
10
10
  makeAiGatewayService,
11
+ setDefaultAiGatewayDeps,
11
12
  } from './ai-gateway/ai-gateway'
12
13
  import type { AiGatewayModels, RuntimeBridge } from './ai-gateway/ai-gateway'
13
14
  import { computeSchemaFingerprint } from './db/schema-fingerprint'
@@ -79,9 +80,9 @@ export interface LotaRuntime {
79
80
  config: ResolvedLotaRuntimeConfig
80
81
  plugins: Record<string, LotaPlugin>
81
82
  systemExecutors: Record<string, SystemNodeExecutor>
82
- /** Pre-bound AI gateway model factories. Use instead of the legacy
83
- * `aiGatewayChatModel(modelId)` / `aiGatewayModel(modelId)` module-level
84
- * helpers those now require a `deps` argument. */
83
+ /** Pre-bound AI gateway model factories. Prefer these inside runtime-bound
84
+ * services; the module-level helpers are bound during runtime creation for
85
+ * module-scope agent definitions. */
85
86
  ai: AiGatewayModels
86
87
  connectPluginDatabases(): Promise<void>
87
88
  connect(): Promise<void>
@@ -130,12 +131,14 @@ export async function createLotaRuntime(config: LotaRuntimeConfig): Promise<Lota
130
131
  runPromise: (effect, options) => managedRuntime.runPromise(effect, options),
131
132
  runFork: (effect) => managedRuntime.runFork(effect),
132
133
  }
133
- const aiGatewayModels = createAiGatewayModels({
134
+ const aiGatewayDeps = {
134
135
  gateway: aiGateway,
135
136
  runtimeConfig,
136
137
  runPromise: runtimeBridge.runPromise,
137
138
  runFork: runtimeBridge.runFork,
138
- })
139
+ }
140
+ const aiGatewayModels = createAiGatewayModels(aiGatewayDeps)
141
+ setDefaultAiGatewayDeps(aiGatewayDeps)
139
142
 
140
143
  if (!Effect.runSync(Deferred.succeed(runtimeBridgeDeferred, runtimeBridge))) {
141
144
  throw new ServiceError({ message: 'Failed to initialize the runtime bridge.' })