@inkeep/agents-core 0.74.2 → 0.74.3

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.
Files changed (43) hide show
  1. package/dist/auth/auth-schema.d.ts +227 -227
  2. package/dist/auth/auth-validation-schemas.d.ts +154 -154
  3. package/dist/client-exports.d.ts +2 -1
  4. package/dist/client-exports.js +2 -1
  5. package/dist/constants/models.d.ts +3 -0
  6. package/dist/constants/models.js +3 -0
  7. package/dist/constants/otel-attributes.d.ts +4 -0
  8. package/dist/constants/otel-attributes.js +4 -0
  9. package/dist/data-access/manage/agents.d.ts +5 -5
  10. package/dist/data-access/manage/skills.d.ts +3 -3
  11. package/dist/data-access/manage/subAgentRelations.d.ts +2 -2
  12. package/dist/data-access/manage/subAgents.d.ts +3 -3
  13. package/dist/data-access/manage/tools.d.ts +3 -3
  14. package/dist/data-access/manage/triggers.d.ts +2 -2
  15. package/dist/data-access/runtime/apiKeys.d.ts +8 -8
  16. package/dist/data-access/runtime/apps.d.ts +9 -9
  17. package/dist/data-access/runtime/conversations.d.ts +12 -12
  18. package/dist/data-access/runtime/events.d.ts +1 -1
  19. package/dist/data-access/runtime/feedback.d.ts +2 -2
  20. package/dist/data-access/runtime/messages.d.ts +21 -21
  21. package/dist/data-access/runtime/tasks.d.ts +2 -2
  22. package/dist/db/manage/manage-schema.d.ts +484 -484
  23. package/dist/db/runtime/runtime-schema.d.ts +451 -451
  24. package/dist/index.d.ts +2 -2
  25. package/dist/index.js +2 -2
  26. package/dist/utils/cache-debug-query.d.ts +43 -0
  27. package/dist/utils/cache-debug-query.js +70 -0
  28. package/dist/utils/cache-debug-walk.d.ts +36 -0
  29. package/dist/utils/cache-debug-walk.js +91 -0
  30. package/dist/utils/cache-state.d.ts +36 -0
  31. package/dist/utils/cache-state.js +33 -0
  32. package/dist/utils/error.d.ts +51 -51
  33. package/dist/utils/index.d.ts +2 -2
  34. package/dist/utils/index.js +2 -2
  35. package/dist/utils/model-factory.d.ts +7 -0
  36. package/dist/utils/model-factory.js +18 -2
  37. package/dist/utils/token-estimator.d.ts +1 -0
  38. package/dist/utils/usage-cost-middleware.d.ts +3 -1
  39. package/dist/utils/usage-cost-middleware.js +70 -12
  40. package/dist/validation/drizzle-schema-helpers.d.ts +3 -3
  41. package/dist/validation/schemas/skills.d.ts +34 -34
  42. package/dist/validation/schemas.d.ts +1930 -1930
  43. package/package.json +3 -2
@@ -0,0 +1,70 @@
1
+ import { AI_OPERATIONS, SPAN_KEYS } from "../constants/otel-attributes.js";
2
+ import { FIELD_CONTEXTS, FIELD_DATA_TYPES, OPERATORS, ORDER_DIRECTIONS, QUERY_DEFAULTS, QUERY_EXPRESSIONS, QUERY_TYPES, REQUEST_TYPES, SIGNALS, buildFilterExpression } from "../constants/signoz-queries.js";
3
+
4
+ //#region src/utils/cache-debug-query.ts
5
+ const CACHE_DEBUG_QUERY_NAME = QUERY_EXPRESSIONS.AI_LLM_CALLS;
6
+ const selectField = (name, fieldDataType, fieldContext) => ({
7
+ name,
8
+ fieldDataType,
9
+ fieldContext
10
+ });
11
+ function buildCacheDebugQuery(conversationId, options) {
12
+ const { start, end, projectId, limit = QUERY_DEFAULTS.LIMIT_UNLIMITED } = options;
13
+ const filterItems = [
14
+ {
15
+ key: SPAN_KEYS.CONVERSATION_ID,
16
+ op: OPERATORS.EQUALS,
17
+ value: conversationId
18
+ },
19
+ {
20
+ key: SPAN_KEYS.AI_OPERATION_ID,
21
+ op: OPERATORS.IN,
22
+ value: [AI_OPERATIONS.GENERATE_TEXT, AI_OPERATIONS.STREAM_TEXT]
23
+ },
24
+ ...projectId ? [{
25
+ key: SPAN_KEYS.PROJECT_ID,
26
+ op: OPERATORS.EQUALS,
27
+ value: projectId
28
+ }] : []
29
+ ];
30
+ return {
31
+ start,
32
+ end,
33
+ requestType: REQUEST_TYPES.RAW,
34
+ ...projectId ? { projectId } : {},
35
+ compositeQuery: { queries: [{
36
+ type: QUERY_TYPES.BUILDER_QUERY,
37
+ spec: {
38
+ name: CACHE_DEBUG_QUERY_NAME,
39
+ signal: SIGNALS.TRACES,
40
+ filter: { expression: buildFilterExpression(filterItems) },
41
+ selectFields: [
42
+ selectField(SPAN_KEYS.SPAN_ID, FIELD_DATA_TYPES.STRING, FIELD_CONTEXTS.SPAN),
43
+ selectField(SPAN_KEYS.TIMESTAMP, FIELD_DATA_TYPES.INT64, FIELD_CONTEXTS.SPAN),
44
+ selectField(SPAN_KEYS.AI_OPERATION_ID, FIELD_DATA_TYPES.STRING, FIELD_CONTEXTS.ATTRIBUTE),
45
+ selectField(SPAN_KEYS.AI_MODEL_ID, FIELD_DATA_TYPES.STRING, FIELD_CONTEXTS.ATTRIBUTE),
46
+ selectField(SPAN_KEYS.AI_TELEMETRY_GENERATION_TYPE, FIELD_DATA_TYPES.STRING, FIELD_CONTEXTS.ATTRIBUTE),
47
+ selectField(SPAN_KEYS.AI_TELEMETRY_SUB_AGENT_ID, FIELD_DATA_TYPES.STRING, FIELD_CONTEXTS.ATTRIBUTE),
48
+ selectField(SPAN_KEYS.AGENT_ID, FIELD_DATA_TYPES.STRING, FIELD_CONTEXTS.ATTRIBUTE),
49
+ selectField(SPAN_KEYS.AI_MODEL_PROVIDER, FIELD_DATA_TYPES.STRING, FIELD_CONTEXTS.ATTRIBUTE),
50
+ selectField(SPAN_KEYS.GEN_AI_RESPONSE_PROVIDER, FIELD_DATA_TYPES.STRING, FIELD_CONTEXTS.ATTRIBUTE),
51
+ selectField(SPAN_KEYS.GEN_AI_USAGE_INPUT_TOKENS, FIELD_DATA_TYPES.INT64, FIELD_CONTEXTS.ATTRIBUTE),
52
+ selectField(SPAN_KEYS.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, FIELD_DATA_TYPES.INT64, FIELD_CONTEXTS.ATTRIBUTE),
53
+ selectField(SPAN_KEYS.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, FIELD_DATA_TYPES.INT64, FIELD_CONTEXTS.ATTRIBUTE),
54
+ selectField(SPAN_KEYS.CACHE_INTENT_MARKER_COUNT, FIELD_DATA_TYPES.INT64, FIELD_CONTEXTS.ATTRIBUTE),
55
+ selectField(SPAN_KEYS.CACHE_INTENT_PREFIX_SIGNATURE, FIELD_DATA_TYPES.STRING, FIELD_CONTEXTS.ATTRIBUTE)
56
+ ],
57
+ order: [{
58
+ key: { name: SPAN_KEYS.TIMESTAMP },
59
+ direction: ORDER_DIRECTIONS.DESC
60
+ }],
61
+ limit,
62
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
63
+ disabled: QUERY_DEFAULTS.DISABLED
64
+ }
65
+ }] }
66
+ };
67
+ }
68
+
69
+ //#endregion
70
+ export { CACHE_DEBUG_QUERY_NAME, buildCacheDebugQuery };
@@ -0,0 +1,36 @@
1
+ import { CacheState } from "./cache-state.js";
2
+
3
+ //#region src/utils/cache-debug-walk.d.ts
4
+ type CacheDebugSpanRow = {
5
+ data?: Record<string, unknown>;
6
+ } & Record<string, unknown>;
7
+ interface CacheDebugCall {
8
+ spanId: string;
9
+ timestamp: string;
10
+ operationId: string;
11
+ model: string;
12
+ modelProvider: string;
13
+ generationType: string;
14
+ subAgentId: string;
15
+ inputTokens: number;
16
+ cacheReadTokens: number;
17
+ cacheCreationTokens: number;
18
+ markerCount: number;
19
+ prefixSignature: string;
20
+ cacheState: CacheState;
21
+ }
22
+ /**
23
+ * Walk the LLM-span rows chronologically, deriving each call's cache state with
24
+ * a per-agent prior-signature cursor.
25
+ *
26
+ * The walk:
27
+ * 1. Sorts rows by `SPAN_KEYS.TIMESTAMP` (ascending).
28
+ * 2. For each row, resolves the sub-agent key via fallback chain
29
+ * `AI_TELEMETRY_SUB_AGENT_ID -> AGENT_ID -> '_default'`.
30
+ * 3. Looks up that agent's prior signature in `priorSignatureByAgent`.
31
+ * 4. Calls `deriveCacheState` and, if the row's `prefix_signature` is non-empty,
32
+ * updates the agent's cursor.
33
+ */
34
+ declare function deriveCacheDebugCalls(rows: CacheDebugSpanRow[]): CacheDebugCall[];
35
+ //#endregion
36
+ export { CacheDebugCall, CacheDebugSpanRow, deriveCacheDebugCalls };
@@ -0,0 +1,91 @@
1
+ import { SPAN_KEYS } from "../constants/otel-attributes.js";
2
+ import { deriveCacheState, isProviderSupportedForCaching, resolveCachingProvider } from "./cache-state.js";
3
+
4
+ //#region src/utils/cache-debug-walk.ts
5
+ /**
6
+ * Pure cache-debug walk: turns the SigNoz LLM-span rows returned by
7
+ * `buildCacheDebugQuery` into a chronologically ordered list of `CacheDebugCall`
8
+ * records — each carrying the derived `CacheState`.
9
+ *
10
+ * Per-agent priorSignature tracking (mirrors the per-agent walk in
11
+ * agents-manage-ui/.../[conversationId]/route.ts). A single global cursor
12
+ * cross-contaminates `priorSignature` between sub-agents in multi-agent
13
+ * conversations and reports false MISS-expected / MISS-regression states; the
14
+ * Map<subAgentId, signature> keeps each agent's cursor independent.
15
+ *
16
+ * This is the pure, testable core of the `pnpm cache-debug` CLI. The CLI itself
17
+ * remains a thin shell that fetches from SigNoz and prints these records.
18
+ */
19
+ function getField(row, key) {
20
+ const data = row.data;
21
+ if (data && typeof data === "object" && key in data) return data[key];
22
+ return row[key];
23
+ }
24
+ function getString(row, key) {
25
+ const value = getField(row, key);
26
+ if (typeof value === "string") return value;
27
+ return value == null ? "" : String(value);
28
+ }
29
+ function getNumber(row, key) {
30
+ const value = getField(row, key);
31
+ const n = typeof value === "number" ? value : Number(value);
32
+ return Number.isFinite(n) ? n : 0;
33
+ }
34
+ function subAgentKey(row) {
35
+ return getString(row, SPAN_KEYS.AI_TELEMETRY_SUB_AGENT_ID) || getString(row, SPAN_KEYS.AGENT_ID) || "_default";
36
+ }
37
+ /**
38
+ * Walk the LLM-span rows chronologically, deriving each call's cache state with
39
+ * a per-agent prior-signature cursor.
40
+ *
41
+ * The walk:
42
+ * 1. Sorts rows by `SPAN_KEYS.TIMESTAMP` (ascending).
43
+ * 2. For each row, resolves the sub-agent key via fallback chain
44
+ * `AI_TELEMETRY_SUB_AGENT_ID -> AGENT_ID -> '_default'`.
45
+ * 3. Looks up that agent's prior signature in `priorSignatureByAgent`.
46
+ * 4. Calls `deriveCacheState` and, if the row's `prefix_signature` is non-empty,
47
+ * updates the agent's cursor.
48
+ */
49
+ function deriveCacheDebugCalls(rows) {
50
+ const sorted = [...rows].sort((a, b) => getString(a, SPAN_KEYS.TIMESTAMP).localeCompare(getString(b, SPAN_KEYS.TIMESTAMP)));
51
+ const calls = [];
52
+ const priorSignatureByAgent = /* @__PURE__ */ new Map();
53
+ for (const row of sorted) {
54
+ const prefixSignature = getString(row, SPAN_KEYS.CACHE_INTENT_PREFIX_SIGNATURE) || null;
55
+ const cacheReadTokens = getNumber(row, SPAN_KEYS.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS);
56
+ const markerCount = getNumber(row, SPAN_KEYS.CACHE_INTENT_MARKER_COUNT);
57
+ const requestProvider = getString(row, SPAN_KEYS.AI_MODEL_PROVIDER);
58
+ const cachingProvider = resolveCachingProvider({
59
+ requestProvider,
60
+ responseProvider: getString(row, SPAN_KEYS.GEN_AI_RESPONSE_PROVIDER)
61
+ });
62
+ const subAgentId = subAgentKey(row);
63
+ const cacheState = deriveCacheState({
64
+ markerCount,
65
+ prefixSignature,
66
+ cacheRead: cacheReadTokens,
67
+ priorSignature: priorSignatureByAgent.get(subAgentId) ?? null,
68
+ providerSupportsCaching: cachingProvider ? isProviderSupportedForCaching(cachingProvider) : true
69
+ });
70
+ if (prefixSignature) priorSignatureByAgent.set(subAgentId, prefixSignature);
71
+ calls.push({
72
+ spanId: getString(row, SPAN_KEYS.SPAN_ID),
73
+ timestamp: getString(row, SPAN_KEYS.TIMESTAMP),
74
+ operationId: getString(row, SPAN_KEYS.AI_OPERATION_ID),
75
+ model: getString(row, SPAN_KEYS.AI_MODEL_ID),
76
+ modelProvider: requestProvider,
77
+ generationType: getString(row, SPAN_KEYS.AI_TELEMETRY_GENERATION_TYPE),
78
+ subAgentId: getString(row, SPAN_KEYS.AI_TELEMETRY_SUB_AGENT_ID),
79
+ inputTokens: getNumber(row, SPAN_KEYS.GEN_AI_USAGE_INPUT_TOKENS),
80
+ cacheReadTokens,
81
+ cacheCreationTokens: getNumber(row, SPAN_KEYS.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS),
82
+ markerCount,
83
+ prefixSignature: prefixSignature ?? "",
84
+ cacheState
85
+ });
86
+ }
87
+ return calls;
88
+ }
89
+
90
+ //#endregion
91
+ export { deriveCacheDebugCalls };
@@ -0,0 +1,36 @@
1
+ //#region src/utils/cache-state.d.ts
2
+ type CacheState = 'HIT' | 'MISS-regression' | 'MISS-expected' | 'NOT-ATTEMPTED' | 'NOT-SUPPORTED-BY-PROVIDER';
3
+ declare function isProviderSupportedForCaching(provider: string): boolean;
4
+ /**
5
+ * Resolve the provider to use for the caching-support gate.
6
+ *
7
+ * Vercel-AI-Gateway-routed deployments report `ai.model.provider = 'gateway'`,
8
+ * which is a router, not a caching-capable provider. The actual model provider
9
+ * that produced the response (and owns the cache keys) lives in
10
+ * `gen_ai.response.provider`. Prefer that resolved provider when present so the
11
+ * support gate reflects the real backend (e.g. 'anthropic'); fall back to the
12
+ * request-side `ai.model.provider` only when the resolved provider is absent.
13
+ */
14
+ declare function resolveCachingProvider({
15
+ requestProvider,
16
+ responseProvider
17
+ }: {
18
+ requestProvider?: string | null;
19
+ responseProvider?: string | null;
20
+ }): string;
21
+ interface DeriveCacheStateInput {
22
+ markerCount: number;
23
+ prefixSignature: string | null;
24
+ cacheRead: number;
25
+ priorSignature?: string | null;
26
+ providerSupportsCaching?: boolean;
27
+ }
28
+ declare function deriveCacheState({
29
+ markerCount,
30
+ prefixSignature,
31
+ cacheRead,
32
+ priorSignature,
33
+ providerSupportsCaching
34
+ }: DeriveCacheStateInput): CacheState;
35
+ //#endregion
36
+ export { CacheState, DeriveCacheStateInput, deriveCacheState, isProviderSupportedForCaching, resolveCachingProvider };
@@ -0,0 +1,33 @@
1
+ //#region src/utils/cache-state.ts
2
+ const CACHING_SUPPORTED_PROVIDERS = new Set([
3
+ "anthropic",
4
+ "openai",
5
+ "google",
6
+ "gemini"
7
+ ]);
8
+ function isProviderSupportedForCaching(provider) {
9
+ return CACHING_SUPPORTED_PROVIDERS.has(provider.toLowerCase());
10
+ }
11
+ /**
12
+ * Resolve the provider to use for the caching-support gate.
13
+ *
14
+ * Vercel-AI-Gateway-routed deployments report `ai.model.provider = 'gateway'`,
15
+ * which is a router, not a caching-capable provider. The actual model provider
16
+ * that produced the response (and owns the cache keys) lives in
17
+ * `gen_ai.response.provider`. Prefer that resolved provider when present so the
18
+ * support gate reflects the real backend (e.g. 'anthropic'); fall back to the
19
+ * request-side `ai.model.provider` only when the resolved provider is absent.
20
+ */
21
+ function resolveCachingProvider({ requestProvider, responseProvider }) {
22
+ return (responseProvider || requestProvider || "").trim();
23
+ }
24
+ function deriveCacheState({ markerCount, prefixSignature, cacheRead, priorSignature = null, providerSupportsCaching = true }) {
25
+ if (!providerSupportsCaching) return "NOT-SUPPORTED-BY-PROVIDER";
26
+ if (markerCount <= 0) return "NOT-ATTEMPTED";
27
+ if (cacheRead > 0) return "HIT";
28
+ if (priorSignature && prefixSignature && prefixSignature === priorSignature) return "MISS-regression";
29
+ return "MISS-expected";
30
+ }
31
+
32
+ //#endregion
33
+ export { deriveCacheState, isProviderSupportedForCaching, resolveCachingProvider };