@lota-sdk/core 0.4.40 → 0.4.42

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.40",
3
+ "version": "0.4.42",
4
4
  "files": [
5
5
  "src",
6
6
  "infrastructure/schema"
@@ -32,7 +32,7 @@
32
32
  "@ai-sdk/provider": "^3.0.9",
33
33
  "@chat-adapter/slack": "^4.26.0",
34
34
  "@chat-adapter/state-ioredis": "^4.26.0",
35
- "@lota-sdk/shared": "0.4.40",
35
+ "@lota-sdk/shared": "0.4.42",
36
36
  "@mendable/firecrawl-js": "^4.20.0",
37
37
  "@surrealdb/node": "^3.0.3",
38
38
  "ai": "^6.0.170",
@@ -10,7 +10,6 @@ import { ERROR_TAGS, AiGenerationError, ConfigurationError } from '../effect/err
10
10
  import { RuntimeConfigServiceTag } from '../effect/services'
11
11
  import { openRouterEmbeddingModel } from '../embeddings/openrouter'
12
12
  import { isRecord, readString } from '../utils/string'
13
- import { buildAiGatewayCacheHeaders } from './cache-headers'
14
13
 
15
14
  type AiGatewayChatResponse = { body?: unknown }
16
15
  type AiGatewayTransformParamsOptions = Parameters<NonNullable<LanguageModelMiddleware['transformParams']>>[0]
@@ -473,23 +472,6 @@ function withAiGatewayStreamIdleTimeout(
473
472
  })
474
473
  }
475
474
 
476
- function mergeAiGatewayHeaders(
477
- existingHeaders: AiGatewayCallOptions['headers'] | undefined,
478
- additionalHeaders: Record<string, string>,
479
- ): Record<string, string> {
480
- const merged = new Headers(existingHeaders as HeadersInit | undefined)
481
- for (const [key, value] of Object.entries(additionalHeaders)) {
482
- if (!merged.has(key)) {
483
- merged.set(key, value)
484
- }
485
- }
486
- return Object.fromEntries(merged.entries())
487
- }
488
-
489
- function withDefaultAiGatewayCacheHeaders(params: AiGatewayCallOptions): AiGatewayCallOptions {
490
- return { ...params, headers: mergeAiGatewayHeaders(params.headers, buildAiGatewayCacheHeaders('lota-sdk')) }
491
- }
492
-
493
475
  function normalizeAiGatewayUrlEffect(value: string): Effect.Effect<string, ConfigurationError> {
494
476
  const trimmed = value.trim()
495
477
  if (!trimmed) {
@@ -1122,13 +1104,11 @@ function createAiGatewayLanguageModelMiddleware(
1122
1104
  specificationVersion: 'v3',
1123
1105
  transformParams: ({ params, type }) =>
1124
1106
  Promise.resolve(
1125
- withDefaultAiGatewayCacheHeaders(
1126
- addAiGatewayReasoningRawChunks(
1127
- normalizeAiGatewayJsonSchemas(
1128
- providerId === OPENAI_CHAT_PROVIDER_ID ? normalizeAiGatewayChatProviderOptions(params, modelId) : params,
1129
- ),
1130
- type,
1107
+ addAiGatewayReasoningRawChunks(
1108
+ normalizeAiGatewayJsonSchemas(
1109
+ providerId === OPENAI_CHAT_PROVIDER_ID ? normalizeAiGatewayChatProviderOptions(params, modelId) : params,
1131
1110
  ),
1111
+ type,
1132
1112
  ),
1133
1113
  ),
1134
1114
  wrapGenerate: ({ params }) => {
@@ -20,4 +20,3 @@ export {
20
20
  normalizeAiGatewayUrl,
21
21
  } from './ai-gateway'
22
22
  export type { AiGatewayDeps, AiGatewayModels, RuntimeBridge } from './ai-gateway'
23
- export * from './cache-headers'
@@ -1,4 +1,5 @@
1
1
  export {
2
+ AI_GATEWAY_FAST_RERANK_MODEL_ID,
2
3
  AI_GATEWAY_REASONING_SUMMARY_LEVEL,
3
4
  OPENROUTER_GEMINI_PRO_MODEL_ID,
4
5
  OPENAI_HIGH_REASONING_PROVIDER_OPTIONS,
@@ -5,7 +5,7 @@ import { z } from 'zod'
5
5
  import type { CoreThreadProfile } from '../config/agent-defaults'
6
6
  import type { AgentFactory, AgentRuntimeConfigProvider, AgentToolBuilder } from '../config/agent-types'
7
7
  import { DEFAULT_AI_GATEWAY_URL } from '../config/constants'
8
- import { OPENROUTER_FAST_RERANK_MODEL_ID } from '../config/model-constants'
8
+ import { AI_GATEWAY_FAST_RERANK_MODEL_ID } from '../config/model-constants'
9
9
  import type { LotaThreadConfig, ThreadBootstrapWelcomeConfig } from '../config/thread-defaults'
10
10
  import type { RecordIdRef } from '../db/record-id'
11
11
  import type { NotificationService } from '../services/notification.service'
@@ -239,13 +239,13 @@ export const LotaRuntimeConfigSchema = z.object({
239
239
  searchK: z.coerce.number().int().positive().default(6),
240
240
  embeddingCacheTtlSeconds: z.coerce.number().int().positive().default(7200),
241
241
  rerankerStrategy: MemoryRerankerStrategySchema.default('rerank'),
242
- rerankerModelId: z.string().trim().min(1).default(OPENROUTER_FAST_RERANK_MODEL_ID),
242
+ rerankerModelId: z.string().trim().min(1).default(AI_GATEWAY_FAST_RERANK_MODEL_ID),
243
243
  })
244
244
  .default({
245
245
  searchK: 6,
246
246
  embeddingCacheTtlSeconds: 7200,
247
247
  rerankerStrategy: 'rerank',
248
- rerankerModelId: OPENROUTER_FAST_RERANK_MODEL_ID,
248
+ rerankerModelId: AI_GATEWAY_FAST_RERANK_MODEL_ID,
249
249
  }),
250
250
  threads: threadConfigSchema.default({}),
251
251
  agents: agentsConfigSchema,
@@ -342,7 +342,7 @@ export const lotaRuntimeEnvConfig = Config.all({
342
342
  memorySearchK: Config.number('MEMORY_SEARCH_K').pipe(Config.withDefault(6)),
343
343
  memoryRerankerStrategy: Config.string('MEMORY_RERANKER_STRATEGY').pipe(Config.withDefault('rerank')),
344
344
  memoryRerankerModelId: Config.string('MEMORY_RERANKER_MODEL_ID').pipe(
345
- Config.withDefault(OPENROUTER_FAST_RERANK_MODEL_ID),
345
+ Config.withDefault(AI_GATEWAY_FAST_RERANK_MODEL_ID),
346
346
  ),
347
347
  otlpBaseUrl: Config.string('OTLP_BASE_URL').pipe(Config.option),
348
348
  otlpServiceName: Config.string('OTLP_SERVICE_NAME').pipe(Config.withDefault('lota-sdk')),
@@ -2,7 +2,7 @@ import { Context, Effect, Layer } from 'effect'
2
2
  import * as Schema from 'effect/Schema'
3
3
  import { z } from 'zod'
4
4
 
5
- import { OPENROUTER_FAST_RERANK_MODEL_ID } from '../../config/model-constants'
5
+ import { AI_GATEWAY_FAST_RERANK_MODEL_ID } from '../../config/model-constants'
6
6
  import { ConfigurationError, ERROR_TAGS } from '../../effect/errors'
7
7
  import { RuntimeConfigServiceTag } from '../../effect/services'
8
8
  import { toValidationError } from '../../effect/zod'
@@ -11,6 +11,7 @@ import type { ResolvedLotaRuntimeConfig } from '../../runtime/runtime-config'
11
11
  const AI_GATEWAY_VIRTUAL_KEY_HEADER = 'x-bf-vk' as const
12
12
  const EXPECTED_GATEWAY_KEY_PREFIX = 'sk-bf-' as const
13
13
  const OPENROUTER_MODEL_PREFIX = 'openrouter/' as const
14
+ const LEGACY_COHERE_RERANK_MODEL_IDS = new Set(['cohere/rerank-4-fast', 'openrouter/cohere/rerank-4-fast'])
14
15
 
15
16
  const RerankRequestBodySchema = Schema.Struct({
16
17
  model: Schema.String,
@@ -58,6 +59,8 @@ function normalizeRerankModelId(modelId: string): string {
58
59
  throw new ConfigurationError({ message: 'Rerank model id is required.', key: 'rerankModelId' })
59
60
  }
60
61
 
62
+ if (LEGACY_COHERE_RERANK_MODEL_IDS.has(normalized)) return AI_GATEWAY_FAST_RERANK_MODEL_ID
63
+
61
64
  return normalized.startsWith(OPENROUTER_MODEL_PREFIX) ? normalized.slice(OPENROUTER_MODEL_PREFIX.length) : normalized
62
65
  }
63
66
 
@@ -137,7 +140,7 @@ export function makeRerankService(config: ResolvedLotaRuntimeConfig) {
137
140
  const configured = readConfiguredRerankModelId()
138
141
  if (configured) return normalizeRerankModelId(configured)
139
142
 
140
- return OPENROUTER_FAST_RERANK_MODEL_ID
143
+ return AI_GATEWAY_FAST_RERANK_MODEL_ID
141
144
  }
142
145
 
143
146
  return {
@@ -2,7 +2,6 @@ import type { CreateHelperToolLoopAgentOptions } from '@lota-sdk/shared'
2
2
  import { ToolLoopAgent } from 'ai'
3
3
 
4
4
  import type { AiGatewayModels } from '../ai-gateway/ai-gateway'
5
- import { buildAiGatewayDirectCacheHeaders } from '../ai-gateway/cache-headers'
6
5
  import { OPENROUTER_STRUCTURED_HELPER_MODEL_ID } from '../config/model-constants'
7
6
  import { resolveHelperAgentOptions } from './helper-agent-options'
8
7
 
@@ -33,7 +32,6 @@ export function makeContextCompactionAgentFactory(models: AiGatewayModels) {
33
32
  new ToolLoopAgent({
34
33
  id: 'context-compaction',
35
34
  model: models.chatModel(OPENROUTER_STRUCTURED_HELPER_MODEL_ID),
36
- headers: buildAiGatewayDirectCacheHeaders('lota-sdk'),
37
35
  ...resolveHelperAgentOptions(options, { instructions: CONTEXT_COMPACTION_PROMPT }),
38
36
  })
39
37
  }
@@ -2,7 +2,6 @@ import type { CreateHelperToolLoopAgentOptions } from '@lota-sdk/shared'
2
2
  import { ToolLoopAgent } from 'ai'
3
3
 
4
4
  import type { AiGatewayModels } from '../ai-gateway/ai-gateway'
5
- import { buildAiGatewayDirectCacheHeaders } from '../ai-gateway/cache-headers'
6
5
  import {
7
6
  OPENROUTER_LOW_REASONING_PROVIDER_OPTIONS,
8
7
  OPENROUTER_STRUCTURED_HELPER_MODEL_ID,
@@ -34,7 +33,6 @@ export function makeMemoryRerankerAgentFactory(models: AiGatewayModels) {
34
33
  new ToolLoopAgent({
35
34
  id: 'memory-reranker',
36
35
  model: models.chatModel(OPENROUTER_STRUCTURED_HELPER_MODEL_ID),
37
- headers: buildAiGatewayDirectCacheHeaders('lota-sdk'),
38
36
  providerOptions: OPENROUTER_LOW_REASONING_PROVIDER_OPTIONS,
39
37
  ...resolveHelperAgentOptions(options),
40
38
  })
@@ -2,7 +2,6 @@ import type { CreateHelperToolLoopAgentOptions } from '@lota-sdk/shared'
2
2
  import { ToolLoopAgent } from 'ai'
3
3
 
4
4
  import type { AiGatewayModels } from '../ai-gateway/ai-gateway'
5
- import { buildAiGatewayDirectCacheHeaders } from '../ai-gateway/cache-headers'
6
5
  import {
7
6
  OPENROUTER_STRUCTURED_HELPER_MODEL_ID,
8
7
  OPENROUTER_HIGH_REASONING_PROVIDER_OPTIONS,
@@ -54,7 +53,6 @@ export function makeOrgMemoryAgentFactory(models: AiGatewayModels) {
54
53
  new ToolLoopAgent({
55
54
  id: 'org-memory',
56
55
  model: models.chatModel(OPENROUTER_STRUCTURED_HELPER_MODEL_ID),
57
- headers: buildAiGatewayDirectCacheHeaders('lota-sdk'),
58
56
  providerOptions: OPENROUTER_HIGH_REASONING_PROVIDER_OPTIONS,
59
57
  ...resolveHelperAgentOptions(options),
60
58
  })
@@ -2,7 +2,6 @@ import type { CreateHelperToolLoopAgentOptions } from '@lota-sdk/shared'
2
2
  import { ToolLoopAgent } from 'ai'
3
3
 
4
4
  import type { AiGatewayModels } from '../ai-gateway/ai-gateway'
5
- import { buildAiGatewayDirectCacheHeaders } from '../ai-gateway/cache-headers'
6
5
  import type { ResolvedAgentConfig } from '../config/agent-defaults'
7
6
  import { OPENROUTER_STRUCTURED_HELPER_MODEL_ID } from '../config/model-constants'
8
7
  import { resolveHelperAgentOptions } from './helper-agent-options'
@@ -78,7 +77,6 @@ export function makeRecentActivityTitleRefinerAgentFactory(models: AiGatewayMode
78
77
  new ToolLoopAgent({
79
78
  id: 'recent-activity-title-refiner',
80
79
  model: models.chatModel(OPENROUTER_STRUCTURED_HELPER_MODEL_ID),
81
- headers: buildAiGatewayDirectCacheHeaders('lota-sdk'),
82
80
  ...resolveHelperAgentOptions(options, {
83
81
  instructions: buildRecentActivityTitleRefinerPrompt(agentConfig),
84
82
  maxOutputTokens: RECENT_ACTIVITY_TITLE_MAX_TOKENS,
@@ -2,7 +2,6 @@ import type { CreateHelperToolLoopAgentOptions } from '@lota-sdk/shared'
2
2
  import { ToolLoopAgent } from 'ai'
3
3
 
4
4
  import type { AiGatewayModels } from '../ai-gateway/ai-gateway'
5
- import { buildAiGatewayDirectCacheHeaders } from '../ai-gateway/cache-headers'
6
5
  import {
7
6
  OPENROUTER_STRUCTURED_HELPER_MODEL_ID,
8
7
  OPENROUTER_HIGH_REASONING_PROVIDER_OPTIONS,
@@ -29,7 +28,6 @@ export function makeRegularChatMemoryDigestAgentFactory(models: AiGatewayModels)
29
28
  new ToolLoopAgent({
30
29
  id: 'regular-chat-memory-digest',
31
30
  model: models.chatModel(OPENROUTER_STRUCTURED_HELPER_MODEL_ID),
32
- headers: buildAiGatewayDirectCacheHeaders('lota-sdk'),
33
31
  providerOptions: OPENROUTER_HIGH_REASONING_PROVIDER_OPTIONS,
34
32
  ...resolveHelperAgentOptions(options, {
35
33
  instructions: regularChatMemoryDigestPrompt,
@@ -3,7 +3,6 @@ import { ToolLoopAgent } from 'ai'
3
3
  import { z } from 'zod'
4
4
 
5
5
  import type { AiGatewayModels } from '../ai-gateway/ai-gateway'
6
- import { buildAiGatewayDirectCacheHeaders } from '../ai-gateway/cache-headers'
7
6
  import {
8
7
  OPENROUTER_STRUCTURED_HELPER_MODEL_ID,
9
8
  OPENROUTER_HIGH_REASONING_PROVIDER_OPTIONS,
@@ -47,7 +46,6 @@ export function makeSkillExtractorAgentFactory(models: AiGatewayModels) {
47
46
  new ToolLoopAgent({
48
47
  id: 'skill-extractor',
49
48
  model: models.chatModel(OPENROUTER_STRUCTURED_HELPER_MODEL_ID),
50
- headers: buildAiGatewayDirectCacheHeaders('lota-sdk'),
51
49
  providerOptions: OPENROUTER_HIGH_REASONING_PROVIDER_OPTIONS,
52
50
  ...resolveHelperAgentOptions(options, {
53
51
  instructions: skillExtractorPrompt,
@@ -3,7 +3,6 @@ import { ToolLoopAgent } from 'ai'
3
3
  import { z } from 'zod'
4
4
 
5
5
  import type { AiGatewayModels } from '../ai-gateway/ai-gateway'
6
- import { buildAiGatewayDirectCacheHeaders } from '../ai-gateway/cache-headers'
7
6
  import {
8
7
  OPENROUTER_STRUCTURED_HELPER_MODEL_ID,
9
8
  OPENROUTER_HIGH_REASONING_PROVIDER_OPTIONS,
@@ -71,7 +70,6 @@ export function makeSkillManagerAgentFactory(models: AiGatewayModels) {
71
70
  new ToolLoopAgent({
72
71
  id: 'skill-manager',
73
72
  model: models.chatModel(OPENROUTER_STRUCTURED_HELPER_MODEL_ID),
74
- headers: buildAiGatewayDirectCacheHeaders('lota-sdk'),
75
73
  providerOptions: OPENROUTER_HIGH_REASONING_PROVIDER_OPTIONS,
76
74
  ...resolveHelperAgentOptions(options, {
77
75
  instructions: skillManagerPrompt,
@@ -3,7 +3,6 @@ import { Effect } from 'effect'
3
3
  import { z } from 'zod'
4
4
 
5
5
  import type { AiGatewayModels } from '../ai-gateway/ai-gateway'
6
- import { buildAiGatewayDirectCacheHeaders } from '../ai-gateway/cache-headers'
7
6
  import type { ResolvedAgentConfig } from '../config/agent-defaults'
8
7
  import { chatLogger } from '../config/logger'
9
8
  import type { ValidationError } from '../effect/errors'
@@ -182,7 +181,6 @@ function generateRouterObjectEffect<TSchema extends z.ZodTypeAny>(params: {
182
181
  try: () =>
183
182
  generateObject({
184
183
  model: params.aiGatewayModels.chatModel(modelId),
185
- headers: buildAiGatewayDirectCacheHeaders('lota-sdk'),
186
184
  schema: params.schema,
187
185
  system: params.system,
188
186
  prompt: params.prompt,
@@ -2,7 +2,6 @@ import type { CreateHelperToolLoopAgentOptions } from '@lota-sdk/shared'
2
2
  import { ToolLoopAgent } from 'ai'
3
3
 
4
4
  import type { AiGatewayModels } from '../ai-gateway/ai-gateway'
5
- import { buildAiGatewayDirectCacheHeaders } from '../ai-gateway/cache-headers'
6
5
  import {
7
6
  OPENROUTER_FAST_REASONING_MODEL_ID,
8
7
  OPENROUTER_MINIMAL_REASONING_PROVIDER_OPTIONS,
@@ -35,7 +34,6 @@ export function makeThreadTitleGeneratorAgentFactory(models: AiGatewayModels) {
35
34
  new ToolLoopAgent({
36
35
  id: 'thread-title-generator',
37
36
  model: models.chatModel(OPENROUTER_FAST_REASONING_MODEL_ID),
38
- headers: buildAiGatewayDirectCacheHeaders('lota-sdk'),
39
37
  providerOptions: OPENROUTER_MINIMAL_REASONING_PROVIDER_OPTIONS,
40
38
  ...resolveHelperAgentOptions(options, {
41
39
  instructions: THREAD_TITLE_GENERATOR_PROMPT,
@@ -3,7 +3,6 @@ import type { Effect } from 'effect'
3
3
 
4
4
  import type { AiGatewayModels } from '../ai-gateway/ai-gateway'
5
5
  import { aiGatewayChatModel, getDefaultAiGatewayRunPromise } from '../ai-gateway/ai-gateway'
6
- import { buildAiGatewayStrictSemanticCacheHeaders } from '../ai-gateway/cache-headers'
7
6
  import {
8
7
  OPENROUTER_FAST_REASONING_MODEL_ID,
9
8
  OPENROUTER_LOW_REASONING_PROVIDER_OPTIONS,
@@ -28,7 +27,6 @@ export const researchTopicTool = createDelegatedAgentToolWithContext<ResearchTop
28
27
  ? aiGatewayModels.chatModel(OPENROUTER_FAST_REASONING_MODEL_ID)
29
28
  : aiGatewayChatModel(OPENROUTER_FAST_REASONING_MODEL_ID),
30
29
  providerOptions: OPENROUTER_LOW_REASONING_PROVIDER_OPTIONS,
31
- headers: buildAiGatewayStrictSemanticCacheHeaders('researchTopic'),
32
30
  instructions: RESEARCHER_PROMPT,
33
31
  createTools: ({ firecrawl, runPromise }) => ({
34
32
  searchWeb: searchWebTool.create({ firecrawl, runPromise }),
@@ -1,42 +0,0 @@
1
- const AI_GATEWAY_CACHE_KEY_HEADER = 'x-bf-cache-key'
2
- const AI_GATEWAY_CACHE_TTL_HEADER = 'x-bf-cache-ttl'
3
- const AI_GATEWAY_CACHE_THRESHOLD_HEADER = 'x-bf-cache-threshold'
4
- const AI_GATEWAY_CACHE_TYPE_HEADER = 'x-bf-cache-type'
5
-
6
- export const AI_GATEWAY_STRICT_SEMANTIC_CACHE_THRESHOLD = 0.975
7
-
8
- export type AiGatewayCacheType = 'direct' | 'semantic'
9
-
10
- export function toAiGatewayCacheKeyPart(value: string): string {
11
- const normalized = value
12
- .trim()
13
- .toLowerCase()
14
- .replace(/[^a-z0-9:_-]+/g, '-')
15
- .replace(/-+/g, '-')
16
- return normalized.replace(/^-+|-+$/g, '') || 'request'
17
- }
18
-
19
- export function buildAiGatewayCacheHeaders(
20
- cacheKey: string,
21
- ttl?: string,
22
- threshold?: number,
23
- cacheType?: AiGatewayCacheType,
24
- ): Record<string, string> {
25
- const headers: Record<string, string> = { [AI_GATEWAY_CACHE_KEY_HEADER]: cacheKey }
26
- if (ttl) headers[AI_GATEWAY_CACHE_TTL_HEADER] = ttl
27
- if (typeof threshold === 'number') headers[AI_GATEWAY_CACHE_THRESHOLD_HEADER] = String(threshold)
28
- if (cacheType) headers[AI_GATEWAY_CACHE_TYPE_HEADER] = cacheType
29
- return headers
30
- }
31
-
32
- export function buildAiGatewayDirectCacheHeaders(cacheKey: string, ttl?: string): Record<string, string> {
33
- return buildAiGatewayCacheHeaders(cacheKey, ttl, undefined, 'direct')
34
- }
35
-
36
- export function buildAiGatewayStrictSemanticCacheHeaders(
37
- cacheKey: string,
38
- ttl?: string,
39
- threshold = AI_GATEWAY_STRICT_SEMANTIC_CACHE_THRESHOLD,
40
- ): Record<string, string> {
41
- return buildAiGatewayCacheHeaders(cacheKey, ttl, threshold, 'semantic')
42
- }