@msm-core/mini 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +297 -0
- package/dist/adapters/index.d.ts +9 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +7 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/redis-control.d.ts +25 -0
- package/dist/adapters/redis-control.d.ts.map +1 -0
- package/dist/adapters/redis-control.js +48 -0
- package/dist/adapters/redis-control.js.map +1 -0
- package/dist/adapters/redis-lock.d.ts +31 -0
- package/dist/adapters/redis-lock.d.ts.map +1 -0
- package/dist/adapters/redis-lock.js +73 -0
- package/dist/adapters/redis-lock.js.map +1 -0
- package/dist/adapters/redis-memory.d.ts +42 -0
- package/dist/adapters/redis-memory.d.ts.map +1 -0
- package/dist/adapters/redis-memory.js +87 -0
- package/dist/adapters/redis-memory.js.map +1 -0
- package/dist/adapters/redis-types.d.ts +17 -0
- package/dist/adapters/redis-types.d.ts.map +1 -0
- package/dist/adapters/redis-types.js +2 -0
- package/dist/adapters/redis-types.js.map +1 -0
- package/dist/brain/anthropic.d.ts +10 -0
- package/dist/brain/anthropic.d.ts.map +1 -0
- package/dist/brain/anthropic.js +73 -0
- package/dist/brain/anthropic.js.map +1 -0
- package/dist/brain/factory.d.ts +7 -0
- package/dist/brain/factory.d.ts.map +1 -0
- package/dist/brain/factory.js +24 -0
- package/dist/brain/factory.js.map +1 -0
- package/dist/brain/gemini.d.ts +10 -0
- package/dist/brain/gemini.d.ts.map +1 -0
- package/dist/brain/gemini.js +113 -0
- package/dist/brain/gemini.js.map +1 -0
- package/dist/brain/ollama.d.ts +10 -0
- package/dist/brain/ollama.d.ts.map +1 -0
- package/dist/brain/ollama.js +38 -0
- package/dist/brain/ollama.js.map +1 -0
- package/dist/brain/openai.d.ts +11 -0
- package/dist/brain/openai.d.ts.map +1 -0
- package/dist/brain/openai.js +96 -0
- package/dist/brain/openai.js.map +1 -0
- package/dist/brain/types.d.ts +6 -0
- package/dist/brain/types.d.ts.map +1 -0
- package/dist/brain/types.js +2 -0
- package/dist/brain/types.js.map +1 -0
- package/dist/core/context-builder.d.ts +25 -0
- package/dist/core/context-builder.d.ts.map +1 -0
- package/dist/core/context-builder.js +107 -0
- package/dist/core/context-builder.js.map +1 -0
- package/dist/core/gates.d.ts +16 -0
- package/dist/core/gates.d.ts.map +1 -0
- package/dist/core/gates.js +70 -0
- package/dist/core/gates.js.map +1 -0
- package/dist/core/guards.d.ts +22 -0
- package/dist/core/guards.d.ts.map +1 -0
- package/dist/core/guards.js +119 -0
- package/dist/core/guards.js.map +1 -0
- package/dist/core/hooks.d.ts +13 -0
- package/dist/core/hooks.d.ts.map +1 -0
- package/dist/core/hooks.js +61 -0
- package/dist/core/hooks.js.map +1 -0
- package/dist/core/loop.d.ts +16 -0
- package/dist/core/loop.d.ts.map +1 -0
- package/dist/core/loop.js +255 -0
- package/dist/core/loop.js.map +1 -0
- package/dist/core/types.d.ts +310 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +8 -0
- package/dist/core/types.js.map +1 -0
- package/dist/definition/parser.d.ts +12 -0
- package/dist/definition/parser.d.ts.map +1 -0
- package/dist/definition/parser.js +117 -0
- package/dist/definition/parser.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/quality/scorer.d.ts +18 -0
- package/dist/quality/scorer.d.ts.map +1 -0
- package/dist/quality/scorer.js +22 -0
- package/dist/quality/scorer.js.map +1 -0
- package/dist/server.d.ts +27 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +118 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/dedup.d.ts +20 -0
- package/dist/tools/dedup.d.ts.map +1 -0
- package/dist/tools/dedup.js +47 -0
- package/dist/tools/dedup.js.map +1 -0
- package/dist/tools/executor.d.ts +32 -0
- package/dist/tools/executor.d.ts.map +1 -0
- package/dist/tools/executor.js +75 -0
- package/dist/tools/executor.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Redis interface — minimal surface used across adapters.
|
|
3
|
+
* Compatible with ioredis and any Redis client with the same method signatures.
|
|
4
|
+
*/
|
|
5
|
+
export interface RedisLike {
|
|
6
|
+
get(key: string): Promise<string | null>;
|
|
7
|
+
set(...args: any[]): Promise<any>;
|
|
8
|
+
setex(key: string, seconds: number, value: string): Promise<unknown>;
|
|
9
|
+
del(key: string | string[]): Promise<unknown>;
|
|
10
|
+
rpush(key: string, ...values: string[]): Promise<unknown>;
|
|
11
|
+
lrange(key: string, start: number, stop: number): Promise<string[]>;
|
|
12
|
+
expire(key: string, seconds: number): Promise<unknown>;
|
|
13
|
+
hget(key: string, field: string): Promise<string | null>;
|
|
14
|
+
hset(key: string, field: string, value: string): Promise<unknown>;
|
|
15
|
+
eval(script: string, numkeys: number, ...args: any[]): Promise<unknown>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=redis-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-types.d.ts","sourceRoot":"","sources":["../../src/adapters/redis-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEzC,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAElE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-types.js","sourceRoot":"","sources":["../../src/adapters/redis-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic Brain — Claude via Messages API.
|
|
3
|
+
* Peer dependency: @anthropic-ai/sdk >= 0.20.0
|
|
4
|
+
*/
|
|
5
|
+
import type { Brain } from "./types.js";
|
|
6
|
+
export declare function createAnthropicBrain(opts: {
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
model?: string;
|
|
9
|
+
}): Brain;
|
|
10
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/brain/anthropic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,KAAK,EAIN,MAAM,YAAY,CAAC;AAGpB,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,KAAK,CA+ER"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic Brain — Claude via Messages API.
|
|
3
|
+
* Peer dependency: @anthropic-ai/sdk >= 0.20.0
|
|
4
|
+
*/
|
|
5
|
+
export function createAnthropicBrain(opts) {
|
|
6
|
+
const model = opts.model ?? "claude-3-5-sonnet-20241022";
|
|
7
|
+
return {
|
|
8
|
+
name: "anthropic",
|
|
9
|
+
async run(input) {
|
|
10
|
+
const { default: Anthropic } = await import("@anthropic-ai/sdk");
|
|
11
|
+
const apiKey = opts.apiKey ?? process.env["ANTHROPIC_API_KEY"];
|
|
12
|
+
if (!apiKey)
|
|
13
|
+
throw new Error("msm-mini: ANTHROPIC_API_KEY not set");
|
|
14
|
+
const client = new Anthropic({ apiKey });
|
|
15
|
+
const messages = input.history.map((m) => ({
|
|
16
|
+
role: m.role === "assistant" ? "assistant" : "user",
|
|
17
|
+
content: m.content,
|
|
18
|
+
}));
|
|
19
|
+
messages.push({ role: "user", content: input.raw });
|
|
20
|
+
const tools = input.tools.length > 0
|
|
21
|
+
? input.tools.map((t) => ({
|
|
22
|
+
name: t.name,
|
|
23
|
+
description: t.description,
|
|
24
|
+
input_schema: {
|
|
25
|
+
type: "object",
|
|
26
|
+
properties: Object.fromEntries(Object.entries(t.parameters).map(([k, v]) => [
|
|
27
|
+
k,
|
|
28
|
+
{ type: v.type, description: v.description },
|
|
29
|
+
])),
|
|
30
|
+
required: Object.entries(t.parameters)
|
|
31
|
+
.filter(([, v]) => v.required)
|
|
32
|
+
.map(([k]) => k),
|
|
33
|
+
},
|
|
34
|
+
}))
|
|
35
|
+
: undefined;
|
|
36
|
+
const baseParams = {
|
|
37
|
+
model,
|
|
38
|
+
max_tokens: 4096,
|
|
39
|
+
system: input.system_context,
|
|
40
|
+
messages: messages,
|
|
41
|
+
};
|
|
42
|
+
const response = await client.messages.create(tools
|
|
43
|
+
? {
|
|
44
|
+
...baseParams,
|
|
45
|
+
tools: tools,
|
|
46
|
+
}
|
|
47
|
+
: baseParams);
|
|
48
|
+
const content = response.content;
|
|
49
|
+
// Tool use
|
|
50
|
+
const toolUseBlock = content.find((b) => b.type === "tool_use");
|
|
51
|
+
if (toolUseBlock && toolUseBlock.type === "tool_use") {
|
|
52
|
+
const orchestration = {
|
|
53
|
+
action: "use_tool",
|
|
54
|
+
confidence: 0.9,
|
|
55
|
+
tool_name: toolUseBlock.name,
|
|
56
|
+
tool_params: toolUseBlock.input,
|
|
57
|
+
};
|
|
58
|
+
return { orchestration };
|
|
59
|
+
}
|
|
60
|
+
// Text
|
|
61
|
+
const textBlock = content.find((b) => b.type === "text");
|
|
62
|
+
const text = textBlock && textBlock.type === "text" ? textBlock.text : "";
|
|
63
|
+
const inputTokens = response.usage.input_tokens;
|
|
64
|
+
const outputTokens = response.usage.output_tokens;
|
|
65
|
+
return {
|
|
66
|
+
generation: { response_text: text },
|
|
67
|
+
orchestration: { action: "respond", confidence: 0.95 },
|
|
68
|
+
usage: { inputTokens, outputTokens },
|
|
69
|
+
};
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/brain/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brain factory — create a Brain from an AgentDefinition's brain config.
|
|
3
|
+
* Uses async factory pattern — call and await before passing to createAgent().
|
|
4
|
+
*/
|
|
5
|
+
import type { Brain, AgentDefinition } from "../core/types.js";
|
|
6
|
+
export declare function buildBrain(def: AgentDefinition): Brain;
|
|
7
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/brain/factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAM/D,wBAAgB,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,KAAK,CAiBtD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brain factory — create a Brain from an AgentDefinition's brain config.
|
|
3
|
+
* Uses async factory pattern — call and await before passing to createAgent().
|
|
4
|
+
*/
|
|
5
|
+
import { createOpenAIBrain } from "./openai.js";
|
|
6
|
+
import { createAnthropicBrain } from "./anthropic.js";
|
|
7
|
+
import { createGeminiBrain } from "./gemini.js";
|
|
8
|
+
import { createOllamaBrain } from "./ollama.js";
|
|
9
|
+
export function buildBrain(def) {
|
|
10
|
+
const { provider, model, endpoint, apiKey } = def.brain;
|
|
11
|
+
switch (provider) {
|
|
12
|
+
case "openai":
|
|
13
|
+
return createOpenAIBrain({ ...(model ? { model } : {}), ...(endpoint ? { baseURL: endpoint } : {}), ...(apiKey ? { apiKey } : {}) });
|
|
14
|
+
case "anthropic":
|
|
15
|
+
return createAnthropicBrain({ ...(model ? { model } : {}), ...(apiKey ? { apiKey } : {}) });
|
|
16
|
+
case "gemini":
|
|
17
|
+
return createGeminiBrain({ ...(model ? { model } : {}), ...(apiKey ? { apiKey } : {}) });
|
|
18
|
+
case "ollama":
|
|
19
|
+
return createOllamaBrain({ ...(endpoint ? { endpoint } : {}), ...(model ? { model } : {}) });
|
|
20
|
+
default:
|
|
21
|
+
throw new Error(`msm-mini: unknown brain provider "${String(provider)}". Pass a Brain instance directly to createAgent().`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/brain/factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,UAAU,UAAU,CAAC,GAAoB;IAC7C,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;IAExD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,iBAAiB,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvI,KAAK,WAAW;YACd,OAAO,oBAAoB,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9F,KAAK,QAAQ;YACX,OAAO,iBAAiB,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3F,KAAK,QAAQ;YACX,OAAO,iBAAiB,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/F;YACE,MAAM,IAAI,KAAK,CACb,qCAAqC,MAAM,CAAC,QAAQ,CAAC,qDAAqD,CAC3G,CAAC;IACN,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini Brain — Google Gemini 2.5 Flash (primary brain for UTS).
|
|
3
|
+
* Peer dependency: @google/generative-ai >= 0.14.0
|
|
4
|
+
*/
|
|
5
|
+
import type { Brain } from "./types.js";
|
|
6
|
+
export declare function createGeminiBrain(opts: {
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
model?: string;
|
|
9
|
+
}): Brain;
|
|
10
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/brain/gemini.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,KAAK,EAIN,MAAM,YAAY,CAAC;AAIpB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,KAAK,CA+GR"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini Brain — Google Gemini 2.5 Flash (primary brain for UTS).
|
|
3
|
+
* Peer dependency: @google/generative-ai >= 0.14.0
|
|
4
|
+
*/
|
|
5
|
+
import { GoogleGenerativeAI } from "@google/generative-ai";
|
|
6
|
+
export function createGeminiBrain(opts) {
|
|
7
|
+
const model = opts.model ?? "gemini-2.5-flash";
|
|
8
|
+
return {
|
|
9
|
+
name: "gemini",
|
|
10
|
+
async run(input) {
|
|
11
|
+
const apiKey = opts.apiKey ??
|
|
12
|
+
process.env["GEMINI_API_KEY"] ??
|
|
13
|
+
process.env["GOOGLE_API_KEY"];
|
|
14
|
+
if (!apiKey)
|
|
15
|
+
throw new Error("msm-mini: GEMINI_API_KEY not set");
|
|
16
|
+
const genai = new GoogleGenerativeAI(apiKey);
|
|
17
|
+
const geminiModel = genai.getGenerativeModel({ model });
|
|
18
|
+
// Build Gemini contents array (user/model alternation)
|
|
19
|
+
const contents = buildGeminiContents(input);
|
|
20
|
+
// Build function declarations
|
|
21
|
+
const tools = input.tools.length > 0
|
|
22
|
+
? [
|
|
23
|
+
{
|
|
24
|
+
functionDeclarations: input.tools.map((t) => ({
|
|
25
|
+
name: t.name,
|
|
26
|
+
description: t.description,
|
|
27
|
+
parameters: {
|
|
28
|
+
type: "OBJECT",
|
|
29
|
+
properties: Object.fromEntries(Object.entries(t.parameters).map(([k, v]) => [
|
|
30
|
+
k,
|
|
31
|
+
{
|
|
32
|
+
type: v.type.toUpperCase(),
|
|
33
|
+
description: v.description,
|
|
34
|
+
...(v.enum ? { enum: v.enum } : {}),
|
|
35
|
+
},
|
|
36
|
+
])),
|
|
37
|
+
required: Object.entries(t.parameters)
|
|
38
|
+
.filter(([, v]) => v.required)
|
|
39
|
+
.map(([k]) => k),
|
|
40
|
+
},
|
|
41
|
+
})),
|
|
42
|
+
},
|
|
43
|
+
]
|
|
44
|
+
: undefined;
|
|
45
|
+
const request = tools
|
|
46
|
+
? {
|
|
47
|
+
systemInstruction: input.system_context,
|
|
48
|
+
contents,
|
|
49
|
+
tools: tools,
|
|
50
|
+
}
|
|
51
|
+
: { systemInstruction: input.system_context, contents };
|
|
52
|
+
const result = await geminiModel.generateContent(request);
|
|
53
|
+
const response = result.response;
|
|
54
|
+
const parts = response?.candidates?.[0]?.content?.parts ?? [];
|
|
55
|
+
// Check for function call
|
|
56
|
+
const fnCallPart = parts.find((p) => "functionCall" in p && p.functionCall);
|
|
57
|
+
if (fnCallPart &&
|
|
58
|
+
"functionCall" in fnCallPart &&
|
|
59
|
+
fnCallPart.functionCall) {
|
|
60
|
+
const fc = fnCallPart.functionCall;
|
|
61
|
+
const orchestration = {
|
|
62
|
+
action: "use_tool",
|
|
63
|
+
confidence: 0.9,
|
|
64
|
+
tool_name: fc.name,
|
|
65
|
+
tool_params: fc.args,
|
|
66
|
+
};
|
|
67
|
+
return { orchestration };
|
|
68
|
+
}
|
|
69
|
+
// Text response
|
|
70
|
+
const textPart = parts.find((p) => "text" in p && typeof p.text === "string");
|
|
71
|
+
const text = textPart && "text" in textPart ? textPart.text : "";
|
|
72
|
+
// Token usage
|
|
73
|
+
const usage = response?.usageMetadata;
|
|
74
|
+
const inputTokens = usage?.promptTokenCount;
|
|
75
|
+
const outputTokens = usage?.candidatesTokenCount;
|
|
76
|
+
return {
|
|
77
|
+
generation: { response_text: text },
|
|
78
|
+
orchestration: { action: "respond", confidence: 0.95 },
|
|
79
|
+
// Gemini 2.5 Flash pricing: $0.075/1M input, $0.30/1M output
|
|
80
|
+
costUsd: usage
|
|
81
|
+
? (usage.promptTokenCount ?? 0) * 0.000_000_075 +
|
|
82
|
+
(usage.candidatesTokenCount ?? 0) * 0.0000003
|
|
83
|
+
: 0,
|
|
84
|
+
...(inputTokens !== undefined || outputTokens !== undefined
|
|
85
|
+
? {
|
|
86
|
+
usage: {
|
|
87
|
+
...(inputTokens !== undefined ? { inputTokens } : {}),
|
|
88
|
+
...(outputTokens !== undefined ? { outputTokens } : {}),
|
|
89
|
+
},
|
|
90
|
+
}
|
|
91
|
+
: {}),
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function buildGeminiContents(input) {
|
|
97
|
+
const contents = [];
|
|
98
|
+
for (const msg of input.history) {
|
|
99
|
+
const role = msg.role === "assistant" ? "model" : "user";
|
|
100
|
+
contents.push({ role, parts: [{ text: msg.content }] });
|
|
101
|
+
}
|
|
102
|
+
// Current user message
|
|
103
|
+
let userText = input.raw;
|
|
104
|
+
if (input.tool_results?.length) {
|
|
105
|
+
const resultSummary = input.tool_results
|
|
106
|
+
.map((r) => `[${r.tool}] ${r.status}: ${JSON.stringify(r.result ?? r.error)}`)
|
|
107
|
+
.join("\n");
|
|
108
|
+
userText = `Tool results:\n${resultSummary}\n\n${input.raw}`;
|
|
109
|
+
}
|
|
110
|
+
contents.push({ role: "user", parts: [{ text: userText }] });
|
|
111
|
+
return contents;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/brain/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama Brain — local model via Ollama REST API.
|
|
3
|
+
* No peer dependencies — plain HTTP fetch.
|
|
4
|
+
*/
|
|
5
|
+
import type { Brain } from "./types.js";
|
|
6
|
+
export declare function createOllamaBrain(opts: {
|
|
7
|
+
endpoint?: string;
|
|
8
|
+
model?: string;
|
|
9
|
+
}): Brain;
|
|
10
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/brain/ollama.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAmD,MAAM,YAAY,CAAC;AAEzF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,KAAK,CAyCR"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama Brain — local model via Ollama REST API.
|
|
3
|
+
* No peer dependencies — plain HTTP fetch.
|
|
4
|
+
*/
|
|
5
|
+
export function createOllamaBrain(opts) {
|
|
6
|
+
const endpoint = opts.endpoint ?? process.env["OLLAMA_ENDPOINT"] ?? "http://localhost:11434";
|
|
7
|
+
const model = opts.model ?? "llama3.2";
|
|
8
|
+
return {
|
|
9
|
+
name: "ollama",
|
|
10
|
+
async run(input) {
|
|
11
|
+
const messages = [
|
|
12
|
+
{ role: "system", content: input.system_context },
|
|
13
|
+
...input.history.map((m) => ({ role: m.role, content: m.content })),
|
|
14
|
+
{ role: "user", content: input.raw },
|
|
15
|
+
];
|
|
16
|
+
const response = await fetch(`${endpoint}/api/chat`, {
|
|
17
|
+
method: "POST",
|
|
18
|
+
headers: { "Content-Type": "application/json" },
|
|
19
|
+
body: JSON.stringify({ model, messages, stream: false }),
|
|
20
|
+
});
|
|
21
|
+
if (!response.ok) {
|
|
22
|
+
throw new Error(`Ollama error: ${response.status} ${response.statusText}`);
|
|
23
|
+
}
|
|
24
|
+
const data = (await response.json());
|
|
25
|
+
const text = data.message?.content ?? "";
|
|
26
|
+
const inputTokens = data.prompt_eval_count;
|
|
27
|
+
const outputTokens = data.eval_count;
|
|
28
|
+
return {
|
|
29
|
+
generation: { response_text: text },
|
|
30
|
+
orchestration: { action: "respond", confidence: 0.85 },
|
|
31
|
+
...(inputTokens !== undefined || outputTokens !== undefined
|
|
32
|
+
? { usage: { ...(inputTokens !== undefined ? { inputTokens } : {}), ...(outputTokens !== undefined ? { outputTokens } : {}) } }
|
|
33
|
+
: {}),
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/brain/ollama.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,UAAU,iBAAiB,CAAC,IAGjC;IACC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,wBAAwB,CAAC;IAC7F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC;IAEvC,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,KAAK,CAAC,GAAG,CAAC,KAAoB;YAC5B,MAAM,QAAQ,GAAG;gBACf,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,cAAc,EAAE;gBACjD,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBACnE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE;aACrC,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,WAAW,EAAE;gBACnD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;aACzD,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAC7E,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAIlC,CAAC;YAEF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;YACzC,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC;YAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC;YACrC,OAAO;gBACL,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;gBACnC,aAAa,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAwB;gBAC5E,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS;oBACzD,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC/H,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Brain — wraps the OpenAI Chat Completions API.
|
|
3
|
+
* Peer dependency: openai >= 4.0.0
|
|
4
|
+
*/
|
|
5
|
+
import type { Brain } from "./types.js";
|
|
6
|
+
export declare function createOpenAIBrain(opts: {
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
model?: string;
|
|
9
|
+
baseURL?: string;
|
|
10
|
+
}): Brain;
|
|
11
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/brain/openai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,KAAK,EAIN,MAAM,YAAY,CAAC;AAGpB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,KAAK,CAwGR"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Brain — wraps the OpenAI Chat Completions API.
|
|
3
|
+
* Peer dependency: openai >= 4.0.0
|
|
4
|
+
*/
|
|
5
|
+
export function createOpenAIBrain(opts) {
|
|
6
|
+
const model = opts.model ?? "gpt-4o-mini";
|
|
7
|
+
return {
|
|
8
|
+
name: "openai",
|
|
9
|
+
async run(input) {
|
|
10
|
+
const { default: OpenAI } = await import("openai");
|
|
11
|
+
const client = new OpenAI({
|
|
12
|
+
apiKey: opts.apiKey ?? process.env["OPENAI_API_KEY"],
|
|
13
|
+
...(opts.baseURL ? { baseURL: opts.baseURL } : {}),
|
|
14
|
+
});
|
|
15
|
+
const messages = [
|
|
16
|
+
{ role: "system", content: input.system_context },
|
|
17
|
+
...input.history.map((m) => ({
|
|
18
|
+
role: (m.role === "assistant" ? "assistant" : "user"),
|
|
19
|
+
content: m.content,
|
|
20
|
+
})),
|
|
21
|
+
{ role: "user", content: input.raw },
|
|
22
|
+
];
|
|
23
|
+
const tools = input.tools.length > 0
|
|
24
|
+
? input.tools.map((t) => ({
|
|
25
|
+
type: "function",
|
|
26
|
+
function: {
|
|
27
|
+
name: t.name,
|
|
28
|
+
description: t.description,
|
|
29
|
+
parameters: {
|
|
30
|
+
type: "object",
|
|
31
|
+
properties: Object.fromEntries(Object.entries(t.parameters).map(([k, v]) => [
|
|
32
|
+
k,
|
|
33
|
+
{
|
|
34
|
+
type: v.type,
|
|
35
|
+
description: v.description,
|
|
36
|
+
enum: v.enum,
|
|
37
|
+
},
|
|
38
|
+
])),
|
|
39
|
+
required: Object.entries(t.parameters)
|
|
40
|
+
.filter(([, v]) => v.required)
|
|
41
|
+
.map(([k]) => k),
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
}))
|
|
45
|
+
: undefined;
|
|
46
|
+
const body = tools
|
|
47
|
+
? {
|
|
48
|
+
model,
|
|
49
|
+
messages: messages,
|
|
50
|
+
tools: tools,
|
|
51
|
+
tool_choice: "auto",
|
|
52
|
+
}
|
|
53
|
+
: { model, messages: messages };
|
|
54
|
+
const response = await client.chat.completions.create(body);
|
|
55
|
+
const choice = response.choices[0];
|
|
56
|
+
if (!choice)
|
|
57
|
+
return {};
|
|
58
|
+
const msg = choice.message;
|
|
59
|
+
// Tool call response
|
|
60
|
+
if (msg.tool_calls?.length) {
|
|
61
|
+
const call = msg.tool_calls[0];
|
|
62
|
+
if (!call)
|
|
63
|
+
return {};
|
|
64
|
+
let params = {};
|
|
65
|
+
try {
|
|
66
|
+
params = JSON.parse(call.function
|
|
67
|
+
?.arguments ?? "{}");
|
|
68
|
+
}
|
|
69
|
+
catch { }
|
|
70
|
+
const orchestration = {
|
|
71
|
+
action: "use_tool",
|
|
72
|
+
confidence: 0.9,
|
|
73
|
+
tool_name: call.function?.name ?? "",
|
|
74
|
+
tool_params: params,
|
|
75
|
+
};
|
|
76
|
+
return { orchestration };
|
|
77
|
+
}
|
|
78
|
+
const text = msg.content ?? "";
|
|
79
|
+
const inputTokens = response.usage?.prompt_tokens;
|
|
80
|
+
const outputTokens = response.usage?.completion_tokens;
|
|
81
|
+
return {
|
|
82
|
+
generation: { response_text: text },
|
|
83
|
+
orchestration: { action: "respond", confidence: 0.95 },
|
|
84
|
+
...(inputTokens !== undefined || outputTokens !== undefined
|
|
85
|
+
? {
|
|
86
|
+
usage: {
|
|
87
|
+
...(inputTokens !== undefined ? { inputTokens } : {}),
|
|
88
|
+
...(outputTokens !== undefined ? { outputTokens } : {}),
|
|
89
|
+
},
|
|
90
|
+
}
|
|
91
|
+
: {}),
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/brain/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brain types — the contract every brain implementation must satisfy.
|
|
3
|
+
* Re-exported here for clarity; primary definition is in core/types.ts.
|
|
4
|
+
*/
|
|
5
|
+
export type { Brain, BrainRunInput, BrainPayload, BrainOrchestration, BrainGeneration } from "../core/types.js";
|
|
6
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/brain/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/brain/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Builder — Assembles brain input from session state + injected context.
|
|
3
|
+
*
|
|
4
|
+
* Priority order (highest first):
|
|
5
|
+
* 1. neverTruncate memories (from msm-context tiers marked protected)
|
|
6
|
+
* 2. normal memories, sorted by score
|
|
7
|
+
* 3. session history (last N messages)
|
|
8
|
+
* 4. tool catalog
|
|
9
|
+
*
|
|
10
|
+
* Token budget is enforced by dropping lowest-priority memories first.
|
|
11
|
+
* The agent never queries external stores — context arrives pre-assembled.
|
|
12
|
+
*/
|
|
13
|
+
import type { AgentDefinition, AgentContext, BrainRunInput, Message, ToolDefinition } from "./types.js";
|
|
14
|
+
export interface ContextBudget {
|
|
15
|
+
/** Total token ceiling (default: 32_000) */
|
|
16
|
+
maxTokens: number;
|
|
17
|
+
/** Max history messages to include (default: 20) */
|
|
18
|
+
maxHistoryMessages: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Build the full system context string for the brain.
|
|
22
|
+
* Enforces token budget by truncating memories from the bottom.
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildContext(def: AgentDefinition, history: Message[], tools: ToolDefinition[], context?: AgentContext, budget?: ContextBudget): Pick<BrainRunInput, "system_context" | "history">;
|
|
25
|
+
//# sourceMappingURL=context-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../src/core/context-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,aAAa,EACb,OAAO,EAEP,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAoDD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,OAAO,EAAE,EAClB,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,CAAC,EAAE,YAAY,EACtB,MAAM,GAAE,aAA8B,GACrC,IAAI,CAAC,aAAa,EAAE,gBAAgB,GAAG,SAAS,CAAC,CA4BnD"}
|