beth-copilot 1.0.18 → 1.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/CHANGELOG.md +41 -28
- package/README.md +87 -247
- package/bin/cli.js +158 -358
- package/dist/__tests__/smoke.test.d.ts +8 -0
- package/dist/__tests__/smoke.test.d.ts.map +1 -0
- package/dist/__tests__/smoke.test.js +49 -0
- package/dist/__tests__/smoke.test.js.map +1 -0
- package/dist/cli/commands/beads.e2e.test.d.ts +13 -0
- package/dist/cli/commands/beads.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/beads.e2e.test.js +526 -0
- package/dist/cli/commands/beads.e2e.test.js.map +1 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts +32 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.js +162 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.js.map +1 -0
- package/dist/cli/commands/close.d.ts +89 -0
- package/dist/cli/commands/close.d.ts.map +1 -0
- package/dist/cli/commands/close.e2e.test.d.ts +27 -0
- package/dist/cli/commands/close.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/close.e2e.test.js +252 -0
- package/dist/cli/commands/close.e2e.test.js.map +1 -0
- package/dist/cli/commands/close.js +309 -0
- package/dist/cli/commands/close.js.map +1 -0
- package/dist/cli/commands/close.test.d.ts +15 -0
- package/dist/cli/commands/close.test.d.ts.map +1 -0
- package/dist/cli/commands/close.test.js +634 -0
- package/dist/cli/commands/close.test.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +23 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +93 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/doctor.test.js +209 -0
- package/dist/cli/commands/doctor.test.js.map +1 -1
- package/dist/cli/commands/framework-isolation.test.d.ts +30 -0
- package/dist/cli/commands/framework-isolation.test.d.ts.map +1 -0
- package/dist/cli/commands/framework-isolation.test.js +119 -0
- package/dist/cli/commands/framework-isolation.test.js.map +1 -0
- package/dist/cli/commands/help.e2e.test.js +4 -4
- package/dist/cli/commands/help.e2e.test.js.map +1 -1
- package/dist/cli/commands/init-logic.e2e.test.d.ts +37 -0
- package/dist/cli/commands/init-logic.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/init-logic.e2e.test.js +305 -0
- package/dist/cli/commands/init-logic.e2e.test.js.map +1 -0
- package/dist/cli/commands/land.d.ts +142 -0
- package/dist/cli/commands/land.d.ts.map +1 -0
- package/dist/cli/commands/land.js +647 -0
- package/dist/cli/commands/land.js.map +1 -0
- package/dist/cli/commands/land.test.d.ts +20 -0
- package/dist/cli/commands/land.test.d.ts.map +1 -0
- package/dist/cli/commands/land.test.js +622 -0
- package/dist/cli/commands/land.test.js.map +1 -0
- package/dist/cli/commands/mcp.e2e.test.js +22 -29
- package/dist/cli/commands/mcp.e2e.test.js.map +1 -1
- package/dist/cli/commands/pipeline.e2e.test.js +20 -20
- package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
- package/dist/cli/commands/pre-push-guard.d.ts +84 -0
- package/dist/cli/commands/pre-push-guard.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.d.ts +24 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.js +171 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -0
- package/dist/cli/commands/pre-push-guard.js +257 -0
- package/dist/cli/commands/pre-push-guard.js.map +1 -0
- package/dist/cli/commands/pre-push-guard.test.d.ts +15 -0
- package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.test.js +397 -0
- package/dist/cli/commands/pre-push-guard.test.js.map +1 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +23 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.js +179 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -0
- package/dist/cli/commands/quickstart.d.ts.map +1 -1
- package/dist/cli/commands/quickstart.js +7 -23
- package/dist/cli/commands/quickstart.js.map +1 -1
- package/dist/cli/commands/quickstart.test.js +40 -67
- package/dist/cli/commands/quickstart.test.js.map +1 -1
- package/dist/core/agents/suite.test.js +4 -2
- package/dist/core/agents/suite.test.js.map +1 -1
- package/dist/core/agents/tools.test.js +5 -1
- package/dist/core/agents/tools.test.js.map +1 -1
- package/dist/index.d.ts +3 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -10
- package/dist/index.js.map +1 -1
- package/package.json +15 -9
- package/sbom.json +2011 -819
- package/templates/.github/agents/beth.agent.md +220 -66
- package/templates/.github/agents/developer.agent.md +53 -90
- package/templates/.github/agents/product-manager.agent.md +15 -68
- package/templates/.github/agents/researcher.agent.md +20 -71
- package/templates/.github/agents/security-reviewer.agent.md +29 -81
- package/templates/.github/agents/tester.agent.md +40 -69
- package/templates/.github/agents/ux-designer.agent.md +20 -74
- package/templates/.github/copilot-instructions.md +217 -225
- package/templates/AGENTS.md +108 -20
- package/templates/mcp.json.example +0 -3
- package/dist/cli/commands/client-config.d.ts +0 -31
- package/dist/cli/commands/client-config.d.ts.map +0 -1
- package/dist/cli/commands/client-config.e2e.test.d.ts +0 -15
- package/dist/cli/commands/client-config.e2e.test.d.ts.map +0 -1
- package/dist/cli/commands/client-config.e2e.test.js +0 -556
- package/dist/cli/commands/client-config.e2e.test.js.map +0 -1
- package/dist/cli/commands/client-config.js +0 -73
- package/dist/cli/commands/client-config.js.map +0 -1
- package/dist/cli/commands/client-config.test.d.ts +0 -6
- package/dist/cli/commands/client-config.test.d.ts.map +0 -1
- package/dist/cli/commands/client-config.test.js +0 -133
- package/dist/cli/commands/client-config.test.js.map +0 -1
- package/dist/cli/commands/init-quickstart.e2e.test.d.ts +0 -11
- package/dist/cli/commands/init-quickstart.e2e.test.d.ts.map +0 -1
- package/dist/cli/commands/init-quickstart.e2e.test.js +0 -221
- package/dist/cli/commands/init-quickstart.e2e.test.js.map +0 -1
- package/dist/core/context.d.ts +0 -171
- package/dist/core/context.d.ts.map +0 -1
- package/dist/core/context.js +0 -353
- package/dist/core/context.js.map +0 -1
- package/dist/core/context.test.d.ts +0 -8
- package/dist/core/context.test.d.ts.map +0 -1
- package/dist/core/context.test.js +0 -253
- package/dist/core/context.test.js.map +0 -1
- package/dist/core/handoffs.d.ts +0 -151
- package/dist/core/handoffs.d.ts.map +0 -1
- package/dist/core/handoffs.js +0 -220
- package/dist/core/handoffs.js.map +0 -1
- package/dist/core/handoffs.test.d.ts +0 -8
- package/dist/core/handoffs.test.d.ts.map +0 -1
- package/dist/core/handoffs.test.js +0 -231
- package/dist/core/handoffs.test.js.map +0 -1
- package/dist/core/orchestrator.d.ts +0 -246
- package/dist/core/orchestrator.d.ts.map +0 -1
- package/dist/core/orchestrator.js +0 -514
- package/dist/core/orchestrator.js.map +0 -1
- package/dist/core/orchestrator.test.d.ts +0 -8
- package/dist/core/orchestrator.test.d.ts.map +0 -1
- package/dist/core/orchestrator.test.js +0 -517
- package/dist/core/orchestrator.test.js.map +0 -1
- package/dist/core/router.d.ts +0 -102
- package/dist/core/router.d.ts.map +0 -1
- package/dist/core/router.js +0 -178
- package/dist/core/router.js.map +0 -1
- package/dist/core/router.test.d.ts +0 -8
- package/dist/core/router.test.d.ts.map +0 -1
- package/dist/core/router.test.js +0 -215
- package/dist/core/router.test.js.map +0 -1
- package/dist/init.test.js +0 -288
- package/dist/providers/azure.d.ts +0 -147
- package/dist/providers/azure.d.ts.map +0 -1
- package/dist/providers/azure.js +0 -491
- package/dist/providers/azure.js.map +0 -1
- package/dist/providers/azure.test.d.ts +0 -11
- package/dist/providers/azure.test.d.ts.map +0 -1
- package/dist/providers/azure.test.js +0 -330
- package/dist/providers/azure.test.js.map +0 -1
- package/dist/providers/config.d.ts +0 -87
- package/dist/providers/config.d.ts.map +0 -1
- package/dist/providers/config.js +0 -193
- package/dist/providers/config.js.map +0 -1
- package/dist/providers/config.test.d.ts +0 -7
- package/dist/providers/config.test.d.ts.map +0 -1
- package/dist/providers/config.test.js +0 -370
- package/dist/providers/config.test.js.map +0 -1
- package/dist/providers/index.d.ts +0 -18
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -14
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/interface.d.ts +0 -191
- package/dist/providers/interface.d.ts.map +0 -1
- package/dist/providers/interface.js +0 -94
- package/dist/providers/interface.js.map +0 -1
- package/dist/providers/retry.d.ts +0 -128
- package/dist/providers/retry.d.ts.map +0 -1
- package/dist/providers/retry.js +0 -205
- package/dist/providers/retry.js.map +0 -1
- package/dist/providers/retry.test.d.ts +0 -7
- package/dist/providers/retry.test.d.ts.map +0 -1
- package/dist/providers/retry.test.js +0 -439
- package/dist/providers/retry.test.js.map +0 -1
- package/dist/providers/streaming.d.ts +0 -157
- package/dist/providers/streaming.d.ts.map +0 -1
- package/dist/providers/streaming.js +0 -233
- package/dist/providers/streaming.js.map +0 -1
- package/dist/providers/streaming.test.d.ts +0 -7
- package/dist/providers/streaming.test.d.ts.map +0 -1
- package/dist/providers/streaming.test.js +0 -372
- package/dist/providers/streaming.test.js.map +0 -1
- package/dist/providers/types.d.ts +0 -209
- package/dist/providers/types.d.ts.map +0 -1
- package/dist/providers/types.js +0 -53
- package/dist/providers/types.js.map +0 -1
- package/dist/providers/types.test.d.ts +0 -7
- package/dist/providers/types.test.d.ts.map +0 -1
- package/dist/providers/types.test.js +0 -141
- package/dist/providers/types.test.js.map +0 -1
- package/dist/tools/cli/beads.d.ts +0 -27
- package/dist/tools/cli/beads.d.ts.map +0 -1
- package/dist/tools/cli/beads.js +0 -172
- package/dist/tools/cli/beads.js.map +0 -1
- package/dist/tools/cli/beads.test.d.ts +0 -8
- package/dist/tools/cli/beads.test.d.ts.map +0 -1
- package/dist/tools/cli/beads.test.js +0 -264
- package/dist/tools/cli/beads.test.js.map +0 -1
- package/dist/tools/cli/editFile.d.ts +0 -17
- package/dist/tools/cli/editFile.d.ts.map +0 -1
- package/dist/tools/cli/editFile.js +0 -125
- package/dist/tools/cli/editFile.js.map +0 -1
- package/dist/tools/cli/editFile.test.d.ts +0 -8
- package/dist/tools/cli/editFile.test.d.ts.map +0 -1
- package/dist/tools/cli/editFile.test.js +0 -177
- package/dist/tools/cli/editFile.test.js.map +0 -1
- package/dist/tools/cli/readFile.d.ts +0 -25
- package/dist/tools/cli/readFile.d.ts.map +0 -1
- package/dist/tools/cli/readFile.js +0 -118
- package/dist/tools/cli/readFile.js.map +0 -1
- package/dist/tools/cli/readFile.test.d.ts +0 -8
- package/dist/tools/cli/readFile.test.d.ts.map +0 -1
- package/dist/tools/cli/readFile.test.js +0 -194
- package/dist/tools/cli/readFile.test.js.map +0 -1
- package/dist/tools/cli/search.d.ts +0 -16
- package/dist/tools/cli/search.d.ts.map +0 -1
- package/dist/tools/cli/search.js +0 -261
- package/dist/tools/cli/search.js.map +0 -1
- package/dist/tools/cli/search.test.d.ts +0 -8
- package/dist/tools/cli/search.test.d.ts.map +0 -1
- package/dist/tools/cli/search.test.js +0 -172
- package/dist/tools/cli/search.test.js.map +0 -1
- package/dist/tools/cli/subagent.d.ts +0 -43
- package/dist/tools/cli/subagent.d.ts.map +0 -1
- package/dist/tools/cli/subagent.js +0 -99
- package/dist/tools/cli/subagent.js.map +0 -1
- package/dist/tools/cli/subagent.test.d.ts +0 -8
- package/dist/tools/cli/subagent.test.d.ts.map +0 -1
- package/dist/tools/cli/subagent.test.js +0 -190
- package/dist/tools/cli/subagent.test.js.map +0 -1
- package/dist/tools/cli/terminal.d.ts +0 -19
- package/dist/tools/cli/terminal.d.ts.map +0 -1
- package/dist/tools/cli/terminal.js +0 -164
- package/dist/tools/cli/terminal.js.map +0 -1
- package/dist/tools/cli/terminal.test.d.ts +0 -8
- package/dist/tools/cli/terminal.test.d.ts.map +0 -1
- package/dist/tools/cli/terminal.test.js +0 -161
- package/dist/tools/cli/terminal.test.js.map +0 -1
- package/dist/tools/index.d.ts +0 -25
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -41
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/interface.d.ts +0 -64
- package/dist/tools/interface.d.ts.map +0 -1
- package/dist/tools/interface.js +0 -37
- package/dist/tools/interface.js.map +0 -1
- package/dist/tools/interface.test.d.ts +0 -7
- package/dist/tools/interface.test.d.ts.map +0 -1
- package/dist/tools/interface.test.js +0 -179
- package/dist/tools/interface.test.js.map +0 -1
- package/dist/tools/mcp/bridge.d.ts +0 -48
- package/dist/tools/mcp/bridge.d.ts.map +0 -1
- package/dist/tools/mcp/bridge.js +0 -128
- package/dist/tools/mcp/bridge.js.map +0 -1
- package/dist/tools/mcp/bridge.test.d.ts +0 -8
- package/dist/tools/mcp/bridge.test.d.ts.map +0 -1
- package/dist/tools/mcp/bridge.test.js +0 -300
- package/dist/tools/mcp/bridge.test.js.map +0 -1
- package/dist/tools/mcp/client.d.ts +0 -135
- package/dist/tools/mcp/client.d.ts.map +0 -1
- package/dist/tools/mcp/client.js +0 -263
- package/dist/tools/mcp/client.js.map +0 -1
- package/dist/tools/mcp/client.test.d.ts +0 -8
- package/dist/tools/mcp/client.test.d.ts.map +0 -1
- package/dist/tools/mcp/client.test.js +0 -390
- package/dist/tools/mcp/client.test.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -82
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js +0 -99
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/registry.test.d.ts +0 -7
- package/dist/tools/registry.test.d.ts.map +0 -1
- package/dist/tools/registry.test.js +0 -199
- package/dist/tools/registry.test.js.map +0 -1
- package/dist/tools/suite.test.d.ts +0 -11
- package/dist/tools/suite.test.d.ts.map +0 -1
- package/dist/tools/suite.test.js +0 -119
- package/dist/tools/suite.test.js.map +0 -1
- package/dist/tools/types.d.ts +0 -75
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/types.js +0 -30
- package/dist/tools/types.js.map +0 -1
- package/dist/tools/types.test.d.ts +0 -7
- package/dist/tools/types.test.d.ts.map +0 -1
- package/dist/tools/types.test.js +0 -178
- package/dist/tools/types.test.js.map +0 -1
- package/templates/.vscode/mcp.json +0 -20
- package/templates/CLAUDE.md +0 -129
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Stream Handler Utilities for LLM Streaming Responses
|
|
3
|
-
*
|
|
4
|
-
* Provides utilities for processing incremental streaming responses from LLM APIs.
|
|
5
|
-
* Handles content accumulation, tool call assembly from deltas, and stream transformation.
|
|
6
|
-
*/
|
|
7
|
-
// =============================================================================
|
|
8
|
-
// StreamAccumulator Class
|
|
9
|
-
// =============================================================================
|
|
10
|
-
/**
|
|
11
|
-
* Accumulates streamed chat response chunks into a complete response.
|
|
12
|
-
*
|
|
13
|
-
* Handles the complexity of:
|
|
14
|
-
* - Concatenating content chunks as they arrive
|
|
15
|
-
* - Assembling tool calls from incremental deltas (by index)
|
|
16
|
-
* - Tracking the finish reason from the final chunk
|
|
17
|
-
* - Managing multiple in-flight tool calls simultaneously
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```typescript
|
|
21
|
-
* const accumulator = new StreamAccumulator();
|
|
22
|
-
*
|
|
23
|
-
* for await (const chunk of stream) {
|
|
24
|
-
* accumulator.processChunk(chunk);
|
|
25
|
-
* }
|
|
26
|
-
*
|
|
27
|
-
* console.log(accumulator.getContent());
|
|
28
|
-
* console.log(accumulator.getToolCalls());
|
|
29
|
-
* console.log(accumulator.getFinishReason());
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
export class StreamAccumulator {
|
|
33
|
-
/** Accumulated text content from all chunks */
|
|
34
|
-
content = '';
|
|
35
|
-
/** Map of tool call index to partially assembled tool call */
|
|
36
|
-
toolCallMap = new Map();
|
|
37
|
-
/** Finish reason from the final chunk */
|
|
38
|
-
finishReason = null;
|
|
39
|
-
/** Role from the response (typically from first chunk) */
|
|
40
|
-
role = 'assistant';
|
|
41
|
-
/**
|
|
42
|
-
* Process a single chunk from the stream.
|
|
43
|
-
*
|
|
44
|
-
* Updates internal state with any content, tool call deltas,
|
|
45
|
-
* role, or finish reason present in the chunk.
|
|
46
|
-
*
|
|
47
|
-
* @param chunk - The chat chunk to process
|
|
48
|
-
*/
|
|
49
|
-
processChunk(chunk) {
|
|
50
|
-
// Accumulate text content
|
|
51
|
-
if (chunk.content !== null) {
|
|
52
|
-
this.content += chunk.content;
|
|
53
|
-
}
|
|
54
|
-
// Track role (typically only in first chunk)
|
|
55
|
-
if (chunk.role !== undefined) {
|
|
56
|
-
this.role = chunk.role;
|
|
57
|
-
}
|
|
58
|
-
// Track finish reason (only in final chunk)
|
|
59
|
-
if (chunk.finish_reason !== null) {
|
|
60
|
-
this.finishReason = chunk.finish_reason;
|
|
61
|
-
}
|
|
62
|
-
// Process tool call deltas
|
|
63
|
-
if (chunk.tool_calls !== undefined) {
|
|
64
|
-
for (const delta of chunk.tool_calls) {
|
|
65
|
-
this.processToolCallDelta(delta);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Process a tool call delta and merge it into the accumulated state.
|
|
71
|
-
*
|
|
72
|
-
* Tool calls arrive incrementally:
|
|
73
|
-
* - First chunk: id, type, function.name
|
|
74
|
-
* - Subsequent chunks: function.arguments (appended)
|
|
75
|
-
*
|
|
76
|
-
* @param delta - The tool call delta to process
|
|
77
|
-
*/
|
|
78
|
-
processToolCallDelta(delta) {
|
|
79
|
-
const { index } = delta;
|
|
80
|
-
// Get or create the partial tool call for this index
|
|
81
|
-
let partial = this.toolCallMap.get(index);
|
|
82
|
-
if (partial === undefined) {
|
|
83
|
-
// First delta for this tool call - initialize
|
|
84
|
-
partial = {
|
|
85
|
-
id: delta.id ?? '',
|
|
86
|
-
type: delta.type ?? 'function',
|
|
87
|
-
functionName: delta.function?.name ?? '',
|
|
88
|
-
functionArguments: delta.function?.arguments ?? '',
|
|
89
|
-
};
|
|
90
|
-
this.toolCallMap.set(index, partial);
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
// Subsequent delta - merge in new data
|
|
94
|
-
if (delta.id !== undefined) {
|
|
95
|
-
partial.id = delta.id;
|
|
96
|
-
}
|
|
97
|
-
if (delta.type !== undefined) {
|
|
98
|
-
partial.type = delta.type;
|
|
99
|
-
}
|
|
100
|
-
if (delta.function?.name !== undefined) {
|
|
101
|
-
partial.functionName = delta.function.name;
|
|
102
|
-
}
|
|
103
|
-
if (delta.function?.arguments !== undefined) {
|
|
104
|
-
// Arguments are streamed incrementally - append
|
|
105
|
-
partial.functionArguments += delta.function.arguments;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Get the accumulated text content.
|
|
111
|
-
*
|
|
112
|
-
* @returns The complete text content from all processed chunks
|
|
113
|
-
*/
|
|
114
|
-
getContent() {
|
|
115
|
-
return this.content;
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Get the assembled tool calls.
|
|
119
|
-
*
|
|
120
|
-
* Returns tool calls sorted by their original index order.
|
|
121
|
-
*
|
|
122
|
-
* @returns Array of fully assembled tool calls
|
|
123
|
-
*/
|
|
124
|
-
getToolCalls() {
|
|
125
|
-
// Sort by index to maintain order
|
|
126
|
-
const sortedEntries = [...this.toolCallMap.entries()].sort(([a], [b]) => a - b);
|
|
127
|
-
return sortedEntries.map(([, partial]) => ({
|
|
128
|
-
id: partial.id,
|
|
129
|
-
type: partial.type,
|
|
130
|
-
function: {
|
|
131
|
-
name: partial.functionName,
|
|
132
|
-
arguments: partial.functionArguments,
|
|
133
|
-
},
|
|
134
|
-
}));
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Get the finish reason from the final chunk.
|
|
138
|
-
*
|
|
139
|
-
* @returns The finish reason, or null if stream hasn't finished
|
|
140
|
-
*/
|
|
141
|
-
getFinishReason() {
|
|
142
|
-
return this.finishReason;
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Get the role of the response.
|
|
146
|
-
*
|
|
147
|
-
* @returns The chat role (defaults to 'assistant' if not specified)
|
|
148
|
-
*/
|
|
149
|
-
getRole() {
|
|
150
|
-
return this.role;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Reset the accumulator for reuse.
|
|
154
|
-
*
|
|
155
|
-
* Clears all accumulated state, allowing the accumulator to be
|
|
156
|
-
* reused for processing a new stream.
|
|
157
|
-
*/
|
|
158
|
-
reset() {
|
|
159
|
-
this.content = '';
|
|
160
|
-
this.toolCallMap.clear();
|
|
161
|
-
this.finishReason = null;
|
|
162
|
-
this.role = 'assistant';
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Consume an entire stream and collect the results.
|
|
167
|
-
*
|
|
168
|
-
* This is a convenience function that uses StreamAccumulator internally
|
|
169
|
-
* to process all chunks and return the final aggregated result.
|
|
170
|
-
*
|
|
171
|
-
* @param stream - Async iterable of chat chunks
|
|
172
|
-
* @returns Promise resolving to the collected stream result
|
|
173
|
-
*
|
|
174
|
-
* @example
|
|
175
|
-
* ```typescript
|
|
176
|
-
* const stream = client.streamCompletion(messages);
|
|
177
|
-
* const result = await collectStream(stream);
|
|
178
|
-
*
|
|
179
|
-
* if (result.toolCalls.length > 0) {
|
|
180
|
-
* // Handle tool calls
|
|
181
|
-
* } else {
|
|
182
|
-
* console.log(result.content);
|
|
183
|
-
* }
|
|
184
|
-
* ```
|
|
185
|
-
*/
|
|
186
|
-
export async function collectStream(stream) {
|
|
187
|
-
const accumulator = new StreamAccumulator();
|
|
188
|
-
for await (const chunk of stream) {
|
|
189
|
-
accumulator.processChunk(chunk);
|
|
190
|
-
}
|
|
191
|
-
return {
|
|
192
|
-
content: accumulator.getContent(),
|
|
193
|
-
toolCalls: accumulator.getToolCalls(),
|
|
194
|
-
finishReason: accumulator.getFinishReason(),
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Transform stream chunks using a mapping function.
|
|
199
|
-
*
|
|
200
|
-
* Creates a new async generator that yields transformed values
|
|
201
|
-
* for each chunk in the input stream.
|
|
202
|
-
*
|
|
203
|
-
* @typeParam T - The output type of the mapper function
|
|
204
|
-
* @param stream - Async iterable of chat chunks
|
|
205
|
-
* @param mapper - Function to transform each chunk
|
|
206
|
-
* @returns Async generator yielding transformed values
|
|
207
|
-
*
|
|
208
|
-
* @example
|
|
209
|
-
* ```typescript
|
|
210
|
-
* // Extract just the content from each chunk
|
|
211
|
-
* const contentStream = mapStream(stream, (chunk) => chunk.content ?? '');
|
|
212
|
-
*
|
|
213
|
-
* for await (const text of contentStream) {
|
|
214
|
-
* process.stdout.write(text);
|
|
215
|
-
* }
|
|
216
|
-
* ```
|
|
217
|
-
*
|
|
218
|
-
* @example
|
|
219
|
-
* ```typescript
|
|
220
|
-
* // Transform to custom event format
|
|
221
|
-
* const eventStream = mapStream(stream, (chunk) => ({
|
|
222
|
-
* type: 'delta',
|
|
223
|
-
* text: chunk.content,
|
|
224
|
-
* done: chunk.finish_reason !== null,
|
|
225
|
-
* }));
|
|
226
|
-
* ```
|
|
227
|
-
*/
|
|
228
|
-
export async function* mapStream(stream, mapper) {
|
|
229
|
-
for await (const chunk of stream) {
|
|
230
|
-
yield mapper(chunk);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
//# sourceMappingURL=streaming.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/providers/streaming.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streaming.test.d.ts","sourceRoot":"","sources":["../../src/providers/streaming.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -1,372 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Stream Handler Utility Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for StreamAccumulator, collectStream, and mapStream.
|
|
5
|
-
*/
|
|
6
|
-
import { describe, it } from 'node:test';
|
|
7
|
-
import assert from 'node:assert';
|
|
8
|
-
import { StreamAccumulator, collectStream, mapStream } from './streaming.js';
|
|
9
|
-
/**
|
|
10
|
-
* Helper to create async iterable from array of chunks.
|
|
11
|
-
*/
|
|
12
|
-
async function* asyncIterableFromArray(chunks) {
|
|
13
|
-
for (const chunk of chunks) {
|
|
14
|
-
yield chunk;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Helper to create a basic ChatChunk.
|
|
19
|
-
*/
|
|
20
|
-
function createChunk(overrides = {}) {
|
|
21
|
-
return {
|
|
22
|
-
id: 'test-id',
|
|
23
|
-
content: null,
|
|
24
|
-
finish_reason: null,
|
|
25
|
-
...overrides,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
describe('StreamAccumulator', () => {
|
|
29
|
-
describe('content accumulation', () => {
|
|
30
|
-
it('should accumulate content from multiple chunks', () => {
|
|
31
|
-
const accumulator = new StreamAccumulator();
|
|
32
|
-
accumulator.processChunk(createChunk({ content: 'Hello' }));
|
|
33
|
-
accumulator.processChunk(createChunk({ content: ' ' }));
|
|
34
|
-
accumulator.processChunk(createChunk({ content: 'World' }));
|
|
35
|
-
assert.strictEqual(accumulator.getContent(), 'Hello World');
|
|
36
|
-
});
|
|
37
|
-
it('should return empty string when no content received', () => {
|
|
38
|
-
const accumulator = new StreamAccumulator();
|
|
39
|
-
assert.strictEqual(accumulator.getContent(), '');
|
|
40
|
-
});
|
|
41
|
-
it('should handle single chunk with content', () => {
|
|
42
|
-
const accumulator = new StreamAccumulator();
|
|
43
|
-
accumulator.processChunk(createChunk({ content: 'Complete message' }));
|
|
44
|
-
assert.strictEqual(accumulator.getContent(), 'Complete message');
|
|
45
|
-
});
|
|
46
|
-
it('should skip null content chunks (no accumulation)', () => {
|
|
47
|
-
const accumulator = new StreamAccumulator();
|
|
48
|
-
accumulator.processChunk(createChunk({ content: 'Start' }));
|
|
49
|
-
accumulator.processChunk(createChunk({ content: null }));
|
|
50
|
-
accumulator.processChunk(createChunk({ content: 'End' }));
|
|
51
|
-
assert.strictEqual(accumulator.getContent(), 'StartEnd');
|
|
52
|
-
});
|
|
53
|
-
it('should handle empty string content', () => {
|
|
54
|
-
const accumulator = new StreamAccumulator();
|
|
55
|
-
accumulator.processChunk(createChunk({ content: 'A' }));
|
|
56
|
-
accumulator.processChunk(createChunk({ content: '' }));
|
|
57
|
-
accumulator.processChunk(createChunk({ content: 'B' }));
|
|
58
|
-
assert.strictEqual(accumulator.getContent(), 'AB');
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
describe('role tracking', () => {
|
|
62
|
-
it('should track role from first chunk', () => {
|
|
63
|
-
const accumulator = new StreamAccumulator();
|
|
64
|
-
accumulator.processChunk(createChunk({ role: 'assistant', content: 'Hello' }));
|
|
65
|
-
accumulator.processChunk(createChunk({ content: ' World' }));
|
|
66
|
-
assert.strictEqual(accumulator.getRole(), 'assistant');
|
|
67
|
-
});
|
|
68
|
-
it('should default to assistant role', () => {
|
|
69
|
-
const accumulator = new StreamAccumulator();
|
|
70
|
-
assert.strictEqual(accumulator.getRole(), 'assistant');
|
|
71
|
-
});
|
|
72
|
-
it('should update role if provided in later chunk', () => {
|
|
73
|
-
const accumulator = new StreamAccumulator();
|
|
74
|
-
accumulator.processChunk(createChunk({ role: 'user' }));
|
|
75
|
-
accumulator.processChunk(createChunk({ role: 'assistant' }));
|
|
76
|
-
assert.strictEqual(accumulator.getRole(), 'assistant');
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
describe('finish_reason tracking', () => {
|
|
80
|
-
it('should track finish_reason from final chunk', () => {
|
|
81
|
-
const accumulator = new StreamAccumulator();
|
|
82
|
-
accumulator.processChunk(createChunk({ content: 'Hello' }));
|
|
83
|
-
accumulator.processChunk(createChunk({ content: ' World', finish_reason: 'stop' }));
|
|
84
|
-
assert.strictEqual(accumulator.getFinishReason(), 'stop');
|
|
85
|
-
});
|
|
86
|
-
it('should return null if stream has not finished', () => {
|
|
87
|
-
const accumulator = new StreamAccumulator();
|
|
88
|
-
accumulator.processChunk(createChunk({ content: 'Hello' }));
|
|
89
|
-
assert.strictEqual(accumulator.getFinishReason(), null);
|
|
90
|
-
});
|
|
91
|
-
it('should handle tool_calls finish reason', () => {
|
|
92
|
-
const accumulator = new StreamAccumulator();
|
|
93
|
-
accumulator.processChunk(createChunk({ finish_reason: 'tool_calls' }));
|
|
94
|
-
assert.strictEqual(accumulator.getFinishReason(), 'tool_calls');
|
|
95
|
-
});
|
|
96
|
-
it('should handle length finish reason', () => {
|
|
97
|
-
const accumulator = new StreamAccumulator();
|
|
98
|
-
accumulator.processChunk(createChunk({ finish_reason: 'length' }));
|
|
99
|
-
assert.strictEqual(accumulator.getFinishReason(), 'length');
|
|
100
|
-
});
|
|
101
|
-
it('should handle content_filter finish reason', () => {
|
|
102
|
-
const accumulator = new StreamAccumulator();
|
|
103
|
-
accumulator.processChunk(createChunk({ finish_reason: 'content_filter' }));
|
|
104
|
-
assert.strictEqual(accumulator.getFinishReason(), 'content_filter');
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
describe('tool call assembly', () => {
|
|
108
|
-
it('should assemble tool calls from deltas', () => {
|
|
109
|
-
const accumulator = new StreamAccumulator();
|
|
110
|
-
// First chunk: id, type, function name (beginning of tool call)
|
|
111
|
-
const delta1 = {
|
|
112
|
-
index: 0,
|
|
113
|
-
id: 'call_123',
|
|
114
|
-
type: 'function',
|
|
115
|
-
function: {
|
|
116
|
-
name: 'get_weather',
|
|
117
|
-
arguments: '',
|
|
118
|
-
},
|
|
119
|
-
};
|
|
120
|
-
// Second chunk: arguments (streamed incrementally)
|
|
121
|
-
const delta2 = {
|
|
122
|
-
index: 0,
|
|
123
|
-
function: {
|
|
124
|
-
arguments: '{"city":',
|
|
125
|
-
},
|
|
126
|
-
};
|
|
127
|
-
// Third chunk: more arguments
|
|
128
|
-
const delta3 = {
|
|
129
|
-
index: 0,
|
|
130
|
-
function: {
|
|
131
|
-
arguments: '"NYC"}',
|
|
132
|
-
},
|
|
133
|
-
};
|
|
134
|
-
accumulator.processChunk(createChunk({ tool_calls: [delta1] }));
|
|
135
|
-
accumulator.processChunk(createChunk({ tool_calls: [delta2] }));
|
|
136
|
-
accumulator.processChunk(createChunk({ tool_calls: [delta3] }));
|
|
137
|
-
const toolCalls = accumulator.getToolCalls();
|
|
138
|
-
assert.strictEqual(toolCalls.length, 1);
|
|
139
|
-
assert.strictEqual(toolCalls[0].id, 'call_123');
|
|
140
|
-
assert.strictEqual(toolCalls[0].type, 'function');
|
|
141
|
-
assert.strictEqual(toolCalls[0].function.name, 'get_weather');
|
|
142
|
-
assert.strictEqual(toolCalls[0].function.arguments, '{"city":"NYC"}');
|
|
143
|
-
});
|
|
144
|
-
it('should handle multiple simultaneous tool calls (different indices)', () => {
|
|
145
|
-
const accumulator = new StreamAccumulator();
|
|
146
|
-
// First tool call
|
|
147
|
-
const delta0 = {
|
|
148
|
-
index: 0,
|
|
149
|
-
id: 'call_1',
|
|
150
|
-
type: 'function',
|
|
151
|
-
function: { name: 'tool_a', arguments: '{}' },
|
|
152
|
-
};
|
|
153
|
-
// Second tool call
|
|
154
|
-
const delta1 = {
|
|
155
|
-
index: 1,
|
|
156
|
-
id: 'call_2',
|
|
157
|
-
type: 'function',
|
|
158
|
-
function: { name: 'tool_b', arguments: '{"x":1}' },
|
|
159
|
-
};
|
|
160
|
-
accumulator.processChunk(createChunk({ tool_calls: [delta0, delta1] }));
|
|
161
|
-
const toolCalls = accumulator.getToolCalls();
|
|
162
|
-
assert.strictEqual(toolCalls.length, 2);
|
|
163
|
-
assert.strictEqual(toolCalls[0].id, 'call_1');
|
|
164
|
-
assert.strictEqual(toolCalls[0].function.name, 'tool_a');
|
|
165
|
-
assert.strictEqual(toolCalls[1].id, 'call_2');
|
|
166
|
-
assert.strictEqual(toolCalls[1].function.name, 'tool_b');
|
|
167
|
-
});
|
|
168
|
-
it('should sort tool calls by index', () => {
|
|
169
|
-
const accumulator = new StreamAccumulator();
|
|
170
|
-
// Receive tool calls out of order
|
|
171
|
-
accumulator.processChunk(createChunk({
|
|
172
|
-
tool_calls: [
|
|
173
|
-
{ index: 2, id: 'call_3', type: 'function', function: { name: 'c', arguments: '' } },
|
|
174
|
-
],
|
|
175
|
-
}));
|
|
176
|
-
accumulator.processChunk(createChunk({
|
|
177
|
-
tool_calls: [
|
|
178
|
-
{ index: 0, id: 'call_1', type: 'function', function: { name: 'a', arguments: '' } },
|
|
179
|
-
],
|
|
180
|
-
}));
|
|
181
|
-
accumulator.processChunk(createChunk({
|
|
182
|
-
tool_calls: [
|
|
183
|
-
{ index: 1, id: 'call_2', type: 'function', function: { name: 'b', arguments: '' } },
|
|
184
|
-
],
|
|
185
|
-
}));
|
|
186
|
-
const toolCalls = accumulator.getToolCalls();
|
|
187
|
-
assert.strictEqual(toolCalls.length, 3);
|
|
188
|
-
assert.strictEqual(toolCalls[0].function.name, 'a');
|
|
189
|
-
assert.strictEqual(toolCalls[1].function.name, 'b');
|
|
190
|
-
assert.strictEqual(toolCalls[2].function.name, 'c');
|
|
191
|
-
});
|
|
192
|
-
it('should return empty array when no tool calls', () => {
|
|
193
|
-
const accumulator = new StreamAccumulator();
|
|
194
|
-
accumulator.processChunk(createChunk({ content: 'Hello' }));
|
|
195
|
-
const toolCalls = accumulator.getToolCalls();
|
|
196
|
-
assert.deepStrictEqual(toolCalls, []);
|
|
197
|
-
});
|
|
198
|
-
it('should handle tool call with empty function details', () => {
|
|
199
|
-
const accumulator = new StreamAccumulator();
|
|
200
|
-
const delta = {
|
|
201
|
-
index: 0,
|
|
202
|
-
};
|
|
203
|
-
accumulator.processChunk(createChunk({ tool_calls: [delta] }));
|
|
204
|
-
const toolCalls = accumulator.getToolCalls();
|
|
205
|
-
assert.strictEqual(toolCalls.length, 1);
|
|
206
|
-
assert.strictEqual(toolCalls[0].id, '');
|
|
207
|
-
assert.strictEqual(toolCalls[0].function.name, '');
|
|
208
|
-
assert.strictEqual(toolCalls[0].function.arguments, '');
|
|
209
|
-
});
|
|
210
|
-
it('should merge tool call updates correctly', () => {
|
|
211
|
-
const accumulator = new StreamAccumulator();
|
|
212
|
-
// First: partial info
|
|
213
|
-
accumulator.processChunk(createChunk({
|
|
214
|
-
tool_calls: [{ index: 0, id: 'original_id' }],
|
|
215
|
-
}));
|
|
216
|
-
// Second: update with name
|
|
217
|
-
accumulator.processChunk(createChunk({
|
|
218
|
-
tool_calls: [{ index: 0, function: { name: 'my_function' } }],
|
|
219
|
-
}));
|
|
220
|
-
// Third: update with arguments
|
|
221
|
-
accumulator.processChunk(createChunk({
|
|
222
|
-
tool_calls: [{ index: 0, function: { arguments: '{"a":1}' } }],
|
|
223
|
-
}));
|
|
224
|
-
const toolCalls = accumulator.getToolCalls();
|
|
225
|
-
assert.strictEqual(toolCalls[0].id, 'original_id');
|
|
226
|
-
assert.strictEqual(toolCalls[0].function.name, 'my_function');
|
|
227
|
-
assert.strictEqual(toolCalls[0].function.arguments, '{"a":1}');
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
describe('reset', () => {
|
|
231
|
-
it('should clear all state', () => {
|
|
232
|
-
const accumulator = new StreamAccumulator();
|
|
233
|
-
accumulator.processChunk(createChunk({ content: 'Hello', role: 'user' }));
|
|
234
|
-
accumulator.processChunk(createChunk({ finish_reason: 'stop' }));
|
|
235
|
-
accumulator.processChunk(createChunk({
|
|
236
|
-
tool_calls: [
|
|
237
|
-
{ index: 0, id: 'call_1', type: 'function', function: { name: 'test', arguments: '{}' } },
|
|
238
|
-
],
|
|
239
|
-
}));
|
|
240
|
-
accumulator.reset();
|
|
241
|
-
assert.strictEqual(accumulator.getContent(), '');
|
|
242
|
-
assert.strictEqual(accumulator.getRole(), 'assistant');
|
|
243
|
-
assert.strictEqual(accumulator.getFinishReason(), null);
|
|
244
|
-
assert.deepStrictEqual(accumulator.getToolCalls(), []);
|
|
245
|
-
});
|
|
246
|
-
it('should allow reuse after reset', () => {
|
|
247
|
-
const accumulator = new StreamAccumulator();
|
|
248
|
-
accumulator.processChunk(createChunk({ content: 'First' }));
|
|
249
|
-
accumulator.reset();
|
|
250
|
-
accumulator.processChunk(createChunk({ content: 'Second' }));
|
|
251
|
-
assert.strictEqual(accumulator.getContent(), 'Second');
|
|
252
|
-
});
|
|
253
|
-
});
|
|
254
|
-
});
|
|
255
|
-
describe('collectStream', () => {
|
|
256
|
-
it('should collect complete stream into result', async () => {
|
|
257
|
-
const chunks = [
|
|
258
|
-
createChunk({ role: 'assistant', content: 'Hello' }),
|
|
259
|
-
createChunk({ content: ' World' }),
|
|
260
|
-
createChunk({ content: '!', finish_reason: 'stop' }),
|
|
261
|
-
];
|
|
262
|
-
const result = await collectStream(asyncIterableFromArray(chunks));
|
|
263
|
-
assert.strictEqual(result.content, 'Hello World!');
|
|
264
|
-
assert.strictEqual(result.finishReason, 'stop');
|
|
265
|
-
assert.deepStrictEqual(result.toolCalls, []);
|
|
266
|
-
});
|
|
267
|
-
it('should return content, toolCalls, and finishReason', async () => {
|
|
268
|
-
const chunks = [
|
|
269
|
-
createChunk({
|
|
270
|
-
content: '',
|
|
271
|
-
tool_calls: [
|
|
272
|
-
{ index: 0, id: 'tc_1', type: 'function', function: { name: 'test', arguments: '{}' } },
|
|
273
|
-
],
|
|
274
|
-
}),
|
|
275
|
-
createChunk({ finish_reason: 'tool_calls' }),
|
|
276
|
-
];
|
|
277
|
-
const result = await collectStream(asyncIterableFromArray(chunks));
|
|
278
|
-
assert.strictEqual(result.finishReason, 'tool_calls');
|
|
279
|
-
assert.strictEqual(result.toolCalls.length, 1);
|
|
280
|
-
assert.strictEqual(result.toolCalls[0].id, 'tc_1');
|
|
281
|
-
});
|
|
282
|
-
it('should work with empty stream', async () => {
|
|
283
|
-
const chunks = [];
|
|
284
|
-
const result = await collectStream(asyncIterableFromArray(chunks));
|
|
285
|
-
assert.strictEqual(result.content, '');
|
|
286
|
-
assert.strictEqual(result.finishReason, null);
|
|
287
|
-
assert.deepStrictEqual(result.toolCalls, []);
|
|
288
|
-
});
|
|
289
|
-
it('should handle stream with only null content', async () => {
|
|
290
|
-
const chunks = [
|
|
291
|
-
createChunk({ content: null }),
|
|
292
|
-
createChunk({ content: null, finish_reason: 'stop' }),
|
|
293
|
-
];
|
|
294
|
-
const result = await collectStream(asyncIterableFromArray(chunks));
|
|
295
|
-
assert.strictEqual(result.content, '');
|
|
296
|
-
assert.strictEqual(result.finishReason, 'stop');
|
|
297
|
-
});
|
|
298
|
-
});
|
|
299
|
-
describe('mapStream', () => {
|
|
300
|
-
it('should transform chunks through mapper function', async () => {
|
|
301
|
-
const chunks = [
|
|
302
|
-
createChunk({ content: 'A' }),
|
|
303
|
-
createChunk({ content: 'B' }),
|
|
304
|
-
createChunk({ content: 'C' }),
|
|
305
|
-
];
|
|
306
|
-
const mappedStream = mapStream(asyncIterableFromArray(chunks), (chunk) => chunk.content ?? '');
|
|
307
|
-
const results = [];
|
|
308
|
-
for await (const value of mappedStream) {
|
|
309
|
-
results.push(value);
|
|
310
|
-
}
|
|
311
|
-
assert.deepStrictEqual(results, ['A', 'B', 'C']);
|
|
312
|
-
});
|
|
313
|
-
it('should preserve iteration order', async () => {
|
|
314
|
-
const chunks = [
|
|
315
|
-
createChunk({ id: '1', content: 'first' }),
|
|
316
|
-
createChunk({ id: '2', content: 'second' }),
|
|
317
|
-
createChunk({ id: '3', content: 'third' }),
|
|
318
|
-
];
|
|
319
|
-
const mappedStream = mapStream(asyncIterableFromArray(chunks), (chunk) => chunk.id);
|
|
320
|
-
const results = [];
|
|
321
|
-
for await (const value of mappedStream) {
|
|
322
|
-
results.push(value);
|
|
323
|
-
}
|
|
324
|
-
assert.deepStrictEqual(results, ['1', '2', '3']);
|
|
325
|
-
});
|
|
326
|
-
it('should transform to different type', async () => {
|
|
327
|
-
const chunks = [
|
|
328
|
-
createChunk({ content: 'hello' }),
|
|
329
|
-
createChunk({ content: 'world' }),
|
|
330
|
-
];
|
|
331
|
-
const mappedStream = mapStream(asyncIterableFromArray(chunks), (chunk) => ({
|
|
332
|
-
text: chunk.content,
|
|
333
|
-
length: chunk.content?.length ?? 0,
|
|
334
|
-
}));
|
|
335
|
-
const results = [];
|
|
336
|
-
for await (const value of mappedStream) {
|
|
337
|
-
results.push(value);
|
|
338
|
-
}
|
|
339
|
-
assert.deepStrictEqual(results, [
|
|
340
|
-
{ text: 'hello', length: 5 },
|
|
341
|
-
{ text: 'world', length: 5 },
|
|
342
|
-
]);
|
|
343
|
-
});
|
|
344
|
-
it('should work with empty stream', async () => {
|
|
345
|
-
const chunks = [];
|
|
346
|
-
const mappedStream = mapStream(asyncIterableFromArray(chunks), (chunk) => chunk.content);
|
|
347
|
-
const results = [];
|
|
348
|
-
for await (const value of mappedStream) {
|
|
349
|
-
results.push(value);
|
|
350
|
-
}
|
|
351
|
-
assert.deepStrictEqual(results, []);
|
|
352
|
-
});
|
|
353
|
-
it('should handle mapper that extracts complex data', async () => {
|
|
354
|
-
const chunks = [
|
|
355
|
-
createChunk({ id: 'c1', content: 'text', finish_reason: null }),
|
|
356
|
-
createChunk({ id: 'c2', content: null, finish_reason: 'stop' }),
|
|
357
|
-
];
|
|
358
|
-
const mappedStream = mapStream(asyncIterableFromArray(chunks), (chunk) => ({
|
|
359
|
-
id: chunk.id,
|
|
360
|
-
done: chunk.finish_reason !== null,
|
|
361
|
-
}));
|
|
362
|
-
const results = [];
|
|
363
|
-
for await (const value of mappedStream) {
|
|
364
|
-
results.push(value);
|
|
365
|
-
}
|
|
366
|
-
assert.deepStrictEqual(results, [
|
|
367
|
-
{ id: 'c1', done: false },
|
|
368
|
-
{ id: 'c2', done: true },
|
|
369
|
-
]);
|
|
370
|
-
});
|
|
371
|
-
});
|
|
372
|
-
//# sourceMappingURL=streaming.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streaming.test.js","sourceRoot":"","sources":["../../src/providers/streaming.test.ts"],"names":[],"mappings":"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"}
|