@deeprelay/mcp 0.1.0 → 0.1.2
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 +15 -4
- package/dist/auth.d.ts +6 -0
- package/dist/auth.js +16 -0
- package/dist/auth.js.map +1 -1
- package/dist/guardrail/estimate.d.ts +13 -1
- package/dist/guardrail/estimate.js +39 -10
- package/dist/guardrail/estimate.js.map +1 -1
- package/dist/tools/readonly/define.d.ts +12 -1
- package/dist/tools/readonly/define.js +17 -3
- package/dist/tools/readonly/define.js.map +1 -1
- package/dist/tools/readonly/index.d.ts +1 -1
- package/dist/tools/readonly/index.js +54 -25
- package/dist/tools/readonly/index.js.map +1 -1
- package/dist/tools/readonly/usage.d.ts +29 -0
- package/dist/tools/readonly/usage.js +163 -0
- package/dist/tools/readonly/usage.js.map +1 -0
- package/dist/tools/readonly/video-reads.js +7 -4
- package/dist/tools/readonly/video-reads.js.map +1 -1
- package/dist/tools/spend/media.js +7 -5
- package/dist/tools/spend/media.js.map +1 -1
- package/dist/tools/spend/pricing.js +4 -0
- package/dist/tools/spend/pricing.js.map +1 -1
- package/dist/tools/write/payment-links.js +26 -4
- package/dist/tools/write/payment-links.js.map +1 -1
- package/dist/tools/write/spending-limit.js +26 -33
- package/dist/tools/write/spending-limit.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -124,8 +124,9 @@ one server process.
|
|
|
124
124
|
Estimates are reserved before each call and replaced by the actual cost
|
|
125
125
|
afterwards. A failed call releases its reservation.
|
|
126
126
|
|
|
127
|
-
**Video is quoted as a floor, not a cap.** `deeprelay_videos_create`
|
|
128
|
-
the
|
|
127
|
+
**Video is quoted as a floor, not a cap.** `deeprelay_videos_create` prices the
|
|
128
|
+
clip the way the platform bills it, per second of the requested `seconds` (the
|
|
129
|
+
model's default length when omitted), and reserves that floor. When `deeprelay_videos_get` or `deeprelay_videos_list` sees the
|
|
129
130
|
job completed, the reservation settles at the actual `cost_cents`. Failed,
|
|
130
131
|
cancelled or expired jobs are not billed. If the server exits before the job
|
|
131
132
|
finishes, the reservation is dropped and the real charge appears in
|
|
@@ -173,9 +174,19 @@ finishes, the reservation is dropped and the real charge appears in
|
|
|
173
174
|
**Money (4):** `deeprelay_chat_completion`, `deeprelay_embeddings_create`,
|
|
174
175
|
`deeprelay_images_generate`, `deeprelay_videos_create`.
|
|
175
176
|
|
|
176
|
-
`deeprelay_health`
|
|
177
|
+
`deeprelay_health` calls the unauthenticated liveness endpoint, so it answers
|
|
178
|
+
even when the key is wrong or revoked; the server itself still needs
|
|
179
|
+
`DEEPRELAY_API_KEY` set to start. `deeprelay_usage_get` reports serverless
|
|
180
|
+
inference usage: optional `modality` (`chat`, `image`, `video`, `embedding`),
|
|
181
|
+
`model`, `bucket`, `start` and `end`; with no `modality` or `model` it covers
|
|
182
|
+
all four modalities and returns `total_cost_cents` plus per-modality subtotals.
|
|
183
|
+
It follows pages itself and never counts a row twice; `truncated: true` means
|
|
184
|
+
the totals cover only the rows returned, so narrow `start`/`end`.
|
|
185
|
+
`deeprelay_videos_content` saves the MP4
|
|
177
186
|
to a local file (under the system temp directory by default, or an absolute
|
|
178
|
-
`output_path`) instead of returning it inline.
|
|
187
|
+
`output_path`) instead of returning it inline. Because it writes a file it
|
|
188
|
+
advertises `readOnlyHint: false` and `idempotentHint: false`; it still costs
|
|
189
|
+
nothing and needs no confirmation.
|
|
179
190
|
|
|
180
191
|
Per-tool arguments and the full guide are at <https://deeprelay.ai/docs/mcp>.
|
|
181
192
|
|
package/dist/auth.d.ts
CHANGED
|
@@ -28,6 +28,12 @@ export declare function requireApiKey(env?: Env): string;
|
|
|
28
28
|
* never produce `//`.
|
|
29
29
|
*/
|
|
30
30
|
export declare function resolveBaseUrl(env?: Env): string;
|
|
31
|
+
/**
|
|
32
|
+
* The API base as it may be shown to the agent: resolveBaseUrl with any
|
|
33
|
+
* userinfo (`user:pass@`) removed (WR-07). A proxy basic-auth base must never
|
|
34
|
+
* land in a transcript; errors.ts strips it from messages the same way.
|
|
35
|
+
*/
|
|
36
|
+
export declare function displayBaseUrl(env?: Env): string;
|
|
31
37
|
/**
|
|
32
38
|
* Build the single SDK Configuration every tool uses.
|
|
33
39
|
*
|
package/dist/auth.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.StartupConfigError = exports.PROD_API_BASE = exports.API_BASE_ENV = exports.API_KEY_ENV = void 0;
|
|
4
4
|
exports.requireApiKey = requireApiKey;
|
|
5
5
|
exports.resolveBaseUrl = resolveBaseUrl;
|
|
6
|
+
exports.displayBaseUrl = displayBaseUrl;
|
|
6
7
|
exports.buildConfiguration = buildConfiguration;
|
|
7
8
|
exports.describeStartupError = describeStartupError;
|
|
8
9
|
// Startup configuration and the one API-client construction site
|
|
@@ -87,6 +88,21 @@ function resolveBaseUrl(env = process.env) {
|
|
|
87
88
|
}
|
|
88
89
|
return raw.replace(/\/+$/, "");
|
|
89
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* The API base as it may be shown to the agent: resolveBaseUrl with any
|
|
93
|
+
* userinfo (`user:pass@`) removed (WR-07). A proxy basic-auth base must never
|
|
94
|
+
* land in a transcript; errors.ts strips it from messages the same way.
|
|
95
|
+
*/
|
|
96
|
+
function displayBaseUrl(env = process.env) {
|
|
97
|
+
const base = resolveBaseUrl(env);
|
|
98
|
+
const url = new URL(base);
|
|
99
|
+
if (url.username === "" && url.password === "") {
|
|
100
|
+
return base;
|
|
101
|
+
}
|
|
102
|
+
url.username = "";
|
|
103
|
+
url.password = "";
|
|
104
|
+
return url.toString().replace(/\/+$/, "");
|
|
105
|
+
}
|
|
90
106
|
/**
|
|
91
107
|
* Build the single SDK Configuration every tool uses.
|
|
92
108
|
*
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":";;;AAgEA,sCAMC;AASD,wCAmBC;AASD,gDAQC;AAqBD,oDAUC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":";;;AAgEA,sCAMC;AASD,wCAmBC;AAOD,wCASC;AASD,gDAQC;AAqBD,oDAUC;AAlKD,iEAAiE;AACjE,yEAAyE;AACzE,EAAE;AACF,+BAA+B;AAC/B,EAAE;AACF,4EAA4E;AAC5E,uEAAuE;AACvE,yEAAyE;AACzE,+EAA+E;AAC/E,8CAA8C;AAC9C,0EAA0E;AAC1E,6EAA6E;AAC7E,kDAAkD;AAClD,yEAAyE;AACzE,6EAA6E;AAC7E,iCAAiC;AACjC,gFAAgF;AAChF,mEAAmE;AACnE,+EAA+E;AAC/E,sDAAsD;AACtD,uEAAuE;AACvE,wCAA+C;AAE/C,2CAA4C;AAE5C,6CAA2C;AAI3C,6CAA6C;AAChC,QAAA,WAAW,GAAG,mBAAmB,CAAC;AAE/C,+DAA+D;AAClD,QAAA,YAAY,GAAG,oBAAoB,CAAC;AAEjD,gEAAgE;AACnD,QAAA,aAAa,GAAG,6BAA6B,CAAC;AAE3D,gEAAgE;AAChE,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,wDAAwD;IAC/C,MAAM,CAAS;IAExB,YAAY,OAAe,EAAE,MAAc;QACzC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AATD,gDASC;AAED,MAAM,kBAAkB,GACtB,OAAO,mBAAW,8EAA8E;IAChG,0FAA0F,CAAC;AAE7F,MAAM,eAAe,GACnB,OAAO,oBAAY,wEAAwE;IAC3F,kCAAkC,qBAAa,IAAI,CAAC;AAEtD;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,MAAW,OAAO,CAAC,GAAG;IAClD,MAAM,GAAG,GAAG,GAAG,CAAC,mBAAW,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,kBAAkB,CAAC,GAAG,mBAAW,cAAc,EAAE,kBAAkB,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,MAAW,OAAO,CAAC,GAAG;IACnD,MAAM,GAAG,GAAG,GAAG,CAAC,oBAAY,CAAC,EAAE,IAAI,EAAE,CAAC;IACtC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACpC,OAAO,qBAAa,CAAC;IACvB,CAAC;IAED,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,GAAG,oBAAY,+BAA+B,EAAE,eAAe,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC1D,MAAM,IAAI,kBAAkB,CAC1B,GAAG,oBAAY,gCAAgC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EACjF,eAAe,CAChB,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAAC,MAAW,OAAO,CAAC,GAAG;IACnD,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC;IAClB,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC;IAClB,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,MAAW,OAAO,CAAC,GAAG,EAAE,UAAqC,EAAE;IAChG,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAChG,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,IAAI,mBAAa,CAAC;QACvB,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QACrD,QAAQ;QACR,OAAO,EAAE,EAAE,YAAY,EAAE,iBAAiB,IAAA,wBAAW,GAAE,EAAE,EAAE;KAC5D,CAAC,CAAC;AACL,CAAC;AAYD,SAAS,cAAc,CAAC,GAAQ;IAC9B,MAAM,GAAG,GAAG,GAAG,CAAC,mBAAW,CAAC,CAAC;IAC7B,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,GAAY,EAAE,MAAW,OAAO,CAAC,GAAG;IACvE,IAAI,GAAG,YAAY,kBAAkB,EAAE,CAAC;QACtC,OAAO,IAAA,yBAAa,EAAC,kBAAkB,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,IAAA,yBAAa,EAClB,mCAAmC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI;QACxE,aAAa,mBAAW,QAAQ,oBAAY,6CAA6C,EAC3F,GAAG,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -12,6 +12,11 @@ export interface PricingLike {
|
|
|
12
12
|
perMpxlMicrocents?: number;
|
|
13
13
|
perVideoMicrocents?: number;
|
|
14
14
|
perVideoSecondMicrocents?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Not a rate: the model's default clip length from its catalog `seconds`
|
|
17
|
+
* parameter descriptor. The server bills an omitted `seconds` at this value.
|
|
18
|
+
*/
|
|
19
|
+
defaultVideoSeconds?: number;
|
|
15
20
|
}
|
|
16
21
|
/** Agent-supplied request parameters that the estimate depends on. */
|
|
17
22
|
export interface EstimateParams {
|
|
@@ -27,7 +32,7 @@ export interface EstimateParams {
|
|
|
27
32
|
n?: number;
|
|
28
33
|
/** Image: "WxH". Defaults to 1024x1024. */
|
|
29
34
|
size?: string;
|
|
30
|
-
/** Video: clip length in seconds. Defaults to 5. */
|
|
35
|
+
/** Video: clip length in seconds. Defaults to the model's catalog default, then 5. */
|
|
31
36
|
seconds?: number;
|
|
32
37
|
}
|
|
33
38
|
export interface Estimate {
|
|
@@ -46,6 +51,11 @@ export declare const DEFAULT_VIDEO_SECONDS = 5;
|
|
|
46
51
|
export declare function estimatePromptTokens(texts: ReadonlyArray<string>): number;
|
|
47
52
|
/** Megapixels for a "WxH" size. Anything unparseable uses the default size. */
|
|
48
53
|
export declare function megapixels(size: string | undefined): number;
|
|
54
|
+
/**
|
|
55
|
+
* The clip length the server will bill: the requested seconds, else the
|
|
56
|
+
* model's catalog default, else DEFAULT_VIDEO_SECONDS.
|
|
57
|
+
*/
|
|
58
|
+
export declare function videoSeconds(requested: number | undefined, pricing: PricingLike): number;
|
|
49
59
|
/** Estimate one invocation's billed cost before it runs. */
|
|
50
60
|
export declare function estimateMicroCents(modality: Modality, params: EstimateParams, pricing: PricingLike): Estimate;
|
|
51
61
|
/** Usage fields the API returns, per modality (camelCase SDK shapes). */
|
|
@@ -58,6 +68,8 @@ export interface UsageLike {
|
|
|
58
68
|
imageCount?: number;
|
|
59
69
|
/** Video (VideoJob, populated on completed). */
|
|
60
70
|
costCents?: number;
|
|
71
|
+
/** Video: the clip length the job reports, used when costCents is absent. */
|
|
72
|
+
seconds?: number;
|
|
61
73
|
}
|
|
62
74
|
/**
|
|
63
75
|
* The billed actual cost of one completed invocation, from the API's usage
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DEFAULT_VIDEO_SECONDS = exports.DEFAULT_IMAGE_SIZE = exports.DEFAULT_MAX_TOKENS = exports.CHARS_PER_TOKEN = void 0;
|
|
4
4
|
exports.estimatePromptTokens = estimatePromptTokens;
|
|
5
5
|
exports.megapixels = megapixels;
|
|
6
|
+
exports.videoSeconds = videoSeconds;
|
|
6
7
|
exports.estimateMicroCents = estimateMicroCents;
|
|
7
8
|
exports.actualMicroCents = actualMicroCents;
|
|
8
9
|
// Per-modality cost estimator for the unified session budget (Phase 104 D-06).
|
|
@@ -19,8 +20,14 @@ exports.actualMicroCents = actualMicroCents;
|
|
|
19
20
|
// Inputs from the agent (messages, n, size, seconds, max_tokens) are untrusted.
|
|
20
21
|
// Non-finite or non-positive counts fall back to the defaults. For chat the
|
|
21
22
|
// estimate is bounded by max_tokens. For video it is a FLOOR (isFloor: true),
|
|
22
|
-
// because the
|
|
23
|
-
//
|
|
23
|
+
// because the real cost arrives later on VideoJob.costCents.
|
|
24
|
+
//
|
|
25
|
+
// Video is priced the way the server bills it (CR-01): per second of output x
|
|
26
|
+
// the requested seconds, where an omitted `seconds` resolves to the model's own
|
|
27
|
+
// catalog default (its `seconds` parameter descriptor), then DEFAULT_VIDEO_SECONDS.
|
|
28
|
+
// The per-clip price is only a representative "from" price for an example clip
|
|
29
|
+
// length, so it never stands in for a known per-second rate; when both are
|
|
30
|
+
// published the estimate is the larger of the two.
|
|
24
31
|
const budget_js_1 = require("./budget.js");
|
|
25
32
|
exports.CHARS_PER_TOKEN = 4;
|
|
26
33
|
exports.DEFAULT_MAX_TOKENS = 1024;
|
|
@@ -94,6 +101,25 @@ function imageRaw(count, size, pricing) {
|
|
|
94
101
|
return count * per;
|
|
95
102
|
return count * rate(pricing.perMpxlMicrocents) * megapixels(size);
|
|
96
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* The clip length the server will bill: the requested seconds, else the
|
|
106
|
+
* model's catalog default, else DEFAULT_VIDEO_SECONDS.
|
|
107
|
+
*/
|
|
108
|
+
function videoSeconds(requested, pricing) {
|
|
109
|
+
return positiveCount(requested, positiveCount(pricing.defaultVideoSeconds, exports.DEFAULT_VIDEO_SECONDS));
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Raw micro-cents for one clip, priced exactly the way the server bills it:
|
|
113
|
+
* per-second rate x seconds (internal/mediajob/poller.go costCents). The
|
|
114
|
+
* per-clip "from" price is only a representative figure for an example
|
|
115
|
+
* length and is never charged, so it is used solely as a fallback when a
|
|
116
|
+
* model publishes no per-second rate.
|
|
117
|
+
*/
|
|
118
|
+
function videoRaw(seconds, pricing) {
|
|
119
|
+
return known(pricing.perVideoSecondMicrocents)
|
|
120
|
+
? rate(pricing.perVideoSecondMicrocents) * seconds
|
|
121
|
+
: rate(pricing.perVideoMicrocents);
|
|
122
|
+
}
|
|
97
123
|
/** Estimate one invocation's billed cost before it runs. */
|
|
98
124
|
function estimateMicroCents(modality, params, pricing) {
|
|
99
125
|
switch (modality) {
|
|
@@ -124,12 +150,8 @@ function estimateMicroCents(modality, params, pricing) {
|
|
|
124
150
|
};
|
|
125
151
|
}
|
|
126
152
|
case "video": {
|
|
127
|
-
const seconds = positiveCount(params.seconds, exports.DEFAULT_VIDEO_SECONDS);
|
|
128
|
-
const raw = known(pricing.perVideoMicrocents)
|
|
129
|
-
? rate(pricing.perVideoMicrocents)
|
|
130
|
-
: rate(pricing.perVideoSecondMicrocents) * seconds;
|
|
131
153
|
return {
|
|
132
|
-
microCents: (0, budget_js_1.billedMicroCents)(
|
|
154
|
+
microCents: (0, budget_js_1.billedMicroCents)(videoRaw(videoSeconds(params.seconds, pricing), pricing)),
|
|
133
155
|
isFloor: true,
|
|
134
156
|
pricingKnown: known(pricing.perVideoMicrocents) || known(pricing.perVideoSecondMicrocents),
|
|
135
157
|
};
|
|
@@ -163,9 +185,16 @@ function actualMicroCents(modality, usage, pricing, fallbackEstimateMicroCents,
|
|
|
163
185
|
return fallback;
|
|
164
186
|
return (0, budget_js_1.billedMicroCents)(imageRaw(usage.imageCount, params?.size, pricing));
|
|
165
187
|
case "video":
|
|
166
|
-
if (
|
|
167
|
-
return
|
|
168
|
-
|
|
188
|
+
if (num(usage.costCents))
|
|
189
|
+
return (0, budget_js_1.billedMicroCents)(usage.costCents * budget_js_1.MICRO_CENTS_PER_CENT);
|
|
190
|
+
// No cost on the job: price it on the same basis as the estimate, at the
|
|
191
|
+
// job's own seconds when it reports them.
|
|
192
|
+
if (num(usage.seconds) && usage.seconds > 0) {
|
|
193
|
+
const raw = videoRaw(videoSeconds(usage.seconds, pricing), pricing);
|
|
194
|
+
if (raw > 0)
|
|
195
|
+
return (0, budget_js_1.billedMicroCents)(raw);
|
|
196
|
+
}
|
|
197
|
+
return fallback;
|
|
169
198
|
}
|
|
170
199
|
}
|
|
171
200
|
//# sourceMappingURL=estimate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"estimate.js","sourceRoot":"","sources":["../../src/guardrail/estimate.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"estimate.js","sourceRoot":"","sources":["../../src/guardrail/estimate.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,8 +11,17 @@ import type { Env, ToolAnnotations, ToolDefinition } from "../types.js";
|
|
|
11
11
|
export declare class ReadRefusal extends Error {
|
|
12
12
|
constructor(message: string);
|
|
13
13
|
}
|
|
14
|
-
/** Every read tool advertises the same four hints. */
|
|
14
|
+
/** Every read tool advertises the same four hints, except a local-file writer (below). */
|
|
15
15
|
export declare const READ_ANNOTATIONS: ToolAnnotations;
|
|
16
|
+
/**
|
|
17
|
+
* Hints for the one read-tier tool that writes to the local filesystem
|
|
18
|
+
* (deeprelay_videos_content, WR-08). It spends nothing and needs no
|
|
19
|
+
* confirmation, so it stays in the read tier, but it is not read-only (it
|
|
20
|
+
* creates a file and its directory) and not idempotent (a repeat call for the
|
|
21
|
+
* same default path is refused because the file exists). Clients that
|
|
22
|
+
* auto-approve readOnlyHint tools must not auto-approve a file write.
|
|
23
|
+
*/
|
|
24
|
+
export declare const LOCAL_WRITE_READ_ANNOTATIONS: ToolAnnotations;
|
|
16
25
|
export interface ReadToolSpec<Shape extends ZodRawShape> {
|
|
17
26
|
name: ReadToolName;
|
|
18
27
|
title: string;
|
|
@@ -26,6 +35,8 @@ export interface ReadToolSpec<Shape extends ZodRawShape> {
|
|
|
26
35
|
* unauthenticated liveness probe sets this.
|
|
27
36
|
*/
|
|
28
37
|
keyless?: boolean;
|
|
38
|
+
/** The tool writes a local file: advertise LOCAL_WRITE_READ_ANNOTATIONS. */
|
|
39
|
+
writesLocalFiles?: boolean;
|
|
29
40
|
call(args: z.infer<z.ZodObject<Shape>>, config: Configuration, env: Env): Promise<unknown>;
|
|
30
41
|
}
|
|
31
42
|
/** Wrap a typed SDK call into a read-tier ToolDefinition. */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.READ_ANNOTATIONS = exports.ReadRefusal = void 0;
|
|
3
|
+
exports.LOCAL_WRITE_READ_ANNOTATIONS = exports.READ_ANNOTATIONS = exports.ReadRefusal = void 0;
|
|
4
4
|
exports.defineTool = defineTool;
|
|
5
5
|
const zod_1 = require("zod");
|
|
6
6
|
const auth_js_1 = require("../../auth.js");
|
|
@@ -19,13 +19,27 @@ class ReadRefusal extends Error {
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
exports.ReadRefusal = ReadRefusal;
|
|
22
|
-
/** Every read tool advertises the same four hints. */
|
|
22
|
+
/** Every read tool advertises the same four hints, except a local-file writer (below). */
|
|
23
23
|
exports.READ_ANNOTATIONS = Object.freeze({
|
|
24
24
|
readOnlyHint: true,
|
|
25
25
|
destructiveHint: false,
|
|
26
26
|
idempotentHint: true,
|
|
27
27
|
openWorldHint: true,
|
|
28
28
|
});
|
|
29
|
+
/**
|
|
30
|
+
* Hints for the one read-tier tool that writes to the local filesystem
|
|
31
|
+
* (deeprelay_videos_content, WR-08). It spends nothing and needs no
|
|
32
|
+
* confirmation, so it stays in the read tier, but it is not read-only (it
|
|
33
|
+
* creates a file and its directory) and not idempotent (a repeat call for the
|
|
34
|
+
* same default path is refused because the file exists). Clients that
|
|
35
|
+
* auto-approve readOnlyHint tools must not auto-approve a file write.
|
|
36
|
+
*/
|
|
37
|
+
exports.LOCAL_WRITE_READ_ANNOTATIONS = Object.freeze({
|
|
38
|
+
readOnlyHint: false,
|
|
39
|
+
destructiveHint: false,
|
|
40
|
+
idempotentHint: false,
|
|
41
|
+
openWorldHint: true,
|
|
42
|
+
});
|
|
29
43
|
/** Wrap a typed SDK call into a read-tier ToolDefinition. */
|
|
30
44
|
function defineTool(spec) {
|
|
31
45
|
const schema = zod_1.z.object(spec.inputSchema);
|
|
@@ -35,7 +49,7 @@ function defineTool(spec) {
|
|
|
35
49
|
title: spec.title,
|
|
36
50
|
description: spec.description,
|
|
37
51
|
inputSchema: spec.inputSchema,
|
|
38
|
-
annotations: { ...exports.READ_ANNOTATIONS },
|
|
52
|
+
annotations: { ...(spec.writesLocalFiles === true ? exports.LOCAL_WRITE_READ_ANNOTATIONS : exports.READ_ANNOTATIONS) },
|
|
39
53
|
enabledAtBoot: true,
|
|
40
54
|
async handler(args, ctx) {
|
|
41
55
|
const env = ctx?.env ?? process.env;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define.js","sourceRoot":"","sources":["../../../src/tools/readonly/define.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"define.js","sourceRoot":"","sources":["../../../src/tools/readonly/define.ts"],"names":[],"mappings":";;;AA8EA,gCA+BC;AA9FD,6BAA0C;AAE1C,2CAAmD;AACnD,+CAAgE;AAEhE,4CAAwC;AAGxC;;;;;GAKG;AACH,MAAa,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AALD,kCAKC;AAED,0FAA0F;AAC7E,QAAA,gBAAgB,GAAoB,MAAM,CAAC,MAAM,CAAC;IAC7D,YAAY,EAAE,IAAI;IAClB,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;CACpB,CAAC,CAAC;AAEH;;;;;;;GAOG;AACU,QAAA,4BAA4B,GAAoB,MAAM,CAAC,MAAM,CAAC;IACzE,YAAY,EAAE,KAAK;IACnB,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,KAAK;IACrB,aAAa,EAAE,IAAI;CACpB,CAAC,CAAC;AAoBH,6DAA6D;AAC7D,SAAgB,UAAU,CAA4B,IAAyB;IAC7E,MAAM,MAAM,GAAG,OAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1C,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,oCAA4B,CAAC,CAAC,CAAC,wBAAgB,CAAC,EAAE;QACtG,aAAa,EAAE,IAAI;QACnB,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;YACrB,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;YACpC,IAAI,MAA8B,CAAC;YACnC,IAAI,MAAqB,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAClC,MAAM,GAAG,IAAA,4BAAkB,EAAC,GAAG,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC;YAC/E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,IAAA,gBAAI,EAAC,IAAA,uBAAW,EAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;gBACrD,OAAO,IAAA,cAAE,EAAC,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;oBAC/B,OAAO,IAAA,gBAAI,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACxB,CAAC;gBACD,OAAO,IAAA,gBAAI,EAAC,MAAM,IAAA,4BAAgB,EAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ToolDefinition } from "../types.js";
|
|
2
|
-
export { defineTool, READ_ANNOTATIONS } from "./define.js";
|
|
2
|
+
export { defineTool, LOCAL_WRITE_READ_ANNOTATIONS, READ_ANNOTATIONS } from "./define.js";
|
|
3
3
|
export { observeVideoJob, VIDEO_TMP_DIR, videoReadTools } from "./video-reads.js";
|
|
4
4
|
/** The in-process session budget (D-06/D-08), in dollars, with pending video holds. */
|
|
5
5
|
export declare function renderSessionBudget(): Record<string, unknown>;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.readonlyTools = exports.videoReadTools = exports.VIDEO_TMP_DIR = exports.observeVideoJob = exports.READ_ANNOTATIONS = exports.defineTool = void 0;
|
|
3
|
+
exports.readonlyTools = exports.videoReadTools = exports.VIDEO_TMP_DIR = exports.observeVideoJob = exports.READ_ANNOTATIONS = exports.LOCAL_WRITE_READ_ANNOTATIONS = exports.defineTool = void 0;
|
|
4
4
|
exports.renderSessionBudget = renderSessionBudget;
|
|
5
5
|
// The free read tier (Phase 104, D-03/D-04/D-05/D-10). Authored fresh (D-12).
|
|
6
6
|
//
|
|
7
|
-
// Every tool here is a
|
|
7
|
+
// Every tool here is a GET mapped to one @deeprelay/sdk method (D-05; the usage
|
|
8
|
+
// tool calls it once per modality when unfiltered, see usage.ts),
|
|
8
9
|
// built with defineTool (define.ts): no confirmation, no quote, no budget
|
|
9
10
|
// accounting, and every result goes through ok(), so credential fields are
|
|
10
11
|
// sanitized and key-shaped text is redacted before the agent sees it.
|
|
@@ -17,9 +18,11 @@ const auth_js_1 = require("../../auth.js");
|
|
|
17
18
|
const errors_js_1 = require("../../errors.js");
|
|
18
19
|
const budget_js_1 = require("../../guardrail/budget.js");
|
|
19
20
|
const define_js_1 = require("./define.js");
|
|
21
|
+
const usage_js_1 = require("./usage.js");
|
|
20
22
|
const video_reads_js_1 = require("./video-reads.js");
|
|
21
23
|
var define_js_2 = require("./define.js");
|
|
22
24
|
Object.defineProperty(exports, "defineTool", { enumerable: true, get: function () { return define_js_2.defineTool; } });
|
|
25
|
+
Object.defineProperty(exports, "LOCAL_WRITE_READ_ANNOTATIONS", { enumerable: true, get: function () { return define_js_2.LOCAL_WRITE_READ_ANNOTATIONS; } });
|
|
23
26
|
Object.defineProperty(exports, "READ_ANNOTATIONS", { enumerable: true, get: function () { return define_js_2.READ_ANNOTATIONS; } });
|
|
24
27
|
var video_reads_js_2 = require("./video-reads.js");
|
|
25
28
|
Object.defineProperty(exports, "observeVideoJob", { enumerable: true, get: function () { return video_reads_js_2.observeVideoJob; } });
|
|
@@ -41,6 +44,39 @@ async function orNotFound(call, onNotFound) {
|
|
|
41
44
|
throw err;
|
|
42
45
|
}
|
|
43
46
|
}
|
|
47
|
+
/** The API's code for a crypto route while the feature is dark for this account. */
|
|
48
|
+
const CRYPTO_DARK_CODE = "not-found";
|
|
49
|
+
/** The API's code for an unknown (or another org's) deposit id; the feature is on. */
|
|
50
|
+
const DEPOSIT_NOT_FOUND_CODE = "deposit-not-found";
|
|
51
|
+
/**
|
|
52
|
+
* deeprelay_deposits_get's 404s are two different answers (WR-05): the dark
|
|
53
|
+
* route (`not-found`) means the feature is not enabled, while
|
|
54
|
+
* `deposit-not-found` means the feature is on and there is no deposit with
|
|
55
|
+
* that id on this account. Any other 404 is a real error.
|
|
56
|
+
*/
|
|
57
|
+
async function getDepositOrExplain(api, id) {
|
|
58
|
+
try {
|
|
59
|
+
return { crypto_deposits_enabled: true, ...(await api.getDeposit({ id })) };
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
if ((0, errors_js_1.httpStatusOf)(err) !== 404)
|
|
63
|
+
throw err;
|
|
64
|
+
const { code } = await (0, errors_js_1.readErrorEnvelope)(err);
|
|
65
|
+
if (code === DEPOSIT_NOT_FOUND_CODE) {
|
|
66
|
+
return {
|
|
67
|
+
crypto_deposits_enabled: true,
|
|
68
|
+
found: false,
|
|
69
|
+
id,
|
|
70
|
+
note: "No crypto deposit with this id exists on this account. Crypto deposits are enabled; check the id " +
|
|
71
|
+
"with deeprelay_deposits_list.",
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (code === CRYPTO_DARK_CODE) {
|
|
75
|
+
return { crypto_deposits_enabled: false };
|
|
76
|
+
}
|
|
77
|
+
throw err;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
44
80
|
/** The in-process session budget (D-06/D-08), in dollars, with pending video holds. */
|
|
45
81
|
function renderSessionBudget() {
|
|
46
82
|
const s = (0, budget_js_1.budgetStatus)();
|
|
@@ -95,7 +131,7 @@ const coreReadTools = [
|
|
|
95
131
|
const balance = await billing.getBalance();
|
|
96
132
|
return {
|
|
97
133
|
authenticated: true,
|
|
98
|
-
api_base: (0, auth_js_1.
|
|
134
|
+
api_base: (0, auth_js_1.displayBaseUrl)(env),
|
|
99
135
|
spending_limit: limit === null ? null : spendingLimitView(limit),
|
|
100
136
|
balance: balanceView(balance),
|
|
101
137
|
session_budget: renderSessionBudget(),
|
|
@@ -106,13 +142,13 @@ const coreReadTools = [
|
|
|
106
142
|
name: "deeprelay_health",
|
|
107
143
|
title: "Check deeprelay API liveness",
|
|
108
144
|
description: "Is the deeprelay API up? Call this when other calls fail with network errors, to tell an outage apart from " +
|
|
109
|
-
`a
|
|
145
|
+
`a key problem. It uses the unauthenticated liveness endpoint, so a wrong or revoked key does not affect it. ${FREE}`,
|
|
110
146
|
inputSchema: {},
|
|
111
147
|
context: "checking deeprelay API health",
|
|
112
148
|
keyless: true,
|
|
113
149
|
async call(_args, config, env) {
|
|
114
150
|
const health = await new sdk_1.MetaApi(config).getHealth();
|
|
115
|
-
return { status: health.status ?? "unknown", api_base: (0, auth_js_1.
|
|
151
|
+
return { status: health.status ?? "unknown", api_base: (0, auth_js_1.displayBaseUrl)(env) };
|
|
116
152
|
},
|
|
117
153
|
}),
|
|
118
154
|
(0, define_js_1.defineTool)({
|
|
@@ -158,26 +194,18 @@ const coreReadTools = [
|
|
|
158
194
|
}),
|
|
159
195
|
(0, define_js_1.defineTool)({
|
|
160
196
|
name: "deeprelay_usage_get",
|
|
161
|
-
title: "Get deeprelay usage",
|
|
162
|
-
description: "How much has this account used and spent, over time? Returns time-bucketed
|
|
163
|
-
"
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
start
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
limit: zod_1.z.number().int().min(1).max(100).default(31).describe("Buckets per page (1-100)."),
|
|
171
|
-
},
|
|
197
|
+
title: "Get deeprelay inference usage",
|
|
198
|
+
description: "How much serverless inference has this account used and spent, over time? Returns time-bucketed inference " +
|
|
199
|
+
"usage (hour, day, week or month buckets; default day over the last 30 days), one row per bucket, modality " +
|
|
200
|
+
"and model, with cost in cents and token/image counts, plus `total_cost_cents` and per-modality subtotals " +
|
|
201
|
+
"(`by_modality`). Filter with `modality` (chat, image, video, embedding) and/or `model`; with neither it " +
|
|
202
|
+
"covers all four modalities. Pages are followed automatically; `truncated: true` means the window was too " +
|
|
203
|
+
"large, so narrow `start`/`end`. Use this to answer spend questions about past days; for this session's " +
|
|
204
|
+
`spend use deeprelay_auth_status. ${FREE}`,
|
|
205
|
+
inputSchema: usage_js_1.usageInputSchema,
|
|
172
206
|
context: "getting usage",
|
|
173
207
|
async call(args, config) {
|
|
174
|
-
return
|
|
175
|
-
bucket: args.bucket,
|
|
176
|
-
start: args.start === undefined ? undefined : new Date(args.start),
|
|
177
|
-
end: args.end === undefined ? undefined : new Date(args.end),
|
|
178
|
-
cursor: args.cursor,
|
|
179
|
-
limit: args.limit,
|
|
180
|
-
});
|
|
208
|
+
return (0, usage_js_1.getInferenceUsage)(args, config);
|
|
181
209
|
},
|
|
182
210
|
}),
|
|
183
211
|
];
|
|
@@ -239,13 +267,14 @@ const billingReadTools = [
|
|
|
239
267
|
name: "deeprelay_deposits_get",
|
|
240
268
|
title: "Get a crypto deposit",
|
|
241
269
|
description: `Get one crypto deposit by id: status, chain, asset, amount and credited cents. ${DEPOSITS_NOTE} ` +
|
|
242
|
-
|
|
270
|
+
"An id that does not exist on this account returns `{ crypto_deposits_enabled: true, found: false }`: the " +
|
|
271
|
+
`feature is on and the id is wrong, so check it with deeprelay_deposits_list. ${FREE}`,
|
|
243
272
|
inputSchema: {
|
|
244
273
|
id: zod_1.z.string().min(1).describe("Deposit id, as returned by deeprelay_deposits_list."),
|
|
245
274
|
},
|
|
246
275
|
context: "getting a crypto deposit",
|
|
247
276
|
async call(args, config) {
|
|
248
|
-
return
|
|
277
|
+
return getDepositOrExplain(new sdk_1.BillingApi(config), args.id);
|
|
249
278
|
},
|
|
250
279
|
}),
|
|
251
280
|
(0, define_js_1.defineTool)({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/readonly/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/readonly/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type Configuration } from "@deeprelay/sdk";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
/** Rows per page requested from the API (its maximum). */
|
|
4
|
+
export declare const USAGE_PAGE_SIZE = 100;
|
|
5
|
+
/** Pages followed per query before the result is reported as truncated. */
|
|
6
|
+
export declare const USAGE_MAX_PAGES = 10;
|
|
7
|
+
/** Every modality, in the order the fan-out queries them. */
|
|
8
|
+
export declare const USAGE_MODALITIES: ("chat" | "image" | "video" | "embedding")[];
|
|
9
|
+
export declare const usageInputSchema: {
|
|
10
|
+
modality: z.ZodOptional<z.ZodEnum<{
|
|
11
|
+
readonly Chat: "chat";
|
|
12
|
+
readonly Image: "image";
|
|
13
|
+
readonly Video: "video";
|
|
14
|
+
readonly Embedding: "embedding";
|
|
15
|
+
}>>;
|
|
16
|
+
model: z.ZodOptional<z.ZodString>;
|
|
17
|
+
bucket: z.ZodDefault<z.ZodEnum<{
|
|
18
|
+
readonly Hour: "hour";
|
|
19
|
+
readonly Day: "day";
|
|
20
|
+
readonly Week: "week";
|
|
21
|
+
readonly Month: "month";
|
|
22
|
+
}>>;
|
|
23
|
+
start: z.ZodOptional<z.ZodISODateTime>;
|
|
24
|
+
end: z.ZodOptional<z.ZodISODateTime>;
|
|
25
|
+
};
|
|
26
|
+
type UsageArgs = z.infer<z.ZodObject<typeof usageInputSchema>>;
|
|
27
|
+
/** Read inference usage: one query when filtered, one per modality otherwise. */
|
|
28
|
+
export declare function getInferenceUsage(args: UsageArgs, config: Configuration): Promise<Record<string, unknown>>;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.usageInputSchema = exports.USAGE_MODALITIES = exports.USAGE_MAX_PAGES = exports.USAGE_PAGE_SIZE = void 0;
|
|
4
|
+
exports.getInferenceUsage = getInferenceUsage;
|
|
5
|
+
// deeprelay_usage_get: serverless inference usage (Phase 104 follow-up).
|
|
6
|
+
//
|
|
7
|
+
// GET /v1/usage has two row shapes. With `modality` or `model` set it returns
|
|
8
|
+
// inference-usage rows (one per bucket × modality × model); with neither it
|
|
9
|
+
// returns GPU-instance usage, which deeprelay does not surface (no GPU supply
|
|
10
|
+
// on the platform), so an unfiltered call reads as "no usage" even for an
|
|
11
|
+
// account that spent money on inference. There is no single call for every
|
|
12
|
+
// modality, so with no filter this tool asks once per modality and merges.
|
|
13
|
+
//
|
|
14
|
+
// It never sends `group_by` (instance/GPU split) and keeps only the inference
|
|
15
|
+
// fields on each row (the GPU-instance duration field is always 0 there).
|
|
16
|
+
//
|
|
17
|
+
// Cursor following is defensive (Phase 104 CR-02). A server that ignores the
|
|
18
|
+
// cursor returns page one again with the same next_cursor, which used to be
|
|
19
|
+
// summed up to USAGE_MAX_PAGES times. fetchAll stops when a next_cursor repeats
|
|
20
|
+
// or a page brings no row it has not already seen, and it de-duplicates rows on
|
|
21
|
+
// (bucket_start, modality, model), so a row is never counted twice.
|
|
22
|
+
const sdk_1 = require("@deeprelay/sdk");
|
|
23
|
+
const zod_1 = require("zod");
|
|
24
|
+
/** Rows per page requested from the API (its maximum). */
|
|
25
|
+
exports.USAGE_PAGE_SIZE = 100;
|
|
26
|
+
/** Pages followed per query before the result is reported as truncated. */
|
|
27
|
+
exports.USAGE_MAX_PAGES = 10;
|
|
28
|
+
/** Every modality, in the order the fan-out queries them. */
|
|
29
|
+
exports.USAGE_MODALITIES = Object.values(sdk_1.ListUsageModalityEnum);
|
|
30
|
+
exports.usageInputSchema = {
|
|
31
|
+
modality: zod_1.z
|
|
32
|
+
.enum(sdk_1.ListUsageModalityEnum)
|
|
33
|
+
.optional()
|
|
34
|
+
.describe("Only this modality (chat, image, video or embedding). Omit for all four."),
|
|
35
|
+
model: zod_1.z.string().min(1).optional().describe("Only this model id, as returned by deeprelay_models_list."),
|
|
36
|
+
bucket: zod_1.z.enum(sdk_1.ListUsageBucketEnum).default("day").describe("Bucket width (hour, day, week or month)."),
|
|
37
|
+
start: zod_1.z.iso
|
|
38
|
+
.datetime({ offset: true })
|
|
39
|
+
.optional()
|
|
40
|
+
.describe("ISO-8601 start of the window (inclusive). Default: 30 days before end."),
|
|
41
|
+
end: zod_1.z.iso.datetime({ offset: true }).optional().describe("ISO-8601 end of the window (exclusive). Default: now."),
|
|
42
|
+
};
|
|
43
|
+
/** Sum cents without binary-float noise (costs can be fractional cents). */
|
|
44
|
+
function addCents(a, b) {
|
|
45
|
+
return Math.round((a + b) * 1e6) / 1e6;
|
|
46
|
+
}
|
|
47
|
+
function toRow(b, fallbackModality) {
|
|
48
|
+
const start = b.bucketStart instanceof Date ? b.bucketStart.toISOString() : String(b.bucketStart);
|
|
49
|
+
return {
|
|
50
|
+
bucket_start: start,
|
|
51
|
+
modality: b.modality ?? fallbackModality ?? null,
|
|
52
|
+
model: b.model ?? null,
|
|
53
|
+
cost_cents: b.costCents,
|
|
54
|
+
prompt_tokens: b.promptTokens ?? null,
|
|
55
|
+
completion_tokens: b.completionTokens ?? null,
|
|
56
|
+
image_count: b.imageCount ?? null,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function rowKey(r) {
|
|
60
|
+
return `${r.bucket_start}\u0000${r.modality ?? ""}\u0000${r.model ?? ""}`;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* One filtered query, following cursors up to USAGE_MAX_PAGES. Stops early,
|
|
64
|
+
* with `repeated`, when the API hands back a cursor already followed or a page
|
|
65
|
+
* with no unseen row; never counts a (bucket, modality, model) row twice.
|
|
66
|
+
*/
|
|
67
|
+
async function fetchAll(api, args, filter) {
|
|
68
|
+
const rows = [];
|
|
69
|
+
const seenRows = new Set();
|
|
70
|
+
const seenCursors = new Set();
|
|
71
|
+
let cursor;
|
|
72
|
+
for (let pageNo = 0; pageNo < exports.USAGE_MAX_PAGES; pageNo += 1) {
|
|
73
|
+
const page = await api.listUsage({
|
|
74
|
+
bucket: args.bucket,
|
|
75
|
+
start: args.start === undefined ? undefined : new Date(args.start),
|
|
76
|
+
end: args.end === undefined ? undefined : new Date(args.end),
|
|
77
|
+
cursor,
|
|
78
|
+
limit: exports.USAGE_PAGE_SIZE,
|
|
79
|
+
modality: filter.modality,
|
|
80
|
+
model: filter.model,
|
|
81
|
+
});
|
|
82
|
+
let fresh = 0;
|
|
83
|
+
for (const b of page.data) {
|
|
84
|
+
const r = toRow(b, filter.modality);
|
|
85
|
+
const k = rowKey(r);
|
|
86
|
+
if (seenRows.has(k))
|
|
87
|
+
continue;
|
|
88
|
+
seenRows.add(k);
|
|
89
|
+
rows.push(r);
|
|
90
|
+
fresh += 1;
|
|
91
|
+
}
|
|
92
|
+
const next = page.nextCursor;
|
|
93
|
+
if (next === null || next === undefined || next === "") {
|
|
94
|
+
return { rows, truncated: false, repeated: false };
|
|
95
|
+
}
|
|
96
|
+
if ((pageNo > 0 && fresh === 0) || seenCursors.has(next)) {
|
|
97
|
+
return { rows, truncated: false, repeated: true };
|
|
98
|
+
}
|
|
99
|
+
seenCursors.add(next);
|
|
100
|
+
cursor = next;
|
|
101
|
+
}
|
|
102
|
+
return { rows, truncated: true, repeated: false };
|
|
103
|
+
}
|
|
104
|
+
/** Read inference usage: one query when filtered, one per modality otherwise. */
|
|
105
|
+
async function getInferenceUsage(args, config) {
|
|
106
|
+
const api = new sdk_1.UsageApi(config);
|
|
107
|
+
const filtered = args.modality !== undefined || args.model !== undefined;
|
|
108
|
+
const queries = filtered
|
|
109
|
+
? [{ modality: args.modality, model: args.model }]
|
|
110
|
+
: exports.USAGE_MODALITIES.map((modality) => ({ modality }));
|
|
111
|
+
const results = await Promise.all(queries.map((q) => fetchAll(api, args, q)));
|
|
112
|
+
const rows = results.flatMap((r) => r.rows);
|
|
113
|
+
// Newest bucket first (the API's order), then by modality and model.
|
|
114
|
+
rows.sort((a, b) => b.bucket_start.localeCompare(a.bucket_start) ||
|
|
115
|
+
(a.modality ?? "").localeCompare(b.modality ?? "") ||
|
|
116
|
+
(a.model ?? "").localeCompare(b.model ?? ""));
|
|
117
|
+
const byModality = {};
|
|
118
|
+
// With no filter every modality was asked, so report the zeros too.
|
|
119
|
+
if (!filtered) {
|
|
120
|
+
for (const m of exports.USAGE_MODALITIES)
|
|
121
|
+
byModality[m] = { cost_cents: 0, rows: 0 };
|
|
122
|
+
}
|
|
123
|
+
let total = 0;
|
|
124
|
+
for (const row of rows) {
|
|
125
|
+
const key = row.modality ?? "unknown";
|
|
126
|
+
const sub = (byModality[key] ??= { cost_cents: 0, rows: 0 });
|
|
127
|
+
sub.cost_cents = addCents(sub.cost_cents, row.cost_cents);
|
|
128
|
+
sub.rows += 1;
|
|
129
|
+
total = addCents(total, row.cost_cents);
|
|
130
|
+
}
|
|
131
|
+
const truncatedQueries = queries.filter((_, i) => results[i].truncated);
|
|
132
|
+
const repeatedQueries = queries.filter((_, i) => results[i].repeated);
|
|
133
|
+
const truncated = truncatedQueries.length > 0 || repeatedQueries.length > 0;
|
|
134
|
+
const label = (q) => q.modality ?? q.model ?? "the query";
|
|
135
|
+
return {
|
|
136
|
+
usage_kind: "inference",
|
|
137
|
+
note: "Serverless inference usage (what this account is billed for), from GET /v1/usage filtered by modality/model. " +
|
|
138
|
+
(filtered
|
|
139
|
+
? "One filtered query."
|
|
140
|
+
: `No modality or model was given, so this merges one query per modality (${exports.USAGE_MODALITIES.join(", ")}).`) +
|
|
141
|
+
(truncatedQueries.length > 0
|
|
142
|
+
? ` TRUNCATED: stopped after ${exports.USAGE_MAX_PAGES} pages of ${exports.USAGE_PAGE_SIZE} rows for ` +
|
|
143
|
+
truncatedQueries.map(label).join(", ") +
|
|
144
|
+
"; totals cover only the rows returned. Narrow start/end or use a wider bucket."
|
|
145
|
+
: "") +
|
|
146
|
+
(repeatedQueries.length > 0
|
|
147
|
+
? " TRUNCATED: the API returned a page or cursor it had already returned for " +
|
|
148
|
+
repeatedQueries.map(label).join(", ") +
|
|
149
|
+
", so paging stopped there; no row is counted twice, but totals cover only the rows returned. " +
|
|
150
|
+
"Narrow start/end or use a wider bucket."
|
|
151
|
+
: ""),
|
|
152
|
+
filter: { modality: args.modality ?? null, model: args.model ?? null },
|
|
153
|
+
bucket: args.bucket,
|
|
154
|
+
start: args.start ?? null,
|
|
155
|
+
end: args.end ?? null,
|
|
156
|
+
total_cost_cents: total,
|
|
157
|
+
total_cost_dollars: `$${(total / 100).toFixed(2)}`,
|
|
158
|
+
by_modality: byModality,
|
|
159
|
+
truncated,
|
|
160
|
+
rows,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/tools/readonly/usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,8 +21,9 @@ exports.observeVideoJob = observeVideoJob;
|
|
|
21
21
|
// can be tens of MB and would flood the agent's context (T-104-20). The stdio
|
|
22
22
|
// server runs as the user, so an agent-chosen path is the user's own
|
|
23
23
|
// filesystem; it must be absolute (T-104-19). The write uses flag "wx", so an
|
|
24
|
-
// existing file is never overwritten
|
|
25
|
-
//
|
|
24
|
+
// existing file is never overwritten. Because it creates files, the content
|
|
25
|
+
// tool advertises readOnlyHint: false and idempotentHint: false (WR-08); it
|
|
26
|
+
// stays in the read tier because it spends nothing and needs no confirmation.
|
|
26
27
|
const promises_1 = require("node:fs/promises");
|
|
27
28
|
const node_os_1 = require("node:os");
|
|
28
29
|
const node_path_1 = require("node:path");
|
|
@@ -33,6 +34,7 @@ const define_js_1 = require("./define.js");
|
|
|
33
34
|
/** Where deeprelay_videos_content saves when no output_path is given. */
|
|
34
35
|
exports.VIDEO_TMP_DIR = (0, node_path_1.join)((0, node_os_1.tmpdir)(), "deeprelay-mcp");
|
|
35
36
|
const FREE = "Free: a read-only call with no charge and no confirmation.";
|
|
37
|
+
const FREE_FILE_WRITE = "Free: no charge and no confirmation, but not read-only: it creates a file (and its directory) on this machine.";
|
|
36
38
|
function isTracked(videoId) {
|
|
37
39
|
return (0, budget_js_1.pendingVideoReservations)().some((r) => r.videoId === videoId);
|
|
38
40
|
}
|
|
@@ -116,8 +118,8 @@ exports.videoReadTools = [
|
|
|
116
118
|
description: "Download a completed video's MP4 to a file on this machine and return its path and size (the video is never " +
|
|
117
119
|
"returned inline). Pass `output_path` as an absolute file path, or omit it to save under the system temp " +
|
|
118
120
|
"directory. It never overwrites an existing file: if the path exists the call is refused and you must choose a " +
|
|
119
|
-
"new path
|
|
120
|
-
`completion. ${
|
|
121
|
+
"new path, and calling it twice with the default path is refused the second time. Also settles this " +
|
|
122
|
+
`session's reservation for the job. Artifacts are kept for 24 hours after completion. ${FREE_FILE_WRITE}`,
|
|
121
123
|
inputSchema: {
|
|
122
124
|
id: zod_1.z.string().min(1).describe("Video job id."),
|
|
123
125
|
output_path: zod_1.z
|
|
@@ -128,6 +130,7 @@ exports.videoReadTools = [
|
|
|
128
130
|
.describe("Absolute path to write the MP4 to. Default: <system temp>/deeprelay-mcp/<id>.mp4"),
|
|
129
131
|
},
|
|
130
132
|
context: "downloading a video",
|
|
133
|
+
writesLocalFiles: true,
|
|
131
134
|
async call(args, config) {
|
|
132
135
|
const api = new sdk_1.InferenceApi(config);
|
|
133
136
|
const job = observeVideoJob(await api.getVideo({ id: args.id }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video-reads.js","sourceRoot":"","sources":["../../../src/tools/readonly/video-reads.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"video-reads.js","sourceRoot":"","sources":["../../../src/tools/readonly/video-reads.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,9 +14,10 @@ exports.imageMimeType = imageMimeType;
|
|
|
14
14
|
// the text block is still built by ok() (sanitized and redacted).
|
|
15
15
|
//
|
|
16
16
|
// Video is asynchronous (RESEARCH Pitfall 2). The create call returns a queued
|
|
17
|
-
// job with no cost, so this handler reserves the
|
|
18
|
-
//
|
|
19
|
-
//
|
|
17
|
+
// job with no cost, so this handler reserves the estimate (a FLOOR: per-second
|
|
18
|
+
// rate x the requested seconds, or the model's default seconds; the per-clip
|
|
19
|
+
// from-price only when no per-second rate is published) under the returned job id and does not settle
|
|
20
|
+
// anything itself. The video reads (readonly/video-reads.ts) settle the reservation when they observe the
|
|
20
21
|
// job finished: at cost_cents on completion, released on failed, cancelled or
|
|
21
22
|
// expired.
|
|
22
23
|
//
|
|
@@ -107,8 +108,9 @@ const imagesGenerate = (0, define_js_1.defineSpendTool)({
|
|
|
107
108
|
const videosCreate = (0, define_js_1.defineSpendTool)({
|
|
108
109
|
name: "deeprelay_videos_create",
|
|
109
110
|
title: "Create a video",
|
|
110
|
-
description: "Start an asynchronous text-to-video job on a deeprelay video model. Priced
|
|
111
|
-
"
|
|
111
|
+
description: "Start an asynchronous text-to-video job on a deeprelay video model. Priced like the server bills it: the " +
|
|
112
|
+
"catalog's per-second rate x the requested seconds (the model's default length when omitted); the quote " +
|
|
113
|
+
"is a floor, not a cap, and the real charge " +
|
|
112
114
|
"is known only when the job completes. The floor is held against the session budget until " +
|
|
113
115
|
"deeprelay_videos_get or deeprelay_videos_list sees the job finish, which settles it at the actual cost " +
|
|
114
116
|
"(or releases it if the job failed or was cancelled). Download a finished clip with deeprelay_videos_content.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/tools/spend/media.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/tools/spend/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,6 +52,10 @@ async function ratesFor(config, modelId, now = Date.now) {
|
|
|
52
52
|
perVideoSecondMicrocents: pick(p.perVideoSecondMicrocents) ??
|
|
53
53
|
(pick(p.perVideoSecondCents) === undefined ? undefined : p.perVideoSecondCents * budget_js_1.MICRO_CENTS_PER_CENT),
|
|
54
54
|
};
|
|
55
|
+
const secondsDefault = (model.parameters ?? []).find((d) => d.name === "seconds")?._default;
|
|
56
|
+
if (typeof secondsDefault === "number" && Number.isFinite(secondsDefault) && secondsDefault > 0) {
|
|
57
|
+
rates.defaultVideoSeconds = secondsDefault;
|
|
58
|
+
}
|
|
55
59
|
cache.set(key, { rates, expiresAt: now() + exports.RATE_CACHE_TTL_MS });
|
|
56
60
|
return rates;
|
|
57
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../../src/tools/spend/pricing.ts"],"names":[],"mappings":";;;AAmCA,8DAEC;AAUD,
|
|
1
|
+
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../../src/tools/spend/pricing.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,6 +38,27 @@ function subscriptionError(status) {
|
|
|
38
38
|
exports.CRYPTO_NOT_ENABLED = "Crypto deposits are not enabled for this account — this tool cannot be used here. Do not retry; use " +
|
|
39
39
|
"deeprelay_subscription_checkout or the dashboard to add funds.";
|
|
40
40
|
const CRYPTO_UNAVAILABLE = "Crypto deposit service is temporarily unavailable — try later.";
|
|
41
|
+
/**
|
|
42
|
+
* The agent-supplied redirect URLs, spelled out for the confirmation (WR-06).
|
|
43
|
+
* The server applies no allowlist to them, so the user must see where the
|
|
44
|
+
* browser will be sent before agreeing. Empty when none was given (the
|
|
45
|
+
* deeprelay defaults apply).
|
|
46
|
+
*/
|
|
47
|
+
function redirectPhrase(urls) {
|
|
48
|
+
const given = urls.filter((u) => u.url !== undefined);
|
|
49
|
+
if (given.length === 0)
|
|
50
|
+
return "";
|
|
51
|
+
return ` ${given.map((u) => `${u.label} the browser is sent to ${u.url}`).join("; ")}.`;
|
|
52
|
+
}
|
|
53
|
+
function checkoutRedirects(args) {
|
|
54
|
+
return redirectPhrase([
|
|
55
|
+
{ label: "After a completed checkout", url: args.success_url },
|
|
56
|
+
{ label: "If checkout is abandoned", url: args.cancel_url },
|
|
57
|
+
]);
|
|
58
|
+
}
|
|
59
|
+
function portalRedirects(args) {
|
|
60
|
+
return redirectPhrase([{ label: "When the user leaves the portal", url: args.return_url }]);
|
|
61
|
+
}
|
|
41
62
|
function iso(d) {
|
|
42
63
|
return d instanceof Date && !Number.isNaN(d.getTime()) ? d.toISOString() : null;
|
|
43
64
|
}
|
|
@@ -52,12 +73,13 @@ const subscriptionCheckoutTool = (0, define_js_1.defineWriteTool)({
|
|
|
52
73
|
cancel_url: httpsUrl("the browser returns to if checkout is abandoned").optional(),
|
|
53
74
|
},
|
|
54
75
|
destructive: false,
|
|
55
|
-
question: (args) => `This will create a checkout link for plan ${args.plan_key ?? "default"}
|
|
76
|
+
question: (args) => `This will create a checkout link for plan ${args.plan_key ?? "default"}.${checkoutRedirects(args)} Confirm?`,
|
|
56
77
|
context: "creating a subscription checkout link",
|
|
57
78
|
async quote(args) {
|
|
58
79
|
return {
|
|
59
80
|
summary: `Create a subscription checkout link for plan ${args.plan_key ?? "default"}. ` +
|
|
60
|
-
"Nothing is charged until the user completes checkout in their browser."
|
|
81
|
+
"Nothing is charged until the user completes checkout in their browser." +
|
|
82
|
+
checkoutRedirects(args),
|
|
61
83
|
resolvedParams: { plan_key: args.plan_key, success_url: args.success_url, cancel_url: args.cancel_url },
|
|
62
84
|
};
|
|
63
85
|
},
|
|
@@ -86,11 +108,11 @@ const billingPortalTool = (0, define_js_1.defineWriteTool)({
|
|
|
86
108
|
return_url: httpsUrl("the browser returns to when the user leaves the portal").optional(),
|
|
87
109
|
},
|
|
88
110
|
destructive: false,
|
|
89
|
-
question:
|
|
111
|
+
question: (args) => `This will create a billing portal link.${portalRedirects(args)} Confirm?`,
|
|
90
112
|
context: "creating a billing portal link",
|
|
91
113
|
async quote(args) {
|
|
92
114
|
return {
|
|
93
|
-
summary:
|
|
115
|
+
summary: `Create a billing portal link. Nothing is charged by creating or opening it.${portalRedirects(args)}`,
|
|
94
116
|
resolvedParams: { return_url: args.return_url },
|
|
95
117
|
};
|
|
96
118
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-links.js","sourceRoot":"","sources":["../../../src/tools/write/payment-links.ts"],"names":[],"mappings":";;;AAAA,6EAA6E;AAC7E,gDAAgD;AAChD,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,iEAAiE;AACjE,EAAE;AACF,yEAAyE;AACzE,2EAA2E;AAC3E,0EAA0E;AAC1E,+EAA+E;AAC/E,4EAA4E;AAC5E,2EAA2E;AAC3E,sCAAsC;AACtC,wCAIwB;AACxB,6BAAwB;AAGxB,2CAA8C;AAE9C,MAAM,SAAS,GAAG,mGAAmG,CAAC;AAEtH,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAChC,OAAC;KACE,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;KACxD,QAAQ,CAAC,gBAAgB,IAAI,GAAG,CAAC,CAAC;AAEvC,MAAM,wBAAwB,GAAG,gEAAgE,CAAC;AAClG,MAAM,sBAAsB,GAC1B,kGAAkG,CAAC;AAErG,yFAAyF;AACzF,SAAS,iBAAiB,CAAC,MAA0B;IACnD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,wBAAwB,CAAC;IAClC,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,sBAAsB,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAEY,QAAA,kBAAkB,GAC7B,sGAAsG;IACtG,gEAAgE,CAAC;AACnE,MAAM,kBAAkB,GAAG,gEAAgE,CAAC;AAE5F,SAAS,GAAG,CAAC,CAAmB;IAC9B,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAClF,CAAC;AAED,MAAM,wBAAwB,GAAG,IAAA,2BAAe,EAAC;IAC/C,IAAI,EAAE,iCAAiC;IACvC,KAAK,EAAE,qCAAqC;IAC5C,WAAW,EACT,iHAAiH;QACjH,yBAAyB,SAAS,+BAA+B;IACnE,WAAW,EAAE;QACX,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;QACnG,WAAW,EAAE,QAAQ,CAAC,mDAAmD,CAAC,CAAC,QAAQ,EAAE;QACrF,UAAU,EAAE,QAAQ,CAAC,iDAAiD,CAAC,CAAC,QAAQ,EAAE;KACnF;IACD,WAAW,EAAE,KAAK;IAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"payment-links.js","sourceRoot":"","sources":["../../../src/tools/write/payment-links.ts"],"names":[],"mappings":";;;AAAA,6EAA6E;AAC7E,gDAAgD;AAChD,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,iEAAiE;AACjE,EAAE;AACF,yEAAyE;AACzE,2EAA2E;AAC3E,0EAA0E;AAC1E,+EAA+E;AAC/E,4EAA4E;AAC5E,2EAA2E;AAC3E,sCAAsC;AACtC,wCAIwB;AACxB,6BAAwB;AAGxB,2CAA8C;AAE9C,MAAM,SAAS,GAAG,mGAAmG,CAAC;AAEtH,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAChC,OAAC;KACE,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;KACxD,QAAQ,CAAC,gBAAgB,IAAI,GAAG,CAAC,CAAC;AAEvC,MAAM,wBAAwB,GAAG,gEAAgE,CAAC;AAClG,MAAM,sBAAsB,GAC1B,kGAAkG,CAAC;AAErG,yFAAyF;AACzF,SAAS,iBAAiB,CAAC,MAA0B;IACnD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,wBAAwB,CAAC;IAClC,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,sBAAsB,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAEY,QAAA,kBAAkB,GAC7B,sGAAsG;IACtG,gEAAgE,CAAC;AACnE,MAAM,kBAAkB,GAAG,gEAAgE,CAAC;AAE5F;;;;;GAKG;AACH,SAAS,cAAc,CAAC,IAAkD;IACxE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;IACtD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,2BAA2B,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1F,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAmD;IAC5E,OAAO,cAAc,CAAC;QACpB,EAAE,KAAK,EAAE,4BAA4B,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE;QAC9D,EAAE,KAAK,EAAE,0BAA0B,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE;KAC5D,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,IAA6B;IACpD,OAAO,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,iCAAiC,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,GAAG,CAAC,CAAmB;IAC9B,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAClF,CAAC;AAED,MAAM,wBAAwB,GAAG,IAAA,2BAAe,EAAC;IAC/C,IAAI,EAAE,iCAAiC;IACvC,KAAK,EAAE,qCAAqC;IAC5C,WAAW,EACT,iHAAiH;QACjH,yBAAyB,SAAS,+BAA+B;IACnE,WAAW,EAAE;QACX,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;QACnG,WAAW,EAAE,QAAQ,CAAC,mDAAmD,CAAC,CAAC,QAAQ,EAAE;QACrF,UAAU,EAAE,QAAQ,CAAC,iDAAiD,CAAC,CAAC,QAAQ,EAAE;KACnF;IACD,WAAW,EAAE,KAAK;IAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CACjB,6CAA6C,IAAI,CAAC,QAAQ,IAAI,SAAS,IAAI,iBAAiB,CAAC,IAAI,CAAC,WAAW;IAC/G,OAAO,EAAE,uCAAuC;IAChD,KAAK,CAAC,KAAK,CAAC,IAAI;QACd,OAAO;YACL,OAAO,EACL,gDAAgD,IAAI,CAAC,QAAQ,IAAI,SAAS,IAAI;gBAC9E,wEAAwE;gBACxE,iBAAiB,CAAC,IAAI,CAAC;YACzB,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;SACxG,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM;QACrB,MAAM,OAAO,GAAG,MAAM,IAAI,gBAAU,CAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC;YACtE,2BAA2B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE;SACzG,CAAC,CAAC;QACH,OAAO;YACL,IAAI,EACF,qGAAqG;gBACrG,0BAA0B;YAC5B,OAAO,EAAE;gBACP,YAAY,EAAE,OAAO,CAAC,WAAW;gBACjC,UAAU,EAAE,OAAO,CAAC,SAAS;gBAC7B,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB;SACF,CAAC;IACJ,CAAC;IACD,aAAa,EAAE,iBAAiB;CACjC,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,IAAA,2BAAe,EAAC;IACxC,IAAI,EAAE,0BAA0B;IAChC,KAAK,EAAE,8BAA8B;IACrC,WAAW,EACT,8GAA8G;QAC9G,YAAY,SAAS,+BAA+B;IACtD,WAAW,EAAE;QACX,UAAU,EAAE,QAAQ,CAAC,wDAAwD,CAAC,CAAC,QAAQ,EAAE;KAC1F;IACD,WAAW,EAAE,KAAK;IAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,0CAA0C,eAAe,CAAC,IAAI,CAAC,WAAW;IAC9F,OAAO,EAAE,gCAAgC;IACzC,KAAK,CAAC,KAAK,CAAC,IAAI;QACd,OAAO;YACL,OAAO,EAAE,8EAA8E,eAAe,CAAC,IAAI,CAAC,EAAE;YAC9G,cAAc,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;SAChD,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM;QACrB,MAAM,MAAM,GAAG,MAAM,IAAI,gBAAU,CAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC;YACnE,yBAAyB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE;SACvD,CAAC,CAAC;QACH,OAAO;YACL,IAAI,EAAE,4EAA4E;YAClF,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE;SAC1C,CAAC;IACJ,CAAC;IACD,aAAa,EAAE,iBAAiB;CACjC,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG,IAAA,2BAAe,EAAC;IAC9C,IAAI,EAAE,kCAAkC;IACxC,KAAK,EAAE,yBAAyB;IAChC,WAAW,EACT,iHAAiH;QACjH,+GAA+G;QAC/G,mHAAmH;IACrH,WAAW,EAAE;QACX,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,+CAA+C,CAAC;QACjG,KAAK,EAAE,OAAC,CAAC,IAAI,CAAC,yCAAmC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACrF,KAAK,EAAE,OAAC,CAAC,IAAI,CAAC,yCAAmC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;KACnF;IACD,WAAW,EAAE,KAAK;IAClB,aAAa,EAAE,KAAK;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CACjB,uBAAuB,CAAC,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,sBAAsB;QAC7G,GAAG,IAAI,CAAC,KAAK,aAAa;IAC5B,OAAO,EAAE,2BAA2B;IACpC,KAAK,CAAC,KAAK,CAAC,IAAI;QACd,OAAO;YACL,OAAO,EACL,wCAAwC,CAAC,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG;gBAC9G,MAAM,IAAI,CAAC,KAAK,kEAAkE;YACpF,cAAc,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;SAC1F,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM;QACrB,MAAM,OAAO,GAAG,MAAM,IAAI,gBAAU,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC;YAC/D,0BAA0B,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE;SAC5F,CAAC,CAAC;QACH,OAAO;YACL,IAAI,EACF,uGAAuG;gBACvG,kEAAkE;YACpE,OAAO,EAAE;gBACP,UAAU,EAAE,OAAO,CAAC,SAAS;gBAC7B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,WAAW,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;gBACvC,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;gBACrC,gBAAgB,EAAE,OAAO,CAAC,cAAc;gBACxC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC;aACnC;SACF,CAAC;IACJ,CAAC;IACD,aAAa,CAAC,MAAM;QAClB,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,OAAO,0BAAkB,CAAC;QAC5B,CAAC;QACD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;YAC1C,OAAO,kBAAkB,CAAC;QAC5B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF,CAAC,CAAC;AAEU,QAAA,gBAAgB,GAAqB,CAAC,wBAAwB,EAAE,iBAAiB,EAAE,uBAAuB,CAAC,CAAC"}
|
|
@@ -27,22 +27,40 @@ exports.spendingLimitClearTool = exports.spendingLimitUpdateTool = void 0;
|
|
|
27
27
|
// omitted field is defaulted server-side, which could silently change
|
|
28
28
|
// behaviour the confirmation never described (T-104-25).
|
|
29
29
|
//
|
|
30
|
+
// Both tools read "no limit configured" only from the API's typed 404
|
|
31
|
+
// `no_spending_limit`; any other 404 is an error (WR-04).
|
|
32
|
+
//
|
|
30
33
|
// The clear tool quotes against a live GET and re-reads at execute, the same
|
|
31
34
|
// time-of-check/time-of-use discipline as the update. "No limit configured"
|
|
32
|
-
// (the
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
+
// (the typed 404, on either the GET or the DELETE) is a plain "nothing to
|
|
36
|
+
// clear" result, never an error: the account is already in the state the user
|
|
37
|
+
// asked for.
|
|
35
38
|
const sdk_1 = require("@deeprelay/sdk");
|
|
36
39
|
const zod_1 = require("zod");
|
|
37
40
|
const errors_js_1 = require("../../errors.js");
|
|
38
41
|
const define_js_1 = require("./define.js");
|
|
39
|
-
/**
|
|
40
|
-
|
|
42
|
+
/** The API's typed code for "this org has no spending limit", on GET and DELETE alike. */
|
|
43
|
+
const NO_SPENDING_LIMIT = "no_spending_limit";
|
|
44
|
+
/** A 404 carrying the typed `no_spending_limit` code; any other 404 is a real error. */
|
|
45
|
+
async function isNoSpendingLimit(err) {
|
|
46
|
+
if ((0, errors_js_1.httpStatusOf)(err) !== 404) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
return (await (0, errors_js_1.readErrorEnvelope)(err)).code === NO_SPENDING_LIMIT;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The limit GET for both tools: only the API's typed `no_spending_limit` 404
|
|
53
|
+
* means "no limit configured" (undefined). Any other 404 (a proxy, a missing
|
|
54
|
+
* route, a base-URL path mistake) is a real error. For the update tool this is
|
|
55
|
+
* what keeps lower-only from failing open (WR-04): an untyped 404 read as "no
|
|
56
|
+
* limit" would let the PUT set a value above a limit that does exist.
|
|
57
|
+
*/
|
|
58
|
+
async function orTypedNoLimit(read) {
|
|
41
59
|
try {
|
|
42
60
|
return await read();
|
|
43
61
|
}
|
|
44
62
|
catch (err) {
|
|
45
|
-
if (
|
|
63
|
+
if (await isNoSpendingLimit(err)) {
|
|
46
64
|
return undefined;
|
|
47
65
|
}
|
|
48
66
|
throw err;
|
|
@@ -84,7 +102,7 @@ exports.spendingLimitUpdateTool = (0, define_js_1.defineWriteTool)({
|
|
|
84
102
|
question: (args) => `Lower the monthly spending limit to ${usd(args.monthly_limit_dollars)}?`,
|
|
85
103
|
context: "updating the spending limit",
|
|
86
104
|
async quote(args, config) {
|
|
87
|
-
const current = await
|
|
105
|
+
const current = await orTypedNoLimit(() => new sdk_1.BillingApi(config).getSpendingLimit());
|
|
88
106
|
const refusal = notADecrease(current, args.monthly_limit_dollars, args.daily_limit_dollars);
|
|
89
107
|
if (refusal !== undefined) {
|
|
90
108
|
throw new errors_js_1.QuoteUnavailableError(`Refused: ${refusal}. ${LOWER_ONLY}`);
|
|
@@ -111,7 +129,7 @@ exports.spendingLimitUpdateTool = (0, define_js_1.defineWriteTool)({
|
|
|
111
129
|
};
|
|
112
130
|
},
|
|
113
131
|
async execute(p, config) {
|
|
114
|
-
const fresh = await
|
|
132
|
+
const fresh = await orTypedNoLimit(() => new sdk_1.BillingApi(config).getSpendingLimit());
|
|
115
133
|
if (notADecrease(fresh, p.monthly_limit_dollars, p.daily_limit_dollars) !== undefined) {
|
|
116
134
|
throw new errors_js_1.QuoteUnavailableError("Refused at execution: the limit changed since the quote. The confirmation has been discarded.");
|
|
117
135
|
}
|
|
@@ -137,31 +155,6 @@ exports.spendingLimitUpdateTool = (0, define_js_1.defineWriteTool)({
|
|
|
137
155
|
};
|
|
138
156
|
},
|
|
139
157
|
});
|
|
140
|
-
/** The API's typed code for "this org has no spending limit", on GET and DELETE alike. */
|
|
141
|
-
const NO_SPENDING_LIMIT = "no_spending_limit";
|
|
142
|
-
/** A 404 carrying the typed `no_spending_limit` code; any other 404 is a real error. */
|
|
143
|
-
async function isNoSpendingLimit(err) {
|
|
144
|
-
if ((0, errors_js_1.httpStatusOf)(err) !== 404) {
|
|
145
|
-
return false;
|
|
146
|
-
}
|
|
147
|
-
return (await (0, errors_js_1.readErrorEnvelope)(err)).code === NO_SPENDING_LIMIT;
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Clear-path read: only the API's typed `no_spending_limit` 404 means "nothing
|
|
151
|
-
* to clear". Any other 404 (a proxy, a missing route) is a real error, so the
|
|
152
|
-
* agent is never told "no limit is configured" when one may exist.
|
|
153
|
-
*/
|
|
154
|
-
async function orTypedNoLimit(read) {
|
|
155
|
-
try {
|
|
156
|
-
return await read();
|
|
157
|
-
}
|
|
158
|
-
catch (err) {
|
|
159
|
-
if (await isNoSpendingLimit(err)) {
|
|
160
|
-
return undefined;
|
|
161
|
-
}
|
|
162
|
-
throw err;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
158
|
const NOTHING_TO_CLEAR = {
|
|
166
159
|
lead: "No spending limit is configured on this account, so there is nothing to clear. Nothing was changed.",
|
|
167
160
|
payload: { cleared: false, reason: NO_SPENDING_LIMIT },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spending-limit.js","sourceRoot":"","sources":["../../../src/tools/write/spending-limit.ts"],"names":[],"mappings":";;;AAAA,0EAA0E;AAC1E,EAAE;AACF,0EAA0E;AAC1E,8EAA8E;AAC9E,iEAAiE;AACjE,sEAAsE;AACtE,EAAE;AACF,4EAA4E;AAC5E,oCAAoC;AACpC,EAAE;AACF,+EAA+E;AAC/E,uBAAuB;AACvB,EAAE;AACF,+EAA+E;AAC/E,2DAA2D;AAC3D,2EAA2E;AAC3E,sEAAsE;AACtE,4EAA4E;AAC5E,2EAA2E;AAC3E,mCAAmC;AACnC,EAAE;AACF,wEAAwE;AACxE,uEAAuE;AACvE,sEAAsE;AACtE,yDAAyD;AACzD,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,
|
|
1
|
+
{"version":3,"file":"spending-limit.js","sourceRoot":"","sources":["../../../src/tools/write/spending-limit.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deeprelay/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "MCP server for the deeprelay serverless inference API",
|
|
5
5
|
"author": "deeprelay",
|
|
6
6
|
"homepage": "https://deeprelay.ai/docs",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"smoke:inspector": "bash scripts/inspector-smoke.sh"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@deeprelay/sdk": "0.2.
|
|
32
|
+
"@deeprelay/sdk": "0.2.1",
|
|
33
33
|
"@modelcontextprotocol/sdk": "1.30.0",
|
|
34
34
|
"zod": "4.4.3"
|
|
35
35
|
},
|