@mcoda/agents 0.1.4
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 +7 -0
- package/LICENSE +21 -0
- package/README.md +9 -0
- package/dist/AgentService/AgentService.d.ts +22 -0
- package/dist/AgentService/AgentService.d.ts.map +1 -0
- package/dist/AgentService/AgentService.js +291 -0
- package/dist/adapters/AdapterTypes.d.ts +29 -0
- package/dist/adapters/AdapterTypes.d.ts.map +1 -0
- package/dist/adapters/AdapterTypes.js +1 -0
- package/dist/adapters/codex/CodexAdapter.d.ts +11 -0
- package/dist/adapters/codex/CodexAdapter.d.ts.map +1 -0
- package/dist/adapters/codex/CodexAdapter.js +58 -0
- package/dist/adapters/codex/CodexCliRunner.d.ts +13 -0
- package/dist/adapters/codex/CodexCliRunner.d.ts.map +1 -0
- package/dist/adapters/codex/CodexCliRunner.js +143 -0
- package/dist/adapters/gemini/GeminiAdapter.d.ts +11 -0
- package/dist/adapters/gemini/GeminiAdapter.d.ts.map +1 -0
- package/dist/adapters/gemini/GeminiAdapter.js +53 -0
- package/dist/adapters/gemini/GeminiCliRunner.d.ts +13 -0
- package/dist/adapters/gemini/GeminiCliRunner.d.ts.map +1 -0
- package/dist/adapters/gemini/GeminiCliRunner.js +68 -0
- package/dist/adapters/local/LocalAdapter.d.ts +11 -0
- package/dist/adapters/local/LocalAdapter.d.ts.map +1 -0
- package/dist/adapters/local/LocalAdapter.js +38 -0
- package/dist/adapters/ollama/OllamaCliAdapter.d.ts +11 -0
- package/dist/adapters/ollama/OllamaCliAdapter.d.ts.map +1 -0
- package/dist/adapters/ollama/OllamaCliAdapter.js +53 -0
- package/dist/adapters/ollama/OllamaCliRunner.d.ts +13 -0
- package/dist/adapters/ollama/OllamaCliRunner.d.ts.map +1 -0
- package/dist/adapters/ollama/OllamaCliRunner.js +61 -0
- package/dist/adapters/ollama/OllamaRemoteAdapter.d.ts +23 -0
- package/dist/adapters/ollama/OllamaRemoteAdapter.d.ts.map +1 -0
- package/dist/adapters/ollama/OllamaRemoteAdapter.js +199 -0
- package/dist/adapters/openai/OpenAiAdapter.d.ts +11 -0
- package/dist/adapters/openai/OpenAiAdapter.d.ts.map +1 -0
- package/dist/adapters/openai/OpenAiAdapter.js +51 -0
- package/dist/adapters/openai/OpenAiCliAdapter.d.ts +11 -0
- package/dist/adapters/openai/OpenAiCliAdapter.d.ts.map +1 -0
- package/dist/adapters/openai/OpenAiCliAdapter.js +57 -0
- package/dist/adapters/qa/QaAdapter.d.ts +11 -0
- package/dist/adapters/qa/QaAdapter.d.ts.map +1 -0
- package/dist/adapters/qa/QaAdapter.js +37 -0
- package/dist/adapters/zhipu/ZhipuApiAdapter.d.ts +30 -0
- package/dist/adapters/zhipu/ZhipuApiAdapter.d.ts.map +1 -0
- package/dist/adapters/zhipu/ZhipuApiAdapter.js +255 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/package.json +41 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { cliHealthy as codexCliHealthy, runCodexExec, runCodexExecStream } from "../codex/CodexCliRunner.js";
|
|
2
|
+
export class OpenAiCliAdapter {
|
|
3
|
+
constructor(config) {
|
|
4
|
+
this.config = config;
|
|
5
|
+
}
|
|
6
|
+
async getCapabilities() {
|
|
7
|
+
return this.config.capabilities;
|
|
8
|
+
}
|
|
9
|
+
async healthCheck() {
|
|
10
|
+
const started = Date.now();
|
|
11
|
+
const result = codexCliHealthy();
|
|
12
|
+
return {
|
|
13
|
+
agentId: this.config.agent.id,
|
|
14
|
+
status: result.ok ? "healthy" : "unreachable",
|
|
15
|
+
lastCheckedAt: new Date().toISOString(),
|
|
16
|
+
latencyMs: Date.now() - started,
|
|
17
|
+
details: { adapter: "codex-cli", ...result.details },
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
async invoke(request) {
|
|
21
|
+
const cliDetails = codexCliHealthy(true);
|
|
22
|
+
const result = runCodexExec(request.input, this.config.model);
|
|
23
|
+
return {
|
|
24
|
+
output: result.output,
|
|
25
|
+
adapter: this.config.adapter ?? "codex-cli",
|
|
26
|
+
model: this.config.model,
|
|
27
|
+
metadata: {
|
|
28
|
+
mode: "cli",
|
|
29
|
+
capabilities: this.config.capabilities,
|
|
30
|
+
prompts: this.config.prompts,
|
|
31
|
+
adapterType: this.config.adapter ?? "codex-cli",
|
|
32
|
+
cli: cliDetails.details,
|
|
33
|
+
raw: result.raw,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async *invokeStream(request) {
|
|
38
|
+
const health = codexCliHealthy(true);
|
|
39
|
+
const cliDetails = health.details;
|
|
40
|
+
for await (const chunk of runCodexExecStream(request.input, this.config.model)) {
|
|
41
|
+
yield {
|
|
42
|
+
output: chunk.output,
|
|
43
|
+
adapter: this.config.adapter ?? "codex-cli",
|
|
44
|
+
model: this.config.model,
|
|
45
|
+
metadata: {
|
|
46
|
+
mode: "cli",
|
|
47
|
+
capabilities: this.config.capabilities,
|
|
48
|
+
prompts: this.config.prompts,
|
|
49
|
+
adapterType: this.config.adapter ?? "codex-cli",
|
|
50
|
+
cli: cliDetails,
|
|
51
|
+
raw: chunk.raw,
|
|
52
|
+
streaming: true,
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AgentHealth } from "@mcoda/shared";
|
|
2
|
+
import { AdapterConfig, AgentAdapter, InvocationRequest, InvocationResult } from "../AdapterTypes.js";
|
|
3
|
+
export declare class QaAdapter implements AgentAdapter {
|
|
4
|
+
private config;
|
|
5
|
+
constructor(config: AdapterConfig);
|
|
6
|
+
getCapabilities(): Promise<string[]>;
|
|
7
|
+
healthCheck(): Promise<AgentHealth>;
|
|
8
|
+
invoke(request: InvocationRequest): Promise<InvocationResult>;
|
|
9
|
+
invokeStream(request: InvocationRequest): AsyncGenerator<InvocationResult, void, unknown>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=QaAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QaAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/qa/QaAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtG,qBAAa,SAAU,YAAW,YAAY;IAChC,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAEnC,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIpC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;IASnC,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAc5D,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,cAAc,CAAC,gBAAgB,EAAE,IAAI,EAAE,OAAO,CAAC;CAQjG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export class QaAdapter {
|
|
2
|
+
constructor(config) {
|
|
3
|
+
this.config = config;
|
|
4
|
+
}
|
|
5
|
+
async getCapabilities() {
|
|
6
|
+
return this.config.capabilities;
|
|
7
|
+
}
|
|
8
|
+
async healthCheck() {
|
|
9
|
+
return {
|
|
10
|
+
agentId: this.config.agent.id,
|
|
11
|
+
status: "healthy",
|
|
12
|
+
lastCheckedAt: new Date().toISOString(),
|
|
13
|
+
details: { adapter: "qa-cli" },
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
async invoke(request) {
|
|
17
|
+
return {
|
|
18
|
+
output: `qa-stub:${request.input}`,
|
|
19
|
+
adapter: this.config.adapter ?? "qa-cli",
|
|
20
|
+
model: this.config.model,
|
|
21
|
+
metadata: {
|
|
22
|
+
mode: "cli",
|
|
23
|
+
capabilities: this.config.capabilities,
|
|
24
|
+
adapterType: this.config.adapter ?? "qa-cli",
|
|
25
|
+
authMode: "cli",
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
async *invokeStream(request) {
|
|
30
|
+
yield {
|
|
31
|
+
output: `qa-stream:${request.input}`,
|
|
32
|
+
adapter: this.config.adapter ?? "qa-cli",
|
|
33
|
+
model: this.config.model,
|
|
34
|
+
metadata: { mode: "cli", streaming: true },
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { AgentHealth } from "@mcoda/shared";
|
|
2
|
+
import { AdapterConfig, AgentAdapter, InvocationRequest, InvocationResult } from "../AdapterTypes.js";
|
|
3
|
+
type ZhipuConfig = AdapterConfig & {
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
temperature?: number;
|
|
7
|
+
thinking?: boolean;
|
|
8
|
+
extraBody?: Record<string, unknown>;
|
|
9
|
+
};
|
|
10
|
+
export declare class ZhipuApiAdapter implements AgentAdapter {
|
|
11
|
+
private config;
|
|
12
|
+
private baseUrl;
|
|
13
|
+
private headers;
|
|
14
|
+
private temperature;
|
|
15
|
+
private thinking;
|
|
16
|
+
private extraBody;
|
|
17
|
+
constructor(config: ZhipuConfig);
|
|
18
|
+
getCapabilities(): Promise<string[]>;
|
|
19
|
+
healthCheck(): Promise<AgentHealth>;
|
|
20
|
+
invoke(request: InvocationRequest): Promise<InvocationResult>;
|
|
21
|
+
invokeStream(request: InvocationRequest): AsyncGenerator<InvocationResult, void, unknown>;
|
|
22
|
+
private assertConfig;
|
|
23
|
+
private ensureBaseUrl;
|
|
24
|
+
private ensureModel;
|
|
25
|
+
private ensureApiKey;
|
|
26
|
+
private buildHeaders;
|
|
27
|
+
private buildBody;
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=ZhipuApiAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZhipuApiAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/zhipu/ZhipuApiAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AA0CtG,KAAK,WAAW,GAAG,aAAa,GAAG;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAAC;AAEF,qBAAa,eAAgB,YAAW,YAAY;IAOtC,OAAO,CAAC,MAAM;IAN1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,SAAS,CAAsC;gBAEnC,MAAM,EAAE,WAAW;IASjC,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIpC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;IAkBnC,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2C5D,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,cAAc,CAAC,gBAAgB,EAAE,IAAI,EAAE,OAAO,CAAC;IA2FhG,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,SAAS;CAgBlB"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
const DEFAULT_BASE_URL = "https://open.bigmodel.cn/api/paas/v4";
|
|
2
|
+
const DEFAULT_TEMPERATURE = 0.1;
|
|
3
|
+
const normalizeBaseUrl = (value) => {
|
|
4
|
+
if (!value)
|
|
5
|
+
return undefined;
|
|
6
|
+
const str = String(value).trim();
|
|
7
|
+
if (!str)
|
|
8
|
+
return undefined;
|
|
9
|
+
return str.endsWith("/") ? str.slice(0, -1) : str;
|
|
10
|
+
};
|
|
11
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
12
|
+
const extractUsage = (usage) => {
|
|
13
|
+
if (!usage || typeof usage !== "object")
|
|
14
|
+
return undefined;
|
|
15
|
+
const tokensPrompt = typeof usage.prompt_tokens === "number"
|
|
16
|
+
? usage.prompt_tokens
|
|
17
|
+
: typeof usage.promptTokens === "number"
|
|
18
|
+
? usage.promptTokens
|
|
19
|
+
: undefined;
|
|
20
|
+
const tokensCompletion = typeof usage.completion_tokens === "number"
|
|
21
|
+
? usage.completion_tokens
|
|
22
|
+
: typeof usage.completionTokens === "number"
|
|
23
|
+
? usage.completionTokens
|
|
24
|
+
: undefined;
|
|
25
|
+
let tokensTotal = typeof usage.total_tokens === "number"
|
|
26
|
+
? usage.total_tokens
|
|
27
|
+
: typeof usage.totalTokens === "number"
|
|
28
|
+
? usage.totalTokens
|
|
29
|
+
: undefined;
|
|
30
|
+
if (tokensTotal === undefined && typeof tokensPrompt === "number" && typeof tokensCompletion === "number") {
|
|
31
|
+
tokensTotal = tokensPrompt + tokensCompletion;
|
|
32
|
+
}
|
|
33
|
+
if (tokensPrompt === undefined && tokensCompletion === undefined && tokensTotal === undefined)
|
|
34
|
+
return undefined;
|
|
35
|
+
return { tokensPrompt, tokensCompletion, tokensTotal };
|
|
36
|
+
};
|
|
37
|
+
export class ZhipuApiAdapter {
|
|
38
|
+
constructor(config) {
|
|
39
|
+
this.config = config;
|
|
40
|
+
this.baseUrl = normalizeBaseUrl(config.baseUrl) ?? DEFAULT_BASE_URL;
|
|
41
|
+
this.headers = isRecord(config.headers) ? config.headers : undefined;
|
|
42
|
+
this.temperature = typeof config.temperature === "number" ? config.temperature : undefined;
|
|
43
|
+
this.thinking = typeof config.thinking === "boolean" ? config.thinking : undefined;
|
|
44
|
+
this.extraBody = isRecord(config.extraBody) ? config.extraBody : undefined;
|
|
45
|
+
this.assertConfig();
|
|
46
|
+
}
|
|
47
|
+
async getCapabilities() {
|
|
48
|
+
return this.config.capabilities;
|
|
49
|
+
}
|
|
50
|
+
async healthCheck() {
|
|
51
|
+
if (!this.config.apiKey) {
|
|
52
|
+
return {
|
|
53
|
+
agentId: this.config.agent.id,
|
|
54
|
+
status: "unreachable",
|
|
55
|
+
lastCheckedAt: new Date().toISOString(),
|
|
56
|
+
details: { reason: "missing_api_key" },
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
agentId: this.config.agent.id,
|
|
61
|
+
status: "healthy",
|
|
62
|
+
lastCheckedAt: new Date().toISOString(),
|
|
63
|
+
latencyMs: 0,
|
|
64
|
+
details: { adapter: "zhipu-api", model: this.config.model, baseUrl: this.baseUrl },
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async invoke(request) {
|
|
68
|
+
const url = this.ensureBaseUrl();
|
|
69
|
+
const model = this.ensureModel();
|
|
70
|
+
const apiKey = this.ensureApiKey();
|
|
71
|
+
const body = this.buildBody(request.input, model, false);
|
|
72
|
+
const resp = await fetch(`${url}/chat/completions`, {
|
|
73
|
+
method: "POST",
|
|
74
|
+
headers: this.buildHeaders(apiKey, false),
|
|
75
|
+
body: JSON.stringify(body),
|
|
76
|
+
});
|
|
77
|
+
if (!resp.ok) {
|
|
78
|
+
const text = await resp.text().catch(() => "");
|
|
79
|
+
throw new Error(`Zhipu chat completions failed (${resp.status}): ${text}`);
|
|
80
|
+
}
|
|
81
|
+
const data = await resp.json().catch(() => ({}));
|
|
82
|
+
const choice = data?.choices?.[0];
|
|
83
|
+
const message = choice?.message;
|
|
84
|
+
const content = typeof message?.content === "string" ? message.content : undefined;
|
|
85
|
+
const reasoning = typeof message?.reasoning_content === "string" ? message.reasoning_content : undefined;
|
|
86
|
+
const output = content ?? reasoning ?? (typeof data?.output_text === "string" ? data.output_text : JSON.stringify(data));
|
|
87
|
+
const usage = extractUsage(data?.usage);
|
|
88
|
+
return {
|
|
89
|
+
output: output.trim(),
|
|
90
|
+
adapter: this.config.adapter ?? "zhipu-api",
|
|
91
|
+
model,
|
|
92
|
+
metadata: {
|
|
93
|
+
mode: "api",
|
|
94
|
+
adapterType: this.config.adapter ?? "zhipu-api",
|
|
95
|
+
baseUrl: url,
|
|
96
|
+
capabilities: this.config.capabilities,
|
|
97
|
+
usage: data?.usage,
|
|
98
|
+
tokensPrompt: usage?.tokensPrompt,
|
|
99
|
+
tokensCompletion: usage?.tokensCompletion,
|
|
100
|
+
tokensTotal: usage?.tokensTotal,
|
|
101
|
+
tokens_prompt: usage?.tokensPrompt,
|
|
102
|
+
tokens_completion: usage?.tokensCompletion,
|
|
103
|
+
tokens_total: usage?.tokensTotal,
|
|
104
|
+
reasoning,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
async *invokeStream(request) {
|
|
109
|
+
const url = this.ensureBaseUrl();
|
|
110
|
+
const model = this.ensureModel();
|
|
111
|
+
const apiKey = this.ensureApiKey();
|
|
112
|
+
const body = this.buildBody(request.input, model, true);
|
|
113
|
+
const resp = await fetch(`${url}/chat/completions`, {
|
|
114
|
+
method: "POST",
|
|
115
|
+
headers: this.buildHeaders(apiKey, true),
|
|
116
|
+
body: JSON.stringify(body),
|
|
117
|
+
});
|
|
118
|
+
if (!resp.ok || !resp.body) {
|
|
119
|
+
const text = !resp.ok ? await resp.text().catch(() => "") : "";
|
|
120
|
+
throw new Error(`Zhipu chat completions (stream) failed (${resp.status}): ${text}`);
|
|
121
|
+
}
|
|
122
|
+
const reader = resp.body.getReader();
|
|
123
|
+
const decoder = new TextDecoder();
|
|
124
|
+
let buffer = "";
|
|
125
|
+
let latestUsage;
|
|
126
|
+
const buildChunk = (payload) => {
|
|
127
|
+
const data = JSON.parse(payload);
|
|
128
|
+
const choice = data?.choices?.[0];
|
|
129
|
+
const delta = choice?.delta ?? choice?.message ?? {};
|
|
130
|
+
const content = typeof delta?.content === "string" ? delta.content : "";
|
|
131
|
+
const reasoning = typeof delta?.reasoning_content === "string" ? delta.reasoning_content : undefined;
|
|
132
|
+
const usage = extractUsage(data?.usage);
|
|
133
|
+
if (usage)
|
|
134
|
+
latestUsage = usage;
|
|
135
|
+
const output = content || reasoning || "";
|
|
136
|
+
const shouldEmit = Boolean(output) || Boolean(usage);
|
|
137
|
+
if (!shouldEmit)
|
|
138
|
+
return null;
|
|
139
|
+
return {
|
|
140
|
+
output,
|
|
141
|
+
adapter: this.config.adapter ?? "zhipu-api",
|
|
142
|
+
model,
|
|
143
|
+
metadata: {
|
|
144
|
+
mode: "api",
|
|
145
|
+
adapterType: this.config.adapter ?? "zhipu-api",
|
|
146
|
+
baseUrl: url,
|
|
147
|
+
capabilities: this.config.capabilities,
|
|
148
|
+
streaming: true,
|
|
149
|
+
reasoning,
|
|
150
|
+
usage: data?.usage,
|
|
151
|
+
tokensPrompt: latestUsage?.tokensPrompt,
|
|
152
|
+
tokensCompletion: latestUsage?.tokensCompletion,
|
|
153
|
+
tokensTotal: latestUsage?.tokensTotal,
|
|
154
|
+
tokens_prompt: latestUsage?.tokensPrompt,
|
|
155
|
+
tokens_completion: latestUsage?.tokensCompletion,
|
|
156
|
+
tokens_total: latestUsage?.tokensTotal,
|
|
157
|
+
raw: payload,
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
};
|
|
161
|
+
while (true) {
|
|
162
|
+
const { value, done } = await reader.read();
|
|
163
|
+
if (done)
|
|
164
|
+
break;
|
|
165
|
+
buffer += decoder.decode(value, { stream: true });
|
|
166
|
+
let idx;
|
|
167
|
+
while ((idx = buffer.indexOf("\n")) !== -1) {
|
|
168
|
+
const line = buffer.slice(0, idx).trim();
|
|
169
|
+
buffer = buffer.slice(idx + 1);
|
|
170
|
+
if (!line || !line.startsWith("data:"))
|
|
171
|
+
continue;
|
|
172
|
+
const payload = line.slice(5).trim();
|
|
173
|
+
if (!payload)
|
|
174
|
+
continue;
|
|
175
|
+
if (payload === "[DONE]")
|
|
176
|
+
return;
|
|
177
|
+
try {
|
|
178
|
+
const chunk = buildChunk(payload);
|
|
179
|
+
if (chunk)
|
|
180
|
+
yield chunk;
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// Ignore malformed lines; keep streaming.
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const tail = buffer.trim();
|
|
188
|
+
if (tail) {
|
|
189
|
+
const lines = tail.split(/\r?\n/).filter((line) => line.trim().length > 0);
|
|
190
|
+
for (const line of lines) {
|
|
191
|
+
const trimmed = line.trim();
|
|
192
|
+
if (!trimmed.startsWith("data:"))
|
|
193
|
+
continue;
|
|
194
|
+
const payload = trimmed.slice(5).trim();
|
|
195
|
+
if (!payload || payload === "[DONE]")
|
|
196
|
+
continue;
|
|
197
|
+
try {
|
|
198
|
+
const chunk = buildChunk(payload);
|
|
199
|
+
if (chunk)
|
|
200
|
+
yield chunk;
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
// Ignore malformed lines; keep streaming.
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
assertConfig() {
|
|
209
|
+
if (!/^https?:\/\//i.test(this.baseUrl)) {
|
|
210
|
+
throw new Error("Zhipu baseUrl must start with http:// or https://");
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
ensureBaseUrl() {
|
|
214
|
+
return this.baseUrl;
|
|
215
|
+
}
|
|
216
|
+
ensureModel() {
|
|
217
|
+
if (!this.config.model) {
|
|
218
|
+
throw new Error("Zhipu model is not configured for this agent");
|
|
219
|
+
}
|
|
220
|
+
return this.config.model;
|
|
221
|
+
}
|
|
222
|
+
ensureApiKey() {
|
|
223
|
+
if (!this.config.apiKey) {
|
|
224
|
+
throw new Error("AUTH_REQUIRED: Zhipu API key missing; run `mcoda agent auth set <name>`");
|
|
225
|
+
}
|
|
226
|
+
return this.config.apiKey;
|
|
227
|
+
}
|
|
228
|
+
buildHeaders(apiKey, streaming) {
|
|
229
|
+
return {
|
|
230
|
+
Authorization: `Bearer ${apiKey}`,
|
|
231
|
+
"Content-Type": "application/json",
|
|
232
|
+
...(streaming ? { Accept: "text/event-stream" } : {}),
|
|
233
|
+
...(this.headers ?? {}),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
buildBody(input, model, stream) {
|
|
237
|
+
const body = {
|
|
238
|
+
model,
|
|
239
|
+
messages: [{ role: "user", content: input }],
|
|
240
|
+
stream,
|
|
241
|
+
};
|
|
242
|
+
const temperature = this.temperature ?? DEFAULT_TEMPERATURE;
|
|
243
|
+
if (typeof temperature === "number")
|
|
244
|
+
body.temperature = temperature;
|
|
245
|
+
if (typeof this.thinking === "boolean")
|
|
246
|
+
body.thinking = this.thinking;
|
|
247
|
+
if (this.extraBody) {
|
|
248
|
+
for (const [key, value] of Object.entries(this.extraBody)) {
|
|
249
|
+
if (body[key] === undefined)
|
|
250
|
+
body[key] = value;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return body;
|
|
254
|
+
}
|
|
255
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from "./AgentService/AgentService.js";
|
|
2
|
+
export * from "./adapters/AdapterTypes.js";
|
|
3
|
+
export * from "./adapters/openai/OpenAiAdapter.js";
|
|
4
|
+
export * from "./adapters/openai/OpenAiCliAdapter.js";
|
|
5
|
+
export * from "./adapters/codex/CodexAdapter.js";
|
|
6
|
+
export * from "./adapters/gemini/GeminiAdapter.js";
|
|
7
|
+
export * from "./adapters/local/LocalAdapter.js";
|
|
8
|
+
export * from "./adapters/ollama/OllamaCliAdapter.js";
|
|
9
|
+
export * from "./adapters/ollama/OllamaRemoteAdapter.js";
|
|
10
|
+
export * from "./adapters/zhipu/ZhipuApiAdapter.js";
|
|
11
|
+
export * from "./adapters/qa/QaAdapter.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oCAAoC,CAAC;AACnD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uCAAuC,CAAC;AACtD,cAAc,0CAA0C,CAAC;AACzD,cAAc,qCAAqC,CAAC;AACpD,cAAc,4BAA4B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from "./AgentService/AgentService.js";
|
|
2
|
+
export * from "./adapters/AdapterTypes.js";
|
|
3
|
+
export * from "./adapters/openai/OpenAiAdapter.js";
|
|
4
|
+
export * from "./adapters/openai/OpenAiCliAdapter.js";
|
|
5
|
+
export * from "./adapters/codex/CodexAdapter.js";
|
|
6
|
+
export * from "./adapters/gemini/GeminiAdapter.js";
|
|
7
|
+
export * from "./adapters/local/LocalAdapter.js";
|
|
8
|
+
export * from "./adapters/ollama/OllamaCliAdapter.js";
|
|
9
|
+
export * from "./adapters/ollama/OllamaRemoteAdapter.js";
|
|
10
|
+
export * from "./adapters/zhipu/ZhipuApiAdapter.js";
|
|
11
|
+
export * from "./adapters/qa/QaAdapter.js";
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mcoda/agents",
|
|
3
|
+
"version": "0.1.4",
|
|
4
|
+
"description": "Agent registry and capabilities for mcoda.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"!dist/**/__tests__/**",
|
|
11
|
+
"!dist/**/*.test.*",
|
|
12
|
+
"README.md",
|
|
13
|
+
"CHANGELOG.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc -p tsconfig.json",
|
|
18
|
+
"lint": "echo \"lint not configured\"",
|
|
19
|
+
"test": "pnpm run build && node ../../scripts/run-node-tests.js dist"
|
|
20
|
+
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=20"
|
|
23
|
+
},
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/bekirdag/mcoda.git"
|
|
27
|
+
},
|
|
28
|
+
"bugs": {
|
|
29
|
+
"url": "https://github.com/bekirdag/mcoda/issues"
|
|
30
|
+
},
|
|
31
|
+
"homepage": "https://github.com/bekirdag/mcoda#readme",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"author": "bekir dag",
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@mcoda/shared": "workspace:*",
|
|
39
|
+
"@mcoda/db": "workspace:*"
|
|
40
|
+
}
|
|
41
|
+
}
|