@deepthonk/providers 0.1.5 → 0.2.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 +21 -9
- package/dist/defaults.d.ts +1 -0
- package/dist/defaults.js +4 -2
- package/dist/defaults.js.map +1 -1
- package/dist/externalConfig.d.ts +4 -0
- package/dist/externalConfig.js +54 -2
- package/dist/externalConfig.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/openaiCompatible.d.ts +1 -0
- package/dist/openaiCompatible.js +21 -11
- package/dist/openaiCompatible.js.map +1 -1
- package/dist/providerReplay.d.ts +32 -29
- package/dist/providerReplay.js +3 -1
- package/dist/providerReplay.js.map +1 -1
- package/dist/registry.js +1 -0
- package/dist/registry.js.map +1 -1
- package/dist/routeLimiter.d.ts +36 -0
- package/dist/routeLimiter.js +164 -0
- package/dist/routeLimiter.js.map +1 -0
- package/dist/sampling.d.ts +2 -1
- package/dist/sampling.js +122 -103
- package/dist/sampling.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/package.json +2 -2
package/dist/sampling.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ProviderError } from "@deepthonk/core";
|
|
2
2
|
import { extractJsonObjectText } from "./jsonExtract.js";
|
|
3
|
+
import { getSharedRouteLimiter } from "./routeLimiter.js";
|
|
3
4
|
const DEFAULT_SAMPLING_TIMEOUT_MS = 60_000;
|
|
4
5
|
const DEFAULT_SAMPLING_RESPONSE_LIMIT_BYTES = 1024 * 1024;
|
|
5
6
|
const DEFAULT_OUTPUT_TOKENS = 4096;
|
|
@@ -7,89 +8,88 @@ const DEFAULT_JUDGE_OUTPUT_TOKENS = 1024;
|
|
|
7
8
|
export class SamplingDriver {
|
|
8
9
|
createMessage;
|
|
9
10
|
config;
|
|
10
|
-
|
|
11
|
+
routeLimiter;
|
|
11
12
|
constructor(createMessage, config = {}) {
|
|
12
13
|
this.createMessage = createMessage;
|
|
13
14
|
this.config = config;
|
|
15
|
+
this.routeLimiter = getSharedRouteLimiter({
|
|
16
|
+
provider: "sampling",
|
|
17
|
+
models: { generator: "sampling", mutator: "sampling", judge: "sampling" },
|
|
18
|
+
providerMaxConcurrency: config.providerMaxConcurrency
|
|
19
|
+
});
|
|
14
20
|
}
|
|
15
21
|
async generate(input) {
|
|
16
|
-
|
|
17
|
-
return this.sample(input.model, input.temperature, promptMessages(input.prompt), controls.maxOutputTokens ?? DEFAULT_OUTPUT_TOKENS, controls.signal);
|
|
22
|
+
return this.sample(input.model, input.temperature, promptMessages(input.prompt), input.maxOutputTokens ?? DEFAULT_OUTPUT_TOKENS, input.signal);
|
|
18
23
|
}
|
|
19
24
|
async compare(input) {
|
|
20
|
-
const
|
|
21
|
-
const result = await this.sample(input.model, input.temperature, promptMessages(input.prompt), controls.maxOutputTokens ?? DEFAULT_JUDGE_OUTPUT_TOKENS, controls.signal);
|
|
25
|
+
const result = await this.sample(input.model, input.temperature, promptMessages(input.prompt), input.maxOutputTokens ?? DEFAULT_JUDGE_OUTPUT_TOKENS, input.signal);
|
|
22
26
|
return { ...result, text: extractJsonTextOrOriginal(result.text) };
|
|
23
27
|
}
|
|
24
28
|
async mutate(input) {
|
|
25
|
-
|
|
26
|
-
return this.sample(input.model, input.temperature, promptMessages(input.prompt), controls.maxOutputTokens ?? DEFAULT_OUTPUT_TOKENS, controls.signal);
|
|
29
|
+
return this.sample(input.model, input.temperature, promptMessages(input.prompt), input.maxOutputTokens ?? DEFAULT_OUTPUT_TOKENS, input.signal);
|
|
27
30
|
}
|
|
28
31
|
async finalize(input) {
|
|
29
|
-
|
|
30
|
-
return this.sample(input.model, 0.2, promptMessages(input.prompt), controls.maxOutputTokens ?? DEFAULT_OUTPUT_TOKENS, controls.signal);
|
|
32
|
+
return this.sample(input.model, 0.2, promptMessages(input.prompt), input.maxOutputTokens ?? DEFAULT_OUTPUT_TOKENS, input.signal);
|
|
31
33
|
}
|
|
32
34
|
async sample(model, temperature, prompt, maxOutputTokens, signal) {
|
|
33
35
|
const started = Date.now();
|
|
34
|
-
const result = await this.callCreateMessage({
|
|
35
|
-
messages: prompt.user.trim()
|
|
36
|
-
? [
|
|
37
|
-
{
|
|
38
|
-
role: "user",
|
|
39
|
-
content: {
|
|
40
|
-
type: "text",
|
|
41
|
-
text: prompt.user
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
]
|
|
45
|
-
: [],
|
|
46
|
-
systemPrompt: prompt.system.trim() ? prompt.system : undefined,
|
|
47
|
-
modelPreferences: buildModelPreferences(model, this.config),
|
|
48
|
-
includeContext: "none",
|
|
49
|
-
temperature,
|
|
50
|
-
maxTokens: maxOutputTokens
|
|
51
|
-
}, signal);
|
|
52
|
-
if (result.stopReason === "maxTokens") {
|
|
53
|
-
throw new ProviderError("MCP Sampling response was truncated by maxTokens.", {
|
|
54
|
-
code: "provider.output_truncated",
|
|
55
|
-
retryable: false,
|
|
56
|
-
fix: "Use a smaller prompt, a host model with larger output support, or reduce answer length."
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
const text = textContent(result);
|
|
60
|
-
if (Buffer.byteLength(text, "utf8") > DEFAULT_SAMPLING_RESPONSE_LIMIT_BYTES) {
|
|
61
|
-
throw new ProviderError(`MCP Sampling response exceeded the ${DEFAULT_SAMPLING_RESPONSE_LIMIT_BYTES}-byte body limit.`, {
|
|
62
|
-
code: "provider.response_too_large",
|
|
63
|
-
retryable: false,
|
|
64
|
-
fix: "Use a host model with bounded text responses or reduce the requested output size."
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
return {
|
|
68
|
-
text,
|
|
69
|
-
model: result.model ?? model,
|
|
70
|
-
provider: "sampling",
|
|
71
|
-
usage: {
|
|
72
|
-
inputTokens: undefined,
|
|
73
|
-
outputTokens: undefined
|
|
74
|
-
},
|
|
75
|
-
latencyMs: Date.now() - started,
|
|
76
|
-
retryCount: 0,
|
|
77
|
-
raw: this.config.includeRawOutputs ? result : undefined
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
async callCreateMessage(params, signal) {
|
|
81
36
|
const timeoutMs = this.config.requestTimeoutMs ?? DEFAULT_SAMPLING_TIMEOUT_MS;
|
|
37
|
+
const deadline = samplingDeadline(timeoutMs, signal);
|
|
38
|
+
let release;
|
|
82
39
|
try {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
40
|
+
release = await this.routeLimiter.acquire(deadline.signal);
|
|
41
|
+
const result = await this.callCreateMessage({
|
|
42
|
+
messages: prompt.user.trim()
|
|
43
|
+
? [
|
|
44
|
+
{
|
|
45
|
+
role: "user",
|
|
46
|
+
content: {
|
|
47
|
+
type: "text",
|
|
48
|
+
text: prompt.user
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
: [],
|
|
53
|
+
systemPrompt: prompt.system.trim() ? prompt.system : undefined,
|
|
54
|
+
modelPreferences: buildModelPreferences(model, this.config),
|
|
55
|
+
includeContext: "none",
|
|
56
|
+
temperature,
|
|
57
|
+
maxTokens: maxOutputTokens
|
|
58
|
+
}, deadline);
|
|
59
|
+
if (result.stopReason === "maxTokens") {
|
|
60
|
+
throw new ProviderError("MCP Sampling response was truncated by maxTokens.", {
|
|
61
|
+
code: "provider.output_truncated",
|
|
62
|
+
retryable: false,
|
|
63
|
+
fix: "Use a smaller prompt, a host model with larger output support, or reduce answer length."
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const text = textContent(result);
|
|
67
|
+
if (Buffer.byteLength(text, "utf8") > DEFAULT_SAMPLING_RESPONSE_LIMIT_BYTES) {
|
|
68
|
+
throw new ProviderError(`MCP Sampling response exceeded the ${DEFAULT_SAMPLING_RESPONSE_LIMIT_BYTES}-byte body limit.`, {
|
|
69
|
+
code: "provider.response_too_large",
|
|
89
70
|
retryable: false,
|
|
90
|
-
fix: "
|
|
71
|
+
fix: "Use a host model with bounded text responses or reduce the requested output size."
|
|
91
72
|
});
|
|
92
73
|
}
|
|
74
|
+
this.routeLimiter.recordSuccess();
|
|
75
|
+
return {
|
|
76
|
+
text,
|
|
77
|
+
model: result.model ?? model,
|
|
78
|
+
provider: "sampling",
|
|
79
|
+
usage: {
|
|
80
|
+
inputTokens: undefined,
|
|
81
|
+
outputTokens: undefined
|
|
82
|
+
},
|
|
83
|
+
latencyMs: Date.now() - started,
|
|
84
|
+
retryCount: 0,
|
|
85
|
+
raw: this.config.includeRawOutputs ? result : undefined
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (isRateLimitError(error))
|
|
90
|
+
this.routeLimiter.recordRateLimit();
|
|
91
|
+
if (deadline.timedOut())
|
|
92
|
+
throw samplingTimeoutError(timeoutMs);
|
|
93
93
|
if (signal?.aborted) {
|
|
94
94
|
throw new ProviderError("MCP Sampling request was aborted.", {
|
|
95
95
|
code: "provider.aborted",
|
|
@@ -97,6 +97,20 @@ export class SamplingDriver {
|
|
|
97
97
|
fix: "Retry the run if the cancellation was unintended."
|
|
98
98
|
});
|
|
99
99
|
}
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
release?.();
|
|
104
|
+
deadline.dispose();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async callCreateMessage(params, deadline) {
|
|
108
|
+
try {
|
|
109
|
+
return await callWithDeadline(this.createMessage, params, deadline);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
if (deadline.signal.aborted)
|
|
113
|
+
throw error;
|
|
100
114
|
throw new ProviderError(`MCP Sampling request failed: ${error instanceof Error ? error.message : String(error)}`, {
|
|
101
115
|
code: "provider.sampling_request_failed",
|
|
102
116
|
retryable: false,
|
|
@@ -105,53 +119,57 @@ export class SamplingDriver {
|
|
|
105
119
|
}
|
|
106
120
|
}
|
|
107
121
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
122
|
+
async function callWithDeadline(fn, params, deadline) {
|
|
123
|
+
if (deadline.signal.aborted)
|
|
124
|
+
throw abortError(deadline.signal);
|
|
125
|
+
let rejectOnAbort;
|
|
126
|
+
const abortPromise = new Promise((_, reject) => {
|
|
127
|
+
rejectOnAbort = () => reject(abortError(deadline.signal));
|
|
128
|
+
deadline.signal.addEventListener("abort", rejectOnAbort, { once: true });
|
|
129
|
+
});
|
|
130
|
+
try {
|
|
131
|
+
return await Promise.race([
|
|
132
|
+
fn(params, { signal: deadline.signal, timeout: Math.max(1, deadline.remainingMs()) }),
|
|
133
|
+
abortPromise
|
|
134
|
+
]);
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
if (rejectOnAbort)
|
|
138
|
+
deadline.signal.removeEventListener("abort", rejectOnAbort);
|
|
114
139
|
}
|
|
115
140
|
}
|
|
116
|
-
|
|
141
|
+
function samplingDeadline(timeoutMs, inputSignal) {
|
|
117
142
|
const controller = new AbortController();
|
|
143
|
+
const expiresAt = Date.now() + timeoutMs;
|
|
144
|
+
let timeoutReached = false;
|
|
118
145
|
const onInputAbort = () => controller.abort(inputSignal?.reason);
|
|
119
146
|
if (inputSignal?.aborted)
|
|
120
147
|
controller.abort(inputSignal.reason);
|
|
121
148
|
else
|
|
122
149
|
inputSignal?.addEventListener("abort", onInputAbort, { once: true });
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
? new Promise((_, reject) => {
|
|
133
|
-
if (inputSignal.aborted) {
|
|
134
|
-
reject(inputSignal.reason ?? new DOMException("Aborted", "AbortError"));
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
rejectOnAbort = () => reject(inputSignal.reason ?? new DOMException("Aborted", "AbortError"));
|
|
138
|
-
inputSignal.addEventListener("abort", rejectOnAbort, { once: true });
|
|
139
|
-
})
|
|
140
|
-
: undefined;
|
|
141
|
-
try {
|
|
142
|
-
return await Promise.race([
|
|
143
|
-
fn(params, { signal: controller.signal, timeout: timeoutMs }),
|
|
144
|
-
timeoutPromise,
|
|
145
|
-
...(abortPromise ? [abortPromise] : [])
|
|
146
|
-
]);
|
|
147
|
-
}
|
|
148
|
-
finally {
|
|
149
|
-
if (timer)
|
|
150
|
+
const timer = setTimeout(() => {
|
|
151
|
+
timeoutReached = true;
|
|
152
|
+
controller.abort(new DOMException("Timed out", "AbortError"));
|
|
153
|
+
}, timeoutMs);
|
|
154
|
+
return {
|
|
155
|
+
signal: controller.signal,
|
|
156
|
+
timedOut: () => timeoutReached,
|
|
157
|
+
remainingMs: () => Math.max(0, expiresAt - Date.now()),
|
|
158
|
+
dispose: () => {
|
|
150
159
|
clearTimeout(timer);
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
160
|
+
inputSignal?.removeEventListener("abort", onInputAbort);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
function samplingTimeoutError(timeoutMs) {
|
|
165
|
+
return new ProviderError(`MCP Sampling request timed out after ${timeoutMs}ms.`, {
|
|
166
|
+
code: "provider.sampling_timeout",
|
|
167
|
+
retryable: false,
|
|
168
|
+
fix: "Increase retry.requestTimeoutMs, switch to a direct provider, or check the MCP host responsiveness. Use 'deepthonk resume <run-dir> --continue' to retry an interrupted run."
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
function abortError(signal) {
|
|
172
|
+
return signal.reason instanceof DOMException ? signal.reason : new DOMException("Aborted", "AbortError");
|
|
155
173
|
}
|
|
156
174
|
export function buildModelPreferences(roleModel, config) {
|
|
157
175
|
const hintNames = uniqueNonEmpty([roleModel, ...(config.modelHints ?? [])]);
|
|
@@ -200,7 +218,8 @@ function uniqueNonEmpty(values) {
|
|
|
200
218
|
}
|
|
201
219
|
return unique;
|
|
202
220
|
}
|
|
203
|
-
function
|
|
204
|
-
|
|
221
|
+
function isRateLimitError(error) {
|
|
222
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
223
|
+
return /\b429\b|rate.?limit/i.test(message);
|
|
205
224
|
}
|
|
206
225
|
//# sourceMappingURL=sampling.js.map
|
package/dist/sampling.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sampling.js","sourceRoot":"","sources":["../src/sampling.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAQd,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"sampling.js","sourceRoot":"","sources":["../src/sampling.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export interface RoleProviderConfig {
|
|
|
7
7
|
apiKeyEnv?: string;
|
|
8
8
|
apiKey?: string;
|
|
9
9
|
model: string;
|
|
10
|
+
providerMaxConcurrency?: number;
|
|
10
11
|
retry?: {
|
|
11
12
|
httpRetries?: number;
|
|
12
13
|
requestTimeoutMs?: number;
|
|
@@ -18,6 +19,7 @@ export interface RoleProviderConfig {
|
|
|
18
19
|
export interface BaseProviderConfig extends SamplingDriverConfig {
|
|
19
20
|
provider: "fake" | "openai-compatible" | "deepseek" | string;
|
|
20
21
|
routeFingerprint?: string;
|
|
22
|
+
providerMaxConcurrency?: number;
|
|
21
23
|
baseUrl?: string;
|
|
22
24
|
apiKeyEnv?: string;
|
|
23
25
|
apiKey?: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepthonk/providers",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Provider drivers and routing for DeepThonk.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Xule Lin",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
36
36
|
"yaml": "^2.7.1",
|
|
37
37
|
"zod": "^3.25.28",
|
|
38
|
-
"@deepthonk/core": "0.
|
|
38
|
+
"@deepthonk/core": "0.2.0"
|
|
39
39
|
},
|
|
40
40
|
"scripts": {
|
|
41
41
|
"build": "tsc -p tsconfig.json",
|