gauss-ai 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +489 -0
- package/LICENSE +21 -0
- package/README.md +269 -0
- package/dist/a2a/index.cjs +7 -0
- package/dist/a2a/index.cjs.map +1 -0
- package/dist/a2a/index.d.cts +30 -0
- package/dist/a2a/index.d.ts +30 -0
- package/dist/a2a/index.js +7 -0
- package/dist/a2a/index.js.map +1 -0
- package/dist/agent-UIQDSYCE.js +16 -0
- package/dist/agent-UIQDSYCE.js.map +1 -0
- package/dist/agent-builder-8W3mBR-N.d.ts +1075 -0
- package/dist/agent-builder-GEMYdb1p.d.cts +1075 -0
- package/dist/agent-graph-AMQYAWNF.js +1422 -0
- package/dist/agent-graph-AMQYAWNF.js.map +1 -0
- package/dist/ai-sdk-mcp.adapter-SEN6KHNU.js +124 -0
- package/dist/ai-sdk-mcp.adapter-SEN6KHNU.js.map +1 -0
- package/dist/browser/index.js +10 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/bun-runtime.adapter-MQDAJLQM.js +8 -0
- package/dist/bun-runtime.adapter-MQDAJLQM.js.map +1 -0
- package/dist/bun-runtime.adapter-XKOUXVAK.cjs +8 -0
- package/dist/bun-runtime.adapter-XKOUXVAK.cjs.map +1 -0
- package/dist/chat-A3XMRPJL.js +129 -0
- package/dist/chat-A3XMRPJL.js.map +1 -0
- package/dist/chunk-2ZRU47NC.js +91 -0
- package/dist/chunk-2ZRU47NC.js.map +1 -0
- package/dist/chunk-3LD3JTH4.cjs +18 -0
- package/dist/chunk-3LD3JTH4.cjs.map +1 -0
- package/dist/chunk-5FE5TG2W.cjs +16 -0
- package/dist/chunk-5FE5TG2W.cjs.map +1 -0
- package/dist/chunk-6XF673YC.cjs +436 -0
- package/dist/chunk-6XF673YC.cjs.map +1 -0
- package/dist/chunk-7CKWZJNS.js +230 -0
- package/dist/chunk-7CKWZJNS.js.map +1 -0
- package/dist/chunk-BI2G665F.js +4588 -0
- package/dist/chunk-BI2G665F.js.map +1 -0
- package/dist/chunk-C5NLWJS2.js +139 -0
- package/dist/chunk-C5NLWJS2.js.map +1 -0
- package/dist/chunk-CJZ66SU3.cjs +4321 -0
- package/dist/chunk-CJZ66SU3.cjs.map +1 -0
- package/dist/chunk-DAMT2CXW.cjs +91 -0
- package/dist/chunk-DAMT2CXW.cjs.map +1 -0
- package/dist/chunk-E7WG3MO5.js +18 -0
- package/dist/chunk-E7WG3MO5.js.map +1 -0
- package/dist/chunk-EFDM6R4J.js +99 -0
- package/dist/chunk-EFDM6R4J.js.map +1 -0
- package/dist/chunk-F7WIPPEO.js +256 -0
- package/dist/chunk-F7WIPPEO.js.map +1 -0
- package/dist/chunk-FAYDE67N.js +6927 -0
- package/dist/chunk-FAYDE67N.js.map +1 -0
- package/dist/chunk-GAE2KKCM.js +21 -0
- package/dist/chunk-GAE2KKCM.js.map +1 -0
- package/dist/chunk-INLNGRXM.cjs +130 -0
- package/dist/chunk-INLNGRXM.cjs.map +1 -0
- package/dist/chunk-JKXKXB5O.js +130 -0
- package/dist/chunk-JKXKXB5O.js.map +1 -0
- package/dist/chunk-K6SAETGP.js +375 -0
- package/dist/chunk-K6SAETGP.js.map +1 -0
- package/dist/chunk-KEASLAYR.js +157 -0
- package/dist/chunk-KEASLAYR.js.map +1 -0
- package/dist/chunk-KKJVNM6O.js +436 -0
- package/dist/chunk-KKJVNM6O.js.map +1 -0
- package/dist/chunk-KYIMVRIM.js +16 -0
- package/dist/chunk-KYIMVRIM.js.map +1 -0
- package/dist/chunk-MB7NXIZD.js +4321 -0
- package/dist/chunk-MB7NXIZD.js.map +1 -0
- package/dist/chunk-MHHDXPGE.js +209 -0
- package/dist/chunk-MHHDXPGE.js.map +1 -0
- package/dist/chunk-NE6JJA5W.js +401 -0
- package/dist/chunk-NE6JJA5W.js.map +1 -0
- package/dist/chunk-PF46XZBF.cjs +6927 -0
- package/dist/chunk-PF46XZBF.cjs.map +1 -0
- package/dist/chunk-PSJIAGDE.cjs +375 -0
- package/dist/chunk-PSJIAGDE.cjs.map +1 -0
- package/dist/chunk-PWOQDXNQ.js +16 -0
- package/dist/chunk-PWOQDXNQ.js.map +1 -0
- package/dist/chunk-QYOMQBBZ.cjs +230 -0
- package/dist/chunk-QYOMQBBZ.cjs.map +1 -0
- package/dist/chunk-UDFXLC4J.cjs +16 -0
- package/dist/chunk-UDFXLC4J.cjs.map +1 -0
- package/dist/chunk-UO4NGXRT.cjs +259 -0
- package/dist/chunk-UO4NGXRT.cjs.map +1 -0
- package/dist/chunk-UPFDFLEW.js +40 -0
- package/dist/chunk-UPFDFLEW.js.map +1 -0
- package/dist/chunk-V55JSQS7.cjs +16 -0
- package/dist/chunk-V55JSQS7.cjs.map +1 -0
- package/dist/chunk-VJADHXZL.cjs +16 -0
- package/dist/chunk-VJADHXZL.cjs.map +1 -0
- package/dist/chunk-VRWD7LCI.js +59 -0
- package/dist/chunk-VRWD7LCI.js.map +1 -0
- package/dist/chunk-WKKQ443C.js +487 -0
- package/dist/chunk-WKKQ443C.js.map +1 -0
- package/dist/chunk-X2GHUHAF.js +436 -0
- package/dist/chunk-X2GHUHAF.js.map +1 -0
- package/dist/chunk-XLGW3XNI.cjs +256 -0
- package/dist/chunk-XLGW3XNI.cjs.map +1 -0
- package/dist/chunk-ZFJKX4DP.js +16 -0
- package/dist/chunk-ZFJKX4DP.js.map +1 -0
- package/dist/chunk-ZM2OEWM2.js +259 -0
- package/dist/chunk-ZM2OEWM2.js.map +1 -0
- package/dist/chunk-ZNAIP2XV.js +16 -0
- package/dist/chunk-ZNAIP2XV.js.map +1 -0
- package/dist/chunk-ZYFAZYSL.js +42 -0
- package/dist/chunk-ZYFAZYSL.js.map +1 -0
- package/dist/cli/index.js +421 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config-4MHT6TQW.js +153 -0
- package/dist/config-4MHT6TQW.js.map +1 -0
- package/dist/config-REERQFK4.cjs +153 -0
- package/dist/config-REERQFK4.cjs.map +1 -0
- package/dist/cost-tracker-JLOU7IZJ.js +7 -0
- package/dist/cost-tracker-JLOU7IZJ.js.map +1 -0
- package/dist/demo-C52GMSYH.js +188 -0
- package/dist/demo-C52GMSYH.js.map +1 -0
- package/dist/deno/index.js +306 -0
- package/dist/deno/index.js.map +1 -0
- package/dist/deno-runtime.adapter-F744HY7K.js +8 -0
- package/dist/deno-runtime.adapter-F744HY7K.js.map +1 -0
- package/dist/deno-runtime.adapter-RFEVNSCV.cjs +8 -0
- package/dist/deno-runtime.adapter-RFEVNSCV.cjs.map +1 -0
- package/dist/dev-D7DDVDA4.js +218 -0
- package/dist/dev-D7DDVDA4.js.map +1 -0
- package/dist/edge/index.js +10 -0
- package/dist/edge/index.js.map +1 -0
- package/dist/edge-runtime.adapter-UQCW2F7X.js +8 -0
- package/dist/edge-runtime.adapter-UQCW2F7X.js.map +1 -0
- package/dist/edge-runtime.adapter-YED6F3AY.cjs +8 -0
- package/dist/edge-runtime.adapter-YED6F3AY.cjs.map +1 -0
- package/dist/graph-MGFAQZ5W.js +50 -0
- package/dist/graph-MGFAQZ5W.js.map +1 -0
- package/dist/graph-visualization-HBSVQXJK.js +9 -0
- package/dist/graph-visualization-HBSVQXJK.js.map +1 -0
- package/dist/index-BRgqNnh3.d.cts +982 -0
- package/dist/index-CZxpYUxZ.d.ts +982 -0
- package/dist/index.cjs +14789 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +10275 -0
- package/dist/index.d.ts +10275 -0
- package/dist/index.js +14789 -0
- package/dist/index.js.map +1 -0
- package/dist/init-CFWXTQ35.js +133 -0
- package/dist/init-CFWXTQ35.js.map +1 -0
- package/dist/llm-VWO4MC7J.cjs +17 -0
- package/dist/llm-VWO4MC7J.cjs.map +1 -0
- package/dist/llm-XLXVSPBI.js +17 -0
- package/dist/llm-XLXVSPBI.js.map +1 -0
- package/dist/logging-WRAK5ZXT.js +33 -0
- package/dist/logging-WRAK5ZXT.js.map +1 -0
- package/dist/metrics-FAHZVVD4.js +47 -0
- package/dist/metrics-FAHZVVD4.js.map +1 -0
- package/dist/node/index.cjs +280 -0
- package/dist/node/index.cjs.map +1 -0
- package/dist/node/index.d.cts +51 -0
- package/dist/node/index.d.ts +51 -0
- package/dist/node/index.js +280 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node-runtime.adapter-5L7PJ6W2.js +8 -0
- package/dist/node-runtime.adapter-5L7PJ6W2.js.map +1 -0
- package/dist/node-runtime.adapter-CCRZVGHB.cjs +8 -0
- package/dist/node-runtime.adapter-CCRZVGHB.cjs.map +1 -0
- package/dist/persist-usage-WTBTCWEF.js +7 -0
- package/dist/persist-usage-WTBTCWEF.js.map +1 -0
- package/dist/plugin-RCPBWUUA.js +207 -0
- package/dist/plugin-RCPBWUUA.js.map +1 -0
- package/dist/plugins/index.cjs +75 -0
- package/dist/plugins/index.cjs.map +1 -0
- package/dist/plugins/index.d.cts +8 -0
- package/dist/plugins/index.d.ts +8 -0
- package/dist/plugins/index.js +75 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins-L4ING3CX.js +4625 -0
- package/dist/plugins-L4ING3CX.js.map +1 -0
- package/dist/providers/index.cjs +189 -0
- package/dist/providers/index.cjs.map +1 -0
- package/dist/providers/index.d.cts +168 -0
- package/dist/providers/index.d.ts +168 -0
- package/dist/providers/index.js +189 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers-3RNQ5CKZ.js +59 -0
- package/dist/providers-3RNQ5CKZ.js.map +1 -0
- package/dist/providers-66GPXUGQ.cjs +59 -0
- package/dist/providers-66GPXUGQ.cjs.map +1 -0
- package/dist/repl-K6QN4I2S.js +678 -0
- package/dist/repl-K6QN4I2S.js.map +1 -0
- package/dist/rest/index.cjs +17 -0
- package/dist/rest/index.cjs.map +1 -0
- package/dist/rest/index.d.cts +102 -0
- package/dist/rest/index.d.ts +102 -0
- package/dist/rest/index.js +17 -0
- package/dist/rest/index.js.map +1 -0
- package/dist/runtime-deno.js +15 -0
- package/dist/runtime-deno.js.map +1 -0
- package/dist/runtime-edge.js +15 -0
- package/dist/runtime-edge.js.map +1 -0
- package/dist/runtime-node.js +15 -0
- package/dist/runtime-node.js.map +1 -0
- package/dist/scraping/index.cjs +11 -0
- package/dist/scraping/index.cjs.map +1 -0
- package/dist/scraping/index.d.cts +17 -0
- package/dist/scraping/index.d.ts +17 -0
- package/dist/scraping/index.js +11 -0
- package/dist/scraping/index.js.map +1 -0
- package/dist/semantic-scraping.port-CZWUea88.d.cts +54 -0
- package/dist/semantic-scraping.port-CZWUea88.d.ts +54 -0
- package/dist/server/index.js +166 -0
- package/dist/server/index.js.map +1 -0
- package/dist/testing/index.cjs +25 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +63 -0
- package/dist/testing/index.d.ts +63 -0
- package/dist/testing/index.js +25 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/token-counter.port-CRgxZZGe.d.ts +334 -0
- package/dist/token-counter.port-D7BHMCRR.d.cts +334 -0
- package/dist/tools-BZM33OBZ.js +10 -0
- package/dist/tools-BZM33OBZ.js.map +1 -0
- package/dist/tracing-XA3TEWP4.js +48 -0
- package/dist/tracing-XA3TEWP4.js.map +1 -0
- package/dist/types-CVsP7gFI.d.cts +235 -0
- package/dist/types-CVsP7gFI.d.ts +235 -0
- package/dist/virtual-fs.adapter-BBLS-3AY.d.ts +26 -0
- package/dist/virtual-fs.adapter-nb0CTYOj.d.cts +26 -0
- package/dist/workflow/index.cjs +9 -0
- package/dist/workflow/index.cjs.map +1 -0
- package/dist/workflow/index.d.cts +62 -0
- package/dist/workflow/index.d.ts +62 -0
- package/dist/workflow/index.js +9 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow.port-BaCttxrw.d.cts +153 -0
- package/dist/workflow.port-BaCttxrw.d.ts +153 -0
- package/package.json +230 -0
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
// src/core/llm/tool.ts
|
|
2
|
+
function tool(config) {
|
|
3
|
+
return {
|
|
4
|
+
type: "function",
|
|
5
|
+
description: config.description,
|
|
6
|
+
parameters: config.inputSchema,
|
|
7
|
+
execute: config.execute
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// src/core/llm/generate-text.ts
|
|
12
|
+
function zodToJsonSchema(schema) {
|
|
13
|
+
if (!schema) return {};
|
|
14
|
+
const s = schema;
|
|
15
|
+
if (s._def?.typeName === "ZodObject" && s.shape) {
|
|
16
|
+
const shape = typeof s.shape === "function" ? s.shape() : s.shape;
|
|
17
|
+
const properties = {};
|
|
18
|
+
const required = [];
|
|
19
|
+
for (const [key, val] of Object.entries(shape)) {
|
|
20
|
+
const zodField = val;
|
|
21
|
+
properties[key] = { type: "string" };
|
|
22
|
+
if (zodField._def?.typeName === "ZodString") properties[key] = { type: "string" };
|
|
23
|
+
else if (zodField._def?.typeName === "ZodNumber") properties[key] = { type: "number" };
|
|
24
|
+
else if (zodField._def?.typeName === "ZodBoolean") properties[key] = { type: "boolean" };
|
|
25
|
+
else if (zodField._def?.typeName === "ZodArray") properties[key] = { type: "array" };
|
|
26
|
+
if (zodField._def?.description) properties[key].description = zodField._def.description;
|
|
27
|
+
if (typeof zodField.isOptional !== "function" || !zodField.isOptional()) {
|
|
28
|
+
required.push(key);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return { type: "object", properties, ...required.length > 0 ? { required } : {} };
|
|
32
|
+
}
|
|
33
|
+
return { type: "object" };
|
|
34
|
+
}
|
|
35
|
+
function toolsToLanguageModelTools(tools) {
|
|
36
|
+
return Object.entries(tools).map(([name, def]) => ({
|
|
37
|
+
type: "function",
|
|
38
|
+
name,
|
|
39
|
+
description: def.description,
|
|
40
|
+
parameters: zodToJsonSchema(def.parameters)
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
function buildMessages(options) {
|
|
44
|
+
const msgs = [];
|
|
45
|
+
if (options.system) {
|
|
46
|
+
msgs.push({ role: "system", content: options.system });
|
|
47
|
+
}
|
|
48
|
+
if (options.messages) {
|
|
49
|
+
msgs.push(...options.messages);
|
|
50
|
+
}
|
|
51
|
+
if (options.prompt) {
|
|
52
|
+
msgs.push({ role: "user", content: options.prompt });
|
|
53
|
+
}
|
|
54
|
+
return msgs;
|
|
55
|
+
}
|
|
56
|
+
async function executeTools(toolCalls, tools, abortSignal) {
|
|
57
|
+
const results = [];
|
|
58
|
+
for (const call of toolCalls) {
|
|
59
|
+
const toolDef = tools[call.toolName];
|
|
60
|
+
if (!toolDef?.execute) {
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const args = typeof call.args === "string" ? JSON.parse(call.args) : call.args;
|
|
65
|
+
const result = await toolDef.execute(args, { abortSignal, toolCallId: call.toolCallId });
|
|
66
|
+
results.push({
|
|
67
|
+
toolCallId: call.toolCallId,
|
|
68
|
+
toolName: call.toolName,
|
|
69
|
+
result
|
|
70
|
+
});
|
|
71
|
+
} catch (err) {
|
|
72
|
+
results.push({
|
|
73
|
+
toolCallId: call.toolCallId,
|
|
74
|
+
toolName: call.toolName,
|
|
75
|
+
result: String(err),
|
|
76
|
+
isError: true
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return results;
|
|
81
|
+
}
|
|
82
|
+
async function generateText(options) {
|
|
83
|
+
const { model, tools, stopWhen, maxSteps, abortSignal, onStepFinish, onFinish } = options;
|
|
84
|
+
const lmTools = tools ? toolsToLanguageModelTools(tools) : void 0;
|
|
85
|
+
const messages = buildMessages(options);
|
|
86
|
+
const steps = [];
|
|
87
|
+
const totalUsage = { inputTokens: 0, outputTokens: 0 };
|
|
88
|
+
const stopConditions = [];
|
|
89
|
+
if (stopWhen) {
|
|
90
|
+
if (Array.isArray(stopWhen)) stopConditions.push(...stopWhen);
|
|
91
|
+
else stopConditions.push(stopWhen);
|
|
92
|
+
}
|
|
93
|
+
if (maxSteps && stopConditions.length === 0) {
|
|
94
|
+
stopConditions.push(({ steps: s }) => s.length >= maxSteps);
|
|
95
|
+
}
|
|
96
|
+
if (stopConditions.length === 0) {
|
|
97
|
+
stopConditions.push(({ steps: s }) => s.length >= 20);
|
|
98
|
+
}
|
|
99
|
+
let lastText = "";
|
|
100
|
+
let lastFinishReason = "stop";
|
|
101
|
+
let lastToolCalls = [];
|
|
102
|
+
let lastToolResults = [];
|
|
103
|
+
let lastResponse;
|
|
104
|
+
while (true) {
|
|
105
|
+
const mode = lmTools && lmTools.length > 0 ? { type: "regular", tools: lmTools, toolChoice: options.toolChoice } : options.output ? { type: "object-json", schema: zodToJsonSchema(options.output.schema) } : { type: "regular" };
|
|
106
|
+
const result = await model.doGenerate({
|
|
107
|
+
inputFormat: "messages",
|
|
108
|
+
mode,
|
|
109
|
+
prompt: messages,
|
|
110
|
+
abortSignal
|
|
111
|
+
});
|
|
112
|
+
totalUsage.inputTokens += result.usage.inputTokens;
|
|
113
|
+
totalUsage.outputTokens += result.usage.outputTokens;
|
|
114
|
+
lastText = result.text ?? "";
|
|
115
|
+
lastFinishReason = result.finishReason;
|
|
116
|
+
lastToolCalls = result.toolCalls ?? [];
|
|
117
|
+
lastResponse = result.response;
|
|
118
|
+
if (lastFinishReason === "tool-calls" && lastToolCalls.length > 0 && tools) {
|
|
119
|
+
lastToolResults = await executeTools(lastToolCalls, tools, abortSignal);
|
|
120
|
+
const toolCallParts = lastToolCalls.map((tc) => ({
|
|
121
|
+
type: "tool-call",
|
|
122
|
+
toolCallType: "function",
|
|
123
|
+
toolCallId: tc.toolCallId,
|
|
124
|
+
toolName: tc.toolName,
|
|
125
|
+
args: tc.args
|
|
126
|
+
}));
|
|
127
|
+
messages.push({ role: "assistant", content: lastText ? [{ type: "text", text: lastText }, ...toolCallParts] : toolCallParts });
|
|
128
|
+
const toolResultParts = lastToolResults.map((tr) => ({
|
|
129
|
+
type: "tool-result",
|
|
130
|
+
toolCallId: tr.toolCallId,
|
|
131
|
+
toolName: tr.toolName,
|
|
132
|
+
result: tr.result,
|
|
133
|
+
isError: tr.isError
|
|
134
|
+
}));
|
|
135
|
+
messages.push({ role: "tool", content: toolResultParts });
|
|
136
|
+
} else {
|
|
137
|
+
lastToolResults = [];
|
|
138
|
+
}
|
|
139
|
+
const step = {
|
|
140
|
+
text: lastText,
|
|
141
|
+
toolCalls: lastToolCalls.map((tc) => ({
|
|
142
|
+
toolCallType: "function",
|
|
143
|
+
toolCallId: tc.toolCallId,
|
|
144
|
+
toolName: tc.toolName,
|
|
145
|
+
args: typeof tc.args === "string" ? JSON.parse(tc.args) : tc.args
|
|
146
|
+
})),
|
|
147
|
+
toolResults: lastToolResults,
|
|
148
|
+
finishReason: lastFinishReason,
|
|
149
|
+
usage: { ...result.usage },
|
|
150
|
+
response: lastResponse
|
|
151
|
+
};
|
|
152
|
+
steps.push(step);
|
|
153
|
+
if (onStepFinish) await onStepFinish(step);
|
|
154
|
+
const shouldStop = await Promise.all(
|
|
155
|
+
stopConditions.map((cond) => cond({ steps }))
|
|
156
|
+
);
|
|
157
|
+
if (shouldStop.some(Boolean)) break;
|
|
158
|
+
if (lastFinishReason !== "tool-calls" || lastToolCalls.length === 0) break;
|
|
159
|
+
const hasUnexecutableTool = lastToolCalls.some((tc) => !tools[tc.toolName]?.execute);
|
|
160
|
+
if (hasUnexecutableTool) break;
|
|
161
|
+
}
|
|
162
|
+
const finalResult = {
|
|
163
|
+
text: lastText,
|
|
164
|
+
toolCalls: lastToolCalls.map((tc) => ({
|
|
165
|
+
toolCallType: "function",
|
|
166
|
+
toolCallId: tc.toolCallId,
|
|
167
|
+
toolName: tc.toolName,
|
|
168
|
+
args: typeof tc.args === "string" ? JSON.parse(tc.args) : tc.args
|
|
169
|
+
})),
|
|
170
|
+
toolResults: lastToolResults,
|
|
171
|
+
finishReason: lastFinishReason,
|
|
172
|
+
usage: totalUsage,
|
|
173
|
+
steps,
|
|
174
|
+
response: lastResponse
|
|
175
|
+
};
|
|
176
|
+
if (onFinish) await onFinish(finalResult);
|
|
177
|
+
return finalResult;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// src/core/llm/stream-text.ts
|
|
181
|
+
function zodToJsonSchema2(schema) {
|
|
182
|
+
if (!schema) return {};
|
|
183
|
+
const s = schema;
|
|
184
|
+
if (s._def?.typeName === "ZodObject" && s.shape) {
|
|
185
|
+
const shape = typeof s.shape === "function" ? s.shape() : s.shape;
|
|
186
|
+
const properties = {};
|
|
187
|
+
const required = [];
|
|
188
|
+
for (const [key, val] of Object.entries(shape)) {
|
|
189
|
+
const f = val;
|
|
190
|
+
properties[key] = { type: "string" };
|
|
191
|
+
if (f._def?.typeName === "ZodString") properties[key] = { type: "string" };
|
|
192
|
+
else if (f._def?.typeName === "ZodNumber") properties[key] = { type: "number" };
|
|
193
|
+
else if (f._def?.typeName === "ZodBoolean") properties[key] = { type: "boolean" };
|
|
194
|
+
else if (f._def?.typeName === "ZodArray") properties[key] = { type: "array" };
|
|
195
|
+
if (f._def?.description) properties[key].description = f._def.description;
|
|
196
|
+
if (typeof f.isOptional !== "function" || !f.isOptional()) required.push(key);
|
|
197
|
+
}
|
|
198
|
+
return { type: "object", properties, ...required.length > 0 ? { required } : {} };
|
|
199
|
+
}
|
|
200
|
+
return { type: "object" };
|
|
201
|
+
}
|
|
202
|
+
function toolsToLanguageModelTools2(tools) {
|
|
203
|
+
return Object.entries(tools).map(([name, def]) => ({
|
|
204
|
+
type: "function",
|
|
205
|
+
name,
|
|
206
|
+
description: def.description,
|
|
207
|
+
parameters: zodToJsonSchema2(def.parameters)
|
|
208
|
+
}));
|
|
209
|
+
}
|
|
210
|
+
function buildMessages2(options) {
|
|
211
|
+
const msgs = [];
|
|
212
|
+
if (options.system) msgs.push({ role: "system", content: options.system });
|
|
213
|
+
if (options.messages) msgs.push(...options.messages);
|
|
214
|
+
if (options.prompt) msgs.push({ role: "user", content: options.prompt });
|
|
215
|
+
return msgs;
|
|
216
|
+
}
|
|
217
|
+
function streamText(options) {
|
|
218
|
+
const { model, tools, abortSignal } = options;
|
|
219
|
+
const lmTools = tools ? toolsToLanguageModelTools2(tools) : void 0;
|
|
220
|
+
const messages = buildMessages2(options);
|
|
221
|
+
let resolveText;
|
|
222
|
+
let resolveUsage;
|
|
223
|
+
let resolveFinish;
|
|
224
|
+
let resolveToolCalls;
|
|
225
|
+
let resolveToolResults;
|
|
226
|
+
let resolveSteps;
|
|
227
|
+
const textPromise = new Promise((r) => {
|
|
228
|
+
resolveText = r;
|
|
229
|
+
});
|
|
230
|
+
const usagePromise = new Promise((r) => {
|
|
231
|
+
resolveUsage = r;
|
|
232
|
+
});
|
|
233
|
+
const finishPromise = new Promise((r) => {
|
|
234
|
+
resolveFinish = r;
|
|
235
|
+
});
|
|
236
|
+
const toolCallsPromise = new Promise((r) => {
|
|
237
|
+
resolveToolCalls = r;
|
|
238
|
+
});
|
|
239
|
+
const toolResultsPromise = new Promise((r) => {
|
|
240
|
+
resolveToolResults = r;
|
|
241
|
+
});
|
|
242
|
+
const stepsPromise = new Promise((r) => {
|
|
243
|
+
resolveSteps = r;
|
|
244
|
+
});
|
|
245
|
+
const fullStream = new ReadableStream({
|
|
246
|
+
async start(controller) {
|
|
247
|
+
try {
|
|
248
|
+
const mode = lmTools && lmTools.length > 0 ? { type: "regular", tools: lmTools } : { type: "regular" };
|
|
249
|
+
const result = await model.doStream({
|
|
250
|
+
inputFormat: "messages",
|
|
251
|
+
mode,
|
|
252
|
+
prompt: messages,
|
|
253
|
+
abortSignal
|
|
254
|
+
});
|
|
255
|
+
const reader = result.stream.getReader();
|
|
256
|
+
let fullText = "";
|
|
257
|
+
const allToolCalls = [];
|
|
258
|
+
const totalUsage = { inputTokens: 0, outputTokens: 0 };
|
|
259
|
+
let lastFinish = "stop";
|
|
260
|
+
while (true) {
|
|
261
|
+
const { done, value } = await reader.read();
|
|
262
|
+
if (done) break;
|
|
263
|
+
const part = value;
|
|
264
|
+
controller.enqueue(part);
|
|
265
|
+
if (part.type === "text-delta") {
|
|
266
|
+
fullText += part.textDelta;
|
|
267
|
+
} else if (part.type === "tool-call") {
|
|
268
|
+
allToolCalls.push({
|
|
269
|
+
toolCallType: "function",
|
|
270
|
+
toolCallId: part.toolCallId,
|
|
271
|
+
toolName: part.toolName,
|
|
272
|
+
args: part.args
|
|
273
|
+
});
|
|
274
|
+
} else if (part.type === "finish") {
|
|
275
|
+
lastFinish = part.finishReason;
|
|
276
|
+
totalUsage.inputTokens += part.usage.inputTokens;
|
|
277
|
+
totalUsage.outputTokens += part.usage.outputTokens;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
let toolResults = [];
|
|
281
|
+
if (allToolCalls.length > 0 && tools) {
|
|
282
|
+
for (const call of allToolCalls) {
|
|
283
|
+
const toolDef = tools[call.toolName];
|
|
284
|
+
if (toolDef?.execute) {
|
|
285
|
+
try {
|
|
286
|
+
const args = typeof call.args === "string" ? JSON.parse(call.args) : call.args;
|
|
287
|
+
const result2 = await toolDef.execute(args, { abortSignal, toolCallId: call.toolCallId });
|
|
288
|
+
toolResults.push({ toolCallId: call.toolCallId, toolName: call.toolName, result: result2 });
|
|
289
|
+
} catch (err) {
|
|
290
|
+
toolResults.push({ toolCallId: call.toolCallId, toolName: call.toolName, result: String(err), isError: true });
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
const step = {
|
|
296
|
+
text: fullText,
|
|
297
|
+
toolCalls: allToolCalls.map((tc) => ({
|
|
298
|
+
toolCallType: "function",
|
|
299
|
+
toolCallId: tc.toolCallId,
|
|
300
|
+
toolName: tc.toolName,
|
|
301
|
+
args: typeof tc.args === "string" ? JSON.parse(tc.args) : tc.args
|
|
302
|
+
})),
|
|
303
|
+
toolResults,
|
|
304
|
+
finishReason: lastFinish,
|
|
305
|
+
usage: totalUsage
|
|
306
|
+
};
|
|
307
|
+
resolveText(fullText);
|
|
308
|
+
resolveUsage(totalUsage);
|
|
309
|
+
resolveFinish(lastFinish);
|
|
310
|
+
resolveToolCalls(step.toolCalls);
|
|
311
|
+
resolveToolResults(toolResults);
|
|
312
|
+
resolveSteps([step]);
|
|
313
|
+
if (options.onStepFinish) await options.onStepFinish(step);
|
|
314
|
+
if (options.onFinish) await options.onFinish({ text: fullText, usage: totalUsage, finishReason: lastFinish });
|
|
315
|
+
controller.close();
|
|
316
|
+
} catch (err) {
|
|
317
|
+
controller.error(err);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
const textStream = new ReadableStream({
|
|
322
|
+
async start(controller) {
|
|
323
|
+
const reader = fullStream.getReader();
|
|
324
|
+
try {
|
|
325
|
+
while (true) {
|
|
326
|
+
const { done, value } = await reader.read();
|
|
327
|
+
if (done) break;
|
|
328
|
+
if (value.type === "text-delta") {
|
|
329
|
+
controller.enqueue(value.textDelta);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
controller.close();
|
|
333
|
+
} catch (err) {
|
|
334
|
+
controller.error(err);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
return {
|
|
339
|
+
textStream,
|
|
340
|
+
fullStream,
|
|
341
|
+
text: textPromise,
|
|
342
|
+
toolCalls: toolCallsPromise,
|
|
343
|
+
toolResults: toolResultsPromise,
|
|
344
|
+
finishReason: finishPromise,
|
|
345
|
+
usage: usagePromise,
|
|
346
|
+
steps: stepsPromise
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// src/core/llm/stop-conditions.ts
|
|
351
|
+
function stepCountIs(count) {
|
|
352
|
+
return ({ steps }) => steps.length >= count;
|
|
353
|
+
}
|
|
354
|
+
function hasToolCall(toolName) {
|
|
355
|
+
return ({ steps }) => steps[steps.length - 1]?.toolCalls?.some(
|
|
356
|
+
(tc) => tc.toolName === toolName
|
|
357
|
+
) ?? false;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// src/core/llm/output.ts
|
|
361
|
+
var Output = {
|
|
362
|
+
object(config) {
|
|
363
|
+
return { type: "object", schema: config.schema };
|
|
364
|
+
}
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
export {
|
|
368
|
+
tool,
|
|
369
|
+
generateText,
|
|
370
|
+
streamText,
|
|
371
|
+
stepCountIs,
|
|
372
|
+
hasToolCall,
|
|
373
|
+
Output
|
|
374
|
+
};
|
|
375
|
+
//# sourceMappingURL=chunk-K6SAETGP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/llm/tool.ts","../src/core/llm/generate-text.ts","../src/core/llm/stream-text.ts","../src/core/llm/stop-conditions.ts","../src/core/llm/output.ts"],"sourcesContent":["// =============================================================================\n// Gauss LLM Core — Tool Factory\n// Creates tool definitions with Zod schema validation.\n// =============================================================================\n\nimport { z, type ZodType } from \"zod\";\nimport type { Tool, ToolExecuteOptions } from \"./types.js\";\n\nexport interface ToolConfig<PARAMS extends z.ZodTypeAny = z.ZodTypeAny, RESULT = unknown> {\n description?: string;\n inputSchema: PARAMS;\n execute?: (args: z.infer<PARAMS>, options?: ToolExecuteOptions) => Promise<RESULT>;\n}\n\n/**\n * Creates a typed tool definition from a Zod schema.\n *\n * @example\n * ```ts\n * import { tool } from \"gauss\";\n * import { z } from \"zod\";\n *\n * const weatherTool = tool({\n * description: \"Get weather for a location\",\n * inputSchema: z.object({ city: z.string() }),\n * execute: async ({ city }) => ({ temp: 72, city }),\n * });\n * ```\n */\nexport function tool<PARAMS extends z.ZodTypeAny, RESULT = unknown>(\n config: ToolConfig<PARAMS, RESULT>,\n): Tool<z.infer<PARAMS>, RESULT> {\n return {\n type: \"function\",\n description: config.description,\n parameters: config.inputSchema as unknown as ZodType<z.infer<PARAMS>>,\n execute: config.execute,\n };\n}\n","// =============================================================================\n// Gauss LLM Core — generateText\n// Multi-step tool-loop text generation. Zero external dependencies.\n// =============================================================================\n\nimport type {\n LanguageModel,\n LanguageModelTool,\n ToolSet,\n StepResult,\n ToolCall,\n ToolResult,\n TokenUsage,\n GenerateTextResult,\n FinishReason,\n CoreMessage,\n ToolChoice,\n} from \"./types.js\";\nimport type { StopCondition } from \"./stop-conditions.js\";\nimport type { OutputSpec } from \"./output.js\";\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface GenerateTextOptions<TOOLS extends ToolSet = ToolSet> {\n model: LanguageModel;\n prompt?: string;\n messages?: CoreMessage[];\n system?: string;\n tools?: TOOLS;\n toolChoice?: ToolChoice;\n stopWhen?: StopCondition<TOOLS> | Array<StopCondition<TOOLS>>;\n maxSteps?: number;\n output?: OutputSpec;\n temperature?: number;\n maxTokens?: number;\n abortSignal?: AbortSignal;\n onStepFinish?: (event: StepResult<TOOLS>) => void | Promise<void>;\n onFinish?: (event: GenerateTextResult<TOOLS>) => void | Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction zodToJsonSchema(schema: unknown): Record<string, unknown> {\n if (!schema) return {};\n // Zod v3/v4 interop: try _def.typeName, then JSON serialization\n const s = schema as { _def?: { typeName?: string }; shape?: unknown };\n if (s._def?.typeName === \"ZodObject\" && s.shape) {\n const shape = typeof s.shape === \"function\" ? (s.shape as () => Record<string, unknown>)() : s.shape as Record<string, unknown>;\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, val] of Object.entries(shape)) {\n const zodField = val as { _def?: { typeName?: string; description?: string }; isOptional?: () => boolean };\n properties[key] = { type: \"string\" };\n if (zodField._def?.typeName === \"ZodString\") properties[key] = { type: \"string\" };\n else if (zodField._def?.typeName === \"ZodNumber\") properties[key] = { type: \"number\" };\n else if (zodField._def?.typeName === \"ZodBoolean\") properties[key] = { type: \"boolean\" };\n else if (zodField._def?.typeName === \"ZodArray\") properties[key] = { type: \"array\" };\n if (zodField._def?.description) (properties[key] as Record<string, unknown>).description = zodField._def.description;\n if (typeof zodField.isOptional !== \"function\" || !zodField.isOptional()) {\n required.push(key);\n }\n }\n return { type: \"object\", properties, ...(required.length > 0 ? { required } : {}) };\n }\n // Fallback: if Zod exposes a .jsonSchema or similar\n return { type: \"object\" };\n}\n\nfunction toolsToLanguageModelTools(tools: ToolSet): LanguageModelTool[] {\n return Object.entries(tools).map(([name, def]) => ({\n type: \"function\" as const,\n name,\n description: def.description,\n parameters: zodToJsonSchema(def.parameters),\n }));\n}\n\nfunction buildMessages(options: GenerateTextOptions): CoreMessage[] {\n const msgs: CoreMessage[] = [];\n if (options.system) {\n msgs.push({ role: \"system\", content: options.system });\n }\n if (options.messages) {\n msgs.push(...options.messages);\n }\n if (options.prompt) {\n msgs.push({ role: \"user\", content: options.prompt });\n }\n return msgs;\n}\n\nasync function executeTools(\n toolCalls: ToolCall[],\n tools: ToolSet,\n abortSignal?: AbortSignal,\n): Promise<ToolResult[]> {\n const results: ToolResult[] = [];\n for (const call of toolCalls) {\n const toolDef = tools[call.toolName];\n if (!toolDef?.execute) {\n // Tool without execute — requires human approval or external handling\n break;\n }\n try {\n const args = typeof call.args === \"string\" ? JSON.parse(call.args) : call.args;\n const result = await toolDef.execute(args, { abortSignal, toolCallId: call.toolCallId });\n results.push({\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n result,\n });\n } catch (err) {\n results.push({\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n result: String(err),\n isError: true,\n });\n }\n }\n return results;\n}\n\n// ---------------------------------------------------------------------------\n// generateText\n// ---------------------------------------------------------------------------\n\n/**\n * Generate text with optional multi-step tool loop.\n * Calls the model, executes tool calls, feeds results back until done.\n */\nexport async function generateText<TOOLS extends ToolSet = ToolSet>(\n options: GenerateTextOptions<TOOLS>,\n): Promise<GenerateTextResult<TOOLS>> {\n const { model, tools, stopWhen, maxSteps, abortSignal, onStepFinish, onFinish } = options;\n const lmTools = tools ? toolsToLanguageModelTools(tools as ToolSet) : undefined;\n\n const messages = buildMessages(options);\n const steps: StepResult<TOOLS>[] = [];\n const totalUsage: TokenUsage = { inputTokens: 0, outputTokens: 0 };\n\n const stopConditions: Array<StopCondition<ToolSet>> = [];\n if (stopWhen) {\n if (Array.isArray(stopWhen)) stopConditions.push(...(stopWhen as StopCondition<ToolSet>[]));\n else stopConditions.push(stopWhen as StopCondition<ToolSet>);\n }\n if (maxSteps && stopConditions.length === 0) {\n stopConditions.push(({ steps: s }) => s.length >= maxSteps);\n }\n // Default: max 20 steps\n if (stopConditions.length === 0) {\n stopConditions.push(({ steps: s }) => s.length >= 20);\n }\n\n let lastText = \"\";\n let lastFinishReason: FinishReason = \"stop\";\n let lastToolCalls: ToolCall[] = [];\n let lastToolResults: ToolResult[] = [];\n let lastResponse: StepResult<TOOLS>[\"response\"];\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n // Build mode\n const mode = lmTools && lmTools.length > 0\n ? { type: \"regular\" as const, tools: lmTools, toolChoice: options.toolChoice }\n : options.output\n ? { type: \"object-json\" as const, schema: zodToJsonSchema(options.output.schema) }\n : { type: \"regular\" as const };\n\n const result = await model.doGenerate({\n inputFormat: \"messages\",\n mode,\n prompt: messages,\n abortSignal,\n });\n\n totalUsage.inputTokens += result.usage.inputTokens;\n totalUsage.outputTokens += result.usage.outputTokens;\n\n lastText = result.text ?? \"\";\n lastFinishReason = result.finishReason;\n lastToolCalls = result.toolCalls ?? [];\n lastResponse = result.response;\n\n // Execute tool calls\n if (lastFinishReason === \"tool-calls\" && lastToolCalls.length > 0 && tools) {\n lastToolResults = await executeTools(lastToolCalls, tools as ToolSet, abortSignal);\n\n // Add assistant message with tool calls\n const toolCallParts = lastToolCalls.map((tc) => ({\n type: \"tool-call\" as const,\n toolCallType: \"function\" as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: tc.args,\n }));\n messages.push({ role: \"assistant\", content: lastText ? [{ type: \"text\", text: lastText }, ...toolCallParts] : toolCallParts });\n\n // Add tool result messages\n const toolResultParts = lastToolResults.map((tr) => ({\n type: \"tool-result\" as const,\n toolCallId: tr.toolCallId,\n toolName: tr.toolName,\n result: tr.result,\n isError: tr.isError,\n }));\n messages.push({ role: \"tool\", content: toolResultParts });\n } else {\n lastToolResults = [];\n }\n\n const step: StepResult<TOOLS> = {\n text: lastText,\n toolCalls: lastToolCalls.map((tc) => ({\n toolCallType: \"function\" as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: typeof tc.args === \"string\" ? JSON.parse(tc.args) : tc.args,\n })),\n toolResults: lastToolResults,\n finishReason: lastFinishReason,\n usage: { ...result.usage },\n response: lastResponse,\n };\n steps.push(step);\n\n if (onStepFinish) await onStepFinish(step);\n\n // Check stop conditions\n const shouldStop = await Promise.all(\n stopConditions.map((cond) => cond({ steps: steps as StepResult<ToolSet>[] })),\n );\n if (shouldStop.some(Boolean)) break;\n\n // If no tool calls, we're done\n if (lastFinishReason !== \"tool-calls\" || lastToolCalls.length === 0) break;\n\n // If a tool has no execute function, stop (needs human approval)\n const hasUnexecutableTool = lastToolCalls.some((tc) => !(tools as ToolSet)[tc.toolName]?.execute);\n if (hasUnexecutableTool) break;\n }\n\n const finalResult: GenerateTextResult<TOOLS> = {\n text: lastText,\n toolCalls: lastToolCalls.map((tc) => ({\n toolCallType: \"function\" as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: typeof tc.args === \"string\" ? JSON.parse(tc.args) : tc.args,\n })),\n toolResults: lastToolResults,\n finishReason: lastFinishReason,\n usage: totalUsage,\n steps,\n response: lastResponse,\n };\n\n if (onFinish) await onFinish(finalResult);\n\n return finalResult;\n}\n","// =============================================================================\n// Gauss LLM Core — streamText\n// Streaming multi-step tool-loop text generation.\n// =============================================================================\n\nimport type {\n LanguageModel,\n LanguageModelTool,\n ToolSet,\n StepResult,\n ToolCall,\n ToolResult,\n TokenUsage,\n StreamTextResult,\n FinishReason,\n CoreMessage,\n StreamPart,\n ToolChoice,\n} from \"./types.js\";\nimport type { StopCondition } from \"./stop-conditions.js\";\nimport type { OutputSpec } from \"./output.js\";\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface StreamTextOptions<TOOLS extends ToolSet = ToolSet> {\n model: LanguageModel;\n prompt?: string;\n messages?: CoreMessage[];\n system?: string;\n tools?: TOOLS;\n toolChoice?: ToolChoice;\n stopWhen?: StopCondition<TOOLS> | Array<StopCondition<TOOLS>>;\n maxSteps?: number;\n output?: OutputSpec;\n temperature?: number;\n maxTokens?: number;\n abortSignal?: AbortSignal;\n onStepFinish?: (event: StepResult<TOOLS>) => void | Promise<void>;\n onFinish?: (event: { text: string; usage: TokenUsage; finishReason: FinishReason }) => void | Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers (shared with generateText)\n// ---------------------------------------------------------------------------\n\nfunction zodToJsonSchema(schema: unknown): Record<string, unknown> {\n if (!schema) return {};\n const s = schema as { _def?: { typeName?: string }; shape?: unknown };\n if (s._def?.typeName === \"ZodObject\" && s.shape) {\n const shape = typeof s.shape === \"function\" ? (s.shape as () => Record<string, unknown>)() : s.shape as Record<string, unknown>;\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, val] of Object.entries(shape)) {\n const f = val as { _def?: { typeName?: string; description?: string }; isOptional?: () => boolean };\n properties[key] = { type: \"string\" };\n if (f._def?.typeName === \"ZodString\") properties[key] = { type: \"string\" };\n else if (f._def?.typeName === \"ZodNumber\") properties[key] = { type: \"number\" };\n else if (f._def?.typeName === \"ZodBoolean\") properties[key] = { type: \"boolean\" };\n else if (f._def?.typeName === \"ZodArray\") properties[key] = { type: \"array\" };\n if (f._def?.description) (properties[key] as Record<string, unknown>).description = f._def.description;\n if (typeof f.isOptional !== \"function\" || !f.isOptional()) required.push(key);\n }\n return { type: \"object\", properties, ...(required.length > 0 ? { required } : {}) };\n }\n return { type: \"object\" };\n}\n\nfunction toolsToLanguageModelTools(tools: ToolSet): LanguageModelTool[] {\n return Object.entries(tools).map(([name, def]) => ({\n type: \"function\" as const,\n name,\n description: def.description,\n parameters: zodToJsonSchema(def.parameters),\n }));\n}\n\nfunction buildMessages(options: StreamTextOptions): CoreMessage[] {\n const msgs: CoreMessage[] = [];\n if (options.system) msgs.push({ role: \"system\", content: options.system });\n if (options.messages) msgs.push(...options.messages);\n if (options.prompt) msgs.push({ role: \"user\", content: options.prompt });\n return msgs;\n}\n\n// ---------------------------------------------------------------------------\n// streamText\n// ---------------------------------------------------------------------------\n\n/**\n * Stream text from a language model with optional multi-step tool loop.\n * Returns a result object with promise-based accessors for the final values.\n */\nexport function streamText<TOOLS extends ToolSet = ToolSet>(\n options: StreamTextOptions<TOOLS>,\n): StreamTextResult<TOOLS> {\n const { model, tools, abortSignal } = options;\n const lmTools = tools ? toolsToLanguageModelTools(tools as ToolSet) : undefined;\n const messages = buildMessages(options);\n\n // Shared mutable state accumulated during streaming\n let resolveText: (v: string) => void;\n let resolveUsage: (v: TokenUsage) => void;\n let resolveFinish: (v: FinishReason) => void;\n let resolveToolCalls: (v: Array<{ toolCallType: \"function\"; toolCallId: string; toolName: string; args: unknown }>) => void;\n let resolveToolResults: (v: ToolResult[]) => void;\n let resolveSteps: (v: StepResult<TOOLS>[]) => void;\n\n const textPromise = new Promise<string>((r) => { resolveText = r; });\n const usagePromise = new Promise<TokenUsage>((r) => { resolveUsage = r; });\n const finishPromise = new Promise<FinishReason>((r) => { resolveFinish = r; });\n const toolCallsPromise = new Promise<Array<{ toolCallType: \"function\"; toolCallId: string; toolName: string; args: unknown }>>((r) => { resolveToolCalls = r; });\n const toolResultsPromise = new Promise<ToolResult[]>((r) => { resolveToolResults = r; });\n const stepsPromise = new Promise<StepResult<TOOLS>[]>((r) => { resolveSteps = r; });\n\n // Create the full stream (piped to both textStream and fullStream)\n const fullStream = new ReadableStream<StreamPart>({\n async start(controller) {\n try {\n const mode = lmTools && lmTools.length > 0\n ? { type: \"regular\" as const, tools: lmTools }\n : { type: \"regular\" as const };\n\n const result = await model.doStream({\n inputFormat: \"messages\",\n mode,\n prompt: messages,\n abortSignal,\n });\n\n const reader = result.stream.getReader();\n let fullText = \"\";\n const allToolCalls: ToolCall[] = [];\n const totalUsage: TokenUsage = { inputTokens: 0, outputTokens: 0 };\n let lastFinish: FinishReason = \"stop\";\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const part = value as StreamPart;\n controller.enqueue(part);\n\n if (part.type === \"text-delta\") {\n fullText += part.textDelta;\n } else if (part.type === \"tool-call\") {\n allToolCalls.push({\n toolCallType: \"function\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n });\n } else if (part.type === \"finish\") {\n lastFinish = part.finishReason;\n totalUsage.inputTokens += part.usage.inputTokens;\n totalUsage.outputTokens += part.usage.outputTokens;\n }\n }\n\n // Execute tool calls if any\n let toolResults: ToolResult[] = [];\n if (allToolCalls.length > 0 && tools) {\n for (const call of allToolCalls) {\n const toolDef = (tools as ToolSet)[call.toolName];\n if (toolDef?.execute) {\n try {\n const args = typeof call.args === \"string\" ? JSON.parse(call.args) : call.args;\n const result = await toolDef.execute(args, { abortSignal, toolCallId: call.toolCallId });\n toolResults.push({ toolCallId: call.toolCallId, toolName: call.toolName, result });\n } catch (err) {\n toolResults.push({ toolCallId: call.toolCallId, toolName: call.toolName, result: String(err), isError: true });\n }\n }\n }\n }\n\n const step: StepResult<TOOLS> = {\n text: fullText,\n toolCalls: allToolCalls.map((tc) => ({\n toolCallType: \"function\" as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: typeof tc.args === \"string\" ? JSON.parse(tc.args) : tc.args,\n })),\n toolResults,\n finishReason: lastFinish,\n usage: totalUsage,\n };\n\n resolveText!(fullText);\n resolveUsage!(totalUsage);\n resolveFinish!(lastFinish);\n resolveToolCalls!(step.toolCalls);\n resolveToolResults!(toolResults);\n resolveSteps!([step]);\n\n if (options.onStepFinish) await options.onStepFinish(step);\n if (options.onFinish) await options.onFinish({ text: fullText, usage: totalUsage, finishReason: lastFinish });\n\n controller.close();\n } catch (err) {\n controller.error(err);\n }\n },\n });\n\n // Text-only stream\n const textStream = new ReadableStream<string>({\n async start(controller) {\n const reader = fullStream.getReader();\n try {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value.type === \"text-delta\") {\n controller.enqueue(value.textDelta);\n }\n }\n controller.close();\n } catch (err) {\n controller.error(err);\n }\n },\n });\n\n return {\n textStream,\n fullStream,\n text: textPromise,\n toolCalls: toolCallsPromise,\n toolResults: toolResultsPromise,\n finishReason: finishPromise,\n usage: usagePromise,\n steps: stepsPromise,\n };\n}\n","// =============================================================================\n// Gauss LLM Core — Stop Conditions\n// Determine when to end multi-step agent loops.\n// =============================================================================\n\nimport type { StepResult, ToolSet } from \"./types.js\";\n\nexport type StopCondition<TOOLS extends ToolSet = ToolSet> = (options: {\n steps: Array<StepResult<TOOLS>>;\n}) => PromiseLike<boolean> | boolean;\n\n/**\n * Stops after exactly `count` steps have been executed.\n */\nexport function stepCountIs(count: number): StopCondition<ToolSet> {\n return ({ steps }) => steps.length >= count;\n}\n\n/**\n * Stops when a specific tool has been called in the latest step.\n */\nexport function hasToolCall(toolName: string): StopCondition<ToolSet> {\n return ({ steps }) =>\n steps[steps.length - 1]?.toolCalls?.some(\n (tc) => tc.toolName === toolName,\n ) ?? false;\n}\n","// =============================================================================\n// Gauss LLM Core — Output Specification\n// Structured output mode for generateText / streamText.\n// =============================================================================\n\nimport type { ZodType } from \"zod\";\n\nexport interface OutputSpec<T = unknown> {\n type: \"object\";\n schema: ZodType<T>;\n}\n\n/**\n * Output specification — instructs the model to produce structured JSON output.\n *\n * @example\n * ```ts\n * const result = await generateText({\n * model,\n * output: Output.object({ schema: z.object({ name: z.string() }) }),\n * prompt: \"Generate a person\",\n * });\n * ```\n */\nexport const Output = {\n object<T>(config: { schema: ZodType<T> }): OutputSpec<T> {\n return { type: \"object\", schema: config.schema };\n },\n};\n"],"mappings":"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","names":["zodToJsonSchema","toolsToLanguageModelTools","buildMessages","result"]}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// src/cli/project-context.ts
|
|
2
|
+
import { existsSync, readFileSync, readdirSync } from "fs";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
var IGNORED_DIRS = /* @__PURE__ */ new Set([
|
|
5
|
+
"node_modules",
|
|
6
|
+
".git",
|
|
7
|
+
"dist",
|
|
8
|
+
"build",
|
|
9
|
+
"__pycache__",
|
|
10
|
+
"target",
|
|
11
|
+
".next",
|
|
12
|
+
".nuxt",
|
|
13
|
+
"coverage",
|
|
14
|
+
".turbo",
|
|
15
|
+
".cache",
|
|
16
|
+
"venv",
|
|
17
|
+
".venv",
|
|
18
|
+
"env",
|
|
19
|
+
".env"
|
|
20
|
+
]);
|
|
21
|
+
function readJson(filePath) {
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(readFileSync(filePath, "utf-8"));
|
|
24
|
+
} catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function listTopLevelDirs(dir) {
|
|
29
|
+
try {
|
|
30
|
+
return readdirSync(dir, { withFileTypes: true }).filter((e) => e.isDirectory() && !e.name.startsWith(".") && !IGNORED_DIRS.has(e.name)).map((e) => e.name + "/").slice(0, 20);
|
|
31
|
+
} catch {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function detectNodeFramework(deps) {
|
|
36
|
+
if ("next" in deps) return "next.js";
|
|
37
|
+
if ("nuxt" in deps || "nuxt3" in deps) return "nuxt";
|
|
38
|
+
if ("@angular/core" in deps) return "angular";
|
|
39
|
+
if ("svelte" in deps || "@sveltejs/kit" in deps) return "svelte";
|
|
40
|
+
if ("vue" in deps) return "vue";
|
|
41
|
+
if ("express" in deps) return "express";
|
|
42
|
+
if ("fastify" in deps) return "fastify";
|
|
43
|
+
if ("hono" in deps) return "hono";
|
|
44
|
+
if ("koa" in deps) return "koa";
|
|
45
|
+
if ("nestjs" in deps || "@nestjs/core" in deps) return "nestjs";
|
|
46
|
+
return void 0;
|
|
47
|
+
}
|
|
48
|
+
function detectNodeLanguage(dir, pkg) {
|
|
49
|
+
const devDeps = pkg.devDependencies ?? {};
|
|
50
|
+
const deps = pkg.dependencies ?? {};
|
|
51
|
+
if ("typescript" in devDeps || "typescript" in deps) return "typescript";
|
|
52
|
+
if (existsSync(join(dir, "tsconfig.json"))) return "typescript";
|
|
53
|
+
return "javascript";
|
|
54
|
+
}
|
|
55
|
+
function detectPackageManager(dir) {
|
|
56
|
+
if (existsSync(join(dir, "bun.lockb")) || existsSync(join(dir, "bun.lock"))) return "bun";
|
|
57
|
+
if (existsSync(join(dir, "pnpm-lock.yaml"))) return "pnpm";
|
|
58
|
+
if (existsSync(join(dir, "yarn.lock"))) return "yarn";
|
|
59
|
+
return "npm";
|
|
60
|
+
}
|
|
61
|
+
function extractTopDeps(pkg, max = 10) {
|
|
62
|
+
const deps = pkg.dependencies ?? {};
|
|
63
|
+
return Object.keys(deps).slice(0, max);
|
|
64
|
+
}
|
|
65
|
+
function detectNodeProject(dir, pkg) {
|
|
66
|
+
const allDeps = {
|
|
67
|
+
...pkg.dependencies ?? {},
|
|
68
|
+
...pkg.devDependencies ?? {}
|
|
69
|
+
};
|
|
70
|
+
const scripts = pkg.scripts ?? {};
|
|
71
|
+
const pickedScripts = {};
|
|
72
|
+
for (const key of ["test", "build", "lint", "dev", "start"]) {
|
|
73
|
+
if (scripts[key]) pickedScripts[key] = scripts[key];
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
type: "node",
|
|
77
|
+
framework: detectNodeFramework(allDeps),
|
|
78
|
+
language: detectNodeLanguage(dir, pkg),
|
|
79
|
+
packageManager: detectPackageManager(dir),
|
|
80
|
+
scripts: Object.keys(pickedScripts).length > 0 ? pickedScripts : void 0,
|
|
81
|
+
dependencies: extractTopDeps(pkg),
|
|
82
|
+
structure: listTopLevelDirs(dir).join(", ") || "(empty)"
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function detectPythonFramework(dir) {
|
|
86
|
+
for (const file of ["pyproject.toml", "requirements.txt"]) {
|
|
87
|
+
try {
|
|
88
|
+
const content = readFileSync(join(dir, file), "utf-8");
|
|
89
|
+
if (content.includes("django") || content.includes("Django")) return "django";
|
|
90
|
+
if (content.includes("flask") || content.includes("Flask")) return "flask";
|
|
91
|
+
if (content.includes("fastapi") || content.includes("FastAPI")) return "fastapi";
|
|
92
|
+
} catch {
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return void 0;
|
|
96
|
+
}
|
|
97
|
+
function detectProjectContext(cwd) {
|
|
98
|
+
const dir = cwd || process.cwd();
|
|
99
|
+
const dirs = listTopLevelDirs(dir);
|
|
100
|
+
const structure = dirs.join(", ") || "(empty)";
|
|
101
|
+
const pkgPath = join(dir, "package.json");
|
|
102
|
+
if (existsSync(pkgPath)) {
|
|
103
|
+
const pkg = readJson(pkgPath);
|
|
104
|
+
if (pkg) return detectNodeProject(dir, pkg);
|
|
105
|
+
}
|
|
106
|
+
if (existsSync(join(dir, "pyproject.toml")) || existsSync(join(dir, "requirements.txt"))) {
|
|
107
|
+
return {
|
|
108
|
+
type: "python",
|
|
109
|
+
framework: detectPythonFramework(dir),
|
|
110
|
+
language: "python",
|
|
111
|
+
packageManager: "pip",
|
|
112
|
+
structure
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
if (existsSync(join(dir, "Cargo.toml"))) {
|
|
116
|
+
return { type: "rust", language: "rust", packageManager: "cargo", structure };
|
|
117
|
+
}
|
|
118
|
+
if (existsSync(join(dir, "go.mod"))) {
|
|
119
|
+
return { type: "go", language: "go", packageManager: "go", structure };
|
|
120
|
+
}
|
|
121
|
+
if (existsSync(join(dir, "pom.xml"))) {
|
|
122
|
+
return { type: "java", language: "java", packageManager: "maven", structure };
|
|
123
|
+
}
|
|
124
|
+
if (existsSync(join(dir, "build.gradle")) || existsSync(join(dir, "build.gradle.kts"))) {
|
|
125
|
+
return { type: "java", language: "java", packageManager: "gradle", structure };
|
|
126
|
+
}
|
|
127
|
+
return { type: "unknown", language: "unknown", structure };
|
|
128
|
+
}
|
|
129
|
+
function contextToSystemPrompt(ctx) {
|
|
130
|
+
const parts = [];
|
|
131
|
+
if (ctx.type === "unknown") {
|
|
132
|
+
parts.push("Project type could not be detected.");
|
|
133
|
+
} else {
|
|
134
|
+
const frameworkPart = ctx.framework ? ` using ${ctx.framework} framework` : "";
|
|
135
|
+
parts.push(`This is a ${ctx.language}/${ctx.type} project${frameworkPart}.`);
|
|
136
|
+
}
|
|
137
|
+
if (ctx.packageManager) {
|
|
138
|
+
parts.push(`Package manager: ${ctx.packageManager}.`);
|
|
139
|
+
}
|
|
140
|
+
if (ctx.dependencies && ctx.dependencies.length > 0) {
|
|
141
|
+
parts.push(`Key dependencies: ${ctx.dependencies.join(", ")}.`);
|
|
142
|
+
}
|
|
143
|
+
if (ctx.scripts) {
|
|
144
|
+
const scriptEntries = Object.entries(ctx.scripts).map(([k, v]) => `${k}: \`${v}\``).join(", ");
|
|
145
|
+
parts.push(`Scripts: ${scriptEntries}.`);
|
|
146
|
+
}
|
|
147
|
+
if (ctx.structure && ctx.structure !== "(empty)") {
|
|
148
|
+
parts.push(`Project structure: ${ctx.structure}`);
|
|
149
|
+
}
|
|
150
|
+
return parts.join(" ");
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export {
|
|
154
|
+
detectProjectContext,
|
|
155
|
+
contextToSystemPrompt
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=chunk-KEASLAYR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/project-context.ts"],"sourcesContent":["// =============================================================================\n// Project Context Detection — Detect project type, framework, and structure\n// =============================================================================\n\nimport { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join, basename } from \"node:path\";\n\nexport interface ProjectContext {\n type: string;\n framework?: string;\n language: string;\n packageManager?: string;\n scripts?: Record<string, string>;\n dependencies?: string[];\n structure: string;\n}\n\nconst IGNORED_DIRS = new Set([\n \"node_modules\", \".git\", \"dist\", \"build\", \"__pycache__\",\n \"target\", \".next\", \".nuxt\", \"coverage\", \".turbo\", \".cache\",\n \"venv\", \".venv\", \"env\", \".env\",\n]);\n\nfunction readJson(filePath: string): Record<string, unknown> | null {\n try {\n return JSON.parse(readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction listTopLevelDirs(dir: string): string[] {\n try {\n return readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && !e.name.startsWith(\".\") && !IGNORED_DIRS.has(e.name))\n .map((e) => e.name + \"/\")\n .slice(0, 20);\n } catch {\n return [];\n }\n}\n\nfunction detectNodeFramework(deps: Record<string, unknown>): string | undefined {\n if (\"next\" in deps) return \"next.js\";\n if (\"nuxt\" in deps || \"nuxt3\" in deps) return \"nuxt\";\n if (\"@angular/core\" in deps) return \"angular\";\n if (\"svelte\" in deps || \"@sveltejs/kit\" in deps) return \"svelte\";\n if (\"vue\" in deps) return \"vue\";\n if (\"express\" in deps) return \"express\";\n if (\"fastify\" in deps) return \"fastify\";\n if (\"hono\" in deps) return \"hono\";\n if (\"koa\" in deps) return \"koa\";\n if (\"nestjs\" in deps || \"@nestjs/core\" in deps) return \"nestjs\";\n return undefined;\n}\n\nfunction detectNodeLanguage(dir: string, pkg: Record<string, unknown>): string {\n const devDeps = (pkg.devDependencies ?? {}) as Record<string, unknown>;\n const deps = (pkg.dependencies ?? {}) as Record<string, unknown>;\n if (\"typescript\" in devDeps || \"typescript\" in deps) return \"typescript\";\n if (existsSync(join(dir, \"tsconfig.json\"))) return \"typescript\";\n return \"javascript\";\n}\n\nfunction detectPackageManager(dir: string): string {\n if (existsSync(join(dir, \"bun.lockb\")) || existsSync(join(dir, \"bun.lock\"))) return \"bun\";\n if (existsSync(join(dir, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(dir, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n\nfunction extractTopDeps(pkg: Record<string, unknown>, max = 10): string[] {\n const deps = (pkg.dependencies ?? {}) as Record<string, unknown>;\n return Object.keys(deps).slice(0, max);\n}\n\nfunction detectNodeProject(dir: string, pkg: Record<string, unknown>): ProjectContext {\n const allDeps = {\n ...((pkg.dependencies ?? {}) as Record<string, unknown>),\n ...((pkg.devDependencies ?? {}) as Record<string, unknown>),\n };\n const scripts = (pkg.scripts ?? {}) as Record<string, string>;\n const pickedScripts: Record<string, string> = {};\n for (const key of [\"test\", \"build\", \"lint\", \"dev\", \"start\"]) {\n if (scripts[key]) pickedScripts[key] = scripts[key];\n }\n\n return {\n type: \"node\",\n framework: detectNodeFramework(allDeps),\n language: detectNodeLanguage(dir, pkg),\n packageManager: detectPackageManager(dir),\n scripts: Object.keys(pickedScripts).length > 0 ? pickedScripts : undefined,\n dependencies: extractTopDeps(pkg),\n structure: listTopLevelDirs(dir).join(\", \") || \"(empty)\",\n };\n}\n\nfunction detectPythonFramework(dir: string): string | undefined {\n // Check pyproject.toml or requirements.txt for common frameworks\n for (const file of [\"pyproject.toml\", \"requirements.txt\"]) {\n try {\n const content = readFileSync(join(dir, file), \"utf-8\");\n if (content.includes(\"django\") || content.includes(\"Django\")) return \"django\";\n if (content.includes(\"flask\") || content.includes(\"Flask\")) return \"flask\";\n if (content.includes(\"fastapi\") || content.includes(\"FastAPI\")) return \"fastapi\";\n } catch { /* skip */ }\n }\n return undefined;\n}\n\nexport function detectProjectContext(cwd?: string): ProjectContext {\n const dir = cwd || process.cwd();\n const dirs = listTopLevelDirs(dir);\n const structure = dirs.join(\", \") || \"(empty)\";\n\n // Node.js\n const pkgPath = join(dir, \"package.json\");\n if (existsSync(pkgPath)) {\n const pkg = readJson(pkgPath);\n if (pkg) return detectNodeProject(dir, pkg);\n }\n\n // Python\n if (existsSync(join(dir, \"pyproject.toml\")) || existsSync(join(dir, \"requirements.txt\"))) {\n return {\n type: \"python\",\n framework: detectPythonFramework(dir),\n language: \"python\",\n packageManager: \"pip\",\n structure,\n };\n }\n\n // Rust\n if (existsSync(join(dir, \"Cargo.toml\"))) {\n return { type: \"rust\", language: \"rust\", packageManager: \"cargo\", structure };\n }\n\n // Go\n if (existsSync(join(dir, \"go.mod\"))) {\n return { type: \"go\", language: \"go\", packageManager: \"go\", structure };\n }\n\n // Java\n if (existsSync(join(dir, \"pom.xml\"))) {\n return { type: \"java\", language: \"java\", packageManager: \"maven\", structure };\n }\n if (existsSync(join(dir, \"build.gradle\")) || existsSync(join(dir, \"build.gradle.kts\"))) {\n return { type: \"java\", language: \"java\", packageManager: \"gradle\", structure };\n }\n\n return { type: \"unknown\", language: \"unknown\", structure };\n}\n\nexport function contextToSystemPrompt(ctx: ProjectContext): string {\n const parts: string[] = [];\n\n if (ctx.type === \"unknown\") {\n parts.push(\"Project type could not be detected.\");\n } else {\n const frameworkPart = ctx.framework ? ` using ${ctx.framework} framework` : \"\";\n parts.push(`This is a ${ctx.language}/${ctx.type} project${frameworkPart}.`);\n }\n\n if (ctx.packageManager) {\n parts.push(`Package manager: ${ctx.packageManager}.`);\n }\n\n if (ctx.dependencies && ctx.dependencies.length > 0) {\n parts.push(`Key dependencies: ${ctx.dependencies.join(\", \")}.`);\n }\n\n if (ctx.scripts) {\n const scriptEntries = Object.entries(ctx.scripts)\n .map(([k, v]) => `${k}: \\`${v}\\``)\n .join(\", \");\n parts.push(`Scripts: ${scriptEntries}.`);\n }\n\n if (ctx.structure && ctx.structure !== \"(empty)\") {\n parts.push(`Project structure: ${ctx.structure}`);\n }\n\n return parts.join(\" \");\n}\n"],"mappings":"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","names":[]}
|