llm-stream-assemble 1.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.
Files changed (41) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +390 -0
  3. package/dist/adapters/anthropic.cjs +312 -0
  4. package/dist/adapters/anthropic.cjs.map +1 -0
  5. package/dist/adapters/anthropic.d.cts +11 -0
  6. package/dist/adapters/anthropic.d.ts +11 -0
  7. package/dist/adapters/anthropic.js +310 -0
  8. package/dist/adapters/anthropic.js.map +1 -0
  9. package/dist/adapters/openai-chat.cjs +499 -0
  10. package/dist/adapters/openai-chat.cjs.map +1 -0
  11. package/dist/adapters/openai-chat.d.cts +9 -0
  12. package/dist/adapters/openai-chat.d.ts +9 -0
  13. package/dist/adapters/openai-chat.js +497 -0
  14. package/dist/adapters/openai-chat.js.map +1 -0
  15. package/dist/adapters/openai-compatible.cjs +519 -0
  16. package/dist/adapters/openai-compatible.cjs.map +1 -0
  17. package/dist/adapters/openai-compatible.d.cts +15 -0
  18. package/dist/adapters/openai-compatible.d.ts +15 -0
  19. package/dist/adapters/openai-compatible.js +517 -0
  20. package/dist/adapters/openai-compatible.js.map +1 -0
  21. package/dist/adapters/openai-responses.cjs +444 -0
  22. package/dist/adapters/openai-responses.cjs.map +1 -0
  23. package/dist/adapters/openai-responses.d.cts +8 -0
  24. package/dist/adapters/openai-responses.d.ts +8 -0
  25. package/dist/adapters/openai-responses.js +442 -0
  26. package/dist/adapters/openai-responses.js.map +1 -0
  27. package/dist/core/index.cjs +816 -0
  28. package/dist/core/index.cjs.map +1 -0
  29. package/dist/core/index.d.cts +18 -0
  30. package/dist/core/index.d.ts +18 -0
  31. package/dist/core/index.js +808 -0
  32. package/dist/core/index.js.map +1 -0
  33. package/dist/index.cjs +2238 -0
  34. package/dist/index.cjs.map +1 -0
  35. package/dist/index.d.cts +66 -0
  36. package/dist/index.d.ts +66 -0
  37. package/dist/index.js +2206 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/types-CskRfrmD.d.cts +176 -0
  40. package/dist/types-CskRfrmD.d.ts +176 -0
  41. package/package.json +95 -0
@@ -0,0 +1,176 @@
1
+ type FinishReason = "stop" | "tool_calls" | "length" | "content_filter" | "error" | "incomplete" | "aborted";
2
+ type ReasoningVariant = "summary" | "detail";
3
+ type StreamEvent = {
4
+ type: "message.start";
5
+ id?: string;
6
+ choiceIndex?: number;
7
+ } | {
8
+ type: "metadata";
9
+ model?: string;
10
+ responseId?: string;
11
+ created?: number;
12
+ raw?: unknown;
13
+ } | {
14
+ type: "text.delta";
15
+ text: string;
16
+ choiceIndex?: number;
17
+ } | {
18
+ type: "text.done";
19
+ text: string;
20
+ choiceIndex?: number;
21
+ } | {
22
+ type: "reasoning.delta";
23
+ text: string;
24
+ variant?: ReasoningVariant;
25
+ } | {
26
+ type: "reasoning.done";
27
+ text: string;
28
+ variant?: ReasoningVariant;
29
+ } | {
30
+ type: "refusal.delta";
31
+ text: string;
32
+ } | {
33
+ type: "refusal.done";
34
+ text: string;
35
+ } | {
36
+ type: "json.delta";
37
+ delta: string;
38
+ partial?: unknown;
39
+ } | {
40
+ type: "json.done";
41
+ value: unknown;
42
+ } | {
43
+ type: "tool_call.start";
44
+ id: string;
45
+ name: string;
46
+ index?: number;
47
+ choiceIndex?: number;
48
+ } | {
49
+ type: "tool_call.args.delta";
50
+ id: string;
51
+ delta: string;
52
+ partial?: unknown;
53
+ } | {
54
+ type: "tool_call.done";
55
+ id: string;
56
+ name: string;
57
+ args: unknown;
58
+ } | {
59
+ type: "usage";
60
+ inputTokens?: number;
61
+ outputTokens?: number;
62
+ reasoningTokens?: number;
63
+ raw?: unknown;
64
+ } | {
65
+ type: "finish";
66
+ reason: FinishReason;
67
+ choiceIndex?: number;
68
+ } | {
69
+ type: "error";
70
+ error: Error;
71
+ recoverable?: boolean;
72
+ sanitized?: string;
73
+ };
74
+ interface StreamAdapter {
75
+ parseChunk(raw: string): RawChunk[];
76
+ parseResponse?(body: unknown): RawChunk[];
77
+ }
78
+ /** Internal representation between adapter output and assembler. */
79
+ type RawChunk = {
80
+ kind: "message-start";
81
+ id?: string;
82
+ choiceIndex?: number;
83
+ } | {
84
+ kind: "text-delta";
85
+ text: string;
86
+ choiceIndex?: number;
87
+ } | {
88
+ kind: "reasoning-delta";
89
+ text: string;
90
+ variant?: ReasoningVariant;
91
+ } | {
92
+ kind: "refusal-delta";
93
+ text: string;
94
+ } | {
95
+ kind: "json-delta";
96
+ delta: string;
97
+ } | {
98
+ kind: "tool-start";
99
+ id?: string;
100
+ name: string;
101
+ index?: number;
102
+ choiceIndex?: number;
103
+ } | {
104
+ kind: "tool-args-delta";
105
+ id?: string;
106
+ delta: string;
107
+ index?: number;
108
+ choiceIndex?: number;
109
+ } | {
110
+ kind: "tool-done";
111
+ id?: string;
112
+ index?: number;
113
+ choiceIndex?: number;
114
+ } | {
115
+ kind: "metadata";
116
+ model?: string;
117
+ responseId?: string;
118
+ created?: number;
119
+ raw?: unknown;
120
+ } | {
121
+ kind: "usage";
122
+ inputTokens?: number;
123
+ outputTokens?: number;
124
+ reasoningTokens?: number;
125
+ raw?: unknown;
126
+ } | {
127
+ kind: "finish";
128
+ reason: FinishReason;
129
+ choiceIndex?: number;
130
+ } | {
131
+ kind: "provider-error";
132
+ error: unknown;
133
+ recoverable?: boolean;
134
+ };
135
+ interface AssembleOptions {
136
+ recoverMalformed?: boolean;
137
+ signal?: AbortSignal;
138
+ sanitizeErrors?: boolean;
139
+ strictToolArgs?: boolean;
140
+ maxBufferBytes?: number;
141
+ }
142
+ interface PartialJSONResult {
143
+ value?: unknown;
144
+ complete: boolean;
145
+ }
146
+ interface CollectedStream {
147
+ text: string;
148
+ reasoning: string;
149
+ refusals: string;
150
+ json: unknown;
151
+ toolCalls: Array<{
152
+ id: string;
153
+ name: string;
154
+ args: unknown;
155
+ }>;
156
+ usage?: Extract<StreamEvent, {
157
+ type: "usage";
158
+ }>;
159
+ finishReason?: Extract<StreamEvent, {
160
+ type: "finish";
161
+ }>;
162
+ }
163
+ interface ToSSEOptions {
164
+ sanitizeErrors?: boolean;
165
+ }
166
+ interface AssembleFromFileOptions extends AssembleOptions {
167
+ format?: "sse" | "json";
168
+ }
169
+ type StreamEventType = StreamEvent["type"];
170
+ type StreamEventHandlers<R> = Partial<{
171
+ [K in StreamEventType]: (event: Extract<StreamEvent, {
172
+ type: K;
173
+ }>) => R;
174
+ }>;
175
+
176
+ export type { AssembleFromFileOptions as A, CollectedStream as C, FinishReason as F, PartialJSONResult as P, RawChunk as R, StreamAdapter as S, ToSSEOptions as T, AssembleOptions as a, ReasoningVariant as b, StreamEvent as c, StreamEventHandlers as d, StreamEventType as e };
package/package.json ADDED
@@ -0,0 +1,95 @@
1
+ {
2
+ "name": "llm-stream-assemble",
3
+ "version": "1.0.0",
4
+ "description": "A zero-dependency TypeScript layer for assembling OpenAI, Anthropic, and compatible LLM streams into unified events for text, tool calls, reasoning, JSON, usage, errors, and non-streaming responses.",
5
+ "license": "MIT",
6
+ "author": "Ladislav Kostolny <01laky@gmail.com>",
7
+ "type": "module",
8
+ "sideEffects": false,
9
+ "engines": {
10
+ "node": ">=18"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "LICENSE",
15
+ "README.md"
16
+ ],
17
+ "main": "./dist/index.cjs",
18
+ "module": "./dist/index.js",
19
+ "types": "./dist/index.d.ts",
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js",
24
+ "require": "./dist/index.cjs"
25
+ },
26
+ "./core": {
27
+ "types": "./dist/core/index.d.ts",
28
+ "import": "./dist/core/index.js",
29
+ "require": "./dist/core/index.cjs"
30
+ },
31
+ "./adapters/openai-chat": {
32
+ "types": "./dist/adapters/openai-chat.d.ts",
33
+ "import": "./dist/adapters/openai-chat.js",
34
+ "require": "./dist/adapters/openai-chat.cjs"
35
+ },
36
+ "./adapters/openai-compatible": {
37
+ "types": "./dist/adapters/openai-compatible.d.ts",
38
+ "import": "./dist/adapters/openai-compatible.js",
39
+ "require": "./dist/adapters/openai-compatible.cjs"
40
+ },
41
+ "./adapters/anthropic": {
42
+ "types": "./dist/adapters/anthropic.d.ts",
43
+ "import": "./dist/adapters/anthropic.js",
44
+ "require": "./dist/adapters/anthropic.cjs"
45
+ },
46
+ "./adapters/openai-responses": {
47
+ "types": "./dist/adapters/openai-responses.d.ts",
48
+ "import": "./dist/adapters/openai-responses.js",
49
+ "require": "./dist/adapters/openai-responses.cjs"
50
+ }
51
+ },
52
+ "scripts": {
53
+ "build": "tsup",
54
+ "dev": "tsup --watch",
55
+ "typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json",
56
+ "lint": "eslint .",
57
+ "lint:fix": "eslint . --fix",
58
+ "format": "prettier --check .",
59
+ "format:fix": "prettier --write .",
60
+ "test": "vitest run",
61
+ "test:watch": "vitest",
62
+ "verify": "pnpm verify:deps && pnpm lint && pnpm typecheck && pnpm build && pnpm test && pnpm smoke:package",
63
+ "verify:deps": "node scripts/verify-zero-deps.mjs",
64
+ "smoke:package": "node scripts/smoke-package.mjs"
65
+ },
66
+ "keywords": [
67
+ "llm",
68
+ "streaming",
69
+ "sse",
70
+ "openai",
71
+ "anthropic",
72
+ "tool-calling",
73
+ "server-sent-events"
74
+ ],
75
+ "repository": {
76
+ "type": "git",
77
+ "url": "git+https://github.com/01laky/llm-stream-assemble.git"
78
+ },
79
+ "bugs": {
80
+ "url": "https://github.com/01laky/llm-stream-assemble/issues"
81
+ },
82
+ "homepage": "https://github.com/01laky/llm-stream-assemble#readme",
83
+ "packageManager": "pnpm@9.15.9",
84
+ "devDependencies": {
85
+ "@eslint/js": "^9.28.0",
86
+ "@types/node": "^22.15.29",
87
+ "@vitest/coverage-v8": "^3.2.1",
88
+ "eslint": "^9.28.0",
89
+ "prettier": "^3.5.3",
90
+ "tsup": "^8.5.0",
91
+ "typescript": "^5.8.3",
92
+ "typescript-eslint": "^8.33.0",
93
+ "vitest": "^3.2.1"
94
+ }
95
+ }