@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 +2 -2
- package/src/ai-gateway/ai-gateway.ts +36 -17
- package/src/create-runtime.ts +8 -5
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lota-sdk/core",
|
|
3
|
-
"version": "0.4.
|
|
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.
|
|
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
|
|
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
|
|
995
|
-
|
|
1010
|
+
const resolvedDeps = resolveAiGatewayDeps(deps)
|
|
1011
|
+
const model = resolveProviderModel(resolvedDeps.gateway.provider, modelId, providerId)
|
|
1012
|
+
return resolvedDeps.runPromise(
|
|
996
1013
|
withAiGatewayConcurrency(
|
|
997
|
-
executeGenerateAttemptPlan(
|
|
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,
|
|
1023
|
+
).pipe(Effect.provideService(AiGatewayTag, resolvedDeps.gateway)),
|
|
1007
1024
|
)
|
|
1008
1025
|
},
|
|
1009
1026
|
wrapStream: ({ params }) => {
|
|
1010
|
-
const
|
|
1011
|
-
|
|
1027
|
+
const resolvedDeps = resolveAiGatewayDeps(deps)
|
|
1028
|
+
const model = resolveProviderModel(resolvedDeps.gateway.provider, modelId, providerId)
|
|
1029
|
+
return resolvedDeps.runPromise(
|
|
1012
1030
|
withAiGatewayStreamConcurrency(
|
|
1013
|
-
executeStreamAttemptPlan(
|
|
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
|
-
|
|
1039
|
+
resolvedDeps.runFork,
|
|
1022
1040
|
).pipe(
|
|
1023
1041
|
Effect.map(({ result }) => result),
|
|
1024
|
-
Effect.provideService(AiGatewayTag,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1133
|
-
|
|
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,
|
|
1161
|
+
).pipe(Effect.provideService(AiGatewayTag, resolvedDeps.gateway)),
|
|
1143
1162
|
)
|
|
1144
1163
|
},
|
|
1145
1164
|
},
|
package/src/create-runtime.ts
CHANGED
|
@@ -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.
|
|
83
|
-
*
|
|
84
|
-
*
|
|
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
|
|
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.' })
|