opc-agent 1.3.2 → 2.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/.github/ISSUE_TEMPLATE/bug_report.md +20 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +14 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +13 -0
- package/.github/workflows/ci.yml +24 -0
- package/CHANGELOG.md +48 -63
- package/CONTRIBUTING.md +21 -60
- package/README.md +284 -348
- package/README.zh-CN.md +415 -415
- package/dist/channels/slack.js +93 -10
- package/dist/channels/telegram.d.ts +30 -9
- package/dist/channels/telegram.js +125 -33
- package/dist/channels/web.d.ts +10 -0
- package/dist/channels/web.js +33 -2
- package/dist/cli.js +667 -65
- package/dist/core/agent.d.ts +23 -0
- package/dist/core/agent.js +120 -3
- package/dist/core/runtime.d.ts +5 -0
- package/dist/core/runtime.js +71 -0
- package/dist/core/scheduler.d.ts +52 -0
- package/dist/core/scheduler.js +168 -0
- package/dist/core/subagent.d.ts +28 -0
- package/dist/core/subagent.js +65 -0
- package/dist/daemon.d.ts +3 -0
- package/dist/daemon.js +134 -0
- package/dist/deploy/hermes.js +22 -22
- package/dist/deploy/openclaw.js +31 -40
- package/dist/index.d.ts +10 -10
- package/dist/index.js +22 -15
- package/dist/providers/index.d.ts +6 -2
- package/dist/providers/index.js +22 -9
- package/dist/schema/oad.d.ts +180 -6
- package/dist/schema/oad.js +12 -1
- package/dist/skills/auto-learn.d.ts +28 -0
- package/dist/skills/auto-learn.js +257 -0
- package/dist/templates/code-reviewer.d.ts +0 -8
- package/dist/templates/code-reviewer.js +5 -9
- package/dist/templates/customer-service.d.ts +0 -8
- package/dist/templates/customer-service.js +2 -6
- package/dist/templates/data-analyst.d.ts +0 -8
- package/dist/templates/data-analyst.js +5 -9
- package/dist/templates/knowledge-base.d.ts +0 -8
- package/dist/templates/knowledge-base.js +2 -6
- package/dist/templates/sales-assistant.d.ts +0 -8
- package/dist/templates/sales-assistant.js +4 -8
- package/dist/templates/teacher.d.ts +0 -8
- package/dist/templates/teacher.js +6 -10
- package/dist/tools/builtin/datetime.d.ts +3 -0
- package/dist/tools/builtin/datetime.js +44 -0
- package/dist/tools/builtin/file.d.ts +3 -0
- package/dist/tools/builtin/file.js +151 -0
- package/dist/tools/builtin/index.d.ts +15 -0
- package/dist/tools/builtin/index.js +30 -0
- package/dist/tools/builtin/shell.d.ts +3 -0
- package/dist/tools/builtin/shell.js +43 -0
- package/dist/tools/builtin/web.d.ts +3 -0
- package/dist/tools/builtin/web.js +37 -0
- package/dist/tools/mcp-client.d.ts +24 -0
- package/dist/tools/mcp-client.js +119 -0
- package/dist/traces/index.d.ts +49 -0
- package/dist/traces/index.js +102 -0
- package/docs/.vitepress/config.ts +103 -103
- package/docs/api/cli.md +48 -48
- package/docs/api/oad-schema.md +64 -64
- package/docs/api/sdk.md +80 -80
- package/docs/guide/concepts.md +51 -51
- package/docs/guide/configuration.md +79 -79
- package/docs/guide/deployment.md +42 -42
- package/docs/guide/getting-started.md +44 -44
- package/docs/guide/templates.md +28 -28
- package/docs/guide/testing.md +84 -84
- package/docs/index.md +27 -27
- package/docs/zh/api/cli.md +54 -54
- package/docs/zh/api/oad-schema.md +87 -87
- package/docs/zh/api/sdk.md +102 -102
- package/docs/zh/guide/concepts.md +104 -104
- package/docs/zh/guide/configuration.md +135 -135
- package/docs/zh/guide/deployment.md +81 -81
- package/docs/zh/guide/getting-started.md +82 -82
- package/docs/zh/guide/templates.md +84 -84
- package/docs/zh/guide/testing.md +88 -88
- package/docs/zh/index.md +27 -27
- package/examples/README.md +22 -0
- package/examples/basic-agent.ts +90 -0
- package/examples/brain-integration.ts +71 -0
- package/examples/customer-service-demo/README.md +90 -90
- package/examples/customer-service-demo/oad.yaml +107 -107
- package/examples/multi-channel.ts +74 -0
- package/package.json +1 -1
- package/src/analytics/index.ts +66 -66
- package/src/channels/discord.ts +192 -192
- package/src/channels/email.ts +177 -177
- package/src/channels/feishu.ts +236 -236
- package/src/channels/index.ts +15 -15
- package/src/channels/slack.ts +217 -160
- package/src/channels/telegram.ts +155 -33
- package/src/channels/voice.ts +106 -106
- package/src/channels/web.ts +38 -2
- package/src/channels/webhook.ts +199 -199
- package/src/channels/websocket.ts +87 -87
- package/src/channels/wechat.ts +149 -149
- package/src/cli.ts +697 -63
- package/src/core/a2a.ts +143 -143
- package/src/core/agent.ts +146 -3
- package/src/core/analytics-engine.ts +186 -186
- package/src/core/auth.ts +57 -57
- package/src/core/cache.ts +141 -141
- package/src/core/compose.ts +77 -77
- package/src/core/config.ts +14 -14
- package/src/core/errors.ts +148 -148
- package/src/core/hitl.ts +138 -138
- package/src/core/logger.ts +57 -57
- package/src/core/orchestrator.ts +215 -215
- package/src/core/performance.ts +187 -187
- package/src/core/rate-limiter.ts +128 -128
- package/src/core/room.ts +109 -109
- package/src/core/runtime.ts +230 -152
- package/src/core/sandbox.ts +101 -101
- package/src/core/scheduler.ts +187 -0
- package/src/core/security.ts +171 -171
- package/src/core/subagent.ts +98 -0
- package/src/core/types.ts +68 -68
- package/src/core/versioning.ts +106 -106
- package/src/core/watch.ts +178 -178
- package/src/core/workflow.ts +235 -235
- package/src/daemon.ts +96 -0
- package/src/deploy/hermes.ts +156 -156
- package/src/deploy/openclaw.ts +190 -200
- package/src/i18n/index.ts +216 -216
- package/src/index.ts +14 -10
- package/src/memory/deepbrain.ts +108 -108
- package/src/memory/index.ts +34 -34
- package/src/plugins/index.ts +208 -208
- package/src/providers/index.ts +354 -331
- package/src/schema/oad.ts +14 -2
- package/src/skills/auto-learn.ts +262 -0
- package/src/skills/base.ts +16 -16
- package/src/skills/document.ts +100 -100
- package/src/skills/http.ts +35 -35
- package/src/skills/index.ts +27 -27
- package/src/skills/scheduler.ts +80 -80
- package/src/skills/webhook-trigger.ts +59 -59
- package/src/templates/code-reviewer.ts +30 -34
- package/src/templates/customer-service.ts +76 -80
- package/src/templates/data-analyst.ts +66 -70
- package/src/templates/executive-assistant.ts +71 -71
- package/src/templates/financial-advisor.ts +60 -60
- package/src/templates/knowledge-base.ts +27 -31
- package/src/templates/legal-assistant.ts +71 -71
- package/src/templates/sales-assistant.ts +75 -79
- package/src/templates/teacher.ts +75 -79
- package/src/testing/index.ts +181 -181
- package/src/tools/builtin/datetime.ts +41 -0
- package/src/tools/builtin/file.ts +107 -0
- package/src/tools/builtin/index.ts +28 -0
- package/src/tools/builtin/shell.ts +43 -0
- package/src/tools/builtin/web.ts +35 -0
- package/src/tools/calculator.ts +73 -73
- package/src/tools/datetime.ts +149 -149
- package/src/tools/json-transform.ts +187 -187
- package/src/tools/mcp-client.ts +131 -0
- package/src/tools/mcp.ts +76 -76
- package/src/tools/text-analysis.ts +116 -116
- package/src/traces/index.ts +132 -0
- package/templates/Dockerfile +15 -15
- package/templates/code-reviewer/README.md +27 -27
- package/templates/code-reviewer/oad.yaml +41 -41
- package/templates/customer-service/README.md +22 -22
- package/templates/customer-service/oad.yaml +36 -36
- package/templates/docker-compose.yml +21 -21
- package/templates/ecommerce-assistant/README.md +45 -45
- package/templates/ecommerce-assistant/oad.yaml +47 -47
- package/templates/knowledge-base/README.md +28 -28
- package/templates/knowledge-base/oad.yaml +38 -38
- package/templates/sales-assistant/README.md +26 -26
- package/templates/sales-assistant/oad.yaml +43 -43
- package/templates/tech-support/README.md +43 -43
- package/templates/tech-support/oad.yaml +45 -45
- package/test-agent/Dockerfile +9 -0
- package/test-agent/README.md +50 -0
- package/test-agent/agent.yaml +23 -0
- package/test-agent/docker-compose.yml +11 -0
- package/test-agent/oad.yaml +31 -0
- package/test-agent/package-lock.json +1492 -0
- package/test-agent/package.json +18 -0
- package/test-agent/src/index.ts +24 -0
- package/test-agent/src/skills/echo.ts +15 -0
- package/test-agent/tsconfig.json +25 -0
- package/tests/a2a.test.ts +66 -66
- package/tests/agent.test.ts +72 -72
- package/tests/analytics.test.ts +50 -50
- package/tests/auto-learn.test.ts +105 -0
- package/tests/builtin-tools.test.ts +83 -0
- package/tests/channel.test.ts +39 -39
- package/tests/cli.test.ts +46 -0
- package/tests/e2e.test.ts +134 -134
- package/tests/errors.test.ts +83 -83
- package/tests/hitl.test.ts +71 -71
- package/tests/i18n.test.ts +41 -41
- package/tests/mcp.test.ts +54 -54
- package/tests/oad.test.ts +68 -68
- package/tests/performance.test.ts +115 -115
- package/tests/plugin.test.ts +74 -74
- package/tests/room.test.ts +106 -106
- package/tests/runtime.test.ts +42 -42
- package/tests/sandbox.test.ts +46 -46
- package/tests/security.test.ts +60 -60
- package/tests/subagent.test.ts +130 -0
- package/tests/telegram-discord.test.ts +60 -0
- package/tests/templates.test.ts +77 -77
- package/tests/v070.test.ts +76 -76
- package/tests/versioning.test.ts +75 -75
- package/tests/voice.test.ts +61 -61
- package/tests/webhook.test.ts +29 -29
- package/tests/workflow.test.ts +143 -143
- package/tsconfig.json +19 -19
- package/vitest.config.ts +9 -9
- package/dist/core/dashboard.d.ts +0 -35
- package/dist/core/dashboard.js +0 -157
- package/dist/core/priority.d.ts +0 -52
- package/dist/core/priority.js +0 -102
- package/src/core/dashboard.ts +0 -219
- package/src/core/priority.ts +0 -140
- package/src/dtv/data.ts +0 -29
- package/src/dtv/trust.ts +0 -43
- package/src/dtv/value.ts +0 -47
- package/src/marketplace/index.ts +0 -223
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SubAgentManager = void 0;
|
|
4
|
+
const agent_1 = require("./agent");
|
|
5
|
+
const memory_1 = require("../memory");
|
|
6
|
+
class SubAgentManager {
|
|
7
|
+
agents = new Map();
|
|
8
|
+
async spawn(config, parentProvider) {
|
|
9
|
+
const id = `sub_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
10
|
+
const timeout = config.timeout ?? 300000;
|
|
11
|
+
const isolated = config.isolated !== false;
|
|
12
|
+
const agent = new agent_1.BaseAgent({
|
|
13
|
+
name: config.name,
|
|
14
|
+
systemPrompt: config.systemPrompt ?? 'You are a helpful sub-agent.',
|
|
15
|
+
provider: config.provider ?? 'openai',
|
|
16
|
+
model: config.model,
|
|
17
|
+
memory: isolated ? new memory_1.InMemoryStore() : undefined,
|
|
18
|
+
});
|
|
19
|
+
this.agents.set(id, { agent, status: 'running', name: config.name });
|
|
20
|
+
const message = {
|
|
21
|
+
id: `msg_${Date.now()}`,
|
|
22
|
+
role: 'user',
|
|
23
|
+
content: config.task,
|
|
24
|
+
timestamp: Date.now(),
|
|
25
|
+
metadata: { subAgentId: id },
|
|
26
|
+
};
|
|
27
|
+
const start = Date.now();
|
|
28
|
+
try {
|
|
29
|
+
const result = await Promise.race([
|
|
30
|
+
agent.handleMessage(message),
|
|
31
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('SubAgent timeout')), timeout)),
|
|
32
|
+
]);
|
|
33
|
+
const duration = Date.now() - start;
|
|
34
|
+
this.agents.set(id, { agent, status: 'completed', name: config.name });
|
|
35
|
+
return { id, name: config.name, status: 'completed', result: result.content, duration };
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
const duration = Date.now() - start;
|
|
39
|
+
const isTimeout = err.message.includes('timeout');
|
|
40
|
+
const status = isTimeout ? 'timeout' : 'failed';
|
|
41
|
+
this.agents.set(id, { agent, status, name: config.name });
|
|
42
|
+
return { id, name: config.name, status, result: err.message, duration };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async spawnParallel(configs, parentProvider) {
|
|
46
|
+
return Promise.all(configs.map((c) => this.spawn(c, parentProvider)));
|
|
47
|
+
}
|
|
48
|
+
list() {
|
|
49
|
+
return Array.from(this.agents.entries()).map(([id, entry]) => ({
|
|
50
|
+
id,
|
|
51
|
+
name: entry.name,
|
|
52
|
+
status: entry.status,
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
kill(id) {
|
|
56
|
+
const entry = this.agents.get(id);
|
|
57
|
+
if (!entry)
|
|
58
|
+
return false;
|
|
59
|
+
entry.status = 'killed';
|
|
60
|
+
this.agents.set(id, entry);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.SubAgentManager = SubAgentManager;
|
|
65
|
+
//# sourceMappingURL=subagent.js.map
|
package/dist/daemon.d.ts
ADDED
package/dist/daemon.js
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
/**
|
|
38
|
+
* Daemon entry point — spawned by `opc start` as a detached background process.
|
|
39
|
+
* Loads agent.yaml, creates runtime, starts all channels, writes heartbeat.
|
|
40
|
+
*/
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const runtime_1 = require("./core/runtime");
|
|
44
|
+
const OPC_DIR = path.resolve('.opc');
|
|
45
|
+
const HEARTBEAT_FILE = path.join(OPC_DIR, 'heartbeat');
|
|
46
|
+
const LOG_FILE = path.join(OPC_DIR, 'agent.log');
|
|
47
|
+
const PID_FILE = path.join(OPC_DIR, 'agent.pid');
|
|
48
|
+
const HEARTBEAT_INTERVAL = 30_000;
|
|
49
|
+
function ensureDir(dir) {
|
|
50
|
+
if (!fs.existsSync(dir))
|
|
51
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
52
|
+
}
|
|
53
|
+
function log(msg) {
|
|
54
|
+
const line = `[${new Date().toISOString()}] ${msg}\n`;
|
|
55
|
+
try {
|
|
56
|
+
fs.appendFileSync(LOG_FILE, line);
|
|
57
|
+
}
|
|
58
|
+
catch { /* ignore */ }
|
|
59
|
+
}
|
|
60
|
+
async function main() {
|
|
61
|
+
ensureDir(OPC_DIR);
|
|
62
|
+
// Redirect stdout/stderr to log file
|
|
63
|
+
const logStream = fs.createWriteStream(LOG_FILE, { flags: 'a' });
|
|
64
|
+
process.stdout.write = logStream.write.bind(logStream);
|
|
65
|
+
process.stderr.write = logStream.write.bind(logStream);
|
|
66
|
+
// Write PID
|
|
67
|
+
fs.writeFileSync(PID_FILE, String(process.pid));
|
|
68
|
+
log(`Daemon started, PID=${process.pid}`);
|
|
69
|
+
// Write start time for uptime calculation
|
|
70
|
+
fs.writeFileSync(path.join(OPC_DIR, 'started'), String(Date.now()));
|
|
71
|
+
// Heartbeat
|
|
72
|
+
const heartbeatTimer = setInterval(() => {
|
|
73
|
+
try {
|
|
74
|
+
fs.writeFileSync(HEARTBEAT_FILE, String(Date.now()));
|
|
75
|
+
}
|
|
76
|
+
catch { /* ignore */ }
|
|
77
|
+
}, HEARTBEAT_INTERVAL);
|
|
78
|
+
fs.writeFileSync(HEARTBEAT_FILE, String(Date.now()));
|
|
79
|
+
// Load .env
|
|
80
|
+
const envPath = path.resolve('.env');
|
|
81
|
+
if (fs.existsSync(envPath)) {
|
|
82
|
+
try {
|
|
83
|
+
const content = fs.readFileSync(envPath, 'utf-8');
|
|
84
|
+
for (const line of content.split('\n')) {
|
|
85
|
+
const trimmed = line.trim();
|
|
86
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
87
|
+
continue;
|
|
88
|
+
const eqIdx = trimmed.indexOf('=');
|
|
89
|
+
if (eqIdx === -1)
|
|
90
|
+
continue;
|
|
91
|
+
const key = trimmed.slice(0, eqIdx).trim();
|
|
92
|
+
const value = trimmed.slice(eqIdx + 1).trim();
|
|
93
|
+
if (!process.env[key])
|
|
94
|
+
process.env[key] = value;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch { /* ignore */ }
|
|
98
|
+
}
|
|
99
|
+
// Determine config file
|
|
100
|
+
const configFile = fs.existsSync('agent.yaml') ? 'agent.yaml' : 'oad.yaml';
|
|
101
|
+
const runtime = new runtime_1.AgentRuntime();
|
|
102
|
+
await runtime.loadConfig(configFile);
|
|
103
|
+
await runtime.initialize();
|
|
104
|
+
await runtime.start();
|
|
105
|
+
log(`Agent running (config=${configFile})`);
|
|
106
|
+
// Graceful shutdown
|
|
107
|
+
const shutdown = async (signal) => {
|
|
108
|
+
log(`Received ${signal}, shutting down...`);
|
|
109
|
+
clearInterval(heartbeatTimer);
|
|
110
|
+
await runtime.stop();
|
|
111
|
+
try {
|
|
112
|
+
fs.unlinkSync(PID_FILE);
|
|
113
|
+
}
|
|
114
|
+
catch { /* ignore */ }
|
|
115
|
+
log('Daemon stopped');
|
|
116
|
+
process.exit(0);
|
|
117
|
+
};
|
|
118
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
119
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
120
|
+
// On Windows, handle the message-based kill
|
|
121
|
+
process.on('message', (msg) => {
|
|
122
|
+
if (msg === 'shutdown')
|
|
123
|
+
shutdown('message:shutdown');
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
main().catch((err) => {
|
|
127
|
+
log(`Fatal error: ${err instanceof Error ? err.message : String(err)}`);
|
|
128
|
+
try {
|
|
129
|
+
fs.unlinkSync(PID_FILE);
|
|
130
|
+
}
|
|
131
|
+
catch { /* ignore */ }
|
|
132
|
+
process.exit(1);
|
|
133
|
+
});
|
|
134
|
+
//# sourceMappingURL=daemon.js.map
|
package/dist/deploy/hermes.js
CHANGED
|
@@ -113,32 +113,32 @@ function deployToHermes(options) {
|
|
|
113
113
|
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
|
|
114
114
|
files.push('settings.json');
|
|
115
115
|
// .env template
|
|
116
|
-
const envContent = `# Hermes Agent Environment
|
|
117
|
-
HERMES_CHARACTER=${oad.metadata.name}
|
|
118
|
-
HERMES_MODEL=${oad.spec.model}
|
|
119
|
-
HERMES_PROVIDER=${oad.spec.provider?.default ?? 'openai'}
|
|
120
|
-
# Add your API keys below:
|
|
121
|
-
# OPENAI_API_KEY=
|
|
122
|
-
# DEEPSEEK_API_KEY=
|
|
116
|
+
const envContent = `# Hermes Agent Environment
|
|
117
|
+
HERMES_CHARACTER=${oad.metadata.name}
|
|
118
|
+
HERMES_MODEL=${oad.spec.model}
|
|
119
|
+
HERMES_PROVIDER=${oad.spec.provider?.default ?? 'openai'}
|
|
120
|
+
# Add your API keys below:
|
|
121
|
+
# OPENAI_API_KEY=
|
|
122
|
+
# DEEPSEEK_API_KEY=
|
|
123
123
|
`;
|
|
124
124
|
fs.writeFileSync(path.join(outputDir, '.env.hermes'), envContent, 'utf-8');
|
|
125
125
|
files.push('.env.hermes');
|
|
126
126
|
// README
|
|
127
|
-
const readme = `# ${oad.metadata.name} - Hermes Agent
|
|
128
|
-
|
|
129
|
-
Converted from OAD format using \`opc deploy --target hermes\`.
|
|
130
|
-
|
|
131
|
-
## Usage
|
|
132
|
-
|
|
133
|
-
1. Copy \`character.json\` to your Hermes agents directory
|
|
134
|
-
2. Configure \`.env.hermes\` with your API keys
|
|
135
|
-
3. Start Hermes with this character
|
|
136
|
-
|
|
137
|
-
## Files
|
|
138
|
-
|
|
139
|
-
- \`character.json\` - Agent character definition
|
|
140
|
-
- \`settings.json\` - Runtime settings
|
|
141
|
-
- \`.env.hermes\` - Environment template
|
|
127
|
+
const readme = `# ${oad.metadata.name} - Hermes Agent
|
|
128
|
+
|
|
129
|
+
Converted from OAD format using \`opc deploy --target hermes\`.
|
|
130
|
+
|
|
131
|
+
## Usage
|
|
132
|
+
|
|
133
|
+
1. Copy \`character.json\` to your Hermes agents directory
|
|
134
|
+
2. Configure \`.env.hermes\` with your API keys
|
|
135
|
+
3. Start Hermes with this character
|
|
136
|
+
|
|
137
|
+
## Files
|
|
138
|
+
|
|
139
|
+
- \`character.json\` - Agent character definition
|
|
140
|
+
- \`settings.json\` - Runtime settings
|
|
141
|
+
- \`.env.hermes\` - Environment template
|
|
142
142
|
`;
|
|
143
143
|
fs.writeFileSync(path.join(outputDir, 'README.md'), readme, 'utf-8');
|
|
144
144
|
files.push('README.md');
|
package/dist/deploy/openclaw.js
CHANGED
|
@@ -41,27 +41,27 @@ const fs = __importStar(require("fs"));
|
|
|
41
41
|
const path = __importStar(require("path"));
|
|
42
42
|
function generateIdentityMd(oad) {
|
|
43
43
|
const m = oad.metadata;
|
|
44
|
-
return `# IDENTITY.md
|
|
45
|
-
|
|
46
|
-
- **Name:** ${m.name}
|
|
47
|
-
- **Version:** ${m.version}
|
|
48
|
-
- **Description:** ${m.description ?? 'An AI agent'}
|
|
49
|
-
- **Author:** ${m.author ?? 'Unknown'}
|
|
50
|
-
- **License:** ${m.license}
|
|
44
|
+
return `# IDENTITY.md
|
|
45
|
+
|
|
46
|
+
- **Name:** ${m.name}
|
|
47
|
+
- **Version:** ${m.version}
|
|
48
|
+
- **Description:** ${m.description ?? 'An AI agent'}
|
|
49
|
+
- **Author:** ${m.author ?? 'Unknown'}
|
|
50
|
+
- **License:** ${m.license}
|
|
51
51
|
`;
|
|
52
52
|
}
|
|
53
53
|
function generateSoulMd(oad) {
|
|
54
54
|
const prompt = oad.spec.systemPrompt ?? 'You are a helpful AI assistant.';
|
|
55
|
-
return `# SOUL.md - ${oad.metadata.name}
|
|
56
|
-
|
|
57
|
-
## System Prompt
|
|
58
|
-
|
|
59
|
-
${prompt}
|
|
60
|
-
|
|
61
|
-
## Model Configuration
|
|
62
|
-
|
|
63
|
-
- **Model:** ${oad.spec.model}
|
|
64
|
-
- **Provider:** ${oad.spec.provider?.default ?? 'deepseek'}
|
|
55
|
+
return `# SOUL.md - ${oad.metadata.name}
|
|
56
|
+
|
|
57
|
+
## System Prompt
|
|
58
|
+
|
|
59
|
+
${prompt}
|
|
60
|
+
|
|
61
|
+
## Model Configuration
|
|
62
|
+
|
|
63
|
+
- **Model:** ${oad.spec.model}
|
|
64
|
+
- **Provider:** ${oad.spec.provider?.default ?? 'deepseek'}
|
|
65
65
|
`;
|
|
66
66
|
}
|
|
67
67
|
function generateAgentsMd(oad) {
|
|
@@ -100,35 +100,26 @@ function generateAgentsMd(oad) {
|
|
|
100
100
|
md += `Default memory settings.\n`;
|
|
101
101
|
}
|
|
102
102
|
md += `\n`;
|
|
103
|
-
// DTV
|
|
104
|
-
if (dtv) {
|
|
105
|
-
md += `## Trust & Value\n\n`;
|
|
106
|
-
md += `- Trust Level: ${dtv.trust?.level ?? 'sandbox'}\n`;
|
|
107
|
-
if (dtv.value?.metrics?.length) {
|
|
108
|
-
md += `- Metrics: ${dtv.value.metrics.join(', ')}\n`;
|
|
109
|
-
}
|
|
110
|
-
md += `\n`;
|
|
111
|
-
}
|
|
112
103
|
return md;
|
|
113
104
|
}
|
|
114
105
|
function generateUserMd(oad) {
|
|
115
|
-
return `# USER.md
|
|
116
|
-
|
|
117
|
-
- **Name:** (your name)
|
|
118
|
-
- **Role:** User
|
|
119
|
-
- **Notes:** Configure this file with your preferences for ${oad.metadata.name}.
|
|
106
|
+
return `# USER.md
|
|
107
|
+
|
|
108
|
+
- **Name:** (your name)
|
|
109
|
+
- **Role:** User
|
|
110
|
+
- **Notes:** Configure this file with your preferences for ${oad.metadata.name}.
|
|
120
111
|
`;
|
|
121
112
|
}
|
|
122
113
|
function generateMemoryMd(oad) {
|
|
123
|
-
return `# MEMORY.md - ${oad.metadata.name}
|
|
124
|
-
|
|
125
|
-
## Persistent Knowledge
|
|
126
|
-
|
|
127
|
-
(Agent will store learned information here)
|
|
128
|
-
|
|
129
|
-
## User Preferences
|
|
130
|
-
|
|
131
|
-
(Discovered user preferences will be noted here)
|
|
114
|
+
return `# MEMORY.md - ${oad.metadata.name}
|
|
115
|
+
|
|
116
|
+
## Persistent Knowledge
|
|
117
|
+
|
|
118
|
+
(Agent will store learned information here)
|
|
119
|
+
|
|
120
|
+
## User Preferences
|
|
121
|
+
|
|
122
|
+
(Discovered user preferences will be noted here)
|
|
132
123
|
`;
|
|
133
124
|
}
|
|
134
125
|
function generateOpenClawConfig(oad, agentDir) {
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export { AgentRuntime, truncateOutput } from './core/runtime';
|
|
|
3
3
|
export { Logger } from './core/logger';
|
|
4
4
|
export { loadOAD, validateOAD } from './core/config';
|
|
5
5
|
export { OADSchema } from './schema/oad';
|
|
6
|
-
export type { OADDocument, Metadata, Spec
|
|
6
|
+
export type { OADDocument, Metadata, Spec } from './schema/oad';
|
|
7
7
|
export type { IAgent, IChannel, ISkill, Message, AgentContext, SkillResult, MemoryStore, AgentState } from './core/types';
|
|
8
8
|
export { BaseChannel } from './channels';
|
|
9
9
|
export { WebChannel } from './channels/web';
|
|
@@ -13,9 +13,6 @@ export { BaseSkill } from './skills/base';
|
|
|
13
13
|
export { SkillRegistry } from './skills';
|
|
14
14
|
export { InMemoryStore } from './memory';
|
|
15
15
|
export { DeepBrainMemoryStore } from './memory/deepbrain';
|
|
16
|
-
export { TrustManager } from './dtv/trust';
|
|
17
|
-
export { ValueTracker } from './dtv/value';
|
|
18
|
-
export { MRGConfigReader } from './dtv/data';
|
|
19
16
|
export { createProvider, SUPPORTED_PROVIDERS } from './providers';
|
|
20
17
|
export { Room } from './core/room';
|
|
21
18
|
export type { RoomMessage } from './core/room';
|
|
@@ -45,8 +42,6 @@ export type { Locale } from './i18n';
|
|
|
45
42
|
export { KnowledgeBase } from './core/knowledge';
|
|
46
43
|
export { deployToHermes } from './deploy/hermes';
|
|
47
44
|
export type { HermesDeployOptions, HermesDeployResult } from './deploy/hermes';
|
|
48
|
-
export { publishAgent, installAgent } from './marketplace';
|
|
49
|
-
export type { AgentManifest, PublishOptions, InstallOptions } from './marketplace';
|
|
50
45
|
export { createAuthMiddleware, getActiveSessions } from './core/auth';
|
|
51
46
|
export type { AuthConfig, AuthSession } from './core/auth';
|
|
52
47
|
export { Orchestrator } from './core/orchestrator';
|
|
@@ -70,6 +65,8 @@ export { SchedulerSkill } from './skills/scheduler';
|
|
|
70
65
|
export type { ScheduledTask } from './skills/scheduler';
|
|
71
66
|
export { DocumentSkill } from './skills/document';
|
|
72
67
|
export type { DocumentChunk } from './skills/document';
|
|
68
|
+
export { SkillLearner, skillToMarkdown, parseSkillMarkdown } from './skills/auto-learn';
|
|
69
|
+
export type { LearnedSkill } from './skills/auto-learn';
|
|
73
70
|
export { runTests, loadTestCases, formatReport } from './testing';
|
|
74
71
|
export type { TestCase, TestResult, TestReport } from './testing';
|
|
75
72
|
export { AnalyticsEngine } from './core/analytics-engine';
|
|
@@ -95,8 +92,11 @@ export { ToolGateway } from './tools/gateway';
|
|
|
95
92
|
export type { ToolGatewayConfig, GatewayToolName } from './tools/gateway';
|
|
96
93
|
export { StreamingManager, StreamableResponse } from './core/streaming';
|
|
97
94
|
export type { StreamChunk, StreamOptions } from './core/streaming';
|
|
98
|
-
export {
|
|
99
|
-
export type {
|
|
100
|
-
export {
|
|
101
|
-
export type {
|
|
95
|
+
export { TraceCollector, ConsoleExporter, DeepBrainExporter } from './traces';
|
|
96
|
+
export type { Span, SpanEvent, TraceExporter } from './traces';
|
|
97
|
+
export { Scheduler, parseCron, cronMatches } from './core/scheduler';
|
|
98
|
+
export type { CronJob, JobHandler } from './core/scheduler';
|
|
99
|
+
export { getBuiltinTools, getBuiltinToolsByName } from './tools/builtin';
|
|
100
|
+
export { MCPClient } from './tools/mcp-client';
|
|
101
|
+
export type { MCPServerConfig } from './tools/mcp-client';
|
|
102
102
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.
|
|
3
|
+
exports.JsonTransformTool = exports.DateTimeTool = exports.CalculatorTool = exports.WeChatChannel = exports.SlackChannel = exports.EmailChannel = exports.compose = exports.AgentPipeline = exports.Orchestrator = exports.getActiveSessions = exports.createAuthMiddleware = exports.deployToHermes = exports.KnowledgeBase = exports.addMessages = exports.detectLocale = exports.getLocale = exports.setLocale = exports.t = exports.LazyLoader = exports.RequestBatcher = exports.ConnectionPool = exports.VersionManager = exports.WebhookChannel = exports.VoiceChannel = exports.HITLManager = exports.AgentRegistry = exports.WorkflowEngine = exports.Analytics = exports.Sandbox = exports.PluginManager = exports.createMCPTool = exports.MCPToolRegistry = exports.Room = exports.SUPPORTED_PROVIDERS = exports.createProvider = exports.DeepBrainMemoryStore = exports.InMemoryStore = exports.SkillRegistry = exports.BaseSkill = exports.WebSocketChannel = exports.TelegramChannel = exports.WebChannel = exports.BaseChannel = exports.OADSchema = exports.validateOAD = exports.loadOAD = exports.Logger = exports.truncateOutput = exports.AgentRuntime = exports.BaseAgent = void 0;
|
|
4
|
+
exports.getBuiltinTools = exports.cronMatches = exports.parseCron = exports.Scheduler = exports.DeepBrainExporter = exports.ConsoleExporter = exports.TraceCollector = exports.StreamableResponse = exports.StreamingManager = exports.ToolGateway = exports.ProcessWatcher = exports.DiscordChannel = exports.FeishuChannel = exports.createRateLimitPlugin = exports.createAnalyticsPlugin = exports.createLoggingPlugin = exports.inputValidation = exports.APIKeyManager = exports.corsMiddleware = exports.securityHeaders = exports.detectInjection = exports.sanitizeInput = exports.formatErrorForUser = exports.wrapError = exports.TimeoutError = exports.SecurityError = exports.RateLimitError = exports.PluginError = exports.ChannelError = exports.ConfigError = exports.ValidationError = exports.ProviderError = exports.OPCError = exports.createTeacherConfig = exports.createDataAnalystConfig = exports.getSupportedLocales = exports.LLMCache = exports.RateLimiter = exports.AnalyticsEngine = exports.formatReport = exports.loadTestCases = exports.runTests = exports.parseSkillMarkdown = exports.skillToMarkdown = exports.SkillLearner = exports.DocumentSkill = exports.SchedulerSkill = exports.WebhookTriggerSkill = exports.HttpSkill = exports.TextAnalysisTool = void 0;
|
|
5
|
+
exports.MCPClient = exports.getBuiltinToolsByName = void 0;
|
|
5
6
|
// OPC Agent — Open Agent Framework
|
|
6
7
|
var agent_1 = require("./core/agent");
|
|
7
8
|
Object.defineProperty(exports, "BaseAgent", { enumerable: true, get: function () { return agent_1.BaseAgent; } });
|
|
@@ -31,12 +32,6 @@ var memory_1 = require("./memory");
|
|
|
31
32
|
Object.defineProperty(exports, "InMemoryStore", { enumerable: true, get: function () { return memory_1.InMemoryStore; } });
|
|
32
33
|
var deepbrain_1 = require("./memory/deepbrain");
|
|
33
34
|
Object.defineProperty(exports, "DeepBrainMemoryStore", { enumerable: true, get: function () { return deepbrain_1.DeepBrainMemoryStore; } });
|
|
34
|
-
var trust_1 = require("./dtv/trust");
|
|
35
|
-
Object.defineProperty(exports, "TrustManager", { enumerable: true, get: function () { return trust_1.TrustManager; } });
|
|
36
|
-
var value_1 = require("./dtv/value");
|
|
37
|
-
Object.defineProperty(exports, "ValueTracker", { enumerable: true, get: function () { return value_1.ValueTracker; } });
|
|
38
|
-
var data_1 = require("./dtv/data");
|
|
39
|
-
Object.defineProperty(exports, "MRGConfigReader", { enumerable: true, get: function () { return data_1.MRGConfigReader; } });
|
|
40
35
|
var providers_1 = require("./providers");
|
|
41
36
|
Object.defineProperty(exports, "createProvider", { enumerable: true, get: function () { return providers_1.createProvider; } });
|
|
42
37
|
Object.defineProperty(exports, "SUPPORTED_PROVIDERS", { enumerable: true, get: function () { return providers_1.SUPPORTED_PROVIDERS; } });
|
|
@@ -80,9 +75,6 @@ var knowledge_1 = require("./core/knowledge");
|
|
|
80
75
|
Object.defineProperty(exports, "KnowledgeBase", { enumerable: true, get: function () { return knowledge_1.KnowledgeBase; } });
|
|
81
76
|
var hermes_1 = require("./deploy/hermes");
|
|
82
77
|
Object.defineProperty(exports, "deployToHermes", { enumerable: true, get: function () { return hermes_1.deployToHermes; } });
|
|
83
|
-
var marketplace_1 = require("./marketplace");
|
|
84
|
-
Object.defineProperty(exports, "publishAgent", { enumerable: true, get: function () { return marketplace_1.publishAgent; } });
|
|
85
|
-
Object.defineProperty(exports, "installAgent", { enumerable: true, get: function () { return marketplace_1.installAgent; } });
|
|
86
78
|
// v0.7.0 modules
|
|
87
79
|
var auth_1 = require("./core/auth");
|
|
88
80
|
Object.defineProperty(exports, "createAuthMiddleware", { enumerable: true, get: function () { return auth_1.createAuthMiddleware; } });
|
|
@@ -115,6 +107,10 @@ var scheduler_1 = require("./skills/scheduler");
|
|
|
115
107
|
Object.defineProperty(exports, "SchedulerSkill", { enumerable: true, get: function () { return scheduler_1.SchedulerSkill; } });
|
|
116
108
|
var document_1 = require("./skills/document");
|
|
117
109
|
Object.defineProperty(exports, "DocumentSkill", { enumerable: true, get: function () { return document_1.DocumentSkill; } });
|
|
110
|
+
var auto_learn_1 = require("./skills/auto-learn");
|
|
111
|
+
Object.defineProperty(exports, "SkillLearner", { enumerable: true, get: function () { return auto_learn_1.SkillLearner; } });
|
|
112
|
+
Object.defineProperty(exports, "skillToMarkdown", { enumerable: true, get: function () { return auto_learn_1.skillToMarkdown; } });
|
|
113
|
+
Object.defineProperty(exports, "parseSkillMarkdown", { enumerable: true, get: function () { return auto_learn_1.parseSkillMarkdown; } });
|
|
118
114
|
// v0.9.0 modules
|
|
119
115
|
var testing_1 = require("./testing");
|
|
120
116
|
Object.defineProperty(exports, "runTests", { enumerable: true, get: function () { return testing_1.runTests; } });
|
|
@@ -170,8 +166,19 @@ var streaming_1 = require("./core/streaming");
|
|
|
170
166
|
Object.defineProperty(exports, "StreamingManager", { enumerable: true, get: function () { return streaming_1.StreamingManager; } });
|
|
171
167
|
Object.defineProperty(exports, "StreamableResponse", { enumerable: true, get: function () { return streaming_1.StreamableResponse; } });
|
|
172
168
|
// v1.3.0 modules
|
|
173
|
-
var
|
|
174
|
-
Object.defineProperty(exports, "
|
|
175
|
-
|
|
176
|
-
Object.defineProperty(exports, "
|
|
169
|
+
var traces_1 = require("./traces");
|
|
170
|
+
Object.defineProperty(exports, "TraceCollector", { enumerable: true, get: function () { return traces_1.TraceCollector; } });
|
|
171
|
+
Object.defineProperty(exports, "ConsoleExporter", { enumerable: true, get: function () { return traces_1.ConsoleExporter; } });
|
|
172
|
+
Object.defineProperty(exports, "DeepBrainExporter", { enumerable: true, get: function () { return traces_1.DeepBrainExporter; } });
|
|
173
|
+
// v1.4.0 modules
|
|
174
|
+
var scheduler_2 = require("./core/scheduler");
|
|
175
|
+
Object.defineProperty(exports, "Scheduler", { enumerable: true, get: function () { return scheduler_2.Scheduler; } });
|
|
176
|
+
Object.defineProperty(exports, "parseCron", { enumerable: true, get: function () { return scheduler_2.parseCron; } });
|
|
177
|
+
Object.defineProperty(exports, "cronMatches", { enumerable: true, get: function () { return scheduler_2.cronMatches; } });
|
|
178
|
+
// v1.5.0 — built-in tools + MCP client
|
|
179
|
+
var builtin_1 = require("./tools/builtin");
|
|
180
|
+
Object.defineProperty(exports, "getBuiltinTools", { enumerable: true, get: function () { return builtin_1.getBuiltinTools; } });
|
|
181
|
+
Object.defineProperty(exports, "getBuiltinToolsByName", { enumerable: true, get: function () { return builtin_1.getBuiltinToolsByName; } });
|
|
182
|
+
var mcp_client_1 = require("./tools/mcp-client");
|
|
183
|
+
Object.defineProperty(exports, "MCPClient", { enumerable: true, get: function () { return mcp_client_1.MCPClient; } });
|
|
177
184
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import type { Message } from '../core/types';
|
|
2
|
+
import type { MCPToolDefinition } from '../tools/mcp';
|
|
3
|
+
export interface ChatOptions {
|
|
4
|
+
tools?: MCPToolDefinition[];
|
|
5
|
+
}
|
|
2
6
|
export interface LLMProvider {
|
|
3
7
|
name: string;
|
|
4
|
-
chat(messages: Message[], systemPrompt?: string): Promise<string>;
|
|
8
|
+
chat(messages: Message[], systemPrompt?: string, options?: ChatOptions): Promise<string>;
|
|
5
9
|
chatStream(messages: Message[], systemPrompt?: string): AsyncIterable<string>;
|
|
6
10
|
}
|
|
7
11
|
export declare function createProvider(name?: string, model?: string, baseUrl?: string, apiKey?: string): LLMProvider;
|
|
8
|
-
export declare const SUPPORTED_PROVIDERS: readonly ["openai", "deepseek", "qwen", "gemini", "dashscope", "zhipu", "moonshot"];
|
|
12
|
+
export declare const SUPPORTED_PROVIDERS: readonly ["openai", "ollama", "deepseek", "qwen", "gemini", "dashscope", "zhipu", "moonshot"];
|
|
9
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/providers/index.js
CHANGED
|
@@ -43,6 +43,10 @@ function getApiKey() {
|
|
|
43
43
|
function getBaseUrl() {
|
|
44
44
|
return process.env.OPC_LLM_BASE_URL || 'https://api.openai.com/v1';
|
|
45
45
|
}
|
|
46
|
+
function buildToolPrompt(tools) {
|
|
47
|
+
const toolsDesc = tools.map(t => `- ${t.name}: ${t.description}\n Input schema: ${JSON.stringify(t.inputSchema)}`).join('\n');
|
|
48
|
+
return `\n\nYou have access to the following tools. To use a tool, respond with ONLY a JSON object in this format:\n<tool_call>{"name": "tool_name", "arguments": {...}}</tool_call>\n\nAvailable tools:\n${toolsDesc}\n\nIf you don't need a tool, respond normally with text.`;
|
|
49
|
+
}
|
|
46
50
|
class OpenAICompatibleProvider {
|
|
47
51
|
name;
|
|
48
52
|
model;
|
|
@@ -111,13 +115,16 @@ class OpenAICompatibleProvider {
|
|
|
111
115
|
req.end();
|
|
112
116
|
});
|
|
113
117
|
}
|
|
114
|
-
async chat(messages, systemPrompt) {
|
|
118
|
+
async chat(messages, systemPrompt, options) {
|
|
115
119
|
if (!this.apiKey) {
|
|
116
|
-
// Stub mode when no API key
|
|
117
120
|
const last = messages[messages.length - 1];
|
|
118
121
|
return `[${this.name}/${this.model} - no API key] Echo: ${last?.content ?? ''}`;
|
|
119
122
|
}
|
|
120
|
-
|
|
123
|
+
let effectivePrompt = systemPrompt;
|
|
124
|
+
if (options?.tools && options.tools.length > 0) {
|
|
125
|
+
effectivePrompt = (systemPrompt || '') + buildToolPrompt(options.tools);
|
|
126
|
+
}
|
|
127
|
+
const formatted = this.formatMessages(messages, effectivePrompt);
|
|
121
128
|
const result = await this.request({
|
|
122
129
|
model: this.model,
|
|
123
130
|
messages: formatted,
|
|
@@ -220,12 +227,16 @@ class GeminiNativeProvider {
|
|
|
220
227
|
}
|
|
221
228
|
return result;
|
|
222
229
|
}
|
|
223
|
-
async chat(messages, systemPrompt) {
|
|
230
|
+
async chat(messages, systemPrompt, options) {
|
|
224
231
|
if (!this.apiKey) {
|
|
225
232
|
const last = messages[messages.length - 1];
|
|
226
233
|
return `[gemini/${this.model} - no API key] Echo: ${last?.content ?? ''}`;
|
|
227
234
|
}
|
|
228
|
-
|
|
235
|
+
let effectivePrompt = systemPrompt;
|
|
236
|
+
if (options?.tools && options.tools.length > 0) {
|
|
237
|
+
effectivePrompt = (systemPrompt || '') + buildToolPrompt(options.tools);
|
|
238
|
+
}
|
|
239
|
+
const body = this.formatContents(messages, effectivePrompt);
|
|
229
240
|
const url = this.buildUrl(false);
|
|
230
241
|
const postData = JSON.stringify(body);
|
|
231
242
|
return new Promise((resolve, reject) => {
|
|
@@ -310,18 +321,20 @@ class GeminiNativeProvider {
|
|
|
310
321
|
function isGeminiNative() {
|
|
311
322
|
const baseUrl = process.env.OPC_LLM_BASE_URL || '';
|
|
312
323
|
const key = getApiKey();
|
|
313
|
-
// Use native Gemini API when: key starts with AQ. (new format) OR base URL points to googleapis
|
|
314
324
|
return key.startsWith('AQ.') || (baseUrl.includes('googleapis.com') && !baseUrl.includes('/openai'));
|
|
315
325
|
}
|
|
316
326
|
function createProvider(name = 'openai', model, baseUrl, apiKey) {
|
|
317
327
|
const finalModel = model || process.env.OPC_LLM_MODEL || 'gpt-4o-mini';
|
|
328
|
+
if (name === 'ollama') {
|
|
329
|
+
const ollamaBase = baseUrl || process.env.OPC_LLM_BASE_URL || 'http://localhost:11434/v1';
|
|
330
|
+
const ollamaKey = apiKey || process.env.OPC_LLM_API_KEY || 'ollama';
|
|
331
|
+
return new OpenAICompatibleProvider('ollama', finalModel, ollamaBase, ollamaKey);
|
|
332
|
+
}
|
|
318
333
|
const finalKey = apiKey || getApiKey();
|
|
319
334
|
const finalBaseUrl = baseUrl || getBaseUrl();
|
|
320
|
-
// Auto-detect Gemini native when key is new format or base URL points to googleapis
|
|
321
335
|
if (finalKey.startsWith('AQ.') || isGeminiNative()) {
|
|
322
336
|
return new GeminiNativeProvider(finalModel, finalKey);
|
|
323
337
|
}
|
|
324
|
-
// Auto-detect provider name from base URL
|
|
325
338
|
let resolvedName = name;
|
|
326
339
|
if (finalBaseUrl.includes('deepseek.com')) {
|
|
327
340
|
resolvedName = 'deepseek';
|
|
@@ -331,5 +344,5 @@ function createProvider(name = 'openai', model, baseUrl, apiKey) {
|
|
|
331
344
|
}
|
|
332
345
|
return new OpenAICompatibleProvider(resolvedName, finalModel, baseUrl, apiKey);
|
|
333
346
|
}
|
|
334
|
-
exports.SUPPORTED_PROVIDERS = ['openai', 'deepseek', 'qwen', 'gemini', 'dashscope', 'zhipu', 'moonshot'];
|
|
347
|
+
exports.SUPPORTED_PROVIDERS = ['openai', 'ollama', 'deepseek', 'qwen', 'gemini', 'dashscope', 'zhipu', 'moonshot'];
|
|
335
348
|
//# sourceMappingURL=index.js.map
|