@kortyx/hooks 0.9.1 → 0.10.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 +17 -0
- package/dist/index.d.ts +15 -3
- package/dist/index.js +434 -84
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +14 -3
- package/dist/internal.js +149 -47
- package/dist/internal.js.map +1 -1
- package/dist/tracing-BG-j1cer.d.ts +25 -0
- package/package.json +2 -2
package/dist/internal.js
CHANGED
|
@@ -25,12 +25,7 @@ module.exports = __toCommonJS(internal_exports);
|
|
|
25
25
|
|
|
26
26
|
// src/reason-engine.ts
|
|
27
27
|
var import_node_crypto = require("crypto");
|
|
28
|
-
var
|
|
29
|
-
if (typeof chunk === "string") return chunk;
|
|
30
|
-
if (typeof chunk.text === "string") return chunk.text;
|
|
31
|
-
if (typeof chunk.content === "string") return chunk.content;
|
|
32
|
-
return "";
|
|
33
|
-
};
|
|
28
|
+
var toError = (value) => value instanceof Error ? value : new Error(String(value));
|
|
34
29
|
var createRuntimeId = () => {
|
|
35
30
|
try {
|
|
36
31
|
return (0, import_node_crypto.randomUUID)();
|
|
@@ -49,9 +44,21 @@ async function runReasonEngine(args) {
|
|
|
49
44
|
const stream = args.stream ?? args.model.options?.streaming ?? true;
|
|
50
45
|
const emit = args.emit ?? true;
|
|
51
46
|
const temperature = args.temperature ?? args.model.options?.temperature ?? args.defaultTemperature;
|
|
52
|
-
const
|
|
47
|
+
const maxOutputTokens = args.maxOutputTokens ?? args.model.options?.maxOutputTokens;
|
|
48
|
+
const stopSequences = args.stopSequences ?? args.model.options?.stopSequences;
|
|
49
|
+
const abortSignal = args.abortSignal ?? args.model.options?.abortSignal;
|
|
50
|
+
const reasoning = args.reasoning ?? args.model.options?.reasoning;
|
|
51
|
+
const responseFormat = args.responseFormat ?? args.model.options?.responseFormat;
|
|
52
|
+
const providerOptions = args.providerOptions ?? args.model.options?.providerOptions;
|
|
53
|
+
const model = args.model.provider.getModel(args.model.modelId, {
|
|
53
54
|
...temperature !== void 0 ? { temperature } : {},
|
|
54
|
-
streaming: stream
|
|
55
|
+
streaming: stream,
|
|
56
|
+
...maxOutputTokens !== void 0 ? { maxOutputTokens } : {},
|
|
57
|
+
...stopSequences !== void 0 ? { stopSequences } : {},
|
|
58
|
+
...abortSignal !== void 0 ? { abortSignal } : {},
|
|
59
|
+
...reasoning !== void 0 ? { reasoning } : {},
|
|
60
|
+
...responseFormat !== void 0 ? { responseFormat } : {},
|
|
61
|
+
...providerOptions !== void 0 ? { providerOptions } : {}
|
|
55
62
|
});
|
|
56
63
|
const messages = [];
|
|
57
64
|
if (typeof args.system === "string" && args.system.length > 0) {
|
|
@@ -65,59 +72,154 @@ async function runReasonEngine(args) {
|
|
|
65
72
|
opId,
|
|
66
73
|
segmentId
|
|
67
74
|
};
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
75
|
+
const traceSpan = args.reasonTrace?.startSpan({
|
|
76
|
+
name: "runReasonEngine",
|
|
77
|
+
attributes: {
|
|
78
|
+
...commonMeta,
|
|
79
|
+
providerId: args.model.provider.id,
|
|
80
|
+
modelId: args.model.modelId,
|
|
81
|
+
stream,
|
|
82
|
+
emit,
|
|
83
|
+
...typeof args.nodeId === "string" && args.nodeId.length > 0 ? { nodeId: args.nodeId } : {}
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
const endTrace = (span, result) => {
|
|
87
|
+
span?.end?.({
|
|
88
|
+
...result.usage !== void 0 ? { usage: result.usage } : {},
|
|
89
|
+
...result.finishReason !== void 0 ? { finishReason: result.finishReason } : {},
|
|
90
|
+
...result.providerMetadata !== void 0 ? { providerMetadata: result.providerMetadata } : {},
|
|
91
|
+
...result.warnings !== void 0 ? { warnings: result.warnings } : {},
|
|
92
|
+
attributes: {
|
|
93
|
+
textLength: result.text.length
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
const failTrace = (span, error) => {
|
|
98
|
+
span?.fail?.(error, {
|
|
99
|
+
attributes: {
|
|
100
|
+
providerId: args.model.provider.id,
|
|
101
|
+
modelId: args.model.modelId
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
try {
|
|
106
|
+
if (stream) {
|
|
107
|
+
let final = "";
|
|
108
|
+
let raw;
|
|
109
|
+
let usage;
|
|
110
|
+
let finishReason;
|
|
111
|
+
let providerMetadata;
|
|
112
|
+
let warnings;
|
|
113
|
+
if (emit) {
|
|
114
|
+
emitNodeEvent(args.emitEvent, args.nodeId, "text-start", {
|
|
115
|
+
...commonMeta
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
const response2 = await model.stream(messages);
|
|
119
|
+
for await (const chunk of response2) {
|
|
120
|
+
switch (chunk.type) {
|
|
121
|
+
case "text-delta": {
|
|
122
|
+
if (chunk.delta.length === 0) break;
|
|
123
|
+
final += chunk.delta;
|
|
124
|
+
args.onTextChunk?.(chunk.delta);
|
|
125
|
+
if (chunk.raw !== void 0) {
|
|
126
|
+
raw = chunk.raw;
|
|
127
|
+
}
|
|
128
|
+
if (chunk.providerMetadata !== void 0) {
|
|
129
|
+
providerMetadata = chunk.providerMetadata;
|
|
130
|
+
}
|
|
131
|
+
if (emit) {
|
|
132
|
+
emitNodeEvent(args.emitEvent, args.nodeId, "text-delta", {
|
|
133
|
+
...commonMeta,
|
|
134
|
+
delta: chunk.delta
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
case "finish": {
|
|
140
|
+
if (chunk.raw !== void 0) {
|
|
141
|
+
raw = chunk.raw;
|
|
142
|
+
}
|
|
143
|
+
if (chunk.usage !== void 0) {
|
|
144
|
+
usage = chunk.usage;
|
|
145
|
+
}
|
|
146
|
+
if (chunk.finishReason !== void 0) {
|
|
147
|
+
finishReason = chunk.finishReason;
|
|
148
|
+
}
|
|
149
|
+
if (chunk.providerMetadata !== void 0) {
|
|
150
|
+
providerMetadata = chunk.providerMetadata;
|
|
151
|
+
}
|
|
152
|
+
if (chunk.warnings !== void 0) {
|
|
153
|
+
warnings = chunk.warnings;
|
|
154
|
+
}
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
case "raw": {
|
|
158
|
+
raw = chunk.raw;
|
|
159
|
+
if (chunk.providerMetadata !== void 0) {
|
|
160
|
+
providerMetadata = chunk.providerMetadata;
|
|
161
|
+
}
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
case "error": {
|
|
165
|
+
if (chunk.raw !== void 0) {
|
|
166
|
+
raw = chunk.raw;
|
|
167
|
+
}
|
|
168
|
+
if (chunk.providerMetadata !== void 0) {
|
|
169
|
+
providerMetadata = chunk.providerMetadata;
|
|
170
|
+
}
|
|
171
|
+
if (chunk.warnings !== void 0) {
|
|
172
|
+
warnings = chunk.warnings;
|
|
173
|
+
}
|
|
174
|
+
throw toError(chunk.error);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (emit) {
|
|
179
|
+
emitNodeEvent(args.emitEvent, args.nodeId, "text-end", {
|
|
180
|
+
...commonMeta
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
const result2 = {
|
|
184
|
+
text: final,
|
|
185
|
+
...raw !== void 0 ? { raw } : {},
|
|
186
|
+
...usage !== void 0 ? { usage } : {},
|
|
187
|
+
...finishReason !== void 0 ? { finishReason } : {},
|
|
188
|
+
...providerMetadata !== void 0 ? { providerMetadata } : {},
|
|
189
|
+
...warnings !== void 0 ? { warnings } : {}
|
|
190
|
+
};
|
|
191
|
+
endTrace(traceSpan, result2);
|
|
192
|
+
return result2;
|
|
193
|
+
}
|
|
194
|
+
const response = await model.invoke(messages);
|
|
71
195
|
if (emit) {
|
|
72
196
|
emitNodeEvent(args.emitEvent, args.nodeId, "text-start", {
|
|
73
197
|
...commonMeta
|
|
74
198
|
});
|
|
75
|
-
|
|
76
|
-
const response2 = await model.stream(messages);
|
|
77
|
-
for await (const chunk of response2) {
|
|
78
|
-
const text = chunkToText(chunk);
|
|
79
|
-
if (!text) continue;
|
|
80
|
-
final += text;
|
|
81
|
-
args.onTextChunk?.(text);
|
|
82
|
-
if (typeof chunk === "object" && chunk && "raw" in chunk) {
|
|
83
|
-
raw = chunk.raw;
|
|
84
|
-
}
|
|
85
|
-
if (emit) {
|
|
199
|
+
if (response.content) {
|
|
86
200
|
emitNodeEvent(args.emitEvent, args.nodeId, "text-delta", {
|
|
87
201
|
...commonMeta,
|
|
88
|
-
delta:
|
|
202
|
+
delta: response.content
|
|
89
203
|
});
|
|
90
204
|
}
|
|
91
|
-
}
|
|
92
|
-
if (emit) {
|
|
93
205
|
emitNodeEvent(args.emitEvent, args.nodeId, "text-end", {
|
|
94
206
|
...commonMeta
|
|
95
207
|
});
|
|
96
208
|
}
|
|
97
|
-
|
|
98
|
-
text:
|
|
99
|
-
...raw !== void 0 ? { raw } : {}
|
|
209
|
+
const result = {
|
|
210
|
+
text: response.content,
|
|
211
|
+
...response.raw !== void 0 ? { raw: response.raw } : {},
|
|
212
|
+
...response.usage !== void 0 ? { usage: response.usage } : {},
|
|
213
|
+
...response.finishReason !== void 0 ? { finishReason: response.finishReason } : {},
|
|
214
|
+
...response.providerMetadata !== void 0 ? { providerMetadata: response.providerMetadata } : {},
|
|
215
|
+
...response.warnings !== void 0 ? { warnings: response.warnings } : {}
|
|
100
216
|
};
|
|
217
|
+
endTrace(traceSpan, result);
|
|
218
|
+
return result;
|
|
219
|
+
} catch (error) {
|
|
220
|
+
failTrace(traceSpan, error);
|
|
221
|
+
throw error;
|
|
101
222
|
}
|
|
102
|
-
const response = await model.invoke(messages);
|
|
103
|
-
if (emit) {
|
|
104
|
-
emitNodeEvent(args.emitEvent, args.nodeId, "text-start", {
|
|
105
|
-
...commonMeta
|
|
106
|
-
});
|
|
107
|
-
if (response.content) {
|
|
108
|
-
emitNodeEvent(args.emitEvent, args.nodeId, "text-delta", {
|
|
109
|
-
...commonMeta,
|
|
110
|
-
delta: response.content
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
emitNodeEvent(args.emitEvent, args.nodeId, "text-end", {
|
|
114
|
-
...commonMeta
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
return {
|
|
118
|
-
text: response.content,
|
|
119
|
-
...response.raw !== void 0 ? { raw: response.raw } : {}
|
|
120
|
-
};
|
|
121
223
|
}
|
|
122
224
|
// Annotate the CommonJS export names for ESM import in node:
|
|
123
225
|
0 && (module.exports = {
|
package/dist/internal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/internal.ts","../src/reason-engine.ts"],"sourcesContent":["export type {\n RunReasonEngineArgs,\n RunReasonEngineResult,\n} from \"./reason-engine\";\nexport { runReasonEngine } from \"./reason-engine\";\n","import { randomUUID } from \"node:crypto\";\nimport type {\n GetProviderFn,\n KortyxPromptMessage,\n KortyxStreamChunk,\n ProviderModelRef,\n} from \"@kortyx/providers\";\n\nexport interface RunReasonEngineArgs {\n getProvider: GetProviderFn;\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | undefined;\n defaultTemperature?: number | undefined;\n stream?: boolean | undefined;\n emit?: boolean | undefined;\n nodeId?: string | undefined;\n emitEvent?: ((event: string, payload: unknown) => void) | undefined;\n onTextChunk?: ((text: string) => void) | undefined;\n id?: string | undefined;\n opId?: string | undefined;\n segmentId?: string | undefined;\n}\n\nexport interface RunReasonEngineResult {\n text: string;\n raw?: unknown;\n}\n\nconst chunkToText = (chunk: KortyxStreamChunk | string): string => {\n if (typeof chunk === \"string\") return chunk;\n if (typeof chunk.text === \"string\") return chunk.text;\n if (typeof chunk.content === \"string\") return chunk.content;\n return \"\";\n};\n\nconst createRuntimeId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nconst emitNodeEvent = (\n emitEvent: RunReasonEngineArgs[\"emitEvent\"],\n nodeId: string | undefined,\n event: string,\n payload: Record<string, unknown>,\n): void => {\n if (!emitEvent) return;\n emitEvent(event, {\n ...payload,\n ...(typeof nodeId === \"string\" && nodeId.length > 0\n ? { node: nodeId }\n : {}),\n });\n};\n\nexport async function runReasonEngine(\n args: RunReasonEngineArgs,\n): Promise<RunReasonEngineResult> {\n const stream = args.stream ?? args.model.options?.streaming ?? true;\n const emit = args.emit ?? true;\n const temperature =\n args.temperature ??\n args.model.options?.temperature ??\n args.defaultTemperature;\n\n const model = args.getProvider(args.model.providerId, args.model.modelId, {\n ...(temperature !== undefined ? { temperature } : {}),\n streaming: stream,\n });\n\n const messages: KortyxPromptMessage[] = [];\n if (typeof args.system === \"string\" && args.system.length > 0) {\n messages.push({ role: \"system\", content: args.system });\n }\n messages.push({ role: \"user\", content: String(args.input ?? \"\") });\n\n const opId =\n typeof args.opId === \"string\" && args.opId.length > 0\n ? args.opId\n : createRuntimeId();\n const segmentId =\n typeof args.segmentId === \"string\" && args.segmentId.length > 0\n ? args.segmentId\n : createRuntimeId();\n\n const commonMeta: Record<string, unknown> = {\n ...(typeof args.id === \"string\" && args.id.length > 0\n ? { id: args.id }\n : {}),\n opId,\n segmentId,\n };\n\n if (stream) {\n let final = \"\";\n let raw: unknown;\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-start\", {\n ...commonMeta,\n });\n }\n\n const response = await model.stream(messages);\n for await (const chunk of response) {\n const text = chunkToText(chunk);\n if (!text) continue;\n final += text;\n args.onTextChunk?.(text);\n if (typeof chunk === \"object\" && chunk && \"raw\" in chunk) {\n raw = (chunk as KortyxStreamChunk).raw;\n }\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: text,\n });\n }\n }\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n return {\n text: final,\n ...(raw !== undefined ? { raw } : {}),\n };\n }\n\n const response = await model.invoke(messages);\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-start\", {\n ...commonMeta,\n });\n if (response.content) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: response.content,\n });\n }\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n return {\n text: response.content,\n ...(response.raw !== undefined ? { raw: response.raw } : {}),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,yBAA2B;AA8B3B,IAAM,cAAc,CAAC,UAA8C;AACjE,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,MAAM,SAAS,SAAU,QAAO,MAAM;AACjD,MAAI,OAAO,MAAM,YAAY,SAAU,QAAO,MAAM;AACpD,SAAO;AACT;AAEA,IAAM,kBAAkB,MAAc;AACpC,MAAI;AACF,eAAO,+BAAW;AAAA,EACpB,QAAQ;AACN,WAAO,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAAA,EAC7D;AACF;AAEA,IAAM,gBAAgB,CACpB,WACA,QACA,OACA,YACS;AACT,MAAI,CAAC,UAAW;AAChB,YAAU,OAAO;AAAA,IACf,GAAG;AAAA,IACH,GAAI,OAAO,WAAW,YAAY,OAAO,SAAS,IAC9C,EAAE,MAAM,OAAO,IACf,CAAC;AAAA,EACP,CAAC;AACH;AAEA,eAAsB,gBACpB,MACgC;AAChC,QAAM,SAAS,KAAK,UAAU,KAAK,MAAM,SAAS,aAAa;AAC/D,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,cACJ,KAAK,eACL,KAAK,MAAM,SAAS,eACpB,KAAK;AAEP,QAAM,QAAQ,KAAK,YAAY,KAAK,MAAM,YAAY,KAAK,MAAM,SAAS;AAAA,IACxE,GAAI,gBAAgB,SAAY,EAAE,YAAY,IAAI,CAAC;AAAA,IACnD,WAAW;AAAA,EACb,CAAC;AAED,QAAM,WAAkC,CAAC;AACzC,MAAI,OAAO,KAAK,WAAW,YAAY,KAAK,OAAO,SAAS,GAAG;AAC7D,aAAS,KAAK,EAAE,MAAM,UAAU,SAAS,KAAK,OAAO,CAAC;AAAA,EACxD;AACA,WAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,OAAO,KAAK,SAAS,EAAE,EAAE,CAAC;AAEjE,QAAM,OACJ,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,IAChD,KAAK,OACL,gBAAgB;AACtB,QAAM,YACJ,OAAO,KAAK,cAAc,YAAY,KAAK,UAAU,SAAS,IAC1D,KAAK,YACL,gBAAgB;AAEtB,QAAM,aAAsC;AAAA,IAC1C,GAAI,OAAO,KAAK,OAAO,YAAY,KAAK,GAAG,SAAS,IAChD,EAAE,IAAI,KAAK,GAAG,IACd,CAAC;AAAA,IACL;AAAA,IACA;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,QAAI,QAAQ;AACZ,QAAI;AAEJ,QAAI,MAAM;AACR,oBAAc,KAAK,WAAW,KAAK,QAAQ,cAAc;AAAA,QACvD,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AAEA,UAAMA,YAAW,MAAM,MAAM,OAAO,QAAQ;AAC5C,qBAAiB,SAASA,WAAU;AAClC,YAAM,OAAO,YAAY,KAAK;AAC9B,UAAI,CAAC,KAAM;AACX,eAAS;AACT,WAAK,cAAc,IAAI;AACvB,UAAI,OAAO,UAAU,YAAY,SAAS,SAAS,OAAO;AACxD,cAAO,MAA4B;AAAA,MACrC;AACA,UAAI,MAAM;AACR,sBAAc,KAAK,WAAW,KAAK,QAAQ,cAAc;AAAA,UACvD,GAAG;AAAA,UACH,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,MAAM;AACR,oBAAc,KAAK,WAAW,KAAK,QAAQ,YAAY;AAAA,QACrD,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,GAAI,QAAQ,SAAY,EAAE,IAAI,IAAI,CAAC;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,MAAM,OAAO,QAAQ;AAE5C,MAAI,MAAM;AACR,kBAAc,KAAK,WAAW,KAAK,QAAQ,cAAc;AAAA,MACvD,GAAG;AAAA,IACL,CAAC;AACD,QAAI,SAAS,SAAS;AACpB,oBAAc,KAAK,WAAW,KAAK,QAAQ,cAAc;AAAA,QACvD,GAAG;AAAA,QACH,OAAO,SAAS;AAAA,MAClB,CAAC;AAAA,IACH;AACA,kBAAc,KAAK,WAAW,KAAK,QAAQ,YAAY;AAAA,MACrD,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,MAAM,SAAS;AAAA,IACf,GAAI,SAAS,QAAQ,SAAY,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC;AAAA,EAC5D;AACF;","names":["response"]}
|
|
1
|
+
{"version":3,"sources":["../src/internal.ts","../src/reason-engine.ts"],"sourcesContent":["export type {\n RunReasonEngineArgs,\n RunReasonEngineResult,\n} from \"./reason-engine\";\nexport { runReasonEngine } from \"./reason-engine\";\nexport type { ReasonTraceAdapter } from \"./tracing\";\n","import { randomUUID } from \"node:crypto\";\nimport type {\n KortyxFinishReason,\n KortyxPromptMessage,\n KortyxProviderMetadata,\n KortyxReasoningOptions,\n KortyxResponseFormat,\n KortyxStreamPart,\n KortyxUsage,\n KortyxWarning,\n ProviderModelRef,\n} from \"@kortyx/providers\";\nimport type { ReasonTraceAdapter, ReasonTraceSpan } from \"./tracing\";\n\nexport interface RunReasonEngineArgs {\n model: ProviderModelRef;\n input: string;\n system?: string | undefined;\n temperature?: number | undefined;\n maxOutputTokens?: number | undefined;\n stopSequences?: string[] | undefined;\n abortSignal?: AbortSignal | undefined;\n reasoning?: KortyxReasoningOptions | undefined;\n responseFormat?: KortyxResponseFormat | undefined;\n providerOptions?: Record<string, unknown> | undefined;\n defaultTemperature?: number | undefined;\n stream?: boolean | undefined;\n emit?: boolean | undefined;\n nodeId?: string | undefined;\n emitEvent?: ((event: string, payload: unknown) => void) | undefined;\n onTextChunk?: ((text: string) => void) | undefined;\n id?: string | undefined;\n opId?: string | undefined;\n segmentId?: string | undefined;\n reasonTrace?: ReasonTraceAdapter | undefined;\n}\n\nexport interface RunReasonEngineResult {\n text: string;\n raw?: unknown;\n usage?: KortyxUsage;\n finishReason?: KortyxFinishReason;\n providerMetadata?: KortyxProviderMetadata;\n warnings?: KortyxWarning[];\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\nconst createRuntimeId = (): string => {\n try {\n return randomUUID();\n } catch {\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n};\n\nconst emitNodeEvent = (\n emitEvent: RunReasonEngineArgs[\"emitEvent\"],\n nodeId: string | undefined,\n event: string,\n payload: Record<string, unknown>,\n): void => {\n if (!emitEvent) return;\n emitEvent(event, {\n ...payload,\n ...(typeof nodeId === \"string\" && nodeId.length > 0\n ? { node: nodeId }\n : {}),\n });\n};\n\nexport async function runReasonEngine(\n args: RunReasonEngineArgs,\n): Promise<RunReasonEngineResult> {\n const stream = args.stream ?? args.model.options?.streaming ?? true;\n const emit = args.emit ?? true;\n const temperature =\n args.temperature ??\n args.model.options?.temperature ??\n args.defaultTemperature;\n const maxOutputTokens =\n args.maxOutputTokens ?? args.model.options?.maxOutputTokens;\n const stopSequences = args.stopSequences ?? args.model.options?.stopSequences;\n const abortSignal = args.abortSignal ?? args.model.options?.abortSignal;\n const reasoning = args.reasoning ?? args.model.options?.reasoning;\n const responseFormat =\n args.responseFormat ?? args.model.options?.responseFormat;\n const providerOptions =\n args.providerOptions ?? args.model.options?.providerOptions;\n\n const model = args.model.provider.getModel(args.model.modelId, {\n ...(temperature !== undefined ? { temperature } : {}),\n streaming: stream,\n ...(maxOutputTokens !== undefined ? { maxOutputTokens } : {}),\n ...(stopSequences !== undefined ? { stopSequences } : {}),\n ...(abortSignal !== undefined ? { abortSignal } : {}),\n ...(reasoning !== undefined ? { reasoning } : {}),\n ...(responseFormat !== undefined ? { responseFormat } : {}),\n ...(providerOptions !== undefined ? { providerOptions } : {}),\n });\n\n const messages: KortyxPromptMessage[] = [];\n if (typeof args.system === \"string\" && args.system.length > 0) {\n messages.push({ role: \"system\", content: args.system });\n }\n messages.push({ role: \"user\", content: String(args.input ?? \"\") });\n\n const opId =\n typeof args.opId === \"string\" && args.opId.length > 0\n ? args.opId\n : createRuntimeId();\n const segmentId =\n typeof args.segmentId === \"string\" && args.segmentId.length > 0\n ? args.segmentId\n : createRuntimeId();\n\n const commonMeta: Record<string, unknown> = {\n ...(typeof args.id === \"string\" && args.id.length > 0\n ? { id: args.id }\n : {}),\n opId,\n segmentId,\n };\n const traceSpan = args.reasonTrace?.startSpan({\n name: \"runReasonEngine\",\n attributes: {\n ...commonMeta,\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n stream,\n emit,\n ...(typeof args.nodeId === \"string\" && args.nodeId.length > 0\n ? { nodeId: args.nodeId }\n : {}),\n },\n });\n\n const endTrace = (\n span: ReasonTraceSpan | undefined,\n result: RunReasonEngineResult,\n ): void => {\n span?.end?.({\n ...(result.usage !== undefined ? { usage: result.usage } : {}),\n ...(result.finishReason !== undefined\n ? { finishReason: result.finishReason }\n : {}),\n ...(result.providerMetadata !== undefined\n ? { providerMetadata: result.providerMetadata }\n : {}),\n ...(result.warnings !== undefined ? { warnings: result.warnings } : {}),\n attributes: {\n textLength: result.text.length,\n },\n });\n };\n\n const failTrace = (\n span: ReasonTraceSpan | undefined,\n error: unknown,\n ): void => {\n span?.fail?.(error, {\n attributes: {\n providerId: args.model.provider.id,\n modelId: args.model.modelId,\n },\n });\n };\n\n try {\n if (stream) {\n let final = \"\";\n let raw: unknown;\n let usage: KortyxUsage | undefined;\n let finishReason: KortyxFinishReason | undefined;\n let providerMetadata: KortyxProviderMetadata | undefined;\n let warnings: KortyxWarning[] | undefined;\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-start\", {\n ...commonMeta,\n });\n }\n\n const response = await model.stream(messages);\n for await (const chunk of response) {\n switch (chunk.type) {\n case \"text-delta\": {\n if (chunk.delta.length === 0) break;\n final += chunk.delta;\n args.onTextChunk?.(chunk.delta);\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: chunk.delta,\n });\n }\n break;\n }\n case \"finish\": {\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.usage !== undefined) {\n usage = chunk.usage;\n }\n if (chunk.finishReason !== undefined) {\n finishReason = chunk.finishReason;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (chunk.warnings !== undefined) {\n warnings = chunk.warnings;\n }\n break;\n }\n case \"raw\": {\n raw = chunk.raw;\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n break;\n }\n case \"error\": {\n if (chunk.raw !== undefined) {\n raw = chunk.raw;\n }\n if (chunk.providerMetadata !== undefined) {\n providerMetadata = chunk.providerMetadata;\n }\n if (chunk.warnings !== undefined) {\n warnings = chunk.warnings;\n }\n throw toError(chunk.error);\n }\n }\n }\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n const result = {\n text: final,\n ...(raw !== undefined ? { raw } : {}),\n ...(usage !== undefined ? { usage } : {}),\n ...(finishReason !== undefined ? { finishReason } : {}),\n ...(providerMetadata !== undefined ? { providerMetadata } : {}),\n ...(warnings !== undefined ? { warnings } : {}),\n };\n endTrace(traceSpan, result);\n return result;\n }\n\n const response = await model.invoke(messages);\n\n if (emit) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-start\", {\n ...commonMeta,\n });\n if (response.content) {\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-delta\", {\n ...commonMeta,\n delta: response.content,\n });\n }\n emitNodeEvent(args.emitEvent, args.nodeId, \"text-end\", {\n ...commonMeta,\n });\n }\n\n const result = {\n text: response.content,\n ...(response.raw !== undefined ? { raw: response.raw } : {}),\n ...(response.usage !== undefined ? { usage: response.usage } : {}),\n ...(response.finishReason !== undefined\n ? { finishReason: response.finishReason }\n : {}),\n ...(response.providerMetadata !== undefined\n ? { providerMetadata: response.providerMetadata }\n : {}),\n ...(response.warnings !== undefined\n ? { warnings: response.warnings }\n : {}),\n };\n endTrace(traceSpan, result);\n return result;\n } catch (error) {\n failTrace(traceSpan, error);\n throw error;\n }\n}\n"],"mappings":"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","names":["response","result"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { KortyxUsage, KortyxFinishReason, KortyxProviderMetadata, KortyxWarning } from '@kortyx/providers';
|
|
2
|
+
|
|
3
|
+
type ReasonTraceAttributes = Record<string, unknown>;
|
|
4
|
+
interface ReasonTraceSpanStartArgs {
|
|
5
|
+
name: "useReason" | "runReasonEngine";
|
|
6
|
+
attributes?: ReasonTraceAttributes;
|
|
7
|
+
}
|
|
8
|
+
interface ReasonTraceSpanEndArgs {
|
|
9
|
+
attributes?: ReasonTraceAttributes;
|
|
10
|
+
usage?: KortyxUsage;
|
|
11
|
+
finishReason?: KortyxFinishReason;
|
|
12
|
+
providerMetadata?: KortyxProviderMetadata;
|
|
13
|
+
warnings?: KortyxWarning[];
|
|
14
|
+
}
|
|
15
|
+
interface ReasonTraceSpan {
|
|
16
|
+
setAttributes?: (attributes: ReasonTraceAttributes) => void;
|
|
17
|
+
addEvent?: (name: string, attributes?: ReasonTraceAttributes) => void;
|
|
18
|
+
end?: (args?: ReasonTraceSpanEndArgs) => void;
|
|
19
|
+
fail?: (error: unknown, args?: ReasonTraceSpanEndArgs) => void;
|
|
20
|
+
}
|
|
21
|
+
interface ReasonTraceAdapter {
|
|
22
|
+
startSpan: (args: ReasonTraceSpanStartArgs) => ReasonTraceSpan | undefined;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type { ReasonTraceAdapter as R, ReasonTraceAttributes as a, ReasonTraceSpan as b, ReasonTraceSpanEndArgs as c, ReasonTraceSpanStartArgs as d };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kortyx/hooks",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Lifecycle hooks and extension points for Kortyx.",
|
|
6
6
|
"keywords": [
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"zod": "^4.1.13",
|
|
40
40
|
"@kortyx/core": "0.5.0",
|
|
41
|
-
"@kortyx/providers": "0.
|
|
41
|
+
"@kortyx/providers": "0.4.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"turbo": "^2.5.4",
|