opc-agent 1.2.0 → 1.2.1
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 +6 -0
- package/CONTRIBUTING.md +75 -75
- package/README.md +429 -429
- package/README.zh-CN.md +415 -415
- package/dist/channels/web.js +256 -256
- package/dist/core/knowledge.d.ts +0 -5
- package/dist/core/knowledge.js +2 -39
- package/dist/core/streaming.d.ts +56 -0
- package/dist/core/streaming.js +160 -0
- package/dist/deploy/hermes.js +22 -22
- package/dist/deploy/openclaw.js +31 -31
- package/dist/index.d.ts +4 -0
- package/dist/index.js +7 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.js +14 -158
- package/dist/schema/oad.d.ts +3 -3
- package/dist/templates/code-reviewer.js +5 -5
- package/dist/templates/customer-service.js +2 -2
- package/dist/templates/data-analyst.js +5 -5
- package/dist/templates/knowledge-base.js +2 -2
- package/dist/templates/sales-assistant.js +4 -4
- package/dist/templates/teacher.js +6 -6
- package/dist/tools/gateway.d.ts +28 -0
- package/dist/tools/gateway.js +177 -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/customer-service-demo/README.md +90 -90
- package/examples/customer-service-demo/oad.yaml +107 -107
- package/package.json +50 -50
- 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 +160 -160
- package/src/channels/telegram.ts +90 -90
- package/src/channels/voice.ts +106 -106
- package/src/channels/webhook.ts +199 -199
- package/src/channels/websocket.ts +87 -87
- package/src/channels/wechat.ts +149 -149
- package/src/core/a2a.ts +143 -143
- package/src/core/agent.ts +152 -152
- 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 +152 -152
- package/src/core/sandbox.ts +101 -101
- package/src/core/security.ts +171 -171
- package/src/core/streaming.ts +195 -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/deploy/hermes.ts +156 -156
- package/src/deploy/openclaw.ts +200 -200
- package/src/dtv/data.ts +29 -29
- package/src/dtv/trust.ts +43 -43
- package/src/dtv/value.ts +47 -47
- package/src/i18n/index.ts +216 -216
- package/src/index.ts +6 -0
- package/src/marketplace/index.ts +223 -223
- package/src/memory/deepbrain.ts +108 -108
- package/src/memory/index.ts +34 -34
- package/src/plugins/index.ts +208 -208
- package/src/schema/oad.ts +155 -155
- 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 +34 -34
- package/src/templates/customer-service.ts +80 -80
- package/src/templates/data-analyst.ts +70 -70
- package/src/templates/executive-assistant.ts +71 -71
- package/src/templates/financial-advisor.ts +60 -60
- package/src/templates/knowledge-base.ts +31 -31
- package/src/templates/legal-assistant.ts +71 -71
- package/src/templates/sales-assistant.ts +79 -79
- package/src/templates/teacher.ts +79 -79
- package/src/testing/index.ts +181 -181
- package/src/tools/calculator.ts +73 -73
- package/src/tools/datetime.ts +149 -149
- package/src/tools/gateway.ts +220 -0
- package/src/tools/json-transform.ts +187 -187
- package/src/tools/mcp.ts +76 -76
- package/src/tools/text-analysis.ts +116 -116
- 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/tests/a2a.test.ts +66 -66
- package/tests/agent.test.ts +72 -72
- package/tests/analytics.test.ts +50 -50
- package/tests/channel.test.ts +39 -39
- package/tests/e2e.test.ts +134 -134
- package/tests/errors.test.ts +83 -83
- package/tests/gateway.test.ts +71 -0
- 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/streaming.test.ts +109 -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
|
@@ -1,116 +1,116 @@
|
|
|
1
|
-
import type { MCPTool, MCPToolResult } from './mcp';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Text Analysis Tool — v0.8.0
|
|
5
|
-
* Summarize, translate (stub), sentiment analysis as an LLM function tool.
|
|
6
|
-
* Note: For production, connect to actual LLM/NLP APIs. This provides basic built-in analysis.
|
|
7
|
-
*/
|
|
8
|
-
export const TextAnalysisTool: MCPTool = {
|
|
9
|
-
name: 'text_analysis',
|
|
10
|
-
description: 'Analyze text: word count, character count, reading time, keyword extraction, basic sentiment, and language detection.',
|
|
11
|
-
inputSchema: {
|
|
12
|
-
type: 'object',
|
|
13
|
-
properties: {
|
|
14
|
-
operation: {
|
|
15
|
-
type: 'string',
|
|
16
|
-
enum: ['stats', 'keywords', 'sentiment', 'detect_language', 'truncate', 'split_sentences'],
|
|
17
|
-
description: 'Analysis operation to perform',
|
|
18
|
-
},
|
|
19
|
-
text: {
|
|
20
|
-
type: 'string',
|
|
21
|
-
description: 'Text to analyze',
|
|
22
|
-
},
|
|
23
|
-
maxLength: {
|
|
24
|
-
type: 'number',
|
|
25
|
-
description: 'Max length for truncate operation',
|
|
26
|
-
},
|
|
27
|
-
topN: {
|
|
28
|
-
type: 'number',
|
|
29
|
-
description: 'Number of top keywords to extract (default: 10)',
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
required: ['operation', 'text'],
|
|
33
|
-
},
|
|
34
|
-
|
|
35
|
-
async execute(input: Record<string, unknown>): Promise<MCPToolResult> {
|
|
36
|
-
try {
|
|
37
|
-
const op = String(input.operation);
|
|
38
|
-
const text = String(input.text ?? '');
|
|
39
|
-
|
|
40
|
-
switch (op) {
|
|
41
|
-
case 'stats': {
|
|
42
|
-
const words = text.split(/\s+/).filter(Boolean);
|
|
43
|
-
const sentences = text.split(/[.!?。!?]+/).filter(Boolean);
|
|
44
|
-
const readingTimeMin = Math.ceil(words.length / 200);
|
|
45
|
-
return {
|
|
46
|
-
content: JSON.stringify({
|
|
47
|
-
characters: text.length,
|
|
48
|
-
words: words.length,
|
|
49
|
-
sentences: sentences.length,
|
|
50
|
-
paragraphs: text.split(/\n\s*\n/).filter(Boolean).length,
|
|
51
|
-
readingTimeMinutes: readingTimeMin,
|
|
52
|
-
}, null, 2),
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
case 'keywords': {
|
|
57
|
-
const topN = Number(input.topN ?? 10);
|
|
58
|
-
const words = text.toLowerCase().replace(/[^\w\s\u4e00-\u9fff]/g, '').split(/\s+/).filter(Boolean);
|
|
59
|
-
const stopWords = new Set(['the', 'a', 'an', 'is', 'are', 'was', 'were', 'in', 'on', 'at', 'to', 'for', 'of', 'and', 'or', 'but', 'not', 'with', 'this', 'that', 'it', 'be', 'has', 'have', 'had', 'do', 'does', 'did', 'will', 'would', 'can', 'could', 'should', 'may', 'might', 'from', 'by', 'as', 'if', 'so', 'than']);
|
|
60
|
-
const freq: Record<string, number> = {};
|
|
61
|
-
for (const w of words) {
|
|
62
|
-
if (w.length < 2 || stopWords.has(w)) continue;
|
|
63
|
-
freq[w] = (freq[w] ?? 0) + 1;
|
|
64
|
-
}
|
|
65
|
-
const sorted = Object.entries(freq).sort((a, b) => b[1] - a[1]).slice(0, topN);
|
|
66
|
-
return { content: JSON.stringify(sorted.map(([word, count]) => ({ word, count })), null, 2) };
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
case 'sentiment': {
|
|
70
|
-
// Basic lexicon-based sentiment
|
|
71
|
-
const positiveWords = new Set(['good', 'great', 'excellent', 'amazing', 'wonderful', 'fantastic', 'love', 'happy', 'best', 'awesome', 'perfect', 'brilliant', 'outstanding', 'superb', 'beautiful', 'nice', 'enjoy', 'like', 'positive', 'success']);
|
|
72
|
-
const negativeWords = new Set(['bad', 'terrible', 'awful', 'horrible', 'hate', 'worst', 'poor', 'ugly', 'fail', 'wrong', 'sad', 'angry', 'frustrating', 'disappointing', 'negative', 'annoying', 'broken', 'useless', 'boring', 'painful']);
|
|
73
|
-
|
|
74
|
-
const words = text.toLowerCase().split(/\s+/);
|
|
75
|
-
let pos = 0, neg = 0;
|
|
76
|
-
for (const w of words) {
|
|
77
|
-
if (positiveWords.has(w)) pos++;
|
|
78
|
-
if (negativeWords.has(w)) neg++;
|
|
79
|
-
}
|
|
80
|
-
const total = pos + neg || 1;
|
|
81
|
-
const score = (pos - neg) / total; // -1 to 1
|
|
82
|
-
const label = score > 0.1 ? 'positive' : score < -0.1 ? 'negative' : 'neutral';
|
|
83
|
-
return {
|
|
84
|
-
content: JSON.stringify({ score: Math.round(score * 100) / 100, label, positive: pos, negative: neg }, null, 2),
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
case 'detect_language': {
|
|
89
|
-
// Simple heuristic
|
|
90
|
-
const hasChinese = /[\u4e00-\u9fff]/.test(text);
|
|
91
|
-
const hasJapanese = /[\u3040-\u309f\u30a0-\u30ff]/.test(text);
|
|
92
|
-
const hasKorean = /[\uac00-\ud7af]/.test(text);
|
|
93
|
-
const hasArabic = /[\u0600-\u06ff]/.test(text);
|
|
94
|
-
const lang = hasChinese ? 'zh' : hasJapanese ? 'ja' : hasKorean ? 'ko' : hasArabic ? 'ar' : 'en';
|
|
95
|
-
return { content: JSON.stringify({ detected: lang, confidence: 'heuristic' }) };
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
case 'truncate': {
|
|
99
|
-
const maxLen = Number(input.maxLength ?? 100);
|
|
100
|
-
const truncated = text.length > maxLen ? text.slice(0, maxLen) + '...' : text;
|
|
101
|
-
return { content: truncated };
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
case 'split_sentences': {
|
|
105
|
-
const sentences = text.match(/[^.!?。!?]+[.!?。!?]+/g) ?? [text];
|
|
106
|
-
return { content: JSON.stringify(sentences.map((s) => s.trim()), null, 2) };
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
default:
|
|
110
|
-
return { content: `Unknown operation: ${op}`, isError: true };
|
|
111
|
-
}
|
|
112
|
-
} catch (err) {
|
|
113
|
-
return { content: `Error: ${(err as Error).message}`, isError: true };
|
|
114
|
-
}
|
|
115
|
-
},
|
|
116
|
-
};
|
|
1
|
+
import type { MCPTool, MCPToolResult } from './mcp';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Text Analysis Tool — v0.8.0
|
|
5
|
+
* Summarize, translate (stub), sentiment analysis as an LLM function tool.
|
|
6
|
+
* Note: For production, connect to actual LLM/NLP APIs. This provides basic built-in analysis.
|
|
7
|
+
*/
|
|
8
|
+
export const TextAnalysisTool: MCPTool = {
|
|
9
|
+
name: 'text_analysis',
|
|
10
|
+
description: 'Analyze text: word count, character count, reading time, keyword extraction, basic sentiment, and language detection.',
|
|
11
|
+
inputSchema: {
|
|
12
|
+
type: 'object',
|
|
13
|
+
properties: {
|
|
14
|
+
operation: {
|
|
15
|
+
type: 'string',
|
|
16
|
+
enum: ['stats', 'keywords', 'sentiment', 'detect_language', 'truncate', 'split_sentences'],
|
|
17
|
+
description: 'Analysis operation to perform',
|
|
18
|
+
},
|
|
19
|
+
text: {
|
|
20
|
+
type: 'string',
|
|
21
|
+
description: 'Text to analyze',
|
|
22
|
+
},
|
|
23
|
+
maxLength: {
|
|
24
|
+
type: 'number',
|
|
25
|
+
description: 'Max length for truncate operation',
|
|
26
|
+
},
|
|
27
|
+
topN: {
|
|
28
|
+
type: 'number',
|
|
29
|
+
description: 'Number of top keywords to extract (default: 10)',
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
required: ['operation', 'text'],
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
async execute(input: Record<string, unknown>): Promise<MCPToolResult> {
|
|
36
|
+
try {
|
|
37
|
+
const op = String(input.operation);
|
|
38
|
+
const text = String(input.text ?? '');
|
|
39
|
+
|
|
40
|
+
switch (op) {
|
|
41
|
+
case 'stats': {
|
|
42
|
+
const words = text.split(/\s+/).filter(Boolean);
|
|
43
|
+
const sentences = text.split(/[.!?。!?]+/).filter(Boolean);
|
|
44
|
+
const readingTimeMin = Math.ceil(words.length / 200);
|
|
45
|
+
return {
|
|
46
|
+
content: JSON.stringify({
|
|
47
|
+
characters: text.length,
|
|
48
|
+
words: words.length,
|
|
49
|
+
sentences: sentences.length,
|
|
50
|
+
paragraphs: text.split(/\n\s*\n/).filter(Boolean).length,
|
|
51
|
+
readingTimeMinutes: readingTimeMin,
|
|
52
|
+
}, null, 2),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
case 'keywords': {
|
|
57
|
+
const topN = Number(input.topN ?? 10);
|
|
58
|
+
const words = text.toLowerCase().replace(/[^\w\s\u4e00-\u9fff]/g, '').split(/\s+/).filter(Boolean);
|
|
59
|
+
const stopWords = new Set(['the', 'a', 'an', 'is', 'are', 'was', 'were', 'in', 'on', 'at', 'to', 'for', 'of', 'and', 'or', 'but', 'not', 'with', 'this', 'that', 'it', 'be', 'has', 'have', 'had', 'do', 'does', 'did', 'will', 'would', 'can', 'could', 'should', 'may', 'might', 'from', 'by', 'as', 'if', 'so', 'than']);
|
|
60
|
+
const freq: Record<string, number> = {};
|
|
61
|
+
for (const w of words) {
|
|
62
|
+
if (w.length < 2 || stopWords.has(w)) continue;
|
|
63
|
+
freq[w] = (freq[w] ?? 0) + 1;
|
|
64
|
+
}
|
|
65
|
+
const sorted = Object.entries(freq).sort((a, b) => b[1] - a[1]).slice(0, topN);
|
|
66
|
+
return { content: JSON.stringify(sorted.map(([word, count]) => ({ word, count })), null, 2) };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
case 'sentiment': {
|
|
70
|
+
// Basic lexicon-based sentiment
|
|
71
|
+
const positiveWords = new Set(['good', 'great', 'excellent', 'amazing', 'wonderful', 'fantastic', 'love', 'happy', 'best', 'awesome', 'perfect', 'brilliant', 'outstanding', 'superb', 'beautiful', 'nice', 'enjoy', 'like', 'positive', 'success']);
|
|
72
|
+
const negativeWords = new Set(['bad', 'terrible', 'awful', 'horrible', 'hate', 'worst', 'poor', 'ugly', 'fail', 'wrong', 'sad', 'angry', 'frustrating', 'disappointing', 'negative', 'annoying', 'broken', 'useless', 'boring', 'painful']);
|
|
73
|
+
|
|
74
|
+
const words = text.toLowerCase().split(/\s+/);
|
|
75
|
+
let pos = 0, neg = 0;
|
|
76
|
+
for (const w of words) {
|
|
77
|
+
if (positiveWords.has(w)) pos++;
|
|
78
|
+
if (negativeWords.has(w)) neg++;
|
|
79
|
+
}
|
|
80
|
+
const total = pos + neg || 1;
|
|
81
|
+
const score = (pos - neg) / total; // -1 to 1
|
|
82
|
+
const label = score > 0.1 ? 'positive' : score < -0.1 ? 'negative' : 'neutral';
|
|
83
|
+
return {
|
|
84
|
+
content: JSON.stringify({ score: Math.round(score * 100) / 100, label, positive: pos, negative: neg }, null, 2),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
case 'detect_language': {
|
|
89
|
+
// Simple heuristic
|
|
90
|
+
const hasChinese = /[\u4e00-\u9fff]/.test(text);
|
|
91
|
+
const hasJapanese = /[\u3040-\u309f\u30a0-\u30ff]/.test(text);
|
|
92
|
+
const hasKorean = /[\uac00-\ud7af]/.test(text);
|
|
93
|
+
const hasArabic = /[\u0600-\u06ff]/.test(text);
|
|
94
|
+
const lang = hasChinese ? 'zh' : hasJapanese ? 'ja' : hasKorean ? 'ko' : hasArabic ? 'ar' : 'en';
|
|
95
|
+
return { content: JSON.stringify({ detected: lang, confidence: 'heuristic' }) };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
case 'truncate': {
|
|
99
|
+
const maxLen = Number(input.maxLength ?? 100);
|
|
100
|
+
const truncated = text.length > maxLen ? text.slice(0, maxLen) + '...' : text;
|
|
101
|
+
return { content: truncated };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
case 'split_sentences': {
|
|
105
|
+
const sentences = text.match(/[^.!?。!?]+[.!?。!?]+/g) ?? [text];
|
|
106
|
+
return { content: JSON.stringify(sentences.map((s) => s.trim()), null, 2) };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
default:
|
|
110
|
+
return { content: `Unknown operation: ${op}`, isError: true };
|
|
111
|
+
}
|
|
112
|
+
} catch (err) {
|
|
113
|
+
return { content: `Error: ${(err as Error).message}`, isError: true };
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
};
|
package/templates/Dockerfile
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
FROM node:22-alpine AS base
|
|
2
|
-
WORKDIR /app
|
|
3
|
-
|
|
4
|
-
# Install dependencies
|
|
5
|
-
COPY package.json package-lock.json* ./
|
|
6
|
-
RUN npm ci --production 2>/dev/null || npm install --production
|
|
7
|
-
|
|
8
|
-
# Copy agent files
|
|
9
|
-
COPY oad.yaml ./
|
|
10
|
-
COPY .env* ./
|
|
11
|
-
COPY prompts/ ./prompts/ 2>/dev/null || true
|
|
12
|
-
|
|
13
|
-
EXPOSE 3000
|
|
14
|
-
|
|
15
|
-
CMD ["npx", "opc", "run"]
|
|
1
|
+
FROM node:22-alpine AS base
|
|
2
|
+
WORKDIR /app
|
|
3
|
+
|
|
4
|
+
# Install dependencies
|
|
5
|
+
COPY package.json package-lock.json* ./
|
|
6
|
+
RUN npm ci --production 2>/dev/null || npm install --production
|
|
7
|
+
|
|
8
|
+
# Copy agent files
|
|
9
|
+
COPY oad.yaml ./
|
|
10
|
+
COPY .env* ./
|
|
11
|
+
COPY prompts/ ./prompts/ 2>/dev/null || true
|
|
12
|
+
|
|
13
|
+
EXPOSE 3000
|
|
14
|
+
|
|
15
|
+
CMD ["npx", "opc", "run"]
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
# Code Reviewer Template
|
|
2
|
-
|
|
3
|
-
AI-powered code reviewer that catches bugs and suggests improvements.
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
- **Bug Detection**: Finds potential bugs and security issues
|
|
7
|
-
- **Style Checks**: Enforces coding best practices
|
|
8
|
-
- **Improvement Suggestions**: Actionable refactoring advice
|
|
9
|
-
- **Severity Ratings**: 🔴 Critical | 🟡 Warning | 🔵 Info
|
|
10
|
-
|
|
11
|
-
## Quick Start
|
|
12
|
-
```bash
|
|
13
|
-
opc init my-reviewer --template code-reviewer
|
|
14
|
-
cd my-reviewer
|
|
15
|
-
opc run
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## Usage
|
|
19
|
-
Send code via the web or WebSocket channel:
|
|
20
|
-
```json
|
|
21
|
-
{
|
|
22
|
-
"message": "Review this:\n```python\ndef calc(x):\n return eval(x)\n```"
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Configuration
|
|
27
|
-
Customize the system prompt in `oad.yaml` to focus on specific languages or coding standards.
|
|
1
|
+
# Code Reviewer Template
|
|
2
|
+
|
|
3
|
+
AI-powered code reviewer that catches bugs and suggests improvements.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
- **Bug Detection**: Finds potential bugs and security issues
|
|
7
|
+
- **Style Checks**: Enforces coding best practices
|
|
8
|
+
- **Improvement Suggestions**: Actionable refactoring advice
|
|
9
|
+
- **Severity Ratings**: 🔴 Critical | 🟡 Warning | 🔵 Info
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
```bash
|
|
13
|
+
opc init my-reviewer --template code-reviewer
|
|
14
|
+
cd my-reviewer
|
|
15
|
+
opc run
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
Send code via the web or WebSocket channel:
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"message": "Review this:\n```python\ndef calc(x):\n return eval(x)\n```"
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Configuration
|
|
27
|
+
Customize the system prompt in `oad.yaml` to focus on specific languages or coding standards.
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
apiVersion: opc/v1
|
|
2
|
-
kind: Agent
|
|
3
|
-
metadata:
|
|
4
|
-
name: code-reviewer
|
|
5
|
-
version: 1.0.0
|
|
6
|
-
description: "AI code reviewer that reviews code and suggests improvements"
|
|
7
|
-
author: Deepleaper
|
|
8
|
-
license: Apache-2.0
|
|
9
|
-
marketplace:
|
|
10
|
-
certified: false
|
|
11
|
-
category: developer-tools
|
|
12
|
-
spec:
|
|
13
|
-
provider:
|
|
14
|
-
default: deepseek
|
|
15
|
-
allowed: [openai, deepseek, qwen]
|
|
16
|
-
model: deepseek-chat
|
|
17
|
-
systemPrompt: |
|
|
18
|
-
You are an expert code reviewer. When given code:
|
|
19
|
-
1. Check for bugs, security issues, and performance problems
|
|
20
|
-
2. Suggest improvements for readability and maintainability
|
|
21
|
-
3. Follow language-specific best practices
|
|
22
|
-
4. Be constructive and explain your reasoning
|
|
23
|
-
Rate severity: 🔴 Critical | 🟡 Warning | 🔵 Info
|
|
24
|
-
skills:
|
|
25
|
-
- name: code-analysis
|
|
26
|
-
description: "Analyze code for bugs and improvements"
|
|
27
|
-
- name: style-check
|
|
28
|
-
description: "Check coding style and best practices"
|
|
29
|
-
channels:
|
|
30
|
-
- type: web
|
|
31
|
-
port: 3000
|
|
32
|
-
- type: websocket
|
|
33
|
-
port: 3002
|
|
34
|
-
memory:
|
|
35
|
-
shortTerm: true
|
|
36
|
-
longTerm: false
|
|
37
|
-
dtv:
|
|
38
|
-
trust:
|
|
39
|
-
level: sandbox
|
|
40
|
-
value:
|
|
41
|
-
metrics: [reviews_completed, issues_found, suggestions_accepted]
|
|
1
|
+
apiVersion: opc/v1
|
|
2
|
+
kind: Agent
|
|
3
|
+
metadata:
|
|
4
|
+
name: code-reviewer
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
description: "AI code reviewer that reviews code and suggests improvements"
|
|
7
|
+
author: Deepleaper
|
|
8
|
+
license: Apache-2.0
|
|
9
|
+
marketplace:
|
|
10
|
+
certified: false
|
|
11
|
+
category: developer-tools
|
|
12
|
+
spec:
|
|
13
|
+
provider:
|
|
14
|
+
default: deepseek
|
|
15
|
+
allowed: [openai, deepseek, qwen]
|
|
16
|
+
model: deepseek-chat
|
|
17
|
+
systemPrompt: |
|
|
18
|
+
You are an expert code reviewer. When given code:
|
|
19
|
+
1. Check for bugs, security issues, and performance problems
|
|
20
|
+
2. Suggest improvements for readability and maintainability
|
|
21
|
+
3. Follow language-specific best practices
|
|
22
|
+
4. Be constructive and explain your reasoning
|
|
23
|
+
Rate severity: 🔴 Critical | 🟡 Warning | 🔵 Info
|
|
24
|
+
skills:
|
|
25
|
+
- name: code-analysis
|
|
26
|
+
description: "Analyze code for bugs and improvements"
|
|
27
|
+
- name: style-check
|
|
28
|
+
description: "Check coding style and best practices"
|
|
29
|
+
channels:
|
|
30
|
+
- type: web
|
|
31
|
+
port: 3000
|
|
32
|
+
- type: websocket
|
|
33
|
+
port: 3002
|
|
34
|
+
memory:
|
|
35
|
+
shortTerm: true
|
|
36
|
+
longTerm: false
|
|
37
|
+
dtv:
|
|
38
|
+
trust:
|
|
39
|
+
level: sandbox
|
|
40
|
+
value:
|
|
41
|
+
metrics: [reviews_completed, issues_found, suggestions_accepted]
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
# Customer Service Agent Template
|
|
2
|
-
|
|
3
|
-
A ready-to-use customer service agent with:
|
|
4
|
-
- **FAQ Lookup** — Matches common questions to predefined answers
|
|
5
|
-
- **Human Handoff** — Detects when a customer wants a real person
|
|
6
|
-
- **Web Channel** — HTTP API for chat integration
|
|
7
|
-
|
|
8
|
-
## Quick Start
|
|
9
|
-
|
|
10
|
-
```bash
|
|
11
|
-
opc init my-service --template customer-service
|
|
12
|
-
cd my-service
|
|
13
|
-
opc run
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## Customization
|
|
17
|
-
|
|
18
|
-
Edit `oad.yaml` to:
|
|
19
|
-
- Change the system prompt
|
|
20
|
-
- Add custom FAQ entries
|
|
21
|
-
- Switch LLM provider
|
|
22
|
-
- Adjust trust level
|
|
1
|
+
# Customer Service Agent Template
|
|
2
|
+
|
|
3
|
+
A ready-to-use customer service agent with:
|
|
4
|
+
- **FAQ Lookup** — Matches common questions to predefined answers
|
|
5
|
+
- **Human Handoff** — Detects when a customer wants a real person
|
|
6
|
+
- **Web Channel** — HTTP API for chat integration
|
|
7
|
+
|
|
8
|
+
## Quick Start
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
opc init my-service --template customer-service
|
|
12
|
+
cd my-service
|
|
13
|
+
opc run
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Customization
|
|
17
|
+
|
|
18
|
+
Edit `oad.yaml` to:
|
|
19
|
+
- Change the system prompt
|
|
20
|
+
- Add custom FAQ entries
|
|
21
|
+
- Switch LLM provider
|
|
22
|
+
- Adjust trust level
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
apiVersion: opc/v1
|
|
2
|
-
kind: Agent
|
|
3
|
-
metadata:
|
|
4
|
-
name: customer-service
|
|
5
|
-
version: 1.0.0
|
|
6
|
-
description: "A customer service agent with FAQ lookup and human handoff"
|
|
7
|
-
author: Deepleaper
|
|
8
|
-
license: Apache-2.0
|
|
9
|
-
marketplace:
|
|
10
|
-
certified: false
|
|
11
|
-
category: customer-service
|
|
12
|
-
spec:
|
|
13
|
-
provider:
|
|
14
|
-
default: deepseek
|
|
15
|
-
allowed: [openai, deepseek, qwen]
|
|
16
|
-
model: deepseek-chat
|
|
17
|
-
systemPrompt: |
|
|
18
|
-
You are a friendly and professional customer service agent.
|
|
19
|
-
You help customers with their questions about products, orders, shipping, and returns.
|
|
20
|
-
Be concise, helpful, and empathetic.
|
|
21
|
-
skills:
|
|
22
|
-
- name: faq-lookup
|
|
23
|
-
description: "Look up FAQ answers"
|
|
24
|
-
- name: human-handoff
|
|
25
|
-
description: "Hand off to human agent when needed"
|
|
26
|
-
channels:
|
|
27
|
-
- type: web
|
|
28
|
-
port: 3000
|
|
29
|
-
memory:
|
|
30
|
-
shortTerm: true
|
|
31
|
-
longTerm: false
|
|
32
|
-
dtv:
|
|
33
|
-
trust:
|
|
34
|
-
level: sandbox
|
|
35
|
-
value:
|
|
36
|
-
metrics: [response_time, satisfaction_score]
|
|
1
|
+
apiVersion: opc/v1
|
|
2
|
+
kind: Agent
|
|
3
|
+
metadata:
|
|
4
|
+
name: customer-service
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
description: "A customer service agent with FAQ lookup and human handoff"
|
|
7
|
+
author: Deepleaper
|
|
8
|
+
license: Apache-2.0
|
|
9
|
+
marketplace:
|
|
10
|
+
certified: false
|
|
11
|
+
category: customer-service
|
|
12
|
+
spec:
|
|
13
|
+
provider:
|
|
14
|
+
default: deepseek
|
|
15
|
+
allowed: [openai, deepseek, qwen]
|
|
16
|
+
model: deepseek-chat
|
|
17
|
+
systemPrompt: |
|
|
18
|
+
You are a friendly and professional customer service agent.
|
|
19
|
+
You help customers with their questions about products, orders, shipping, and returns.
|
|
20
|
+
Be concise, helpful, and empathetic.
|
|
21
|
+
skills:
|
|
22
|
+
- name: faq-lookup
|
|
23
|
+
description: "Look up FAQ answers"
|
|
24
|
+
- name: human-handoff
|
|
25
|
+
description: "Hand off to human agent when needed"
|
|
26
|
+
channels:
|
|
27
|
+
- type: web
|
|
28
|
+
port: 3000
|
|
29
|
+
memory:
|
|
30
|
+
shortTerm: true
|
|
31
|
+
longTerm: false
|
|
32
|
+
dtv:
|
|
33
|
+
trust:
|
|
34
|
+
level: sandbox
|
|
35
|
+
value:
|
|
36
|
+
metrics: [response_time, satisfaction_score]
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
version: '3.8'
|
|
2
|
-
|
|
3
|
-
services:
|
|
4
|
-
agent:
|
|
5
|
-
build: .
|
|
6
|
-
ports:
|
|
7
|
-
- "3000:3000"
|
|
8
|
-
env_file:
|
|
9
|
-
- .env
|
|
10
|
-
volumes:
|
|
11
|
-
- ./oad.yaml:/app/oad.yaml:ro
|
|
12
|
-
- agent-data:/app/data
|
|
13
|
-
restart: unless-stopped
|
|
14
|
-
healthcheck:
|
|
15
|
-
test: ["CMD", "wget", "-q", "--spider", "http://localhost:3000/health"]
|
|
16
|
-
interval: 30s
|
|
17
|
-
timeout: 5s
|
|
18
|
-
retries: 3
|
|
19
|
-
|
|
20
|
-
volumes:
|
|
21
|
-
agent-data:
|
|
1
|
+
version: '3.8'
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
agent:
|
|
5
|
+
build: .
|
|
6
|
+
ports:
|
|
7
|
+
- "3000:3000"
|
|
8
|
+
env_file:
|
|
9
|
+
- .env
|
|
10
|
+
volumes:
|
|
11
|
+
- ./oad.yaml:/app/oad.yaml:ro
|
|
12
|
+
- agent-data:/app/data
|
|
13
|
+
restart: unless-stopped
|
|
14
|
+
healthcheck:
|
|
15
|
+
test: ["CMD", "wget", "-q", "--spider", "http://localhost:3000/health"]
|
|
16
|
+
interval: 30s
|
|
17
|
+
timeout: 5s
|
|
18
|
+
retries: 3
|
|
19
|
+
|
|
20
|
+
volumes:
|
|
21
|
+
agent-data:
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
# Ecommerce Assistant — 电商助手工位
|
|
2
|
-
|
|
3
|
-
专为电商平台设计的 AI 导购与售后工位,覆盖商品推荐、订单查询、退换货处理全链路。
|
|
4
|
-
|
|
5
|
-
## 快速开始
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
opc init --template ecommerce-assistant
|
|
9
|
-
opc start
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
访问 http://localhost:3000 即可使用电商助手聊天界面。
|
|
13
|
-
|
|
14
|
-
## 功能
|
|
15
|
-
|
|
16
|
-
| 技能 | 说明 |
|
|
17
|
-
|------|------|
|
|
18
|
-
| product-search | 关键词/类目/价格区间商品搜索 |
|
|
19
|
-
| order-query | 订单状态与物流实时查询 |
|
|
20
|
-
| after-sale | 退换货受理与投诉处理 |
|
|
21
|
-
| promotion | 个性化优惠券与促销推送 |
|
|
22
|
-
| recommendation | 基于偏好的个性化商品推荐 |
|
|
23
|
-
|
|
24
|
-
## 配置
|
|
25
|
-
|
|
26
|
-
在 `oad.yaml` 中修改以下参数:
|
|
27
|
-
|
|
28
|
-
- `spec.provider.default` — 切换 LLM 提供商(deepseek / openai / qwen)
|
|
29
|
-
- `spec.model` — 指定模型版本
|
|
30
|
-
- `spec.systemPrompt` — 定制品牌话术、商品范围和售后规则
|
|
31
|
-
|
|
32
|
-
### 环境变量
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
OPC_LLM_API_KEY=your_key
|
|
36
|
-
OPC_LLM_MODEL=deepseek-chat # 可选,覆盖 oad.yaml 中的 model
|
|
37
|
-
OPC_DEEPBRAIN_ENABLED=true # 启用 DeepBrain 知识库增强(需全局安装 deepbrain)
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## 推荐搭配
|
|
41
|
-
|
|
42
|
-
- 将商品目录、售后政策、FAQ 上传至知识库(`/api/kb/upload`)
|
|
43
|
-
- 开启 `OPC_DEEPBRAIN_ENABLED=true` 提升商品语义匹配精度
|
|
44
|
-
- 通过 Dashboard(`/dashboard`)监控转化率、客满率和退单率
|
|
45
|
-
- 结合 CRM 系统 Webhook 实现订单状态实时同步
|
|
1
|
+
# Ecommerce Assistant — 电商助手工位
|
|
2
|
+
|
|
3
|
+
专为电商平台设计的 AI 导购与售后工位,覆盖商品推荐、订单查询、退换货处理全链路。
|
|
4
|
+
|
|
5
|
+
## 快速开始
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
opc init --template ecommerce-assistant
|
|
9
|
+
opc start
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
访问 http://localhost:3000 即可使用电商助手聊天界面。
|
|
13
|
+
|
|
14
|
+
## 功能
|
|
15
|
+
|
|
16
|
+
| 技能 | 说明 |
|
|
17
|
+
|------|------|
|
|
18
|
+
| product-search | 关键词/类目/价格区间商品搜索 |
|
|
19
|
+
| order-query | 订单状态与物流实时查询 |
|
|
20
|
+
| after-sale | 退换货受理与投诉处理 |
|
|
21
|
+
| promotion | 个性化优惠券与促销推送 |
|
|
22
|
+
| recommendation | 基于偏好的个性化商品推荐 |
|
|
23
|
+
|
|
24
|
+
## 配置
|
|
25
|
+
|
|
26
|
+
在 `oad.yaml` 中修改以下参数:
|
|
27
|
+
|
|
28
|
+
- `spec.provider.default` — 切换 LLM 提供商(deepseek / openai / qwen)
|
|
29
|
+
- `spec.model` — 指定模型版本
|
|
30
|
+
- `spec.systemPrompt` — 定制品牌话术、商品范围和售后规则
|
|
31
|
+
|
|
32
|
+
### 环境变量
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
OPC_LLM_API_KEY=your_key
|
|
36
|
+
OPC_LLM_MODEL=deepseek-chat # 可选,覆盖 oad.yaml 中的 model
|
|
37
|
+
OPC_DEEPBRAIN_ENABLED=true # 启用 DeepBrain 知识库增强(需全局安装 deepbrain)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 推荐搭配
|
|
41
|
+
|
|
42
|
+
- 将商品目录、售后政策、FAQ 上传至知识库(`/api/kb/upload`)
|
|
43
|
+
- 开启 `OPC_DEEPBRAIN_ENABLED=true` 提升商品语义匹配精度
|
|
44
|
+
- 通过 Dashboard(`/dashboard`)监控转化率、客满率和退单率
|
|
45
|
+
- 结合 CRM 系统 Webhook 实现订单状态实时同步
|