@inkeep/agents-core 0.74.2 → 0.74.4
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/dist/auth/auth-schema.d.ts +227 -227
- package/dist/auth/auth-validation-schemas.d.ts +154 -154
- package/dist/auth/permissions.d.ts +9 -9
- package/dist/client-exports.d.ts +2 -1
- package/dist/client-exports.js +2 -1
- package/dist/constants/models.d.ts +4 -0
- package/dist/constants/models.js +4 -0
- package/dist/constants/otel-attributes.d.ts +4 -0
- package/dist/constants/otel-attributes.js +4 -0
- package/dist/data-access/manage/agents.d.ts +46 -46
- package/dist/data-access/manage/artifactComponents.d.ts +16 -16
- package/dist/data-access/manage/contextConfigs.d.ts +12 -12
- package/dist/data-access/manage/dataComponents.d.ts +8 -8
- package/dist/data-access/manage/functionTools.d.ts +18 -18
- package/dist/data-access/manage/skills.d.ts +15 -15
- package/dist/data-access/manage/subAgentExternalAgentRelations.d.ts +24 -24
- package/dist/data-access/manage/subAgentRelations.d.ts +30 -30
- package/dist/data-access/manage/subAgentTeamAgentRelations.d.ts +24 -24
- package/dist/data-access/manage/subAgents.d.ts +18 -18
- package/dist/data-access/manage/tools.d.ts +30 -30
- package/dist/data-access/manage/triggers.d.ts +5 -5
- package/dist/data-access/runtime/apiKeys.d.ts +20 -20
- package/dist/data-access/runtime/apps.d.ts +13 -13
- package/dist/data-access/runtime/conversations.d.ts +32 -32
- package/dist/data-access/runtime/events.d.ts +5 -5
- package/dist/data-access/runtime/feedback.d.ts +6 -6
- package/dist/data-access/runtime/messages.d.ts +27 -27
- package/dist/data-access/runtime/scheduledTriggerInvocations.d.ts +4 -4
- package/dist/data-access/runtime/scheduledTriggerUsers.d.ts +1 -1
- package/dist/data-access/runtime/tasks.d.ts +6 -6
- package/dist/db/manage/manage-schema.d.ts +484 -484
- package/dist/db/runtime/runtime-schema.d.ts +455 -455
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/utils/cache-debug-query.d.ts +43 -0
- package/dist/utils/cache-debug-query.js +70 -0
- package/dist/utils/cache-debug-walk.d.ts +36 -0
- package/dist/utils/cache-debug-walk.js +91 -0
- package/dist/utils/cache-state.d.ts +36 -0
- package/dist/utils/cache-state.js +33 -0
- package/dist/utils/error.d.ts +51 -51
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.js +2 -2
- package/dist/utils/model-factory.d.ts +7 -0
- package/dist/utils/model-factory.js +18 -2
- package/dist/utils/token-estimator.d.ts +1 -0
- package/dist/utils/usage-cost-middleware.d.ts +3 -1
- package/dist/utils/usage-cost-middleware.js +70 -12
- package/dist/validation/drizzle-schema-helpers.d.ts +3 -3
- package/dist/validation/schemas/skills.d.ts +52 -52
- package/dist/validation/schemas.d.ts +2504 -2504
- 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 };
|