@yushaw/sanqian-ai-sdk 0.1.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.d.mts +1393 -0
- package/dist/index.d.ts +1393 -0
- package/dist/index.js +2117 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2065 -0
- package/dist/index.mjs.map +1 -0
- package/dist/testing.d.mts +363 -0
- package/dist/testing.d.ts +363 -0
- package/dist/testing.js +221 -0
- package/dist/testing.js.map +1 -0
- package/dist/testing.mjs +192 -0
- package/dist/testing.mjs.map +1 -0
- package/package.json +51 -0
package/dist/testing.js
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/testing/index.ts
|
|
21
|
+
var testing_exports = {};
|
|
22
|
+
__export(testing_exports, {
|
|
23
|
+
FakeEmbeddingProvider: () => FakeEmbeddingProvider,
|
|
24
|
+
FakeProvider: () => FakeProvider,
|
|
25
|
+
FakeRerankProvider: () => FakeRerankProvider
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(testing_exports);
|
|
28
|
+
|
|
29
|
+
// src/testing/fake-provider.ts
|
|
30
|
+
var DEFAULT_CAPABILITIES = {
|
|
31
|
+
streamingText: true,
|
|
32
|
+
reasoning: false,
|
|
33
|
+
toolCalling: true,
|
|
34
|
+
parallelToolCalls: false,
|
|
35
|
+
toolArgsStreaming: false,
|
|
36
|
+
abort: true,
|
|
37
|
+
hitl: false,
|
|
38
|
+
conversations: false,
|
|
39
|
+
sessionResources: false,
|
|
40
|
+
resourcePicker: false,
|
|
41
|
+
embeddings: false,
|
|
42
|
+
rerank: false
|
|
43
|
+
};
|
|
44
|
+
var FakeProvider = class {
|
|
45
|
+
id;
|
|
46
|
+
kind = "fake";
|
|
47
|
+
displayName;
|
|
48
|
+
capabilities;
|
|
49
|
+
scenarios;
|
|
50
|
+
defaultResponse;
|
|
51
|
+
readinessError;
|
|
52
|
+
disposed = false;
|
|
53
|
+
/** Track calls for assertions */
|
|
54
|
+
chatCalls = [];
|
|
55
|
+
chatStreamCalls = [];
|
|
56
|
+
cancelCalls = [];
|
|
57
|
+
permissionResponses = [];
|
|
58
|
+
constructor(config = {}) {
|
|
59
|
+
this.id = config.id ?? "fake-provider";
|
|
60
|
+
this.displayName = config.displayName ?? "Fake Provider";
|
|
61
|
+
this.capabilities = { ...DEFAULT_CAPABILITIES, ...config.capabilities };
|
|
62
|
+
this.scenarios = config.scenarios ?? [];
|
|
63
|
+
this.defaultResponse = config.defaultResponse ?? "Hello from fake provider";
|
|
64
|
+
this.readinessError = config.readinessError ?? null;
|
|
65
|
+
}
|
|
66
|
+
async ensureReady() {
|
|
67
|
+
if (this.readinessError) {
|
|
68
|
+
throw new Error(this.readinessError);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async dispose() {
|
|
72
|
+
this.disposed = true;
|
|
73
|
+
}
|
|
74
|
+
isDisposed() {
|
|
75
|
+
return this.disposed;
|
|
76
|
+
}
|
|
77
|
+
async chat(input) {
|
|
78
|
+
this.chatCalls.push(input);
|
|
79
|
+
const scenario = this.findScenario(input.agentId);
|
|
80
|
+
if (scenario?.error) {
|
|
81
|
+
throw new Error(scenario.error);
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
content: scenario?.response ?? this.defaultResponse,
|
|
85
|
+
conversationId: input.conversationId ?? void 0
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
async *chatStream(input) {
|
|
89
|
+
this.chatStreamCalls.push(input);
|
|
90
|
+
const scenario = this.findScenario(input.agentId);
|
|
91
|
+
if (scenario?.error) {
|
|
92
|
+
yield { type: "error", error: scenario.error };
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (scenario?.stream) {
|
|
96
|
+
yield { type: "start", runId: `run-${Date.now()}` };
|
|
97
|
+
for (const step of scenario.stream) {
|
|
98
|
+
if (input.signal?.aborted) {
|
|
99
|
+
yield { type: "cancelled" };
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (step.delay) {
|
|
103
|
+
await delay(step.delay);
|
|
104
|
+
}
|
|
105
|
+
if (input.signal?.aborted) {
|
|
106
|
+
yield { type: "cancelled" };
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
yield step.event;
|
|
110
|
+
}
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const text = scenario?.response ?? this.defaultResponse;
|
|
114
|
+
yield { type: "start", runId: `run-${Date.now()}` };
|
|
115
|
+
if (input.signal?.aborted) {
|
|
116
|
+
yield { type: "cancelled" };
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
yield { type: "text", content: text };
|
|
120
|
+
yield { type: "done", conversationId: input.conversationId ?? "" };
|
|
121
|
+
}
|
|
122
|
+
async cancel(runId) {
|
|
123
|
+
this.cancelCalls.push(runId);
|
|
124
|
+
}
|
|
125
|
+
async sendPermissionResponse(input) {
|
|
126
|
+
this.permissionResponses.push(input);
|
|
127
|
+
}
|
|
128
|
+
findScenario(agentId) {
|
|
129
|
+
return this.scenarios.find((s) => !s.agentId || s.agentId === agentId);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
function delay(ms) {
|
|
133
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// src/testing/fake-embedding.ts
|
|
137
|
+
var FakeEmbeddingProvider = class {
|
|
138
|
+
id;
|
|
139
|
+
model;
|
|
140
|
+
dimensions;
|
|
141
|
+
readinessError;
|
|
142
|
+
disposed = false;
|
|
143
|
+
embedCalls = [];
|
|
144
|
+
constructor(config = {}) {
|
|
145
|
+
this.id = config.id ?? "fake-embedding";
|
|
146
|
+
this.model = config.model ?? "fake-embed-model";
|
|
147
|
+
this.dimensions = config.dimensions ?? 128;
|
|
148
|
+
this.readinessError = config.readinessError ?? null;
|
|
149
|
+
}
|
|
150
|
+
async ensureReady() {
|
|
151
|
+
if (this.readinessError) throw new Error(this.readinessError);
|
|
152
|
+
}
|
|
153
|
+
async dispose() {
|
|
154
|
+
this.disposed = true;
|
|
155
|
+
}
|
|
156
|
+
isDisposed() {
|
|
157
|
+
return this.disposed;
|
|
158
|
+
}
|
|
159
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
160
|
+
async embedMany(texts, _opts) {
|
|
161
|
+
if (this.disposed) throw new Error("Provider disposed");
|
|
162
|
+
this.embedCalls.push(texts);
|
|
163
|
+
return texts.map((_, i) => this.deterministicVector(i));
|
|
164
|
+
}
|
|
165
|
+
async embed(text, options) {
|
|
166
|
+
const [result] = await this.embedMany([text], options);
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
async test() {
|
|
170
|
+
return { success: true, dimensions: this.dimensions };
|
|
171
|
+
}
|
|
172
|
+
deterministicVector(index) {
|
|
173
|
+
const vec = new Array(this.dimensions).fill(0);
|
|
174
|
+
for (let i = 0; i < this.dimensions; i++) {
|
|
175
|
+
vec[i] = Math.sin(index * 100 + i) * 0.5;
|
|
176
|
+
}
|
|
177
|
+
return vec;
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
var FakeRerankProvider = class {
|
|
181
|
+
id;
|
|
182
|
+
model;
|
|
183
|
+
readinessError;
|
|
184
|
+
disposed = false;
|
|
185
|
+
rerankCalls = [];
|
|
186
|
+
constructor(config = {}) {
|
|
187
|
+
this.id = config.id ?? "fake-rerank";
|
|
188
|
+
this.model = config.model ?? "fake-rerank-model";
|
|
189
|
+
this.readinessError = config.readinessError ?? null;
|
|
190
|
+
}
|
|
191
|
+
async ensureReady() {
|
|
192
|
+
if (this.readinessError) throw new Error(this.readinessError);
|
|
193
|
+
}
|
|
194
|
+
async dispose() {
|
|
195
|
+
this.disposed = true;
|
|
196
|
+
}
|
|
197
|
+
isDisposed() {
|
|
198
|
+
return this.disposed;
|
|
199
|
+
}
|
|
200
|
+
async rerank(input) {
|
|
201
|
+
if (this.disposed) throw new Error("Provider disposed");
|
|
202
|
+
this.rerankCalls.push(input);
|
|
203
|
+
const results = input.documents.map((doc, i) => ({
|
|
204
|
+
id: doc.id,
|
|
205
|
+
score: 1 - i * 0.1,
|
|
206
|
+
index: i
|
|
207
|
+
}));
|
|
208
|
+
const topN = input.topN ?? results.length;
|
|
209
|
+
return { results: results.slice(0, topN) };
|
|
210
|
+
}
|
|
211
|
+
async test() {
|
|
212
|
+
return { success: true };
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
216
|
+
0 && (module.exports = {
|
|
217
|
+
FakeEmbeddingProvider,
|
|
218
|
+
FakeProvider,
|
|
219
|
+
FakeRerankProvider
|
|
220
|
+
});
|
|
221
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/testing/index.ts","../src/testing/fake-provider.ts","../src/testing/fake-embedding.ts"],"sourcesContent":["export { FakeProvider } from './fake-provider'\nexport type { FakeProviderConfig, FakeScenario, FakeStreamStep } from './fake-provider'\nexport { FakeEmbeddingProvider, FakeRerankProvider } from './fake-embedding'\nexport type { FakeEmbeddingConfig, FakeRerankConfig } from './fake-embedding'\n","/**\n * Fake Provider - deterministic provider for testing runtime contracts.\n *\n * Supports scripted responses, tool calls, cancellation, and error scenarios.\n */\n\nimport type {\n RuntimeProvider,\n RuntimeProviderCapabilities,\n RuntimeChatRequest,\n RuntimeChatResponse,\n RuntimeChatStreamRequest,\n RuntimePermissionResponse,\n RuntimeStreamEvent,\n RuntimeProviderKind,\n} from '../contracts'\n\nexport interface FakeStreamStep {\n delay?: number\n event: RuntimeStreamEvent\n}\n\nexport interface FakeScenario {\n /** Match by agentId (undefined = match all) */\n agentId?: string\n /** Non-streaming response */\n response?: string\n /** Streaming steps */\n stream?: FakeStreamStep[]\n /** Throw error on call */\n error?: string\n}\n\nexport interface FakeProviderConfig {\n id?: string\n displayName?: string\n capabilities?: Partial<RuntimeProviderCapabilities>\n scenarios?: FakeScenario[]\n /** Default stream for unmatched calls */\n defaultResponse?: string\n /** Whether ensureReady() should fail */\n readinessError?: string\n}\n\nconst DEFAULT_CAPABILITIES: RuntimeProviderCapabilities = {\n streamingText: true,\n reasoning: false,\n toolCalling: true,\n parallelToolCalls: false,\n toolArgsStreaming: false,\n abort: true,\n hitl: false,\n conversations: false,\n sessionResources: false,\n resourcePicker: false,\n embeddings: false,\n rerank: false,\n}\n\nexport class FakeProvider implements RuntimeProvider {\n readonly id: string\n readonly kind: RuntimeProviderKind = 'fake'\n readonly displayName: string\n readonly capabilities: RuntimeProviderCapabilities\n\n private scenarios: FakeScenario[]\n private defaultResponse: string\n private readinessError: string | null\n private disposed = false\n\n /** Track calls for assertions */\n readonly chatCalls: RuntimeChatRequest[] = []\n readonly chatStreamCalls: RuntimeChatStreamRequest[] = []\n readonly cancelCalls: string[] = []\n readonly permissionResponses: RuntimePermissionResponse[] = []\n\n constructor(config: FakeProviderConfig = {}) {\n this.id = config.id ?? 'fake-provider'\n this.displayName = config.displayName ?? 'Fake Provider'\n this.capabilities = { ...DEFAULT_CAPABILITIES, ...config.capabilities }\n this.scenarios = config.scenarios ?? []\n this.defaultResponse = config.defaultResponse ?? 'Hello from fake provider'\n this.readinessError = config.readinessError ?? null\n }\n\n async ensureReady(): Promise<void> {\n if (this.readinessError) {\n throw new Error(this.readinessError)\n }\n }\n\n async dispose(): Promise<void> {\n this.disposed = true\n }\n\n isDisposed(): boolean {\n return this.disposed\n }\n\n async chat(input: RuntimeChatRequest): Promise<RuntimeChatResponse> {\n this.chatCalls.push(input)\n\n const scenario = this.findScenario(input.agentId)\n if (scenario?.error) {\n throw new Error(scenario.error)\n }\n\n return {\n content: scenario?.response ?? this.defaultResponse,\n conversationId: input.conversationId ?? undefined,\n }\n }\n\n async *chatStream(input: RuntimeChatStreamRequest): AsyncIterable<RuntimeStreamEvent> {\n this.chatStreamCalls.push(input)\n\n const scenario = this.findScenario(input.agentId)\n if (scenario?.error) {\n yield { type: 'error', error: scenario.error }\n return\n }\n\n if (scenario?.stream) {\n yield { type: 'start', runId: `run-${Date.now()}` }\n\n for (const step of scenario.stream) {\n if (input.signal?.aborted) {\n yield { type: 'cancelled' }\n return\n }\n\n if (step.delay) {\n await delay(step.delay)\n }\n\n if (input.signal?.aborted) {\n yield { type: 'cancelled' }\n return\n }\n\n yield step.event\n }\n return\n }\n\n // Default: simple text stream\n const text = scenario?.response ?? this.defaultResponse\n yield { type: 'start', runId: `run-${Date.now()}` }\n\n if (input.signal?.aborted) {\n yield { type: 'cancelled' }\n return\n }\n\n yield { type: 'text', content: text }\n yield { type: 'done', conversationId: input.conversationId ?? '' }\n }\n\n async cancel(runId: string): Promise<void> {\n this.cancelCalls.push(runId)\n }\n\n async sendPermissionResponse(input: RuntimePermissionResponse): Promise<void> {\n this.permissionResponses.push(input)\n }\n\n private findScenario(agentId: string): FakeScenario | undefined {\n return this.scenarios.find(s => !s.agentId || s.agentId === agentId)\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n","/**\n * Fake Embedding/Rerank providers for testing.\n */\n\nimport type {\n EmbeddingProvider,\n RerankProvider,\n RerankInput,\n RerankResult,\n} from '../contracts'\n\nexport interface FakeEmbeddingConfig {\n id?: string\n model?: string\n dimensions?: number\n readinessError?: string\n}\n\nexport class FakeEmbeddingProvider implements EmbeddingProvider {\n readonly id: string\n readonly model: string\n readonly dimensions: number\n\n private readinessError: string | null\n private disposed = false\n readonly embedCalls: string[][] = []\n\n constructor(config: FakeEmbeddingConfig = {}) {\n this.id = config.id ?? 'fake-embedding'\n this.model = config.model ?? 'fake-embed-model'\n this.dimensions = config.dimensions ?? 128\n this.readinessError = config.readinessError ?? null\n }\n\n async ensureReady(): Promise<void> {\n if (this.readinessError) throw new Error(this.readinessError)\n }\n\n async dispose(): Promise<void> {\n this.disposed = true\n }\n\n isDisposed(): boolean {\n return this.disposed\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async embedMany(texts: string[], _opts?: { signal?: AbortSignal }): Promise<number[][]> {\n if (this.disposed) throw new Error('Provider disposed')\n this.embedCalls.push(texts)\n return texts.map((_, i) => this.deterministicVector(i))\n }\n\n async embed(text: string, options?: { signal?: AbortSignal }): Promise<number[]> {\n const [result] = await this.embedMany([text], options)\n return result\n }\n\n async test(): Promise<{ success: boolean; dimensions?: number; error?: string }> {\n return { success: true, dimensions: this.dimensions }\n }\n\n private deterministicVector(index: number): number[] {\n const vec = new Array(this.dimensions).fill(0)\n for (let i = 0; i < this.dimensions; i++) {\n vec[i] = Math.sin(index * 100 + i) * 0.5\n }\n return vec\n }\n}\n\nexport interface FakeRerankConfig {\n id?: string\n model?: string\n readinessError?: string\n}\n\nexport class FakeRerankProvider implements RerankProvider {\n readonly id: string\n readonly model: string\n\n private readinessError: string | null\n private disposed = false\n readonly rerankCalls: RerankInput[] = []\n\n constructor(config: FakeRerankConfig = {}) {\n this.id = config.id ?? 'fake-rerank'\n this.model = config.model ?? 'fake-rerank-model'\n this.readinessError = config.readinessError ?? null\n }\n\n async ensureReady(): Promise<void> {\n if (this.readinessError) throw new Error(this.readinessError)\n }\n\n async dispose(): Promise<void> {\n this.disposed = true\n }\n\n isDisposed(): boolean {\n return this.disposed\n }\n\n async rerank(input: RerankInput): Promise<RerankResult> {\n if (this.disposed) throw new Error('Provider disposed')\n this.rerankCalls.push(input)\n\n // Reverse order as fake reranking\n const results = input.documents.map((doc, i) => ({\n id: doc.id,\n score: 1 - i * 0.1,\n index: i,\n }))\n const topN = input.topN ?? results.length\n return { results: results.slice(0, topN) }\n }\n\n async test(): Promise<{ success: boolean; error?: string }> {\n return { success: true }\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/testing.mjs
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
// src/testing/fake-provider.ts
|
|
2
|
+
var DEFAULT_CAPABILITIES = {
|
|
3
|
+
streamingText: true,
|
|
4
|
+
reasoning: false,
|
|
5
|
+
toolCalling: true,
|
|
6
|
+
parallelToolCalls: false,
|
|
7
|
+
toolArgsStreaming: false,
|
|
8
|
+
abort: true,
|
|
9
|
+
hitl: false,
|
|
10
|
+
conversations: false,
|
|
11
|
+
sessionResources: false,
|
|
12
|
+
resourcePicker: false,
|
|
13
|
+
embeddings: false,
|
|
14
|
+
rerank: false
|
|
15
|
+
};
|
|
16
|
+
var FakeProvider = class {
|
|
17
|
+
id;
|
|
18
|
+
kind = "fake";
|
|
19
|
+
displayName;
|
|
20
|
+
capabilities;
|
|
21
|
+
scenarios;
|
|
22
|
+
defaultResponse;
|
|
23
|
+
readinessError;
|
|
24
|
+
disposed = false;
|
|
25
|
+
/** Track calls for assertions */
|
|
26
|
+
chatCalls = [];
|
|
27
|
+
chatStreamCalls = [];
|
|
28
|
+
cancelCalls = [];
|
|
29
|
+
permissionResponses = [];
|
|
30
|
+
constructor(config = {}) {
|
|
31
|
+
this.id = config.id ?? "fake-provider";
|
|
32
|
+
this.displayName = config.displayName ?? "Fake Provider";
|
|
33
|
+
this.capabilities = { ...DEFAULT_CAPABILITIES, ...config.capabilities };
|
|
34
|
+
this.scenarios = config.scenarios ?? [];
|
|
35
|
+
this.defaultResponse = config.defaultResponse ?? "Hello from fake provider";
|
|
36
|
+
this.readinessError = config.readinessError ?? null;
|
|
37
|
+
}
|
|
38
|
+
async ensureReady() {
|
|
39
|
+
if (this.readinessError) {
|
|
40
|
+
throw new Error(this.readinessError);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async dispose() {
|
|
44
|
+
this.disposed = true;
|
|
45
|
+
}
|
|
46
|
+
isDisposed() {
|
|
47
|
+
return this.disposed;
|
|
48
|
+
}
|
|
49
|
+
async chat(input) {
|
|
50
|
+
this.chatCalls.push(input);
|
|
51
|
+
const scenario = this.findScenario(input.agentId);
|
|
52
|
+
if (scenario?.error) {
|
|
53
|
+
throw new Error(scenario.error);
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
content: scenario?.response ?? this.defaultResponse,
|
|
57
|
+
conversationId: input.conversationId ?? void 0
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async *chatStream(input) {
|
|
61
|
+
this.chatStreamCalls.push(input);
|
|
62
|
+
const scenario = this.findScenario(input.agentId);
|
|
63
|
+
if (scenario?.error) {
|
|
64
|
+
yield { type: "error", error: scenario.error };
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (scenario?.stream) {
|
|
68
|
+
yield { type: "start", runId: `run-${Date.now()}` };
|
|
69
|
+
for (const step of scenario.stream) {
|
|
70
|
+
if (input.signal?.aborted) {
|
|
71
|
+
yield { type: "cancelled" };
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (step.delay) {
|
|
75
|
+
await delay(step.delay);
|
|
76
|
+
}
|
|
77
|
+
if (input.signal?.aborted) {
|
|
78
|
+
yield { type: "cancelled" };
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
yield step.event;
|
|
82
|
+
}
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const text = scenario?.response ?? this.defaultResponse;
|
|
86
|
+
yield { type: "start", runId: `run-${Date.now()}` };
|
|
87
|
+
if (input.signal?.aborted) {
|
|
88
|
+
yield { type: "cancelled" };
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
yield { type: "text", content: text };
|
|
92
|
+
yield { type: "done", conversationId: input.conversationId ?? "" };
|
|
93
|
+
}
|
|
94
|
+
async cancel(runId) {
|
|
95
|
+
this.cancelCalls.push(runId);
|
|
96
|
+
}
|
|
97
|
+
async sendPermissionResponse(input) {
|
|
98
|
+
this.permissionResponses.push(input);
|
|
99
|
+
}
|
|
100
|
+
findScenario(agentId) {
|
|
101
|
+
return this.scenarios.find((s) => !s.agentId || s.agentId === agentId);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
function delay(ms) {
|
|
105
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// src/testing/fake-embedding.ts
|
|
109
|
+
var FakeEmbeddingProvider = class {
|
|
110
|
+
id;
|
|
111
|
+
model;
|
|
112
|
+
dimensions;
|
|
113
|
+
readinessError;
|
|
114
|
+
disposed = false;
|
|
115
|
+
embedCalls = [];
|
|
116
|
+
constructor(config = {}) {
|
|
117
|
+
this.id = config.id ?? "fake-embedding";
|
|
118
|
+
this.model = config.model ?? "fake-embed-model";
|
|
119
|
+
this.dimensions = config.dimensions ?? 128;
|
|
120
|
+
this.readinessError = config.readinessError ?? null;
|
|
121
|
+
}
|
|
122
|
+
async ensureReady() {
|
|
123
|
+
if (this.readinessError) throw new Error(this.readinessError);
|
|
124
|
+
}
|
|
125
|
+
async dispose() {
|
|
126
|
+
this.disposed = true;
|
|
127
|
+
}
|
|
128
|
+
isDisposed() {
|
|
129
|
+
return this.disposed;
|
|
130
|
+
}
|
|
131
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
132
|
+
async embedMany(texts, _opts) {
|
|
133
|
+
if (this.disposed) throw new Error("Provider disposed");
|
|
134
|
+
this.embedCalls.push(texts);
|
|
135
|
+
return texts.map((_, i) => this.deterministicVector(i));
|
|
136
|
+
}
|
|
137
|
+
async embed(text, options) {
|
|
138
|
+
const [result] = await this.embedMany([text], options);
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
async test() {
|
|
142
|
+
return { success: true, dimensions: this.dimensions };
|
|
143
|
+
}
|
|
144
|
+
deterministicVector(index) {
|
|
145
|
+
const vec = new Array(this.dimensions).fill(0);
|
|
146
|
+
for (let i = 0; i < this.dimensions; i++) {
|
|
147
|
+
vec[i] = Math.sin(index * 100 + i) * 0.5;
|
|
148
|
+
}
|
|
149
|
+
return vec;
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
var FakeRerankProvider = class {
|
|
153
|
+
id;
|
|
154
|
+
model;
|
|
155
|
+
readinessError;
|
|
156
|
+
disposed = false;
|
|
157
|
+
rerankCalls = [];
|
|
158
|
+
constructor(config = {}) {
|
|
159
|
+
this.id = config.id ?? "fake-rerank";
|
|
160
|
+
this.model = config.model ?? "fake-rerank-model";
|
|
161
|
+
this.readinessError = config.readinessError ?? null;
|
|
162
|
+
}
|
|
163
|
+
async ensureReady() {
|
|
164
|
+
if (this.readinessError) throw new Error(this.readinessError);
|
|
165
|
+
}
|
|
166
|
+
async dispose() {
|
|
167
|
+
this.disposed = true;
|
|
168
|
+
}
|
|
169
|
+
isDisposed() {
|
|
170
|
+
return this.disposed;
|
|
171
|
+
}
|
|
172
|
+
async rerank(input) {
|
|
173
|
+
if (this.disposed) throw new Error("Provider disposed");
|
|
174
|
+
this.rerankCalls.push(input);
|
|
175
|
+
const results = input.documents.map((doc, i) => ({
|
|
176
|
+
id: doc.id,
|
|
177
|
+
score: 1 - i * 0.1,
|
|
178
|
+
index: i
|
|
179
|
+
}));
|
|
180
|
+
const topN = input.topN ?? results.length;
|
|
181
|
+
return { results: results.slice(0, topN) };
|
|
182
|
+
}
|
|
183
|
+
async test() {
|
|
184
|
+
return { success: true };
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
export {
|
|
188
|
+
FakeEmbeddingProvider,
|
|
189
|
+
FakeProvider,
|
|
190
|
+
FakeRerankProvider
|
|
191
|
+
};
|
|
192
|
+
//# sourceMappingURL=testing.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/testing/fake-provider.ts","../src/testing/fake-embedding.ts"],"sourcesContent":["/**\n * Fake Provider - deterministic provider for testing runtime contracts.\n *\n * Supports scripted responses, tool calls, cancellation, and error scenarios.\n */\n\nimport type {\n RuntimeProvider,\n RuntimeProviderCapabilities,\n RuntimeChatRequest,\n RuntimeChatResponse,\n RuntimeChatStreamRequest,\n RuntimePermissionResponse,\n RuntimeStreamEvent,\n RuntimeProviderKind,\n} from '../contracts'\n\nexport interface FakeStreamStep {\n delay?: number\n event: RuntimeStreamEvent\n}\n\nexport interface FakeScenario {\n /** Match by agentId (undefined = match all) */\n agentId?: string\n /** Non-streaming response */\n response?: string\n /** Streaming steps */\n stream?: FakeStreamStep[]\n /** Throw error on call */\n error?: string\n}\n\nexport interface FakeProviderConfig {\n id?: string\n displayName?: string\n capabilities?: Partial<RuntimeProviderCapabilities>\n scenarios?: FakeScenario[]\n /** Default stream for unmatched calls */\n defaultResponse?: string\n /** Whether ensureReady() should fail */\n readinessError?: string\n}\n\nconst DEFAULT_CAPABILITIES: RuntimeProviderCapabilities = {\n streamingText: true,\n reasoning: false,\n toolCalling: true,\n parallelToolCalls: false,\n toolArgsStreaming: false,\n abort: true,\n hitl: false,\n conversations: false,\n sessionResources: false,\n resourcePicker: false,\n embeddings: false,\n rerank: false,\n}\n\nexport class FakeProvider implements RuntimeProvider {\n readonly id: string\n readonly kind: RuntimeProviderKind = 'fake'\n readonly displayName: string\n readonly capabilities: RuntimeProviderCapabilities\n\n private scenarios: FakeScenario[]\n private defaultResponse: string\n private readinessError: string | null\n private disposed = false\n\n /** Track calls for assertions */\n readonly chatCalls: RuntimeChatRequest[] = []\n readonly chatStreamCalls: RuntimeChatStreamRequest[] = []\n readonly cancelCalls: string[] = []\n readonly permissionResponses: RuntimePermissionResponse[] = []\n\n constructor(config: FakeProviderConfig = {}) {\n this.id = config.id ?? 'fake-provider'\n this.displayName = config.displayName ?? 'Fake Provider'\n this.capabilities = { ...DEFAULT_CAPABILITIES, ...config.capabilities }\n this.scenarios = config.scenarios ?? []\n this.defaultResponse = config.defaultResponse ?? 'Hello from fake provider'\n this.readinessError = config.readinessError ?? null\n }\n\n async ensureReady(): Promise<void> {\n if (this.readinessError) {\n throw new Error(this.readinessError)\n }\n }\n\n async dispose(): Promise<void> {\n this.disposed = true\n }\n\n isDisposed(): boolean {\n return this.disposed\n }\n\n async chat(input: RuntimeChatRequest): Promise<RuntimeChatResponse> {\n this.chatCalls.push(input)\n\n const scenario = this.findScenario(input.agentId)\n if (scenario?.error) {\n throw new Error(scenario.error)\n }\n\n return {\n content: scenario?.response ?? this.defaultResponse,\n conversationId: input.conversationId ?? undefined,\n }\n }\n\n async *chatStream(input: RuntimeChatStreamRequest): AsyncIterable<RuntimeStreamEvent> {\n this.chatStreamCalls.push(input)\n\n const scenario = this.findScenario(input.agentId)\n if (scenario?.error) {\n yield { type: 'error', error: scenario.error }\n return\n }\n\n if (scenario?.stream) {\n yield { type: 'start', runId: `run-${Date.now()}` }\n\n for (const step of scenario.stream) {\n if (input.signal?.aborted) {\n yield { type: 'cancelled' }\n return\n }\n\n if (step.delay) {\n await delay(step.delay)\n }\n\n if (input.signal?.aborted) {\n yield { type: 'cancelled' }\n return\n }\n\n yield step.event\n }\n return\n }\n\n // Default: simple text stream\n const text = scenario?.response ?? this.defaultResponse\n yield { type: 'start', runId: `run-${Date.now()}` }\n\n if (input.signal?.aborted) {\n yield { type: 'cancelled' }\n return\n }\n\n yield { type: 'text', content: text }\n yield { type: 'done', conversationId: input.conversationId ?? '' }\n }\n\n async cancel(runId: string): Promise<void> {\n this.cancelCalls.push(runId)\n }\n\n async sendPermissionResponse(input: RuntimePermissionResponse): Promise<void> {\n this.permissionResponses.push(input)\n }\n\n private findScenario(agentId: string): FakeScenario | undefined {\n return this.scenarios.find(s => !s.agentId || s.agentId === agentId)\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n","/**\n * Fake Embedding/Rerank providers for testing.\n */\n\nimport type {\n EmbeddingProvider,\n RerankProvider,\n RerankInput,\n RerankResult,\n} from '../contracts'\n\nexport interface FakeEmbeddingConfig {\n id?: string\n model?: string\n dimensions?: number\n readinessError?: string\n}\n\nexport class FakeEmbeddingProvider implements EmbeddingProvider {\n readonly id: string\n readonly model: string\n readonly dimensions: number\n\n private readinessError: string | null\n private disposed = false\n readonly embedCalls: string[][] = []\n\n constructor(config: FakeEmbeddingConfig = {}) {\n this.id = config.id ?? 'fake-embedding'\n this.model = config.model ?? 'fake-embed-model'\n this.dimensions = config.dimensions ?? 128\n this.readinessError = config.readinessError ?? null\n }\n\n async ensureReady(): Promise<void> {\n if (this.readinessError) throw new Error(this.readinessError)\n }\n\n async dispose(): Promise<void> {\n this.disposed = true\n }\n\n isDisposed(): boolean {\n return this.disposed\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async embedMany(texts: string[], _opts?: { signal?: AbortSignal }): Promise<number[][]> {\n if (this.disposed) throw new Error('Provider disposed')\n this.embedCalls.push(texts)\n return texts.map((_, i) => this.deterministicVector(i))\n }\n\n async embed(text: string, options?: { signal?: AbortSignal }): Promise<number[]> {\n const [result] = await this.embedMany([text], options)\n return result\n }\n\n async test(): Promise<{ success: boolean; dimensions?: number; error?: string }> {\n return { success: true, dimensions: this.dimensions }\n }\n\n private deterministicVector(index: number): number[] {\n const vec = new Array(this.dimensions).fill(0)\n for (let i = 0; i < this.dimensions; i++) {\n vec[i] = Math.sin(index * 100 + i) * 0.5\n }\n return vec\n }\n}\n\nexport interface FakeRerankConfig {\n id?: string\n model?: string\n readinessError?: string\n}\n\nexport class FakeRerankProvider implements RerankProvider {\n readonly id: string\n readonly model: string\n\n private readinessError: string | null\n private disposed = false\n readonly rerankCalls: RerankInput[] = []\n\n constructor(config: FakeRerankConfig = {}) {\n this.id = config.id ?? 'fake-rerank'\n this.model = config.model ?? 'fake-rerank-model'\n this.readinessError = config.readinessError ?? null\n }\n\n async ensureReady(): Promise<void> {\n if (this.readinessError) throw new Error(this.readinessError)\n }\n\n async dispose(): Promise<void> {\n this.disposed = true\n }\n\n isDisposed(): boolean {\n return this.disposed\n }\n\n async rerank(input: RerankInput): Promise<RerankResult> {\n if (this.disposed) throw new Error('Provider disposed')\n this.rerankCalls.push(input)\n\n // Reverse order as fake reranking\n const results = input.documents.map((doc, i) => ({\n id: doc.id,\n score: 1 - i * 0.1,\n index: i,\n }))\n const topN = input.topN ?? results.length\n return { results: results.slice(0, topN) }\n }\n\n async test(): Promise<{ success: boolean; error?: string }> {\n return { success: true }\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@yushaw/sanqian-ai-sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Sanqian AI SDK - provider-neutral AI runtime for all products",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./testing": {
|
|
15
|
+
"types": "./dist/testing.d.ts",
|
|
16
|
+
"import": "./dist/testing.mjs",
|
|
17
|
+
"require": "./dist/testing.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsup",
|
|
22
|
+
"prepare": "npm run build",
|
|
23
|
+
"dev": "tsup --watch",
|
|
24
|
+
"typecheck": "tsc --noEmit",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"test:watch": "vitest"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@ai-sdk/openai-compatible": "^2.0.47",
|
|
30
|
+
"ai": "^6.0.183",
|
|
31
|
+
"zod": "3.25.76"
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"@yushaw/sanqian-sdk": ">=0.3.0"
|
|
35
|
+
},
|
|
36
|
+
"peerDependenciesMeta": {
|
|
37
|
+
"@yushaw/sanqian-sdk": {
|
|
38
|
+
"optional": true
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "^22.9.0",
|
|
43
|
+
"@yushaw/sanqian-sdk": "^0.3.29",
|
|
44
|
+
"tsup": "^8.3.5",
|
|
45
|
+
"typescript": "^5.6.3",
|
|
46
|
+
"vitest": "^2.1.5"
|
|
47
|
+
},
|
|
48
|
+
"files": [
|
|
49
|
+
"dist"
|
|
50
|
+
]
|
|
51
|
+
}
|