@stackfactor/agent-utils 1.11.0 → 1.12.0
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/README.md +24 -0
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +3 -2
- package/dist/cjs/langChain.d.ts +8 -0
- package/dist/cjs/langChain.d.ts.map +1 -1
- package/dist/cjs/langChain.js +3 -2
- package/dist/cjs/referenceContext.d.ts +62 -15
- package/dist/cjs/referenceContext.d.ts.map +1 -1
- package/dist/cjs/referenceContext.js +134 -34
- package/dist/cjs/serve.d.ts.map +1 -1
- package/dist/cjs/serve.js +7 -0
- package/dist/cjs/stackfactorKnowledge.d.ts +9 -4
- package/dist/cjs/stackfactorKnowledge.d.ts.map +1 -1
- package/dist/cjs/stackfactorKnowledge.js +30 -6
- package/dist/cjs/tavily.d.ts +8 -0
- package/dist/cjs/tavily.d.ts.map +1 -1
- package/dist/cjs/tavily.js +73 -4
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/langChain.d.ts +8 -0
- package/dist/esm/langChain.d.ts.map +1 -1
- package/dist/esm/langChain.js +3 -2
- package/dist/esm/referenceContext.d.ts +62 -15
- package/dist/esm/referenceContext.d.ts.map +1 -1
- package/dist/esm/referenceContext.js +132 -33
- package/dist/esm/serve.d.ts.map +1 -1
- package/dist/esm/serve.js +7 -0
- package/dist/esm/stackfactorKnowledge.d.ts +9 -4
- package/dist/esm/stackfactorKnowledge.d.ts.map +1 -1
- package/dist/esm/stackfactorKnowledge.js +30 -6
- package/dist/esm/tavily.d.ts +8 -0
- package/dist/esm/tavily.d.ts.map +1 -1
- package/dist/esm/tavily.js +73 -4
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stackfactorKnowledge.d.ts","sourceRoot":"","sources":["../../src/stackfactorKnowledge.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stackfactorKnowledge.d.ts","sourceRoot":"","sources":["../../src/stackfactorKnowledge.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,8 +15,11 @@
|
|
|
15
15
|
// microskill;
|
|
16
16
|
// - access: the platform's search judges the person the run acts for, so a
|
|
17
17
|
// run reads only what that person may open. A knowledge base the person
|
|
18
|
-
// cannot read is skipped and reported
|
|
19
|
-
// generates without it.
|
|
18
|
+
// cannot read is skipped and reported (`retrievePassages`): grounding from
|
|
19
|
+
// skill coverage generates without it. A knowledge base that references
|
|
20
|
+
// cite is another matter (Candin, 2026-10-13): the references reader
|
|
21
|
+
// (referenceContext `gatherReferenceContext`) stops the run with a
|
|
22
|
+
// KnowledgeAccessError instead.
|
|
20
23
|
//
|
|
21
24
|
// A reference points at the content and never copies it: the passage is
|
|
22
25
|
// searched again, under the reader's own access, whenever it is used. Its
|
|
@@ -49,6 +52,8 @@ exports.DEFAULT_TOP_K = 8;
|
|
|
49
52
|
const CONCURRENCY = 4;
|
|
50
53
|
/** Statuses that mean the person may not read the knowledge base, or it is gone. */
|
|
51
54
|
const NO_ACCESS = new Set([401, 403, 404]);
|
|
55
|
+
/** How long a search that failed for another reason waits before it is tried once more. */
|
|
56
|
+
const RETRY_DELAY_MS = 200;
|
|
52
57
|
const text = (value) => (typeof value === "string" ? value.trim() : "");
|
|
53
58
|
/** An http(s) address, or null: a reference's url lands in an `href`. */
|
|
54
59
|
const webUrl = (value) => (/^https?:\/\//i.test(text(value)) ? text(value) : null);
|
|
@@ -130,15 +135,18 @@ const statusOf = (error) => {
|
|
|
130
135
|
const status = error?.response?.status ?? error?.status;
|
|
131
136
|
return typeof status === "number" ? status : null;
|
|
132
137
|
};
|
|
138
|
+
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
133
139
|
/**
|
|
134
140
|
* Searches every source for every query, under the person's access, and hands
|
|
135
141
|
* back the passages found, best first, each once, tagged "k1", "k2"… for the
|
|
136
142
|
* model to cite. A source with documents is searched within them (in batches of
|
|
137
143
|
* SEARCH_DOCUMENT_IDS_MAX); one without, whole. A source the person may not
|
|
138
144
|
* read (401, 403, 404) is skipped: none of its passages are used and no more of
|
|
139
|
-
* its searches are made. A search that fails otherwise is
|
|
140
|
-
*
|
|
141
|
-
*
|
|
145
|
+
* its searches are made. A search that fails otherwise is tried once more; when
|
|
146
|
+
* that fails too it is reported and the passages its other searches found
|
|
147
|
+
* stand. A refusal is never tried again. Either way it is in `skipped`, once
|
|
148
|
+
* per knowledge base, and the passages of the others stand; whether a skip is
|
|
149
|
+
* an error is the caller's to say.
|
|
142
150
|
* @param options `sources`, `queries`, `search` (client-api
|
|
143
151
|
* `knowledgeBaseAgent.search`), `token` (the run's AGENT token), `topK`
|
|
144
152
|
* per search (default DEFAULT_TOP_K)
|
|
@@ -167,8 +175,24 @@ const retrievePassages = async (options) => {
|
|
|
167
175
|
await inPool(searches, CONCURRENCY, async ({ source, query, documentIds, order }) => {
|
|
168
176
|
if (skipped.get(source.knowledgeBaseId)?.noAccess)
|
|
169
177
|
return;
|
|
178
|
+
const searchOnce = () => options.search(source.knowledgeBaseId, query, documentIds ? { topK, documentIds } : { topK }, options.token);
|
|
170
179
|
try {
|
|
171
|
-
|
|
180
|
+
let answer;
|
|
181
|
+
try {
|
|
182
|
+
answer = await searchOnce();
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
// A refusal is the platform's answer and is not asked again. Any other
|
|
186
|
+
// failure may pass (a dropped connection, a 5xx), and one failed search
|
|
187
|
+
// would skip its whole knowledge base, so it is tried once more —
|
|
188
|
+
// unless the base refused the person meanwhile.
|
|
189
|
+
if (NO_ACCESS.has(statusOf(error)))
|
|
190
|
+
throw error;
|
|
191
|
+
await delay(RETRY_DELAY_MS);
|
|
192
|
+
if (skipped.get(source.knowledgeBaseId)?.noAccess)
|
|
193
|
+
return;
|
|
194
|
+
answer = await searchOnce();
|
|
195
|
+
}
|
|
172
196
|
(Array.isArray(answer?.chunks) ? answer.chunks : []).forEach((chunk, rank) => {
|
|
173
197
|
const chunkId = id(chunk?._id);
|
|
174
198
|
if (!chunkId || !id(chunk?.documentId))
|
package/dist/cjs/tavily.d.ts
CHANGED
|
@@ -46,6 +46,14 @@ export type TavilyConfig = {
|
|
|
46
46
|
* for the tabular documents this is usually pointed at.
|
|
47
47
|
*/
|
|
48
48
|
format?: "markdown" | "text";
|
|
49
|
+
/**
|
|
50
|
+
* The only URLs `web_extract` may read (matched trimmed, without case or a
|
|
51
|
+
* trailing slash, and sent as listed). Any other URL is never sent to
|
|
52
|
+
* Tavily: the tool answers the model with an error line for it and never
|
|
53
|
+
* throws. Unset, any URL may be read. Only `web_extract` reads it, so a run
|
|
54
|
+
* kept to its pages enables `extract` alone (referenceContext `toolsFor`).
|
|
55
|
+
*/
|
|
56
|
+
allowedUrls?: string[];
|
|
49
57
|
};
|
|
50
58
|
/**
|
|
51
59
|
* Normalizes `config.tavily` into an options object, returning `null` when the
|
package/dist/cjs/tavily.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tavily.d.ts","sourceRoot":"","sources":["../../src/tavily.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA0BnD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,KAAK,CAAC;AAEpE;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,iEAAiE;IACjE,WAAW,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,YAAY,CAAC;IAC3D,kFAAkF;IAClF,YAAY,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACpC,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"tavily.d.ts","sourceRoot":"","sources":["../../src/tavily.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA0BnD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,KAAK,CAAC;AAEpE;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,iEAAiE;IACjE,WAAW,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,YAAY,CAAC;IAC3D,kFAAkF;IAClF,YAAY,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACpC,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,GAAG,KAAG,YAAY,GAAG,IAI7D,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,GAAG,EAAE,SAAS,YAAY,KAAG,IA+BvE,CAAC;AA0OF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,GAAG,EACX,SAAS,YAAY,EACrB,eAAc,YAAY,GAAG,IAAW,KACvC,GAAG,EAmRL,CAAC;AAiBF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,SAAS,MAAM,EAAE,EACvB,QAAQ,GAAG,EACX,eAAc,YAAY,GAAG,IAAW,KACvC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CA6DrB,CAAC;;iCAhqByC,GAAG,WAAW,YAAY,KAAG,IAAI;+BA2RlE,GAAG,WACF,YAAY,iBACP,YAAY,GAAG,IAAI,KAChC,GAAG,EAAE;+BAkUA,SAAS,MAAM,EAAE,UACf,GAAG,iBACG,YAAY,GAAG,IAAI,KAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;+BAlnBkB,GAAG,KAAG,YAAY,GAAG,IAAI;iCA+IvD,YAAY,GAAG,IAAI,GAAG,SAAS,WAC/B,GAAG,WACH,MAAM,WACN;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,KACzC,IAAI;;AA8hBP,wBAME"}
|
package/dist/cjs/tavily.js
CHANGED
|
@@ -60,6 +60,10 @@ const assertTavilyUsable = (config, options) => {
|
|
|
60
60
|
if (!config?.tavilyAPIKey) {
|
|
61
61
|
throw errorHandling_js_1.default.create(const_js_1.default.HTTP_CODES.INTERNAL_SERVER_ERROR, "Tavily tools are enabled but config.tavilyAPIKey is missing.");
|
|
62
62
|
}
|
|
63
|
+
if (options.allowedUrls !== undefined &&
|
|
64
|
+
!(Array.isArray(options.allowedUrls) && options.allowedUrls.every((url) => typeof url === "string"))) {
|
|
65
|
+
throw errorHandling_js_1.default.create(const_js_1.default.HTTP_CODES.BAD_REQUEST, "config.tavily.allowedUrls must be a list of URLs.");
|
|
66
|
+
}
|
|
63
67
|
const unknown = (options.tools || []).filter((name) => !["search", "extract", "crawl", "map"].includes(name));
|
|
64
68
|
if (unknown.length > 0) {
|
|
65
69
|
throw errorHandling_js_1.default.create(const_js_1.default.HTTP_CODES.BAD_REQUEST, `Unknown Tavily tool(s): ${unknown.join(", ")}. Valid values are search, extract, crawl, map.`);
|
|
@@ -168,6 +172,52 @@ const recordTavilyUsage = (tracker, _config, credits, sources) => {
|
|
|
168
172
|
}
|
|
169
173
|
}
|
|
170
174
|
};
|
|
175
|
+
/**
|
|
176
|
+
* Adds the URLs `web_extract` is about to ask Tavily for to
|
|
177
|
+
* `tracker.attemptedUrls`, each once across the run. Recorded before the call,
|
|
178
|
+
* so a URL the call then fails on is still there.
|
|
179
|
+
* @param tracker - The caller's usage accumulator, when it passed one
|
|
180
|
+
* @param urls - The URLs sent
|
|
181
|
+
*/
|
|
182
|
+
const recordAttemptedUrls = (tracker, urls) => {
|
|
183
|
+
if (!tracker || urls.length === 0)
|
|
184
|
+
return;
|
|
185
|
+
const attempted = tracker.attemptedUrls || (tracker.attemptedUrls = []);
|
|
186
|
+
for (const url of urls) {
|
|
187
|
+
if (!attempted.includes(url))
|
|
188
|
+
attempted.push(url);
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
/**
|
|
192
|
+
* How a URL is matched, against Tavily's answer or `allowedUrls`: trimmed,
|
|
193
|
+
* lowercased, no trailing slash.
|
|
194
|
+
*/
|
|
195
|
+
const urlMatchKey = (url) => url.trim().replace(/\/+$/, "").toLowerCase();
|
|
196
|
+
/** What `web_extract` answers for each URL `allowedUrls` refused. */
|
|
197
|
+
const REFUSED_HEADING = "Refused, not read (only the referenced pages may be read):";
|
|
198
|
+
/**
|
|
199
|
+
* Splits the URLs the model asked `web_extract` for into those it may read —
|
|
200
|
+
* as `allowedUrls` lists them — and those it may not, each once. With no
|
|
201
|
+
* `allowedUrls`, every URL may be read, as asked.
|
|
202
|
+
* @param urls - The URLs the model asked for
|
|
203
|
+
* @param allowed - `allowedUrls` by match key, or `null` when unset
|
|
204
|
+
*/
|
|
205
|
+
const screenUrls = (urls, allowed) => {
|
|
206
|
+
if (!allowed)
|
|
207
|
+
return { read: urls, refused: [] };
|
|
208
|
+
const read = [];
|
|
209
|
+
const refused = [];
|
|
210
|
+
for (const url of urls) {
|
|
211
|
+
const listed = allowed.get(urlMatchKey(url));
|
|
212
|
+
if (listed === undefined) {
|
|
213
|
+
if (!refused.includes(url))
|
|
214
|
+
refused.push(url);
|
|
215
|
+
}
|
|
216
|
+
else if (!read.includes(listed))
|
|
217
|
+
read.push(listed);
|
|
218
|
+
}
|
|
219
|
+
return { read, refused };
|
|
220
|
+
};
|
|
171
221
|
/**
|
|
172
222
|
* Trims one document to whatever the per-URL and per-call budgets allow,
|
|
173
223
|
* appending a note when anything was cut.
|
|
@@ -238,6 +288,9 @@ const buildTavilyTools = (config, options, usageTracker = null) => {
|
|
|
238
288
|
const maxCharsPerUrl = options.maxCharsPerUrl ?? DEFAULT_MAX_CHARS_PER_URL;
|
|
239
289
|
const maxCharsTotal = options.maxCharsTotal ?? DEFAULT_MAX_CHARS_TOTAL;
|
|
240
290
|
const crawlLimit = options.crawlLimit ?? DEFAULT_CRAWL_LIMIT;
|
|
291
|
+
const allowed = Array.isArray(options.allowedUrls)
|
|
292
|
+
? new Map(options.allowedUrls.map((url) => [urlMatchKey(url), url.trim()]))
|
|
293
|
+
: null;
|
|
241
294
|
const newBudget = () => ({
|
|
242
295
|
remaining: maxCharsTotal,
|
|
243
296
|
perUrl: maxCharsPerUrl,
|
|
@@ -285,8 +338,22 @@ const buildTavilyTools = (config, options, usageTracker = null) => {
|
|
|
285
338
|
}
|
|
286
339
|
if (enabled.includes("extract")) {
|
|
287
340
|
tools.push((0, langchain_1.tool)(async ({ urls, query }) => {
|
|
341
|
+
// Outside `allowedUrls` nothing is sent: the model is told per URL,
|
|
342
|
+
// and the run goes on with what it may read.
|
|
343
|
+
const { read, refused } = screenUrls(urls, allowed);
|
|
344
|
+
const refusal = refused.length
|
|
345
|
+
? `${REFUSED_HEADING}\n${refused
|
|
346
|
+
.map((url) => `- ${url}: not one of the referenced pages`)
|
|
347
|
+
.join("\n")}`
|
|
348
|
+
: "";
|
|
349
|
+
if (refused.length > 0) {
|
|
350
|
+
logger_js_1.default.log(null, logger_js_1.default.levels.warn, `Tavily extract refused ${refused.length} URL(s) not among the allowed pages: ${refused.join(", ")}`);
|
|
351
|
+
}
|
|
352
|
+
if (read.length === 0)
|
|
353
|
+
return refusal;
|
|
354
|
+
recordAttemptedUrls(usageTracker, read);
|
|
288
355
|
const data = await callTavily("extract", {
|
|
289
|
-
urls,
|
|
356
|
+
urls: read,
|
|
290
357
|
extract_depth: options.extractDepth,
|
|
291
358
|
format,
|
|
292
359
|
// `query` switches the API from whole-document extraction to
|
|
@@ -317,10 +384,14 @@ const buildTavilyTools = (config, options, usageTracker = null) => {
|
|
|
317
384
|
.join("\n");
|
|
318
385
|
rendered += `\n\n---\n\nFailed to extract:\n${lines}`;
|
|
319
386
|
}
|
|
387
|
+
if (refusal)
|
|
388
|
+
rendered += `\n\n---\n\n${refusal}`;
|
|
320
389
|
return rendered;
|
|
321
390
|
}, {
|
|
322
391
|
name: "web_extract",
|
|
323
|
-
description:
|
|
392
|
+
description: `Read the content of specific URLs. Pass a query to get back only the passages relevant to it — much cheaper and usually sufficient. Omit the query to retrieve the whole document, which is appropriate when you need its full structure. Long documents are truncated, and the result says so when that happens.${allowed
|
|
393
|
+
? " Only the referenced pages can be read; any other URL is refused."
|
|
394
|
+
: ""}`,
|
|
324
395
|
schema: zod_1.z.object({
|
|
325
396
|
urls: zod_1.z
|
|
326
397
|
.array(zod_1.z.string())
|
|
@@ -399,8 +470,6 @@ exports.buildTavilyTools = buildTavilyTools;
|
|
|
399
470
|
const EXTRACT_MAX_URLS = 20;
|
|
400
471
|
/** Seconds. A reachability check needs the page fetched, not rendered at length. */
|
|
401
472
|
const REACHABILITY_TIMEOUT_SECONDS = 20;
|
|
402
|
-
/** How a URL is matched against Tavily's answer: trimmed, lowercased, no trailing slash. */
|
|
403
|
-
const urlMatchKey = (url) => url.trim().replace(/\/+$/, "").toLowerCase();
|
|
404
473
|
/** True for an `http:` or `https:` URL; false for anything else, unparsable included. */
|
|
405
474
|
const isWebUrl = (url) => {
|
|
406
475
|
try {
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { callAgent, checkAgent } from "./client.js";
|
|
|
7
7
|
import * as runtimeContext from "./runtimeContext.js";
|
|
8
8
|
import { recordUsage, USAGE_UNITS } from "./usage.js";
|
|
9
9
|
import stackfactorKnowledge from "./stackfactorKnowledge.js";
|
|
10
|
-
import referenceContext from "./referenceContext.js";
|
|
10
|
+
import referenceContext, { KnowledgeAccessError } from "./referenceContext.js";
|
|
11
11
|
import { checkUrlsReachable } from "./tavily.js";
|
|
12
12
|
export { constants };
|
|
13
13
|
export { errorHandling, AppError };
|
|
@@ -24,7 +24,7 @@ export type { AgentExecuteRequest, CallAgentOptions, CheckAgentOptions, AgentHea
|
|
|
24
24
|
export { runtimeContext };
|
|
25
25
|
export { recordUsage, USAGE_UNITS };
|
|
26
26
|
export type { UsageEntry, UsageUnit } from "./usage.js";
|
|
27
|
-
export { stackfactorKnowledge, referenceContext };
|
|
27
|
+
export { stackfactorKnowledge, referenceContext, KnowledgeAccessError };
|
|
28
28
|
export type { GroundingPassage, KnowledgeChunk, KnowledgeSearch, KnowledgeSource, SkippedSource, StackFactorReference, } from "./stackfactorKnowledge.js";
|
|
29
29
|
export type { ReferenceContext, ReferencePage, ReferencePassage, SourceGuidance, StoredReference, } from "./referenceContext.js";
|
|
30
30
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,oBAAoB,MAAM,2BAA2B,CAAC;AAC7D,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,oBAAoB,MAAM,2BAA2B,CAAC;AAC7D,OAAO,gBAAgB,EAAE,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,CAAC;AAErB,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;AAEnC,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,CAAC;AAErB,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,MAAM,EAAE,CAAC;AAElB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC;AAE7D,OAAO,EAAE,SAAS,EAAE,CAAC;AAErB,OAAO,EAAE,UAAU,EAAE,CAAC;AAEtB,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AAEpC,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;AAExE,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,eAAe,EACf,aAAa,EACb,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAEnC,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,uBAAuB,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import { callAgent, checkAgent } from "./client.js";
|
|
|
7
7
|
import * as runtimeContext from "./runtimeContext.js";
|
|
8
8
|
import { recordUsage, USAGE_UNITS } from "./usage.js";
|
|
9
9
|
import stackfactorKnowledge from "./stackfactorKnowledge.js";
|
|
10
|
-
import referenceContext from "./referenceContext.js";
|
|
10
|
+
import referenceContext, { KnowledgeAccessError } from "./referenceContext.js";
|
|
11
11
|
import { checkUrlsReachable } from "./tavily.js";
|
|
12
12
|
export { constants };
|
|
13
13
|
export { errorHandling, AppError };
|
|
@@ -19,4 +19,4 @@ export { callAgent };
|
|
|
19
19
|
export { checkAgent };
|
|
20
20
|
export { runtimeContext };
|
|
21
21
|
export { recordUsage, USAGE_UNITS };
|
|
22
|
-
export { stackfactorKnowledge, referenceContext };
|
|
22
|
+
export { stackfactorKnowledge, referenceContext, KnowledgeAccessError };
|
package/dist/esm/langChain.d.ts
CHANGED
|
@@ -31,6 +31,14 @@ export type UsageTracker = {
|
|
|
31
31
|
url: string;
|
|
32
32
|
title?: string;
|
|
33
33
|
}[];
|
|
34
|
+
/**
|
|
35
|
+
* Every URL `web_extract` asked Tavily for, each once, in the order first
|
|
36
|
+
* asked, whether Tavily could read it or not (a failed URL, a failed call).
|
|
37
|
+
* A URL refused by `allowedUrls` was never asked for and is not here. What
|
|
38
|
+
* Tavily answered is `webSearchSources`, under the address it answered with
|
|
39
|
+
* (after a redirect); this is what the run actually tried to read.
|
|
40
|
+
*/
|
|
41
|
+
attemptedUrls?: string[];
|
|
34
42
|
};
|
|
35
43
|
/**
|
|
36
44
|
* Instantiates and returns the appropriate LangChain chat model based on the model
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"langChain.d.ts","sourceRoot":"","sources":["../../src/langChain.ts"],"names":[],"mappings":"AAoGA,KAAK,UAAU,GAAG;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IAKtB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACvC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"langChain.d.ts","sourceRoot":"","sources":["../../src/langChain.ts"],"names":[],"mappings":"AAoGA,KAAK,UAAU,GAAG;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IAKtB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACvC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AA0iBF;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,eAAO,MAAM,WAAW,GACtB,WAAW,MAAM,EACjB,QAAQ,GAAG,EACX,SAAQ,GAAU,KACjB,GAwHF,CAAC;;8CAkb+C,OAAO,UAAU,GAAG,KAAG,OAAO;oCAWxC,GAAG,KAAG,OAAO;0CAgBtC,MAAM,cACN,GAAG,SACR,GAAG,KACT,MAAM;2CA0CqC,GAAG,UAAU,GAAG,KAAG,MAAM;sCA5xC9B,MAAM,KAAG,OAAO;0CAuGZ,GAAG,KAAG,IAAI;wBA8sB/C,MAAM,aACD,MAAM,gBACH,MAAM,SACb,GAAG,EAAE,kBACI,GAAG,UACX,GAAG,iBACG,YAAY,GAAG,IAAI,KAChC,GAAG;sBAsCG,GAAG,UACF,MAAM,UACN,GAAG,eACC,QAAQ,GAAG,IAAI,iBACb,YAAY,GAAG,IAAI,aACvB,MAAM,KACf,OAAO,CAAC,GAAG,CAAC;oCAihBF,MAAM,UACT,GAAG,UACH,GAAG,oBACO,GAAG,eACT,MAAM,eACN,MAAM,wBACG,OAAO,WACpB,GAAG,cACA,MAAM,UACV,GAAG,EAAE,iBACE,YAAY,GAAG,IAAI,KAChC,OAAO,CAAC,GAAG,CAAC;sDA2sBF,MAAM,UACT,GAAG,UACH,MAAM,YACL,GAAG,iBACE,YAAY,GAAG,IAAI,KAChC,OAAO,CAAC,GAAG,CAAC;sDAmTF,MAAM,UACT,GAAG,UACH,MAAM,YACL,GAAG,iBACE,YAAY,GAAG,IAAI,KAChC,OAAO,CAAC,GAAG,CAAC;0CAz6C8B,GAAG,KAAG,MAAM;uCAxyB9C,YAAY,GAAG,IAAI,GAAG,SAAS,aAC7B,MAAM,YACP,GAAG,WACJ,GAAG,YACF,QAAQ,GAAG,QAAQ,KAC5B,IAAI;kCA5CI,YAAY,GAAG,IAAI,GAAG,SAAS,aAC7B,MAAM,SACV,UAAU,GAAG,IAAI,YACd,GAAG,KACZ,IAAI;+CA0FI,YAAY,GAAG,IAAI,GAAG,SAAS,aAC7B,MAAM,kBACD,MAAM,YACZ,GAAG,KACZ,IAAI;uCAoBI,YAAY,GAAG,IAAI,GAAG,SAAS,aAC7B,MAAM,WACR,MAAM,YACL,GAAG,KACZ,IAAI;mCAyuBU,MAAM,mBACJ,MAAM,EAAE,KACxB,MAAM;;AA48CT,wBAkBE"}
|
package/dist/esm/langChain.js
CHANGED
|
@@ -1203,8 +1203,9 @@ const parseAgenticJsonResponse = (rawContent, schema) => {
|
|
|
1203
1203
|
*
|
|
1204
1204
|
* Setting `config.tavily` adds the Tavily web tools (`web_search`, `web_extract`, and
|
|
1205
1205
|
* optionally `web_map` / `web_crawl`). They execute in this process, so they require
|
|
1206
|
-
* `config.agentic` to be `true`; the credits spent
|
|
1207
|
-
* on `usageTracker`.
|
|
1206
|
+
* `config.agentic` to be `true`; the credits spent, the URLs returned and the URLs
|
|
1207
|
+
* `web_extract` asked for are recorded on `usageTracker`. `tavily.allowedUrls` keeps
|
|
1208
|
+
* `web_extract` to those URLs.
|
|
1208
1209
|
* @param modelName - The model identifier, e.g. `"gpt-4o"`, `"claude-3-5-sonnet"`,
|
|
1209
1210
|
* `"gemini-1.5-pro"`
|
|
1210
1211
|
* @param config - Configuration object with API keys, `temperature`, optional `agentic`
|
|
@@ -10,7 +10,10 @@ export interface ReferencePage {
|
|
|
10
10
|
}
|
|
11
11
|
/** A passage of a document that references cite. */
|
|
12
12
|
export interface ReferencePassage {
|
|
13
|
-
/**
|
|
13
|
+
/**
|
|
14
|
+
* The short ids of the STACKFACTOR references that cite this passage's chunk
|
|
15
|
+
* (`knowledgeBase.chunkId`); when none does, of every one citing its document.
|
|
16
|
+
*/
|
|
14
17
|
references: string[];
|
|
15
18
|
document: string | null;
|
|
16
19
|
section: string | null;
|
|
@@ -23,21 +26,56 @@ export interface ReferencePassage {
|
|
|
23
26
|
export interface ReferenceContext {
|
|
24
27
|
pages: ReferencePage[];
|
|
25
28
|
passages: ReferencePassage[];
|
|
29
|
+
/**
|
|
30
|
+
* Always empty from `gatherReferenceContext`: a cited knowledge base that
|
|
31
|
+
* cannot be read throws KnowledgeAccessError, which carries the skips.
|
|
32
|
+
*/
|
|
26
33
|
skipped: SkippedSource[];
|
|
27
|
-
/** True when the references cite at least one knowledge base document,
|
|
34
|
+
/** True when the references cite at least one knowledge base document (all of them readable, or it would have thrown). */
|
|
28
35
|
citesKnowledge: boolean;
|
|
29
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* The knowledge base documents a run's references cite could not be read: the
|
|
39
|
+
* run has no token, the person may not open a cited knowledge base (401, 403,
|
|
40
|
+
* 404), or its search failed. The agent answers with it — `code` and `message`
|
|
41
|
+
* are what the person sees — and generates nothing.
|
|
42
|
+
*/
|
|
43
|
+
export declare class KnowledgeAccessError extends Error {
|
|
44
|
+
/** 403 when every skipped knowledge base refused the person (or there was no token), else 502. */
|
|
45
|
+
readonly code: 403 | 502;
|
|
46
|
+
/** The knowledge bases that could not be searched, and why; empty when there was no token. */
|
|
47
|
+
readonly skipped: SkippedSource[];
|
|
48
|
+
/** The titles of the STACKFACTOR references citing those knowledge bases, each once. */
|
|
49
|
+
readonly documents: string[];
|
|
50
|
+
/**
|
|
51
|
+
* @param details `skipped` (from the search) and `documents` (titles); the
|
|
52
|
+
* code and the message follow from them
|
|
53
|
+
*/
|
|
54
|
+
constructor(details?: {
|
|
55
|
+
skipped?: SkippedSource[];
|
|
56
|
+
documents?: unknown[];
|
|
57
|
+
});
|
|
58
|
+
}
|
|
30
59
|
/**
|
|
31
60
|
* What a list of references points at: its pages, and the passages of the
|
|
32
61
|
* documents its STACKFACTOR references cite. One search per knowledge base per
|
|
33
|
-
* query (per batch of 500 documents), however many references there are.
|
|
34
|
-
*
|
|
35
|
-
*
|
|
62
|
+
* query (per batch of 500 documents), however many references there are.
|
|
63
|
+
*
|
|
64
|
+
* References that cite a knowledge base the run cannot read stop it: with no
|
|
65
|
+
* token, or when any cited knowledge base is skipped (refused or failed), it
|
|
66
|
+
* throws a KnowledgeAccessError naming the documents. A search that works and
|
|
67
|
+
* finds nothing is not an error. With no knowledge cited, no token is needed.
|
|
68
|
+
*
|
|
69
|
+
* A passage is attributed to the references citing its chunk, else to every
|
|
70
|
+
* reference citing its document. The best-ranked `maxPassages` are kept, and
|
|
71
|
+
* the first `maxPages` pages in reference order.
|
|
36
72
|
* @param options `references` (a skill's, a microskill's…), `queries` to
|
|
37
73
|
* search the cited documents with, `search` (client-api
|
|
38
74
|
* `knowledgeBaseAgent.search`), `token` (the run's AGENT token), `topK` per
|
|
39
|
-
* search (default 5)
|
|
40
|
-
* @returns `{ pages, passages, skipped, citesKnowledge }`
|
|
75
|
+
* search (default 5), `maxPassages` (default 40), `maxPages` (default: all)
|
|
76
|
+
* @returns `{ pages, passages, skipped, citesKnowledge }`; `skipped` is always
|
|
77
|
+
* empty, since a skip throws
|
|
78
|
+
* @throws KnowledgeAccessError When cited knowledge bases cannot be read
|
|
41
79
|
*/
|
|
42
80
|
export declare const gatherReferenceContext: (options: {
|
|
43
81
|
references: unknown;
|
|
@@ -45,6 +83,8 @@ export declare const gatherReferenceContext: (options: {
|
|
|
45
83
|
search: KnowledgeSearch;
|
|
46
84
|
token: string | null | undefined;
|
|
47
85
|
topK?: number;
|
|
86
|
+
maxPassages?: number;
|
|
87
|
+
maxPages?: number;
|
|
48
88
|
}) => Promise<ReferenceContext>;
|
|
49
89
|
/**
|
|
50
90
|
* The passages as a prompt shows them: who cites each, where it came from, and
|
|
@@ -92,23 +132,26 @@ export interface StoredReference {
|
|
|
92
132
|
}
|
|
93
133
|
/**
|
|
94
134
|
* The tools a run is given. Never `search`, `map` or `crawl`: a run reads what
|
|
95
|
-
* its references point at and discovers nothing. `extract` only,
|
|
96
|
-
* there are pages to open
|
|
135
|
+
* its references point at and discovers nothing. `extract` only, only when
|
|
136
|
+
* there are pages to open, and kept to those pages: any other url the model
|
|
137
|
+
* asks for is refused (`allowedUrls`).
|
|
97
138
|
* @param context From `gatherReferenceContext`
|
|
98
|
-
* @returns `{ tavily: { tools: ["extract"] } }` with pages, else
|
|
99
|
-
* pages it returns `{}`, so a caller spreading it over a config
|
|
100
|
-
* has a `tavily` key keeps that key (and `tavily: true` means
|
|
101
|
-
* extract): callers must not carry a base `tavily` key.
|
|
139
|
+
* @returns `{ tavily: { tools: ["extract"], allowedUrls } }` with pages, else
|
|
140
|
+
* `{}`. With no pages it returns `{}`, so a caller spreading it over a config
|
|
141
|
+
* that already has a `tavily` key keeps that key (and `tavily: true` means
|
|
142
|
+
* search plus extract): callers must not carry a base `tavily` key.
|
|
102
143
|
*/
|
|
103
144
|
export declare const toolsFor: (context: ReferenceContext) => {
|
|
104
145
|
tavily?: {
|
|
105
146
|
tools: string[];
|
|
147
|
+
allowedUrls: string[];
|
|
106
148
|
};
|
|
107
149
|
};
|
|
108
150
|
/**
|
|
109
151
|
* The stage prompt followed by the guidance for each kind of source the run
|
|
110
|
-
* has: pages, then passages; when it has neither
|
|
111
|
-
* guidance adds
|
|
152
|
+
* has: pages, then passages; when it has neither (knowledge cited and readable
|
|
153
|
+
* but no passage found included), the `none` guidance. An empty guidance adds
|
|
154
|
+
* nothing.
|
|
112
155
|
* @param stagePrompt The stage's own prompt
|
|
113
156
|
* @param context From `gatherReferenceContext`
|
|
114
157
|
* @param guidance From `sourceGuidanceFrom`
|
|
@@ -159,6 +202,7 @@ export declare const citedReferences: (ids: unknown, supplied: unknown, origin?:
|
|
|
159
202
|
*/
|
|
160
203
|
export declare const sourceGuidanceFrom: (config: Record<string, unknown>) => SourceGuidance;
|
|
161
204
|
declare const _default: {
|
|
205
|
+
KnowledgeAccessError: typeof KnowledgeAccessError;
|
|
162
206
|
REFERENCE_PASSAGES_KEY: string;
|
|
163
207
|
citedReferences: (ids: unknown, supplied: unknown, origin?: string) => StoredReference[];
|
|
164
208
|
composeSourceInstructions: (stagePrompt: string, context: ReferenceContext, guidance: SourceGuidance) => string;
|
|
@@ -168,6 +212,8 @@ declare const _default: {
|
|
|
168
212
|
search: KnowledgeSearch;
|
|
169
213
|
token: string | null | undefined;
|
|
170
214
|
topK?: number;
|
|
215
|
+
maxPassages?: number;
|
|
216
|
+
maxPages?: number;
|
|
171
217
|
}) => Promise<ReferenceContext>;
|
|
172
218
|
referenceForModel: <T extends {
|
|
173
219
|
kind?: string;
|
|
@@ -184,6 +230,7 @@ declare const _default: {
|
|
|
184
230
|
toolsFor: (context: ReferenceContext) => {
|
|
185
231
|
tavily?: {
|
|
186
232
|
tools: string[];
|
|
233
|
+
allowedUrls: string[];
|
|
187
234
|
};
|
|
188
235
|
};
|
|
189
236
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"referenceContext.d.ts","sourceRoot":"","sources":["../../src/referenceContext.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"referenceContext.d.ts","sourceRoot":"","sources":["../../src/referenceContext.ts"],"names":[],"mappings":"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"}
|