@browserlessapi/inferlo 0.3.0 → 0.5.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 +18 -3
- package/dist/adonisjs.d.ts +33 -0
- package/dist/adonisjs.js +30 -0
- package/dist/adonisjs.js.map +1 -0
- package/dist/ai/index.d.ts +51 -2
- package/dist/ai/index.js +186 -37
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/providers.d.ts +56 -3
- package/dist/ai/providers.js +102 -11
- package/dist/ai/providers.js.map +1 -1
- package/dist/ai/public.d.ts +20 -0
- package/dist/ai/public.js +17 -0
- package/dist/ai/public.js.map +1 -0
- package/dist/ai/tool.d.ts +47 -0
- package/dist/ai/tool.js +85 -0
- package/dist/ai/tool.js.map +1 -0
- package/dist/ai-client.d.ts +3 -0
- package/dist/ai-client.js +8 -0
- package/dist/ai-client.js.map +1 -0
- package/dist/app.d.ts +102 -2
- package/dist/app.js +509 -111
- package/dist/app.js.map +1 -1
- package/dist/cli/main.js +76 -4
- package/dist/cli/main.js.map +1 -1
- package/dist/client-ip.d.ts +7 -0
- package/dist/client-ip.js +27 -0
- package/dist/client-ip.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.js +101 -0
- package/dist/config.js.map +1 -0
- package/dist/cron.d.ts +17 -0
- package/dist/cron.js +143 -0
- package/dist/cron.js.map +1 -0
- package/dist/db/migrate.d.ts +6 -3
- package/dist/db/migrate.js +126 -10
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/table.d.ts +83 -7
- package/dist/db/table.js +245 -9
- package/dist/db/table.js.map +1 -1
- package/dist/deprecation.d.ts +23 -0
- package/dist/deprecation.js +70 -0
- package/dist/deprecation.js.map +1 -0
- package/dist/describe.d.ts +45 -5
- package/dist/describe.js +19 -2
- package/dist/describe.js.map +1 -1
- package/dist/elysia.d.ts +49 -0
- package/dist/elysia.js +10 -0
- package/dist/elysia.js.map +1 -0
- package/dist/env.d.ts +2 -0
- package/dist/env.js +5 -4
- package/dist/env.js.map +1 -1
- package/dist/express.d.ts +38 -0
- package/dist/express.js +18 -0
- package/dist/express.js.map +1 -0
- package/dist/fastify.d.ts +44 -0
- package/dist/fastify.js +47 -0
- package/dist/fastify.js.map +1 -0
- package/dist/hono.d.ts +26 -0
- package/dist/hono.js +10 -0
- package/dist/hono.js.map +1 -0
- package/dist/index.d.ts +20 -6
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/jobs.d.ts +181 -0
- package/dist/jobs.js +391 -0
- package/dist/jobs.js.map +1 -0
- package/dist/logging.d.ts +23 -0
- package/dist/logging.js +87 -0
- package/dist/logging.js.map +1 -0
- package/dist/mcp.d.ts +4 -6
- package/dist/mcp.js +53 -38
- package/dist/mcp.js.map +1 -1
- package/dist/metrics.d.ts +48 -0
- package/dist/metrics.js +184 -0
- package/dist/metrics.js.map +1 -0
- package/dist/nestjs.d.ts +43 -0
- package/dist/nestjs.js +47 -0
- package/dist/nestjs.js.map +1 -0
- package/dist/openapi.d.ts +0 -1
- package/dist/openapi.js +7 -0
- package/dist/openapi.js.map +1 -1
- package/dist/rate-limit.d.ts +45 -0
- package/dist/rate-limit.js +93 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/redact.d.ts +19 -0
- package/dist/redact.js +150 -0
- package/dist/redact.js.map +1 -0
- package/dist/route.d.ts +24 -0
- package/dist/route.js.map +1 -1
- package/dist/schema.d.ts +10 -2
- package/dist/schema.js +13 -1
- package/dist/schema.js.map +1 -1
- package/dist/secure-headers.d.ts +8 -0
- package/dist/secure-headers.js +61 -0
- package/dist/secure-headers.js.map +1 -0
- package/dist/serve.d.ts +53 -1
- package/dist/serve.js +158 -59
- package/dist/serve.js.map +1 -1
- package/dist/trpc.d.ts +57 -0
- package/dist/trpc.js +142 -0
- package/dist/trpc.js.map +1 -0
- package/dist/tsed.d.ts +32 -0
- package/dist/tsed.js +13 -0
- package/dist/tsed.js.map +1 -0
- package/llms.txt +10 -4
- package/package.json +57 -3
- package/templates/app/AGENTS.md +14 -8
- package/templates/app/README.md +2 -0
- package/templates/app/_env.example +2 -0
- package/templates/app/package.json.tpl +1 -0
- package/templates/app/src/app.ts +15 -8
- package/templates/app/src/config.ts +17 -0
- package/templates/app/src/routes/notes.ts +1 -1
- package/templates/app/src/server.ts +13 -3
- package/templates/app/src/routes/health.ts +0 -3
package/dist/mcp.js
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in MCP server (Model Context Protocol, Streamable HTTP transport, JSON responses).
|
|
3
|
+
* Routes with `tool: true` become tools. Tool calls run through the normal router, so auth,
|
|
4
|
+
* roles and validation apply exactly as they do for HTTP clients: the caller's Authorization
|
|
5
|
+
* header is forwarded.
|
|
6
|
+
*/
|
|
7
|
+
import { describeDeprecation, resolveDeprecation } from "./deprecation.js";
|
|
8
|
+
import { clientIps } from "./client-ip.js";
|
|
1
9
|
import { InferloError } from "./errors.js";
|
|
2
10
|
const PROTOCOL_VERSIONS = ["2025-06-18", "2025-03-26", "2024-11-05"];
|
|
3
11
|
function pathKeys(path) {
|
|
@@ -13,44 +21,47 @@ export function toolName(route) {
|
|
|
13
21
|
return `${route.method.toLowerCase()}_${slug}`;
|
|
14
22
|
}
|
|
15
23
|
export function toolDefinitions(app) {
|
|
16
|
-
return app.routes
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
24
|
+
return app.routes.filter((r) => r.options.tool).map(toolDefinition);
|
|
25
|
+
}
|
|
26
|
+
/** The tool definition of one route: its name, description and a JSON Schema of params, query and body together. */
|
|
27
|
+
export function toolDefinition(route) {
|
|
28
|
+
const properties = {};
|
|
29
|
+
const required = new Set();
|
|
30
|
+
const add = (schema) => {
|
|
31
|
+
if (!schema)
|
|
32
|
+
return;
|
|
33
|
+
for (const [k, v] of Object.entries(schema.properties ?? {}))
|
|
34
|
+
properties[k] = v;
|
|
35
|
+
for (const k of schema.required ?? [])
|
|
36
|
+
required.add(k);
|
|
37
|
+
};
|
|
38
|
+
const o = route.options;
|
|
39
|
+
if (o.params)
|
|
40
|
+
add(o.params.toJSONSchema());
|
|
41
|
+
else
|
|
42
|
+
for (const key of pathKeys(route.path))
|
|
43
|
+
(properties[key] = { type: "string" }), required.add(key);
|
|
44
|
+
if (o.query)
|
|
45
|
+
add(o.query.toJSONSchema());
|
|
46
|
+
if (o.body) {
|
|
47
|
+
const body = o.body.toJSONSchema();
|
|
48
|
+
if (body.type === "object")
|
|
49
|
+
add(body);
|
|
50
|
+
else {
|
|
51
|
+
properties.body = body;
|
|
52
|
+
required.add("body");
|
|
45
53
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
}
|
|
55
|
+
const toolOpt = typeof o.tool === "object" ? o.tool : {};
|
|
56
|
+
const description = toolOpt.description ?? o.description ?? o.summary ?? `${route.method} ${route.path}`;
|
|
57
|
+
// Models should prefer other tools over deprecated ones.
|
|
58
|
+
const sunset = typeof o.deprecated === "object" && o.deprecated.sunset !== undefined ? describeDeprecation(resolveDeprecation(o.deprecated, `${route.method} ${route.path}`)).sunset : undefined;
|
|
59
|
+
return {
|
|
60
|
+
name: toolName(route),
|
|
61
|
+
description: o.deprecated ? `${description} (Deprecated${sunset ? `, stops working on ${sunset}` : ""}.)` : description,
|
|
62
|
+
inputSchema: { type: "object", properties, ...(required.size ? { required: [...required] } : {}) },
|
|
63
|
+
route,
|
|
64
|
+
};
|
|
54
65
|
}
|
|
55
66
|
function rpcError(id, code, message) {
|
|
56
67
|
return { jsonrpc: "2.0", id: id ?? null, error: { code, message } };
|
|
@@ -120,7 +131,8 @@ export async function handleMcp(app, req, headers, testUsers) {
|
|
|
120
131
|
const result = await handleOne(payload);
|
|
121
132
|
return result ? new Response(JSON.stringify(result), { status: 200, headers }) : new Response(null, { status: 202, headers });
|
|
122
133
|
}
|
|
123
|
-
|
|
134
|
+
/** Run a tool call as an HTTP request to its route, forwarding the caller's credentials, so auth, roles and validation apply. */
|
|
135
|
+
export async function callTool(app, tool, args, original, testUsers) {
|
|
124
136
|
const route = tool.route;
|
|
125
137
|
const o = route.options;
|
|
126
138
|
const keys = pathKeys(route.path);
|
|
@@ -161,6 +173,9 @@ async function callTool(app, tool, args, original, testUsers) {
|
|
|
161
173
|
const inner = new Request(url, { method: route.method, headers, body: payload });
|
|
162
174
|
if (testUsers.has(original))
|
|
163
175
|
testUsers.set(inner, testUsers.get(original));
|
|
176
|
+
const ip = clientIps.get(original);
|
|
177
|
+
if (ip)
|
|
178
|
+
clientIps.set(inner, ip);
|
|
164
179
|
return app.fetch(inner);
|
|
165
180
|
}
|
|
166
181
|
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,iBAAiB,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AASrE,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAe;IACtC,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACzF,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,IAAI,KAAK,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC;IAC/E,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAa;IAC3C,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACtE,CAAC;AAED,oHAAoH;AACpH,MAAM,UAAU,cAAc,CAAC,KAAe;IAC5C,MAAM,UAAU,GAA+B,EAAE,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,MAA8B,EAAE,EAAE;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAE,MAAM,CAAC,UAAyC,IAAI,EAAE,CAAC;YAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChH,KAAK,MAAM,CAAC,IAAK,MAAM,CAAC,QAAqB,IAAI,EAAE;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC;IACF,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;IACxB,IAAI,CAAC,CAAC,MAAM;QAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;;QACtC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvG,IAAI,CAAC,CAAC,KAAK;QAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC;aACjC,CAAC;YACJ,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;YACvB,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;IACzG,yDAAyD;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAClM,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC;QACrB,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,WAAW,eAAe,MAAM,CAAC,CAAC,CAAC,sBAAsB,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW;QACvH,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;QAClG,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,EAAW,EAAE,IAAY,EAAE,OAAe;IAC1D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAa,EAAE,GAAY,EAAE,OAAgB,EAAE,SAAoC;IACjH,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAC;IAC/D,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,4BAA4B,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IACtH,CAAC;IACD,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IACvG,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,KAAK,EAAE,GAA0F,EAAE,EAAE;QACrH,MAAM,cAAc,GAAG,GAAG,EAAE,EAAE,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;QACjG,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QACzH,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC;YAAE,OAAO,SAAS,CAAC;QACtE,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,IAAI,EAAE,CAAC,CAAC;gBAC5D,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,MAAM,EAAE;wBACN,eAAe,EAAE,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;wBACzF,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE;wBAC/C,UAAU,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;wBACpD,YAAY,EAAE,aAAa,GAAG,CAAC,IAAI,uEAAuE;qBAC3G;iBACF,CAAC;YACJ,CAAC;YACD,KAAK,MAAM;gBACT,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YACpD,KAAK,YAAY;gBACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YACpJ,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;gBAChD,IAAI,CAAC,IAAI;oBAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,iBAAiB,IAAI,EAAE,CAAC,CAAC;gBACpE,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAA4B,CAAC;gBACtE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;gBACjE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE;iBACnG,CAAC;YACJ,CAAC;YACD;gBACE,IAAI,cAAc;oBAAE,OAAO,SAAS,CAAC;gBACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,qBAAqB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5E,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IACzI,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAgB,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;AAChI,CAAC;AAED,iIAAiI;AACjI,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAa,EAAE,IAAoB,EAAE,IAA6B,EAAE,QAAiB,EAAE,SAAoC;IACxJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;IACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAE,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,UAAqB,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7F,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACtB,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC7E,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAAE,KAAK,MAAM,IAAI,IAAI,CAAC;oBAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;iBACrE,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;gBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,CAAC;;YAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,8BAA8B,KAAK,CAAC,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1J,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IACxC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,OAA2B,CAAC;IAChC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACzC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACjF,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3E,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,EAAE;QAAE,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACjC,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export interface MetricsConfig {
|
|
2
|
+
/** Path of the metrics endpoint. Default "/metrics". */
|
|
3
|
+
path?: string;
|
|
4
|
+
/**
|
|
5
|
+
* Require Authorization: Bearer <token> to read metrics (set the same token in the scraper's
|
|
6
|
+
* bearer_token). Without it the endpoint is public, so only leave it out when the endpoint is not
|
|
7
|
+
* reachable from the internet.
|
|
8
|
+
*/
|
|
9
|
+
token?: string;
|
|
10
|
+
/** Upper bounds in seconds of the duration histogram buckets. Default 0.005 to 10 seconds. */
|
|
11
|
+
buckets?: readonly number[];
|
|
12
|
+
}
|
|
13
|
+
export interface ResolvedMetrics {
|
|
14
|
+
path: string;
|
|
15
|
+
token: string | undefined;
|
|
16
|
+
buckets: number[];
|
|
17
|
+
}
|
|
18
|
+
/** Default histogram buckets in seconds, the same as the Prometheus client libraries. */
|
|
19
|
+
export declare const DEFAULT_BUCKETS: number[];
|
|
20
|
+
/** Checks createApp({ metrics }) and returns it with defaults, or undefined when metrics are off. */
|
|
21
|
+
export declare function resolveMetrics(option: unknown, taken: {
|
|
22
|
+
path: string | false;
|
|
23
|
+
what: string;
|
|
24
|
+
}[]): ResolvedMetrics | undefined;
|
|
25
|
+
/** True when the request carries Authorization: Bearer <token>, compared in constant time. */
|
|
26
|
+
export declare function hasMetricsToken(req: Request, token: string): boolean;
|
|
27
|
+
export interface AppMetrics {
|
|
28
|
+
/** A request finished: route is the route pattern ("/tickets/:id"), or "unmatched". */
|
|
29
|
+
request(method: string, route: string, status: number, seconds: number): void;
|
|
30
|
+
inFlight(delta: number): void;
|
|
31
|
+
job(name: string, outcome: "done" | "retried" | "failed", seconds: number): void;
|
|
32
|
+
ai(usage: {
|
|
33
|
+
requested: string;
|
|
34
|
+
model: string;
|
|
35
|
+
kind: string;
|
|
36
|
+
inputTokens: number;
|
|
37
|
+
outputTokens: number;
|
|
38
|
+
cost: number;
|
|
39
|
+
durationMs: number;
|
|
40
|
+
}): void;
|
|
41
|
+
/** The Prometheus text exposition of every metric. */
|
|
42
|
+
render(): string;
|
|
43
|
+
}
|
|
44
|
+
export declare function createMetrics(info: {
|
|
45
|
+
app: string;
|
|
46
|
+
version: string;
|
|
47
|
+
inferlo: string;
|
|
48
|
+
}, buckets: readonly number[]): AppMetrics;
|
package/dist/metrics.js
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics: request, job and AI counters and histograms in the Prometheus text format.
|
|
3
|
+
*
|
|
4
|
+
* createApp({ metrics: { token: settings.METRICS_TOKEN } })
|
|
5
|
+
*
|
|
6
|
+
* serves GET /metrics for Prometheus, Grafana Agent, the OpenTelemetry Collector, Datadog and others.
|
|
7
|
+
*/
|
|
8
|
+
import { InferloError } from "./errors.js";
|
|
9
|
+
/** Default histogram buckets in seconds, the same as the Prometheus client libraries. */
|
|
10
|
+
export const DEFAULT_BUCKETS = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10];
|
|
11
|
+
/** Methods outside this list are counted as "OTHER", so clients cannot create unlimited series. */
|
|
12
|
+
const METHODS = new Set(["GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"]);
|
|
13
|
+
/** Checks createApp({ metrics }) and returns it with defaults, or undefined when metrics are off. */
|
|
14
|
+
export function resolveMetrics(option, taken) {
|
|
15
|
+
if (option === undefined || option === false)
|
|
16
|
+
return undefined;
|
|
17
|
+
const problems = [];
|
|
18
|
+
let path = "/metrics";
|
|
19
|
+
let token;
|
|
20
|
+
let buckets = DEFAULT_BUCKETS;
|
|
21
|
+
if (option !== true) {
|
|
22
|
+
if (!option || typeof option !== "object" || Array.isArray(option))
|
|
23
|
+
problems.push("metrics must be true or an object such as { token: settings.METRICS_TOKEN }");
|
|
24
|
+
else {
|
|
25
|
+
const { path: p, token: tk, buckets: b, ...rest } = option;
|
|
26
|
+
if (p !== undefined) {
|
|
27
|
+
if (typeof p !== "string" || !p.startsWith("/"))
|
|
28
|
+
problems.push(`path must start with "/", got ${JSON.stringify(p)}`);
|
|
29
|
+
else
|
|
30
|
+
path = p;
|
|
31
|
+
}
|
|
32
|
+
// { token: settings.METRICS_TOKEN } with the variable unset must not make the endpoint public.
|
|
33
|
+
if (tk === undefined && "token" in option)
|
|
34
|
+
problems.push("token is undefined (is the variable it comes from set?); leave token out only for a public endpoint");
|
|
35
|
+
else if (tk !== undefined) {
|
|
36
|
+
if (typeof tk !== "string" || tk.length < 16)
|
|
37
|
+
problems.push("token must be a string of at least 16 characters (a random secret from configuration)");
|
|
38
|
+
else
|
|
39
|
+
token = tk;
|
|
40
|
+
}
|
|
41
|
+
if (b !== undefined) {
|
|
42
|
+
const ok = Array.isArray(b) && b.length > 0 && b.every((n, i) => typeof n === "number" && Number.isFinite(n) && n > 0 && (i === 0 || n > b[i - 1]));
|
|
43
|
+
if (!ok)
|
|
44
|
+
problems.push("buckets must be increasing positive numbers of seconds, such as [0.1, 0.5, 1, 5]");
|
|
45
|
+
else
|
|
46
|
+
buckets = [...b];
|
|
47
|
+
}
|
|
48
|
+
for (const key of Object.keys(rest))
|
|
49
|
+
problems.push(`unknown option "${key}"`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
for (const { path: other, what } of taken)
|
|
53
|
+
if (!problems.length && other && other.replace(/\/+$/, "") === path.replace(/\/+$/, ""))
|
|
54
|
+
problems.push(`path ${path} is also ${what}`);
|
|
55
|
+
if (problems.length) {
|
|
56
|
+
throw new InferloError("IL6020", `Invalid metrics options: ${problems.join("; ")}.`, {
|
|
57
|
+
fix: 'Use createApp({ metrics: true }) or createApp({ metrics: { path: "/metrics", token: settings.METRICS_TOKEN } }).',
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return { path, token, buckets };
|
|
61
|
+
}
|
|
62
|
+
/** True when the request carries Authorization: Bearer <token>, compared in constant time. */
|
|
63
|
+
export function hasMetricsToken(req, token) {
|
|
64
|
+
const header = req.headers.get("authorization") ?? "";
|
|
65
|
+
const match = /^Bearer\s+(.+)$/i.exec(header.trim());
|
|
66
|
+
if (!match)
|
|
67
|
+
return false;
|
|
68
|
+
const a = new TextEncoder().encode(match[1]);
|
|
69
|
+
const b = new TextEncoder().encode(token);
|
|
70
|
+
let diff = a.length ^ b.length;
|
|
71
|
+
for (let i = 0; i < b.length; i++)
|
|
72
|
+
diff |= (a[i] ?? 0) ^ b[i];
|
|
73
|
+
return diff === 0;
|
|
74
|
+
}
|
|
75
|
+
function key(labels) {
|
|
76
|
+
return JSON.stringify(Object.entries(labels));
|
|
77
|
+
}
|
|
78
|
+
function escape(value) {
|
|
79
|
+
return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\n");
|
|
80
|
+
}
|
|
81
|
+
function labelText(labels) {
|
|
82
|
+
const parts = Object.entries(labels).map(([k, v]) => `${k}="${escape(v)}"`);
|
|
83
|
+
return parts.length ? `{${parts.join(",")}}` : "";
|
|
84
|
+
}
|
|
85
|
+
function number(n) {
|
|
86
|
+
if (n === Infinity)
|
|
87
|
+
return "+Inf";
|
|
88
|
+
return String(Math.round(n * 1e9) / 1e9);
|
|
89
|
+
}
|
|
90
|
+
export function createMetrics(info, buckets) {
|
|
91
|
+
const counters = new Map();
|
|
92
|
+
const histograms = new Map();
|
|
93
|
+
let inFlight = 0;
|
|
94
|
+
const add = (name, labels, value) => {
|
|
95
|
+
let series = counters.get(name);
|
|
96
|
+
if (!series)
|
|
97
|
+
counters.set(name, (series = new Map()));
|
|
98
|
+
const k = key(labels);
|
|
99
|
+
const entry = series.get(k);
|
|
100
|
+
if (entry)
|
|
101
|
+
entry.value += value;
|
|
102
|
+
else
|
|
103
|
+
series.set(k, { labels, value });
|
|
104
|
+
};
|
|
105
|
+
const observe = (name, labels, value) => {
|
|
106
|
+
let series = histograms.get(name);
|
|
107
|
+
if (!series)
|
|
108
|
+
histograms.set(name, (series = new Map()));
|
|
109
|
+
const k = key(labels);
|
|
110
|
+
let h = series.get(k);
|
|
111
|
+
if (!h)
|
|
112
|
+
series.set(k, (h = { labels, counts: buckets.map(() => 0), sum: 0, count: 0 }));
|
|
113
|
+
for (let i = 0; i < buckets.length; i++)
|
|
114
|
+
if (value <= buckets[i])
|
|
115
|
+
h.counts[i]++;
|
|
116
|
+
h.sum += value;
|
|
117
|
+
h.count++;
|
|
118
|
+
};
|
|
119
|
+
const help = {
|
|
120
|
+
inferlo_info: ["gauge", "The app's name and version and the Inferlo version (always 1)."],
|
|
121
|
+
inferlo_http_requests_total: ["counter", "HTTP requests by method, route pattern and status."],
|
|
122
|
+
inferlo_http_request_duration_seconds: ["histogram", "Time until the response headers were ready, by method and route pattern."],
|
|
123
|
+
inferlo_http_requests_in_flight: ["gauge", "HTTP requests being handled now."],
|
|
124
|
+
inferlo_job_runs_total: ["counter", "Job attempts run in this process, by job and outcome (done, retried or failed)."],
|
|
125
|
+
inferlo_job_duration_seconds: ["histogram", "Time each job attempt took, by job."],
|
|
126
|
+
inferlo_ai_calls_total: ["counter", "AI calls by requested alias or model, the model that answered, and kind (generate, stream or embed)."],
|
|
127
|
+
inferlo_ai_tokens_total: ["counter", "AI tokens by requested alias or model, the model that answered, and type (input or output)."],
|
|
128
|
+
inferlo_ai_cost_usd_total: ["counter", "AI cost in US dollars from ai.pricing, by requested alias or model and the model that answered."],
|
|
129
|
+
inferlo_ai_call_duration_seconds: ["histogram", "Time each AI call took, by requested alias or model and the model that answered."],
|
|
130
|
+
};
|
|
131
|
+
return {
|
|
132
|
+
request(method, route, status, seconds) {
|
|
133
|
+
const m = method.toUpperCase();
|
|
134
|
+
const labels = { method: METHODS.has(m) ? m : "OTHER", route };
|
|
135
|
+
add("inferlo_http_requests_total", { ...labels, status: String(status) }, 1);
|
|
136
|
+
observe("inferlo_http_request_duration_seconds", labels, seconds);
|
|
137
|
+
},
|
|
138
|
+
inFlight(delta) {
|
|
139
|
+
inFlight += delta;
|
|
140
|
+
},
|
|
141
|
+
job(name, outcome, seconds) {
|
|
142
|
+
add("inferlo_job_runs_total", { job: name, outcome }, 1);
|
|
143
|
+
observe("inferlo_job_duration_seconds", { job: name }, seconds);
|
|
144
|
+
},
|
|
145
|
+
ai(usage) {
|
|
146
|
+
const labels = { requested: usage.requested, model: usage.model };
|
|
147
|
+
add("inferlo_ai_calls_total", { ...labels, kind: usage.kind }, 1);
|
|
148
|
+
add("inferlo_ai_tokens_total", { ...labels, type: "input" }, usage.inputTokens);
|
|
149
|
+
add("inferlo_ai_tokens_total", { ...labels, type: "output" }, usage.outputTokens);
|
|
150
|
+
add("inferlo_ai_cost_usd_total", labels, usage.cost);
|
|
151
|
+
observe("inferlo_ai_call_duration_seconds", labels, usage.durationMs / 1000);
|
|
152
|
+
},
|
|
153
|
+
render() {
|
|
154
|
+
const lines = [];
|
|
155
|
+
const header = (name) => {
|
|
156
|
+
const [type, text] = help[name];
|
|
157
|
+
lines.push(`# HELP ${name} ${text}`, `# TYPE ${name} ${type}`);
|
|
158
|
+
};
|
|
159
|
+
header("inferlo_info");
|
|
160
|
+
lines.push(`inferlo_info${labelText(info)} 1`);
|
|
161
|
+
header("inferlo_http_requests_in_flight");
|
|
162
|
+
lines.push(`inferlo_http_requests_in_flight ${inFlight}`);
|
|
163
|
+
for (const name of Object.keys(help)) {
|
|
164
|
+
const series = counters.get(name);
|
|
165
|
+
if (series) {
|
|
166
|
+
header(name);
|
|
167
|
+
for (const { labels, value } of series.values())
|
|
168
|
+
lines.push(`${name}${labelText(labels)} ${number(value)}`);
|
|
169
|
+
}
|
|
170
|
+
const hist = histograms.get(name);
|
|
171
|
+
if (hist) {
|
|
172
|
+
header(name);
|
|
173
|
+
for (const h of hist.values()) {
|
|
174
|
+
buckets.forEach((le, i) => lines.push(`${name}_bucket${labelText({ ...h.labels, le: number(le) })} ${h.counts[i]}`));
|
|
175
|
+
lines.push(`${name}_bucket${labelText({ ...h.labels, le: "+Inf" })} ${h.count}`);
|
|
176
|
+
lines.push(`${name}_sum${labelText(h.labels)} ${number(h.sum)}`, `${name}_count${labelText(h.labels)} ${h.count}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return lines.join("\n") + "\n";
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
|
package/dist/nestjs.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inferlo inside NestJS (11 and later), without a runtime dependency on NestJS:
|
|
3
|
+
*
|
|
4
|
+
* import { INFERLO_AI, InferloModule } from "@browserlessapi/inferlo/nestjs";
|
|
5
|
+
*
|
|
6
|
+
* @Module({ imports: [InferloModule.forRoot({ ai })] }) // or forRootAsync({ inject, useFactory })
|
|
7
|
+
* export class AppModule {}
|
|
8
|
+
*
|
|
9
|
+
* @Injectable()
|
|
10
|
+
* export class TicketsService {
|
|
11
|
+
* constructor(@Inject(INFERLO_AI) private readonly ai: AI) {}
|
|
12
|
+
* }
|
|
13
|
+
*
|
|
14
|
+
* A whole Inferlo app mounts with app.use("/api", toNodeHandler(inferloApp)) on the Express platform.
|
|
15
|
+
* This entry point never loads the router, database or jobs code.
|
|
16
|
+
*/
|
|
17
|
+
import type { DynamicModule } from "@nestjs/common";
|
|
18
|
+
import type { AI } from "./ai/index.ts";
|
|
19
|
+
/** Injection token for the AI client: constructor(@Inject(INFERLO_AI) private readonly ai: AI) {}. */
|
|
20
|
+
export declare const INFERLO_AI = "INFERLO_AI";
|
|
21
|
+
export interface InferloModuleOptions {
|
|
22
|
+
/** The AI client: createAI(...) from @browserlessapi/inferlo/ai, or an Inferlo app's app.ai. */
|
|
23
|
+
ai: AI;
|
|
24
|
+
/** Make INFERLO_AI injectable in every module without importing InferloModule again. Default true. */
|
|
25
|
+
global?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface InferloModuleAsyncOptions {
|
|
28
|
+
/** Modules whose providers useFactory needs, for example ConfigModule. */
|
|
29
|
+
imports?: DynamicModule["imports"];
|
|
30
|
+
/** Providers passed to useFactory, in order, for example [ConfigService]. */
|
|
31
|
+
inject?: unknown[];
|
|
32
|
+
/** Returns the AI client, for example from configuration: (config) => createAI({ ... }). */
|
|
33
|
+
useFactory: (...args: any[]) => AI | Promise<AI>;
|
|
34
|
+
/** Default true, as in forRoot. */
|
|
35
|
+
global?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/** A NestJS module that provides the AI client as INFERLO_AI. Use InferloModule.forRoot({ ai }) in imports. */
|
|
38
|
+
export declare class InferloModule {
|
|
39
|
+
/** Provide an AI client you already have. */
|
|
40
|
+
static forRoot(options: InferloModuleOptions): DynamicModule;
|
|
41
|
+
/** Create the AI client when Nest starts, from other providers (for example ConfigService). */
|
|
42
|
+
static forRootAsync(options: InferloModuleAsyncOptions): DynamicModule;
|
|
43
|
+
}
|
package/dist/nestjs.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { assertAIClient } from "./ai-client.js";
|
|
2
|
+
import { InferloError } from "./errors.js";
|
|
3
|
+
/** Injection token for the AI client: constructor(@Inject(INFERLO_AI) private readonly ai: AI) {}. */
|
|
4
|
+
export const INFERLO_AI = "INFERLO_AI";
|
|
5
|
+
const fix = 'Pass createAI({ providers, models }) from "@browserlessapi/inferlo/ai", or an Inferlo app\'s app.ai: InferloModule.forRoot({ ai }).';
|
|
6
|
+
/** A NestJS module that provides the AI client as INFERLO_AI. Use InferloModule.forRoot({ ai }) in imports. */
|
|
7
|
+
export class InferloModule {
|
|
8
|
+
/** Provide an AI client you already have. */
|
|
9
|
+
static forRoot(options) {
|
|
10
|
+
if (!options || typeof options !== "object")
|
|
11
|
+
throw new InferloError("IL5016", "InferloModule.forRoot() needs options with ai.", { fix });
|
|
12
|
+
assertAIClient(options.ai, fix);
|
|
13
|
+
return {
|
|
14
|
+
module: InferloModule,
|
|
15
|
+
global: options.global ?? true,
|
|
16
|
+
providers: [{ provide: INFERLO_AI, useValue: options.ai }],
|
|
17
|
+
exports: [INFERLO_AI],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** Create the AI client when Nest starts, from other providers (for example ConfigService). */
|
|
21
|
+
static forRootAsync(options) {
|
|
22
|
+
if (!options || typeof options.useFactory !== "function") {
|
|
23
|
+
throw new InferloError("IL5016", "InferloModule.forRootAsync() needs a useFactory function.", {
|
|
24
|
+
fix: "Use InferloModule.forRootAsync({ inject: [ConfigService], useFactory: (config) => createAI({ ... }) }).",
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
const { useFactory } = options;
|
|
28
|
+
return {
|
|
29
|
+
module: InferloModule,
|
|
30
|
+
global: options.global ?? true,
|
|
31
|
+
imports: options.imports ?? [],
|
|
32
|
+
providers: [
|
|
33
|
+
{
|
|
34
|
+
provide: INFERLO_AI,
|
|
35
|
+
inject: (options.inject ?? []),
|
|
36
|
+
useFactory: async (...args) => {
|
|
37
|
+
const ai = await useFactory(...args);
|
|
38
|
+
assertAIClient(ai, "useFactory must return createAI({ providers, models }) or an Inferlo app's app.ai.");
|
|
39
|
+
return ai;
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
exports: [INFERLO_AI],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=nestjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nestjs.js","sourceRoot":"","sources":["../src/nestjs.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,sGAAsG;AACtG,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;AAoBvC,MAAM,GAAG,GAAG,qIAAqI,CAAC;AAElJ,+GAA+G;AAC/G,MAAM,OAAO,aAAa;IACxB,6CAA6C;IAC7C,MAAM,CAAC,OAAO,CAAC,OAA6B;QAC1C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,MAAM,IAAI,YAAY,CAAC,QAAQ,EAAE,gDAAgD,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACzI,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAChC,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;YAC9B,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;YAC1D,OAAO,EAAE,CAAC,UAAU,CAAC;SACtB,CAAC;IACJ,CAAC;IAED,+FAA+F;IAC/F,MAAM,CAAC,YAAY,CAAC,OAAkC;QACpD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YACzD,MAAM,IAAI,YAAY,CAAC,QAAQ,EAAE,2DAA2D,EAAE;gBAC5F,GAAG,EAAE,yGAAyG;aAC/G,CAAC,CAAC;QACL,CAAC;QACD,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAC/B,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;YAC9B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,UAAU;oBACnB,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAY;oBACzC,UAAU,EAAE,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;wBACvC,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;wBACrC,cAAc,CAAC,EAAE,EAAE,oFAAoF,CAAC,CAAC;wBACzG,OAAO,EAAE,CAAC;oBACZ,CAAC;iBACF;aACF;YACD,OAAO,EAAE,CAAC,UAAU,CAAC;SACtB,CAAC;IACJ,CAAC;CACF"}
|
package/dist/openapi.d.ts
CHANGED
package/dist/openapi.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/** OpenAPI 3.1 document generated from routes. Served at /openapi.json by default. */
|
|
2
|
+
import { describeDeprecation, resolveDeprecation } from "./deprecation.js";
|
|
1
3
|
import { toolName } from "./mcp.js";
|
|
2
4
|
const errorSchema = {
|
|
3
5
|
type: "object",
|
|
@@ -45,10 +47,15 @@ export function buildOpenAPI(app, options) {
|
|
|
45
47
|
"200": { description: "Success", content: o.response ? { "application/json": { schema: o.response.toJSONSchema() } } : undefined },
|
|
46
48
|
...(o.body || o.query || o.params ? { "422": { description: "Validation failed (IL1001)", content: { "application/json": { schema: errorSchema } } } } : {}),
|
|
47
49
|
...(!isPublic ? { "401": { description: "Sign in required (IL3001)", content: { "application/json": { schema: errorSchema } } } } : {}),
|
|
50
|
+
...(o.rateLimit
|
|
51
|
+
? { "429": { description: `Too many requests (IL2005): ${o.rateLimit.max} per ${o.rateLimit.per} per ${o.rateLimit.by ?? "user"}`, content: { "application/json": { schema: errorSchema } } } }
|
|
52
|
+
: {}),
|
|
48
53
|
},
|
|
49
54
|
security: !isPublic && options.auth ? [{ bearerAuth: [] }] : undefined,
|
|
50
55
|
"x-inferlo-auth": o.auth ?? "user",
|
|
51
56
|
"x-inferlo-tool": o.tool ? toolName(route) : undefined,
|
|
57
|
+
deprecated: o.deprecated ? true : undefined,
|
|
58
|
+
"x-inferlo-deprecation": typeof o.deprecated === "object" ? describeDeprecation(resolveDeprecation(o.deprecated, `${route.method} ${route.path}`)) : undefined,
|
|
52
59
|
};
|
|
53
60
|
for (const key of Object.keys(operation))
|
|
54
61
|
if (operation[key] === undefined)
|
package/dist/openapi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate limiting per route: route.post("/login", { auth: "public", rateLimit: { max: 5, per: "minute", by: "ip" } }).
|
|
3
|
+
* Fixed windows, counted in memory (one process) or in the database (shared by every instance).
|
|
4
|
+
*/
|
|
5
|
+
import type { Adapter } from "./db/types.ts";
|
|
6
|
+
import { InferloError } from "./errors.ts";
|
|
7
|
+
export interface RateLimit {
|
|
8
|
+
/** Requests allowed per window. */
|
|
9
|
+
max: number;
|
|
10
|
+
/** Window length. */
|
|
11
|
+
per: "second" | "minute" | "hour" | "day";
|
|
12
|
+
/**
|
|
13
|
+
* Who is counted. "user": each signed-in user (requests without a user count by IP).
|
|
14
|
+
* "ip": each client IP address. Default "user".
|
|
15
|
+
*/
|
|
16
|
+
by?: "user" | "ip";
|
|
17
|
+
}
|
|
18
|
+
export interface RateLimitConfig {
|
|
19
|
+
/**
|
|
20
|
+
* Where counts are kept. "memory" (default): in this process, for one instance and tests.
|
|
21
|
+
* "database": in the inferlo_rate_limits table of the app's Postgres database, shared by every instance.
|
|
22
|
+
*/
|
|
23
|
+
store?: "memory" | "database";
|
|
24
|
+
}
|
|
25
|
+
/** Counts hits per key in fixed windows. */
|
|
26
|
+
export interface RateLimitStore {
|
|
27
|
+
hit(key: string, windowMs: number): Promise<{
|
|
28
|
+
count: number;
|
|
29
|
+
resetMs: number;
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
export declare function windowMs(limit: RateLimit): number;
|
|
33
|
+
/** Check a route's rateLimit option at startup. Raises IL6007. */
|
|
34
|
+
export declare function checkRateLimit(limit: unknown, where: string): void;
|
|
35
|
+
export declare function memoryRateLimitStore(now?: () => number): RateLimitStore;
|
|
36
|
+
/** Counts in the inferlo_rate_limits table (created on first use), one row per key, updated atomically. */
|
|
37
|
+
export declare function databaseRateLimitStore(adapter: Adapter): RateLimitStore;
|
|
38
|
+
/** Headers for a limited route, and the IL2005 error once the limit is passed. */
|
|
39
|
+
export declare function rateLimitResult(limit: RateLimit, hit: {
|
|
40
|
+
count: number;
|
|
41
|
+
resetMs: number;
|
|
42
|
+
}): {
|
|
43
|
+
headers: Record<string, string>;
|
|
44
|
+
error?: InferloError;
|
|
45
|
+
};
|