@jterrazz/test 6.5.0 → 7.0.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/dist/index.cjs +21 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -8
- package/dist/index.d.ts +10 -8
- package/dist/index.js +21 -8
- package/dist/index.js.map +1 -1
- package/dist/intercept.cjs +107 -104
- package/dist/intercept.cjs.map +1 -1
- package/dist/intercept.d.cts +26 -42
- package/dist/intercept.d.ts +26 -42
- package/dist/intercept.js +107 -104
- package/dist/intercept.js.map +1 -1
- package/dist/types.d.cts +7 -1
- package/dist/types.d.ts +7 -1
- package/package.json +1 -1
package/dist/intercept.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
//#region src/builder/common/intercept/adapters/anthropic.ts
|
|
3
3
|
const ANTHROPIC_MESSAGES_URL = "https://api.anthropic.com/v1/messages";
|
|
4
|
-
function matchesFilter
|
|
4
|
+
function matchesFilter(body, filter) {
|
|
5
5
|
if (filter.model) {
|
|
6
6
|
const model = body?.model;
|
|
7
7
|
if (typeof filter.model === "string" && model !== filter.model) return false;
|
|
@@ -32,7 +32,7 @@ const anthropic = {
|
|
|
32
32
|
return {
|
|
33
33
|
method: "POST",
|
|
34
34
|
url: ANTHROPIC_MESSAGES_URL,
|
|
35
|
-
match: filter ? (body) => matchesFilter
|
|
35
|
+
match: filter ? (body) => matchesFilter(body, filter) : void 0
|
|
36
36
|
};
|
|
37
37
|
},
|
|
38
38
|
response(data) {
|
|
@@ -77,42 +77,54 @@ const anthropic = {
|
|
|
77
77
|
};
|
|
78
78
|
//#endregion
|
|
79
79
|
//#region src/builder/common/intercept/adapters/http.ts
|
|
80
|
+
/** Default wrap: raw JSON data becomes the response body. */
|
|
81
|
+
function wrapJson(data) {
|
|
82
|
+
return {
|
|
83
|
+
status: 200,
|
|
84
|
+
body: data
|
|
85
|
+
};
|
|
86
|
+
}
|
|
80
87
|
/**
|
|
81
88
|
* Generic HTTP intercept helpers for any URL.
|
|
82
89
|
*
|
|
83
90
|
* @example
|
|
84
|
-
* .intercept(http.get('https://api.example.com/data'),
|
|
85
|
-
* .intercept(http.post('https://api.stripe.com/v1/charges'), {
|
|
91
|
+
* .intercept(http.get('https://api.example.com/data'), 'response.json')
|
|
92
|
+
* .intercept(http.post('https://api.stripe.com/v1/charges'), http.json({ id: 'ch_...' }))
|
|
86
93
|
*/
|
|
87
94
|
const http = {
|
|
88
95
|
get(url) {
|
|
89
96
|
return {
|
|
90
97
|
method: "GET",
|
|
91
|
-
url
|
|
98
|
+
url,
|
|
99
|
+
wrap: wrapJson
|
|
92
100
|
};
|
|
93
101
|
},
|
|
94
102
|
post(url) {
|
|
95
103
|
return {
|
|
96
104
|
method: "POST",
|
|
97
|
-
url
|
|
105
|
+
url,
|
|
106
|
+
wrap: wrapJson
|
|
98
107
|
};
|
|
99
108
|
},
|
|
100
109
|
put(url) {
|
|
101
110
|
return {
|
|
102
111
|
method: "PUT",
|
|
103
|
-
url
|
|
112
|
+
url,
|
|
113
|
+
wrap: wrapJson
|
|
104
114
|
};
|
|
105
115
|
},
|
|
106
116
|
delete(url) {
|
|
107
117
|
return {
|
|
108
118
|
method: "DELETE",
|
|
109
|
-
url
|
|
119
|
+
url,
|
|
120
|
+
wrap: wrapJson
|
|
110
121
|
};
|
|
111
122
|
},
|
|
112
123
|
any(url) {
|
|
113
124
|
return {
|
|
114
125
|
method: "*",
|
|
115
|
-
url
|
|
126
|
+
url,
|
|
127
|
+
wrap: wrapJson
|
|
116
128
|
};
|
|
117
129
|
},
|
|
118
130
|
json(data, status = 200) {
|
|
@@ -132,25 +144,25 @@ const http = {
|
|
|
132
144
|
//#region src/builder/common/intercept/adapters/openai.ts
|
|
133
145
|
const OPENAI_CHAT_URL = "https://api.openai.com/v1/chat/completions";
|
|
134
146
|
const OPENAI_RESPONSES_URL = "https://api.openai.com/v1/responses";
|
|
135
|
-
function
|
|
147
|
+
function matchesChatFilter(body, filter) {
|
|
136
148
|
if (filter.model) {
|
|
137
149
|
const model = body?.model;
|
|
138
150
|
if (typeof filter.model === "string" && model !== filter.model) return false;
|
|
139
151
|
if (filter.model instanceof RegExp && !filter.model.test(model ?? "")) return false;
|
|
140
152
|
}
|
|
141
153
|
if (filter.system) {
|
|
142
|
-
const
|
|
143
|
-
if (typeof filter.system === "string" && !
|
|
144
|
-
if (filter.system instanceof RegExp && !filter.system.test(
|
|
154
|
+
const msg = body?.messages?.find((m) => m.role === "system")?.content ?? "";
|
|
155
|
+
if (typeof filter.system === "string" && !msg.includes(filter.system)) return false;
|
|
156
|
+
if (filter.system instanceof RegExp && !filter.system.test(msg)) return false;
|
|
145
157
|
}
|
|
146
158
|
if (filter.user) {
|
|
147
|
-
const
|
|
148
|
-
if (typeof filter.user === "string" && !
|
|
149
|
-
if (filter.user instanceof RegExp && !filter.user.test(
|
|
159
|
+
const msg = body?.messages?.find((m) => m.role === "user")?.content ?? "";
|
|
160
|
+
if (typeof filter.user === "string" && !msg.includes(filter.user)) return false;
|
|
161
|
+
if (filter.user instanceof RegExp && !filter.user.test(msg)) return false;
|
|
150
162
|
}
|
|
151
163
|
if (filter.tools) {
|
|
152
|
-
const
|
|
153
|
-
if (!filter.tools.every((t) =>
|
|
164
|
+
const names = body?.tools?.map((t) => t.function?.name).filter(Boolean) ?? [];
|
|
165
|
+
if (!filter.tools.every((t) => names.includes(t))) return false;
|
|
154
166
|
}
|
|
155
167
|
if (filter.temperature !== void 0 && body?.temperature !== filter.temperature) return false;
|
|
156
168
|
return true;
|
|
@@ -164,90 +176,94 @@ function matchesResponsesFilter(body, filter) {
|
|
|
164
176
|
if (filter.system) {
|
|
165
177
|
const instructions = body?.instructions ?? "";
|
|
166
178
|
const systemInput = body?.input?.find?.((m) => m.role === "system")?.content ?? "";
|
|
167
|
-
const
|
|
168
|
-
if (typeof filter.system === "string" && !
|
|
169
|
-
if (filter.system instanceof RegExp && !filter.system.test(
|
|
179
|
+
const text = instructions || systemInput;
|
|
180
|
+
if (typeof filter.system === "string" && !text.includes(filter.system)) return false;
|
|
181
|
+
if (filter.system instanceof RegExp && !filter.system.test(text)) return false;
|
|
170
182
|
}
|
|
171
183
|
if (filter.user) {
|
|
172
|
-
const
|
|
173
|
-
if (typeof filter.user === "string" && !
|
|
174
|
-
if (filter.user instanceof RegExp && !filter.user.test(
|
|
184
|
+
const msgs = (body?.input ?? []).filter((m) => m.role === "user").map((m) => typeof m.content === "string" ? m.content : JSON.stringify(m.content)).join(" ");
|
|
185
|
+
if (typeof filter.user === "string" && !msgs.includes(filter.user)) return false;
|
|
186
|
+
if (filter.user instanceof RegExp && !filter.user.test(msgs)) return false;
|
|
175
187
|
}
|
|
176
188
|
if (filter.tools) {
|
|
177
|
-
const
|
|
178
|
-
if (!filter.tools.every((t) =>
|
|
189
|
+
const names = body?.tools?.map((t) => t.name ?? t.function?.name).filter(Boolean) ?? [];
|
|
190
|
+
if (!filter.tools.every((t) => names.includes(t))) return false;
|
|
179
191
|
}
|
|
180
192
|
return true;
|
|
181
193
|
}
|
|
194
|
+
function buildChatReply(data) {
|
|
195
|
+
const content = typeof data === "string" ? data : JSON.stringify(data);
|
|
196
|
+
return {
|
|
197
|
+
status: 200,
|
|
198
|
+
body: {
|
|
199
|
+
id: "chatcmpl-test",
|
|
200
|
+
object: "chat.completion",
|
|
201
|
+
created: Math.floor(Date.now() / 1e3),
|
|
202
|
+
model: "gpt-4o-test",
|
|
203
|
+
choices: [{
|
|
204
|
+
index: 0,
|
|
205
|
+
message: {
|
|
206
|
+
role: "assistant",
|
|
207
|
+
content
|
|
208
|
+
},
|
|
209
|
+
finish_reason: "stop"
|
|
210
|
+
}],
|
|
211
|
+
usage: {
|
|
212
|
+
prompt_tokens: 10,
|
|
213
|
+
completion_tokens: 10,
|
|
214
|
+
total_tokens: 20
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
function buildResponsesReply(data) {
|
|
220
|
+
const text = typeof data === "string" ? data : JSON.stringify(data);
|
|
221
|
+
return {
|
|
222
|
+
status: 200,
|
|
223
|
+
body: {
|
|
224
|
+
id: "resp-test",
|
|
225
|
+
object: "response",
|
|
226
|
+
created_at: Math.floor(Date.now() / 1e3),
|
|
227
|
+
model: "gpt-4o-test",
|
|
228
|
+
output: [{
|
|
229
|
+
type: "message",
|
|
230
|
+
id: "msg-test",
|
|
231
|
+
role: "assistant",
|
|
232
|
+
content: [{
|
|
233
|
+
type: "output_text",
|
|
234
|
+
text,
|
|
235
|
+
annotations: []
|
|
236
|
+
}]
|
|
237
|
+
}],
|
|
238
|
+
usage: {
|
|
239
|
+
input_tokens: 10,
|
|
240
|
+
output_tokens: 10,
|
|
241
|
+
total_tokens: 20
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
}
|
|
182
246
|
/**
|
|
183
247
|
* OpenAI API intercept helpers.
|
|
184
248
|
*/
|
|
185
249
|
const openai = {
|
|
186
|
-
|
|
250
|
+
request(filter) {
|
|
187
251
|
return {
|
|
188
252
|
method: "POST",
|
|
189
253
|
url: OPENAI_CHAT_URL,
|
|
190
|
-
match: filter ? (body) =>
|
|
254
|
+
match: filter ? (body) => matchesChatFilter(body, filter) : void 0,
|
|
255
|
+
wrap: buildChatReply
|
|
191
256
|
};
|
|
192
257
|
},
|
|
193
|
-
|
|
258
|
+
agent(filter, url) {
|
|
194
259
|
return {
|
|
195
260
|
method: "POST",
|
|
196
261
|
url: url ?? OPENAI_RESPONSES_URL,
|
|
197
|
-
match: filter ? (body) => matchesResponsesFilter(body, filter) : void 0
|
|
198
|
-
|
|
199
|
-
},
|
|
200
|
-
responsesResponse(data) {
|
|
201
|
-
const text = typeof data === "string" ? data : JSON.stringify(data);
|
|
202
|
-
return {
|
|
203
|
-
status: 200,
|
|
204
|
-
body: {
|
|
205
|
-
id: "resp-test",
|
|
206
|
-
object: "response",
|
|
207
|
-
created_at: Math.floor(Date.now() / 1e3),
|
|
208
|
-
model: "gpt-4o-test",
|
|
209
|
-
output: [{
|
|
210
|
-
type: "message",
|
|
211
|
-
role: "assistant",
|
|
212
|
-
content: [{
|
|
213
|
-
type: "output_text",
|
|
214
|
-
text,
|
|
215
|
-
annotations: []
|
|
216
|
-
}]
|
|
217
|
-
}],
|
|
218
|
-
usage: {
|
|
219
|
-
input_tokens: 10,
|
|
220
|
-
output_tokens: 10,
|
|
221
|
-
total_tokens: 20
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
};
|
|
225
|
-
},
|
|
226
|
-
response(data) {
|
|
227
|
-
const content = typeof data === "string" ? data : JSON.stringify(data);
|
|
228
|
-
return {
|
|
229
|
-
status: 200,
|
|
230
|
-
body: {
|
|
231
|
-
id: "chatcmpl-test",
|
|
232
|
-
object: "chat.completion",
|
|
233
|
-
created: Math.floor(Date.now() / 1e3),
|
|
234
|
-
model: "gpt-4o-test",
|
|
235
|
-
choices: [{
|
|
236
|
-
index: 0,
|
|
237
|
-
message: {
|
|
238
|
-
role: "assistant",
|
|
239
|
-
content
|
|
240
|
-
},
|
|
241
|
-
finish_reason: "stop"
|
|
242
|
-
}],
|
|
243
|
-
usage: {
|
|
244
|
-
prompt_tokens: 10,
|
|
245
|
-
completion_tokens: 10,
|
|
246
|
-
total_tokens: 20
|
|
247
|
-
}
|
|
248
|
-
}
|
|
262
|
+
match: filter ? (body) => matchesResponsesFilter(body, filter) : void 0,
|
|
263
|
+
wrap: buildResponsesReply
|
|
249
264
|
};
|
|
250
265
|
},
|
|
266
|
+
reply: buildChatReply,
|
|
251
267
|
error(status, message) {
|
|
252
268
|
return {
|
|
253
269
|
status,
|
|
@@ -259,28 +275,7 @@ const openai = {
|
|
|
259
275
|
};
|
|
260
276
|
},
|
|
261
277
|
malformed(content) {
|
|
262
|
-
return
|
|
263
|
-
status: 200,
|
|
264
|
-
body: {
|
|
265
|
-
id: "chatcmpl-test",
|
|
266
|
-
object: "chat.completion",
|
|
267
|
-
created: Math.floor(Date.now() / 1e3),
|
|
268
|
-
model: "gpt-4o-test",
|
|
269
|
-
choices: [{
|
|
270
|
-
index: 0,
|
|
271
|
-
message: {
|
|
272
|
-
role: "assistant",
|
|
273
|
-
content
|
|
274
|
-
},
|
|
275
|
-
finish_reason: "stop"
|
|
276
|
-
}],
|
|
277
|
-
usage: {
|
|
278
|
-
prompt_tokens: 10,
|
|
279
|
-
completion_tokens: 10,
|
|
280
|
-
total_tokens: 20
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
};
|
|
278
|
+
return buildChatReply(content);
|
|
284
279
|
},
|
|
285
280
|
timeout() {
|
|
286
281
|
return {
|
|
@@ -288,7 +283,15 @@ const openai = {
|
|
|
288
283
|
body: {},
|
|
289
284
|
delay: 3e4
|
|
290
285
|
};
|
|
291
|
-
}
|
|
286
|
+
},
|
|
287
|
+
chat(filter) {
|
|
288
|
+
return openai.request(filter);
|
|
289
|
+
},
|
|
290
|
+
response: buildChatReply,
|
|
291
|
+
responses(filter, url) {
|
|
292
|
+
return openai.agent(filter, url);
|
|
293
|
+
},
|
|
294
|
+
responsesResponse: buildResponsesReply
|
|
292
295
|
};
|
|
293
296
|
//#endregion
|
|
294
297
|
exports.anthropic = anthropic;
|
package/dist/intercept.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intercept.cjs","names":["matchesFilter"],"sources":["../src/builder/common/intercept/adapters/anthropic.ts","../src/builder/common/intercept/adapters/http.ts","../src/builder/common/intercept/adapters/openai.ts"],"sourcesContent":["import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\nconst ANTHROPIC_MESSAGES_URL = 'https://api.anthropic.com/v1/messages';\n\nexport interface AnthropicMessagesFilter {\n /** Match by model name. */\n model?: RegExp | string;\n /** Match by system message content. */\n system?: RegExp | string;\n /** Match by user message content. */\n user?: RegExp | string;\n /** Match by tool names. */\n tools?: string[];\n}\n\nfunction matchesFilter(body: any, filter: AnthropicMessagesFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n\n if (filter.system) {\n const system = typeof body?.system === 'string' ? body.system : '';\n if (typeof filter.system === 'string' && !system.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(system)) {\n return false;\n }\n }\n\n if (filter.user) {\n const userMsg = body?.messages?.find((m: any) => m.role === 'user')?.content ?? '';\n const text = typeof userMsg === 'string' ? userMsg : JSON.stringify(userMsg);\n if (typeof filter.user === 'string' && !text.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(text)) {\n return false;\n }\n }\n\n if (filter.tools) {\n const requestTools = body?.tools?.map((t: any) => t.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => requestTools.includes(t))) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Anthropic API intercept helpers.\n */\nexport const anthropic = {\n /**\n * Trigger: match Anthropic messages API requests.\n */\n messages(filter?: AnthropicMessagesFilter): InterceptTrigger {\n return {\n method: 'POST',\n url: ANTHROPIC_MESSAGES_URL,\n match: filter ? (body: unknown) => matchesFilter(body, filter) : undefined,\n };\n },\n\n /** Response: wrap data in Anthropic messages format. */\n response(data: unknown): InterceptResponse {\n const content = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'msg-test',\n type: 'message',\n role: 'assistant',\n content: [{ type: 'text', text: content }],\n model: 'claude-sonnet-4-20250514',\n stop_reason: 'end_turn',\n usage: { input_tokens: 10, output_tokens: 10 },\n },\n };\n },\n\n /** Response: return an Anthropic error. */\n error(status: number, message?: string): InterceptResponse {\n return {\n status,\n body: {\n type: 'error',\n error: {\n type: status === 429 ? 'rate_limit_error' : 'api_error',\n message: message ?? `Anthropic error (${status})`,\n },\n },\n };\n },\n\n /** Response: simulate a timeout. */\n timeout(): InterceptResponse {\n return { status: 200, body: {}, delay: 30_000 };\n },\n};\n","import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\n/**\n * Generic HTTP intercept helpers for any URL.\n *\n * @example\n * .intercept(http.get('https://api.example.com/data'), { body: [...] })\n * .intercept(http.post('https://api.stripe.com/v1/charges'), { body: { id: 'ch_...' } })\n */\nexport const http = {\n /** Trigger: match GET requests to a URL pattern. */\n get(url: RegExp | string): InterceptTrigger {\n return { method: 'GET', url };\n },\n\n /** Trigger: match POST requests to a URL pattern. */\n post(url: RegExp | string): InterceptTrigger {\n return { method: 'POST', url };\n },\n\n /** Trigger: match PUT requests to a URL pattern. */\n put(url: RegExp | string): InterceptTrigger {\n return { method: 'PUT', url };\n },\n\n /** Trigger: match DELETE requests to a URL pattern. */\n delete(url: RegExp | string): InterceptTrigger {\n return { method: 'DELETE', url };\n },\n\n /** Trigger: match any method to a URL pattern. */\n any(url: RegExp | string): InterceptTrigger {\n return { method: '*', url };\n },\n\n /** Response: simple JSON success. */\n json(data: unknown, status = 200): InterceptResponse {\n return { status, body: data };\n },\n\n /** Response: error with message. */\n error(status: number, message?: string): InterceptResponse {\n return { status, body: { error: message ?? `HTTP ${status}` } };\n },\n};\n","import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\nconst OPENAI_CHAT_URL = 'https://api.openai.com/v1/chat/completions';\nconst OPENAI_RESPONSES_URL = 'https://api.openai.com/v1/responses';\n\nexport interface OpenAIChatFilter {\n /** Match by model name (exact string or regex). */\n model?: RegExp | string;\n /** Match by system message content (regex or substring). */\n system?: RegExp | string;\n /** Match by user message content (regex or substring). */\n user?: RegExp | string;\n /** Match by tool/function names present in the request. */\n tools?: string[];\n /** Match by temperature value. */\n temperature?: number;\n}\n\nfunction matchesFilter(body: any, filter: OpenAIChatFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n\n if (filter.system) {\n const systemMsg = body?.messages?.find((m: any) => m.role === 'system')?.content ?? '';\n if (typeof filter.system === 'string' && !systemMsg.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(systemMsg)) {\n return false;\n }\n }\n\n if (filter.user) {\n const userMsg = body?.messages?.find((m: any) => m.role === 'user')?.content ?? '';\n if (typeof filter.user === 'string' && !userMsg.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(userMsg)) {\n return false;\n }\n }\n\n if (filter.tools) {\n const requestTools = body?.tools?.map((t: any) => t.function?.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => requestTools.includes(t))) {\n return false;\n }\n }\n\n if (filter.temperature !== undefined && body?.temperature !== filter.temperature) {\n return false;\n }\n\n return true;\n}\n\n/** Responses API filter — uses `input` array instead of `messages`. */\nexport interface OpenAIResponsesFilter {\n /** Match by model name. */\n model?: RegExp | string;\n /** Match by system instruction content. */\n system?: RegExp | string;\n /** Match by user input content. */\n user?: RegExp | string;\n /** Match by tool names. */\n tools?: string[];\n}\n\nfunction matchesResponsesFilter(body: any, filter: OpenAIResponsesFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n\n if (filter.system) {\n const instructions = body?.instructions ?? '';\n const systemInput = body?.input?.find?.((m: any) => m.role === 'system')?.content ?? '';\n const systemText = instructions || systemInput;\n if (typeof filter.system === 'string' && !systemText.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(systemText)) {\n return false;\n }\n }\n\n if (filter.user) {\n const userInputs = (body?.input ?? [])\n .filter((m: any) => m.role === 'user')\n .map((m: any) =>\n typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n )\n .join(' ');\n if (typeof filter.user === 'string' && !userInputs.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(userInputs)) {\n return false;\n }\n }\n\n if (filter.tools) {\n const requestTools =\n body?.tools?.map((t: any) => t.name ?? t.function?.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => requestTools.includes(t))) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * OpenAI API intercept helpers.\n */\nexport const openai = {\n /**\n * Trigger: match OpenAI chat completion requests.\n *\n * @param filter - Optional filters to narrow which requests match.\n *\n * @example\n * openai.chat() // any chat call\n * openai.chat({ model: 'gpt-4o' }) // specific model\n * openai.chat({ system: /classify/ }) // system prompt contains \"classify\"\n * openai.chat({ tools: ['extract_facts'] }) // function calling\n */\n chat(filter?: OpenAIChatFilter): InterceptTrigger {\n return {\n method: 'POST',\n url: OPENAI_CHAT_URL,\n match: filter ? (body: unknown) => matchesFilter(body, filter) : undefined,\n };\n },\n\n /**\n * Trigger: match OpenAI Responses API requests (AI SDK v5+).\n *\n * @param filter - Optional filters. Supports custom gateway URLs.\n * @param url - Override URL for custom gateways (e.g. 'https://gateway.example.com/v1/responses').\n *\n * @example\n * openai.responses() // default URL\n * openai.responses({ user: /Report Ingestion/ }) // match by prompt content\n * openai.responses({ model: 'gpt-4o' }, 'https://my-gateway/v1/responses') // custom gateway\n */\n responses(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger {\n return {\n method: 'POST',\n url: url ?? OPENAI_RESPONSES_URL,\n match: filter ? (body: unknown) => matchesResponsesFilter(body, filter) : undefined,\n };\n },\n\n /**\n * Response: wrap data in OpenAI Responses API format (AI SDK v5+).\n *\n * @example\n * openai.responsesResponse({ categories: ['TECH'] })\n */\n responsesResponse(data: unknown): InterceptResponse {\n const text = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'resp-test',\n object: 'response',\n created_at: Math.floor(Date.now() / 1000),\n model: 'gpt-4o-test',\n output: [\n {\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text, annotations: [] }],\n },\n ],\n usage: {\n input_tokens: 10,\n output_tokens: 10,\n total_tokens: 20,\n },\n },\n };\n },\n\n /**\n * Response: wrap data in OpenAI chat completion format.\n *\n * @param data - The content to return (will be JSON.stringified if not a string).\n *\n * @example\n * openai.response({ categories: ['TECH'] })\n */\n response(data: unknown): InterceptResponse {\n const content = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'chatcmpl-test',\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: 'gpt-4o-test',\n choices: [\n {\n index: 0,\n message: { role: 'assistant', content },\n finish_reason: 'stop',\n },\n ],\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n },\n };\n },\n\n /** Response: return an OpenAI error. */\n error(status: number, message?: string): InterceptResponse {\n return {\n status,\n body: {\n error: {\n message: message ?? `OpenAI error (${status})`,\n type: status === 429 ? 'rate_limit_error' : 'api_error',\n code: status === 429 ? 'rate_limit_exceeded' : null,\n },\n },\n };\n },\n\n /** Response: return malformed (non-JSON) content. */\n malformed(content: string): InterceptResponse {\n return {\n status: 200,\n body: {\n id: 'chatcmpl-test',\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: 'gpt-4o-test',\n choices: [\n {\n index: 0,\n message: { role: 'assistant', content },\n finish_reason: 'stop',\n },\n ],\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n },\n };\n },\n\n /** Response: simulate a timeout (30s delay). */\n timeout(): InterceptResponse {\n return {\n status: 200,\n body: {},\n delay: 30_000,\n };\n },\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"intercept.cjs","names":[],"sources":["../src/builder/common/intercept/adapters/anthropic.ts","../src/builder/common/intercept/adapters/http.ts","../src/builder/common/intercept/adapters/openai.ts"],"sourcesContent":["import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\nconst ANTHROPIC_MESSAGES_URL = 'https://api.anthropic.com/v1/messages';\n\nexport interface AnthropicMessagesFilter {\n /** Match by model name. */\n model?: RegExp | string;\n /** Match by system message content. */\n system?: RegExp | string;\n /** Match by user message content. */\n user?: RegExp | string;\n /** Match by tool names. */\n tools?: string[];\n}\n\nfunction matchesFilter(body: any, filter: AnthropicMessagesFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n\n if (filter.system) {\n const system = typeof body?.system === 'string' ? body.system : '';\n if (typeof filter.system === 'string' && !system.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(system)) {\n return false;\n }\n }\n\n if (filter.user) {\n const userMsg = body?.messages?.find((m: any) => m.role === 'user')?.content ?? '';\n const text = typeof userMsg === 'string' ? userMsg : JSON.stringify(userMsg);\n if (typeof filter.user === 'string' && !text.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(text)) {\n return false;\n }\n }\n\n if (filter.tools) {\n const requestTools = body?.tools?.map((t: any) => t.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => requestTools.includes(t))) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Anthropic API intercept helpers.\n */\nexport const anthropic = {\n /**\n * Trigger: match Anthropic messages API requests.\n */\n messages(filter?: AnthropicMessagesFilter): InterceptTrigger {\n return {\n method: 'POST',\n url: ANTHROPIC_MESSAGES_URL,\n match: filter ? (body: unknown) => matchesFilter(body, filter) : undefined,\n };\n },\n\n /** Response: wrap data in Anthropic messages format. */\n response(data: unknown): InterceptResponse {\n const content = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'msg-test',\n type: 'message',\n role: 'assistant',\n content: [{ type: 'text', text: content }],\n model: 'claude-sonnet-4-20250514',\n stop_reason: 'end_turn',\n usage: { input_tokens: 10, output_tokens: 10 },\n },\n };\n },\n\n /** Response: return an Anthropic error. */\n error(status: number, message?: string): InterceptResponse {\n return {\n status,\n body: {\n type: 'error',\n error: {\n type: status === 429 ? 'rate_limit_error' : 'api_error',\n message: message ?? `Anthropic error (${status})`,\n },\n },\n };\n },\n\n /** Response: simulate a timeout. */\n timeout(): InterceptResponse {\n return { status: 200, body: {}, delay: 30_000 };\n },\n};\n","import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\n/** Default wrap: raw JSON data becomes the response body. */\nfunction wrapJson(data: unknown): InterceptResponse {\n return { status: 200, body: data };\n}\n\n/**\n * Generic HTTP intercept helpers for any URL.\n *\n * @example\n * .intercept(http.get('https://api.example.com/data'), 'response.json')\n * .intercept(http.post('https://api.stripe.com/v1/charges'), http.json({ id: 'ch_...' }))\n */\nexport const http = {\n /** Trigger: match GET requests to a URL pattern. */\n get(url: RegExp | string): InterceptTrigger {\n return { method: 'GET', url, wrap: wrapJson };\n },\n\n /** Trigger: match POST requests to a URL pattern. */\n post(url: RegExp | string): InterceptTrigger {\n return { method: 'POST', url, wrap: wrapJson };\n },\n\n /** Trigger: match PUT requests to a URL pattern. */\n put(url: RegExp | string): InterceptTrigger {\n return { method: 'PUT', url, wrap: wrapJson };\n },\n\n /** Trigger: match DELETE requests to a URL pattern. */\n delete(url: RegExp | string): InterceptTrigger {\n return { method: 'DELETE', url, wrap: wrapJson };\n },\n\n /** Trigger: match any method to a URL pattern. */\n any(url: RegExp | string): InterceptTrigger {\n return { method: '*', url, wrap: wrapJson };\n },\n\n /** Response: simple JSON success. */\n json(data: unknown, status = 200): InterceptResponse {\n return { status, body: data };\n },\n\n /** Response: error with message. */\n error(status: number, message?: string): InterceptResponse {\n return { status, body: { error: message ?? `HTTP ${status}` } };\n },\n};\n","import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\nconst OPENAI_CHAT_URL = 'https://api.openai.com/v1/chat/completions';\nconst OPENAI_RESPONSES_URL = 'https://api.openai.com/v1/responses';\n\n// ── Chat Completions filters ──\n\nexport interface OpenAIChatFilter {\n model?: RegExp | string;\n system?: RegExp | string;\n user?: RegExp | string;\n tools?: string[];\n temperature?: number;\n}\n\nfunction matchesChatFilter(body: any, filter: OpenAIChatFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n if (filter.system) {\n const msg = body?.messages?.find((m: any) => m.role === 'system')?.content ?? '';\n if (typeof filter.system === 'string' && !msg.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(msg)) {\n return false;\n }\n }\n if (filter.user) {\n const msg = body?.messages?.find((m: any) => m.role === 'user')?.content ?? '';\n if (typeof filter.user === 'string' && !msg.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(msg)) {\n return false;\n }\n }\n if (filter.tools) {\n const names = body?.tools?.map((t: any) => t.function?.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => names.includes(t))) {\n return false;\n }\n }\n if (filter.temperature !== undefined && body?.temperature !== filter.temperature) {\n return false;\n }\n return true;\n}\n\n// ── Responses API filters ──\n\nexport interface OpenAIResponsesFilter {\n model?: RegExp | string;\n system?: RegExp | string;\n user?: RegExp | string;\n tools?: string[];\n}\n\nfunction matchesResponsesFilter(body: any, filter: OpenAIResponsesFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n if (filter.system) {\n const instructions = body?.instructions ?? '';\n const systemInput = body?.input?.find?.((m: any) => m.role === 'system')?.content ?? '';\n const text = instructions || systemInput;\n if (typeof filter.system === 'string' && !text.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(text)) {\n return false;\n }\n }\n if (filter.user) {\n const msgs = (body?.input ?? [])\n .filter((m: any) => m.role === 'user')\n .map((m: any) =>\n typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n )\n .join(' ');\n if (typeof filter.user === 'string' && !msgs.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(msgs)) {\n return false;\n }\n }\n if (filter.tools) {\n const names =\n body?.tools?.map((t: any) => t.name ?? t.function?.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => names.includes(t))) {\n return false;\n }\n }\n return true;\n}\n\n// ── Response builders ──\n\nfunction buildChatReply(data: unknown): InterceptResponse {\n const content = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'chatcmpl-test',\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: 'gpt-4o-test',\n choices: [{ index: 0, message: { role: 'assistant', content }, finish_reason: 'stop' }],\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n },\n };\n}\n\nfunction buildResponsesReply(data: unknown): InterceptResponse {\n const text = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'resp-test',\n object: 'response',\n created_at: Math.floor(Date.now() / 1000),\n model: 'gpt-4o-test',\n output: [\n {\n type: 'message',\n id: 'msg-test',\n role: 'assistant',\n content: [{ type: 'output_text', text, annotations: [] }],\n },\n ],\n usage: { input_tokens: 10, output_tokens: 10, total_tokens: 20 },\n },\n };\n}\n\n// ── Public API ──\n\n/**\n * OpenAI API intercept helpers.\n */\nexport const openai = {\n /**\n * Trigger: match Chat Completions API requests.\n *\n * @example\n * openai.request() // any chat call\n * openai.request({ model: 'gpt-4o' }) // specific model\n * openai.request({ system: /classify/ }) // system prompt match\n */\n request(filter?: OpenAIChatFilter): InterceptTrigger {\n return {\n method: 'POST',\n url: OPENAI_CHAT_URL,\n match: filter ? (body: unknown) => matchesChatFilter(body, filter) : undefined,\n wrap: buildChatReply,\n };\n },\n\n /**\n * Trigger: match Responses API requests (AI SDK v5+) with auto-wrapping.\n * When used with a JSON file, the data is automatically wrapped in the\n * Responses API envelope.\n *\n * @param filter - Optional body filters.\n * @param url - Custom gateway URL (default: api.openai.com).\n *\n * @example\n * openai.agent({ user: /Report Ingestion/ }, GATEWAY)\n */\n agent(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger {\n return {\n method: 'POST',\n url: url ?? OPENAI_RESPONSES_URL,\n match: filter ? (body: unknown) => matchesResponsesFilter(body, filter) : undefined,\n wrap: buildResponsesReply,\n };\n },\n\n /**\n * Response: wrap data in Chat Completions format.\n *\n * @example\n * openai.reply({ categories: ['TECH'] })\n */\n reply: buildChatReply,\n\n /** Response: return an OpenAI error. */\n error(status: number, message?: string): InterceptResponse {\n return {\n status,\n body: {\n error: {\n message: message ?? `OpenAI error (${status})`,\n type: status === 429 ? 'rate_limit_error' : 'api_error',\n code: status === 429 ? 'rate_limit_exceeded' : null,\n },\n },\n };\n },\n\n /** Response: return malformed content. */\n malformed(content: string): InterceptResponse {\n return buildChatReply(content);\n },\n\n /** Response: simulate a timeout. */\n timeout(): InterceptResponse {\n return { status: 200, body: {}, delay: 30_000 };\n },\n\n // ── Legacy aliases ──\n\n /** @deprecated Use openai.request() instead. */\n chat(filter?: OpenAIChatFilter): InterceptTrigger {\n return openai.request(filter);\n },\n\n /** @deprecated Use openai.reply() instead. */\n response: buildChatReply,\n\n /** @deprecated Use openai.agent() instead. */\n responses(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger {\n return openai.agent(filter, url);\n },\n\n /** @deprecated Use openai.reply() or .intercept(trigger, 'file.json') instead. */\n responsesResponse: buildResponsesReply,\n};\n"],"mappings":"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"}
|
package/dist/intercept.d.cts
CHANGED
|
@@ -29,8 +29,8 @@ declare const anthropic: {
|
|
|
29
29
|
* Generic HTTP intercept helpers for any URL.
|
|
30
30
|
*
|
|
31
31
|
* @example
|
|
32
|
-
* .intercept(http.get('https://api.example.com/data'),
|
|
33
|
-
* .intercept(http.post('https://api.stripe.com/v1/charges'), {
|
|
32
|
+
* .intercept(http.get('https://api.example.com/data'), 'response.json')
|
|
33
|
+
* .intercept(http.post('https://api.stripe.com/v1/charges'), http.json({ id: 'ch_...' }))
|
|
34
34
|
*/
|
|
35
35
|
declare const http: {
|
|
36
36
|
/** Trigger: match GET requests to a URL pattern. */get(url: RegExp | string): InterceptTrigger; /** Trigger: match POST requests to a URL pattern. */
|
|
@@ -44,75 +44,59 @@ declare const http: {
|
|
|
44
44
|
//#endregion
|
|
45
45
|
//#region src/builder/common/intercept/adapters/openai.d.ts
|
|
46
46
|
interface OpenAIChatFilter {
|
|
47
|
-
/** Match by model name (exact string or regex). */
|
|
48
47
|
model?: RegExp | string;
|
|
49
|
-
/** Match by system message content (regex or substring). */
|
|
50
48
|
system?: RegExp | string;
|
|
51
|
-
/** Match by user message content (regex or substring). */
|
|
52
49
|
user?: RegExp | string;
|
|
53
|
-
/** Match by tool/function names present in the request. */
|
|
54
50
|
tools?: string[];
|
|
55
|
-
/** Match by temperature value. */
|
|
56
51
|
temperature?: number;
|
|
57
52
|
}
|
|
58
|
-
/** Responses API filter — uses `input` array instead of `messages`. */
|
|
59
53
|
interface OpenAIResponsesFilter {
|
|
60
|
-
/** Match by model name. */
|
|
61
54
|
model?: RegExp | string;
|
|
62
|
-
/** Match by system instruction content. */
|
|
63
55
|
system?: RegExp | string;
|
|
64
|
-
/** Match by user input content. */
|
|
65
56
|
user?: RegExp | string;
|
|
66
|
-
/** Match by tool names. */
|
|
67
57
|
tools?: string[];
|
|
68
58
|
}
|
|
59
|
+
declare function buildChatReply(data: unknown): InterceptResponse;
|
|
60
|
+
declare function buildResponsesReply(data: unknown): InterceptResponse;
|
|
69
61
|
/**
|
|
70
62
|
* OpenAI API intercept helpers.
|
|
71
63
|
*/
|
|
72
64
|
declare const openai: {
|
|
73
65
|
/**
|
|
74
|
-
* Trigger: match
|
|
75
|
-
*
|
|
76
|
-
* @param filter - Optional filters to narrow which requests match.
|
|
66
|
+
* Trigger: match Chat Completions API requests.
|
|
77
67
|
*
|
|
78
68
|
* @example
|
|
79
|
-
* openai.
|
|
80
|
-
* openai.
|
|
81
|
-
* openai.
|
|
82
|
-
* openai.chat({ tools: ['extract_facts'] }) // function calling
|
|
69
|
+
* openai.request() // any chat call
|
|
70
|
+
* openai.request({ model: 'gpt-4o' }) // specific model
|
|
71
|
+
* openai.request({ system: /classify/ }) // system prompt match
|
|
83
72
|
*/
|
|
84
|
-
|
|
73
|
+
request(filter?: OpenAIChatFilter): InterceptTrigger;
|
|
85
74
|
/**
|
|
86
|
-
* Trigger: match
|
|
75
|
+
* Trigger: match Responses API requests (AI SDK v5+) with auto-wrapping.
|
|
76
|
+
* When used with a JSON file, the data is automatically wrapped in the
|
|
77
|
+
* Responses API envelope.
|
|
87
78
|
*
|
|
88
|
-
* @param filter - Optional filters.
|
|
89
|
-
* @param url -
|
|
79
|
+
* @param filter - Optional body filters.
|
|
80
|
+
* @param url - Custom gateway URL (default: api.openai.com).
|
|
90
81
|
*
|
|
91
82
|
* @example
|
|
92
|
-
* openai.
|
|
93
|
-
* openai.responses({ user: /Report Ingestion/ }) // match by prompt content
|
|
94
|
-
* openai.responses({ model: 'gpt-4o' }, 'https://my-gateway/v1/responses') // custom gateway
|
|
83
|
+
* openai.agent({ user: /Report Ingestion/ }, GATEWAY)
|
|
95
84
|
*/
|
|
96
|
-
|
|
85
|
+
agent(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger;
|
|
97
86
|
/**
|
|
98
|
-
* Response: wrap data in
|
|
87
|
+
* Response: wrap data in Chat Completions format.
|
|
99
88
|
*
|
|
100
89
|
* @example
|
|
101
|
-
* openai.
|
|
90
|
+
* openai.reply({ categories: ['TECH'] })
|
|
102
91
|
*/
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
*/
|
|
112
|
-
response(data: unknown): InterceptResponse; /** Response: return an OpenAI error. */
|
|
113
|
-
error(status: number, message?: string): InterceptResponse; /** Response: return malformed (non-JSON) content. */
|
|
114
|
-
malformed(content: string): InterceptResponse; /** Response: simulate a timeout (30s delay). */
|
|
115
|
-
timeout(): InterceptResponse;
|
|
92
|
+
reply: typeof buildChatReply; /** Response: return an OpenAI error. */
|
|
93
|
+
error(status: number, message?: string): InterceptResponse; /** Response: return malformed content. */
|
|
94
|
+
malformed(content: string): InterceptResponse; /** Response: simulate a timeout. */
|
|
95
|
+
timeout(): InterceptResponse; /** @deprecated Use openai.request() instead. */
|
|
96
|
+
chat(filter?: OpenAIChatFilter): InterceptTrigger; /** @deprecated Use openai.reply() instead. */
|
|
97
|
+
response: typeof buildChatReply; /** @deprecated Use openai.agent() instead. */
|
|
98
|
+
responses(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger; /** @deprecated Use openai.reply() or .intercept(trigger, 'file.json') instead. */
|
|
99
|
+
responsesResponse: typeof buildResponsesReply;
|
|
116
100
|
};
|
|
117
101
|
//#endregion
|
|
118
102
|
export { type InterceptEntry, type InterceptResponse, type InterceptTrigger, anthropic, http, openai };
|
package/dist/intercept.d.ts
CHANGED
|
@@ -29,8 +29,8 @@ declare const anthropic: {
|
|
|
29
29
|
* Generic HTTP intercept helpers for any URL.
|
|
30
30
|
*
|
|
31
31
|
* @example
|
|
32
|
-
* .intercept(http.get('https://api.example.com/data'),
|
|
33
|
-
* .intercept(http.post('https://api.stripe.com/v1/charges'), {
|
|
32
|
+
* .intercept(http.get('https://api.example.com/data'), 'response.json')
|
|
33
|
+
* .intercept(http.post('https://api.stripe.com/v1/charges'), http.json({ id: 'ch_...' }))
|
|
34
34
|
*/
|
|
35
35
|
declare const http: {
|
|
36
36
|
/** Trigger: match GET requests to a URL pattern. */get(url: RegExp | string): InterceptTrigger; /** Trigger: match POST requests to a URL pattern. */
|
|
@@ -44,75 +44,59 @@ declare const http: {
|
|
|
44
44
|
//#endregion
|
|
45
45
|
//#region src/builder/common/intercept/adapters/openai.d.ts
|
|
46
46
|
interface OpenAIChatFilter {
|
|
47
|
-
/** Match by model name (exact string or regex). */
|
|
48
47
|
model?: RegExp | string;
|
|
49
|
-
/** Match by system message content (regex or substring). */
|
|
50
48
|
system?: RegExp | string;
|
|
51
|
-
/** Match by user message content (regex or substring). */
|
|
52
49
|
user?: RegExp | string;
|
|
53
|
-
/** Match by tool/function names present in the request. */
|
|
54
50
|
tools?: string[];
|
|
55
|
-
/** Match by temperature value. */
|
|
56
51
|
temperature?: number;
|
|
57
52
|
}
|
|
58
|
-
/** Responses API filter — uses `input` array instead of `messages`. */
|
|
59
53
|
interface OpenAIResponsesFilter {
|
|
60
|
-
/** Match by model name. */
|
|
61
54
|
model?: RegExp | string;
|
|
62
|
-
/** Match by system instruction content. */
|
|
63
55
|
system?: RegExp | string;
|
|
64
|
-
/** Match by user input content. */
|
|
65
56
|
user?: RegExp | string;
|
|
66
|
-
/** Match by tool names. */
|
|
67
57
|
tools?: string[];
|
|
68
58
|
}
|
|
59
|
+
declare function buildChatReply(data: unknown): InterceptResponse;
|
|
60
|
+
declare function buildResponsesReply(data: unknown): InterceptResponse;
|
|
69
61
|
/**
|
|
70
62
|
* OpenAI API intercept helpers.
|
|
71
63
|
*/
|
|
72
64
|
declare const openai: {
|
|
73
65
|
/**
|
|
74
|
-
* Trigger: match
|
|
75
|
-
*
|
|
76
|
-
* @param filter - Optional filters to narrow which requests match.
|
|
66
|
+
* Trigger: match Chat Completions API requests.
|
|
77
67
|
*
|
|
78
68
|
* @example
|
|
79
|
-
* openai.
|
|
80
|
-
* openai.
|
|
81
|
-
* openai.
|
|
82
|
-
* openai.chat({ tools: ['extract_facts'] }) // function calling
|
|
69
|
+
* openai.request() // any chat call
|
|
70
|
+
* openai.request({ model: 'gpt-4o' }) // specific model
|
|
71
|
+
* openai.request({ system: /classify/ }) // system prompt match
|
|
83
72
|
*/
|
|
84
|
-
|
|
73
|
+
request(filter?: OpenAIChatFilter): InterceptTrigger;
|
|
85
74
|
/**
|
|
86
|
-
* Trigger: match
|
|
75
|
+
* Trigger: match Responses API requests (AI SDK v5+) with auto-wrapping.
|
|
76
|
+
* When used with a JSON file, the data is automatically wrapped in the
|
|
77
|
+
* Responses API envelope.
|
|
87
78
|
*
|
|
88
|
-
* @param filter - Optional filters.
|
|
89
|
-
* @param url -
|
|
79
|
+
* @param filter - Optional body filters.
|
|
80
|
+
* @param url - Custom gateway URL (default: api.openai.com).
|
|
90
81
|
*
|
|
91
82
|
* @example
|
|
92
|
-
* openai.
|
|
93
|
-
* openai.responses({ user: /Report Ingestion/ }) // match by prompt content
|
|
94
|
-
* openai.responses({ model: 'gpt-4o' }, 'https://my-gateway/v1/responses') // custom gateway
|
|
83
|
+
* openai.agent({ user: /Report Ingestion/ }, GATEWAY)
|
|
95
84
|
*/
|
|
96
|
-
|
|
85
|
+
agent(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger;
|
|
97
86
|
/**
|
|
98
|
-
* Response: wrap data in
|
|
87
|
+
* Response: wrap data in Chat Completions format.
|
|
99
88
|
*
|
|
100
89
|
* @example
|
|
101
|
-
* openai.
|
|
90
|
+
* openai.reply({ categories: ['TECH'] })
|
|
102
91
|
*/
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
*/
|
|
112
|
-
response(data: unknown): InterceptResponse; /** Response: return an OpenAI error. */
|
|
113
|
-
error(status: number, message?: string): InterceptResponse; /** Response: return malformed (non-JSON) content. */
|
|
114
|
-
malformed(content: string): InterceptResponse; /** Response: simulate a timeout (30s delay). */
|
|
115
|
-
timeout(): InterceptResponse;
|
|
92
|
+
reply: typeof buildChatReply; /** Response: return an OpenAI error. */
|
|
93
|
+
error(status: number, message?: string): InterceptResponse; /** Response: return malformed content. */
|
|
94
|
+
malformed(content: string): InterceptResponse; /** Response: simulate a timeout. */
|
|
95
|
+
timeout(): InterceptResponse; /** @deprecated Use openai.request() instead. */
|
|
96
|
+
chat(filter?: OpenAIChatFilter): InterceptTrigger; /** @deprecated Use openai.reply() instead. */
|
|
97
|
+
response: typeof buildChatReply; /** @deprecated Use openai.agent() instead. */
|
|
98
|
+
responses(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger; /** @deprecated Use openai.reply() or .intercept(trigger, 'file.json') instead. */
|
|
99
|
+
responsesResponse: typeof buildResponsesReply;
|
|
116
100
|
};
|
|
117
101
|
//#endregion
|
|
118
102
|
export { type InterceptEntry, type InterceptResponse, type InterceptTrigger, anthropic, http, openai };
|