opc-agent 1.1.3 → 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.
Files changed (156) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/CONTRIBUTING.md +75 -75
  3. package/README.md +429 -429
  4. package/README.zh-CN.md +415 -415
  5. package/dist/channels/web.js +256 -256
  6. package/dist/core/streaming.d.ts +56 -0
  7. package/dist/core/streaming.js +160 -0
  8. package/dist/deploy/hermes.js +22 -22
  9. package/dist/deploy/openclaw.js +31 -31
  10. package/dist/index.d.ts +4 -0
  11. package/dist/index.js +7 -1
  12. package/dist/providers/index.d.ts +1 -1
  13. package/dist/providers/index.js +13 -148
  14. package/dist/schema/oad.d.ts +3 -3
  15. package/dist/templates/code-reviewer.js +5 -5
  16. package/dist/templates/customer-service.js +2 -2
  17. package/dist/templates/data-analyst.js +5 -5
  18. package/dist/templates/knowledge-base.js +2 -2
  19. package/dist/templates/sales-assistant.js +4 -4
  20. package/dist/templates/teacher.js +6 -6
  21. package/dist/tools/gateway.d.ts +28 -0
  22. package/dist/tools/gateway.js +177 -0
  23. package/docs/.vitepress/config.ts +103 -103
  24. package/docs/api/cli.md +48 -48
  25. package/docs/api/oad-schema.md +64 -64
  26. package/docs/api/sdk.md +80 -80
  27. package/docs/guide/concepts.md +51 -51
  28. package/docs/guide/configuration.md +79 -79
  29. package/docs/guide/deployment.md +42 -42
  30. package/docs/guide/getting-started.md +44 -44
  31. package/docs/guide/templates.md +28 -28
  32. package/docs/guide/testing.md +84 -84
  33. package/docs/index.md +27 -27
  34. package/docs/zh/api/cli.md +54 -54
  35. package/docs/zh/api/oad-schema.md +87 -87
  36. package/docs/zh/api/sdk.md +102 -102
  37. package/docs/zh/guide/concepts.md +104 -104
  38. package/docs/zh/guide/configuration.md +135 -135
  39. package/docs/zh/guide/deployment.md +81 -81
  40. package/docs/zh/guide/getting-started.md +82 -82
  41. package/docs/zh/guide/templates.md +84 -84
  42. package/docs/zh/guide/testing.md +88 -88
  43. package/docs/zh/index.md +27 -27
  44. package/examples/customer-service-demo/README.md +90 -90
  45. package/examples/customer-service-demo/oad.yaml +107 -107
  46. package/package.json +1 -1
  47. package/src/analytics/index.ts +66 -66
  48. package/src/channels/discord.ts +192 -192
  49. package/src/channels/email.ts +177 -177
  50. package/src/channels/feishu.ts +236 -236
  51. package/src/channels/index.ts +15 -15
  52. package/src/channels/slack.ts +160 -160
  53. package/src/channels/telegram.ts +90 -90
  54. package/src/channels/voice.ts +106 -106
  55. package/src/channels/web.ts +17 -17
  56. package/src/channels/webhook.ts +199 -199
  57. package/src/channels/websocket.ts +87 -87
  58. package/src/channels/wechat.ts +149 -149
  59. package/src/core/a2a.ts +143 -143
  60. package/src/core/agent.ts +152 -152
  61. package/src/core/analytics-engine.ts +186 -186
  62. package/src/core/auth.ts +57 -57
  63. package/src/core/cache.ts +141 -141
  64. package/src/core/compose.ts +77 -77
  65. package/src/core/config.ts +14 -14
  66. package/src/core/errors.ts +148 -148
  67. package/src/core/hitl.ts +138 -138
  68. package/src/core/knowledge.ts +49 -4
  69. package/src/core/logger.ts +57 -57
  70. package/src/core/orchestrator.ts +215 -215
  71. package/src/core/performance.ts +187 -187
  72. package/src/core/rate-limiter.ts +128 -128
  73. package/src/core/room.ts +109 -109
  74. package/src/core/runtime.ts +152 -152
  75. package/src/core/sandbox.ts +101 -101
  76. package/src/core/security.ts +171 -171
  77. package/src/core/streaming.ts +195 -0
  78. package/src/core/types.ts +68 -68
  79. package/src/core/versioning.ts +106 -106
  80. package/src/core/watch.ts +178 -178
  81. package/src/core/workflow.ts +235 -235
  82. package/src/deploy/hermes.ts +156 -156
  83. package/src/deploy/openclaw.ts +200 -200
  84. package/src/dtv/data.ts +29 -29
  85. package/src/dtv/trust.ts +43 -43
  86. package/src/dtv/value.ts +47 -47
  87. package/src/i18n/index.ts +216 -216
  88. package/src/index.ts +6 -0
  89. package/src/marketplace/index.ts +223 -223
  90. package/src/memory/deepbrain.ts +108 -108
  91. package/src/memory/index.ts +34 -34
  92. package/src/plugins/index.ts +208 -208
  93. package/src/providers/index.ts +12 -3
  94. package/src/schema/oad.ts +155 -155
  95. package/src/skills/base.ts +16 -16
  96. package/src/skills/document.ts +100 -100
  97. package/src/skills/http.ts +35 -35
  98. package/src/skills/index.ts +27 -27
  99. package/src/skills/scheduler.ts +80 -80
  100. package/src/skills/webhook-trigger.ts +59 -59
  101. package/src/templates/code-reviewer.ts +34 -34
  102. package/src/templates/customer-service.ts +80 -80
  103. package/src/templates/data-analyst.ts +70 -70
  104. package/src/templates/executive-assistant.ts +71 -71
  105. package/src/templates/financial-advisor.ts +60 -60
  106. package/src/templates/knowledge-base.ts +31 -31
  107. package/src/templates/legal-assistant.ts +71 -71
  108. package/src/templates/sales-assistant.ts +79 -79
  109. package/src/templates/teacher.ts +79 -79
  110. package/src/testing/index.ts +181 -181
  111. package/src/tools/calculator.ts +73 -73
  112. package/src/tools/datetime.ts +149 -149
  113. package/src/tools/gateway.ts +220 -0
  114. package/src/tools/json-transform.ts +187 -187
  115. package/src/tools/mcp.ts +76 -76
  116. package/src/tools/text-analysis.ts +116 -116
  117. package/templates/Dockerfile +15 -15
  118. package/templates/code-reviewer/README.md +27 -27
  119. package/templates/code-reviewer/oad.yaml +41 -41
  120. package/templates/customer-service/README.md +22 -22
  121. package/templates/customer-service/oad.yaml +36 -36
  122. package/templates/docker-compose.yml +21 -21
  123. package/templates/ecommerce-assistant/README.md +45 -0
  124. package/templates/ecommerce-assistant/oad.yaml +47 -0
  125. package/templates/knowledge-base/README.md +28 -28
  126. package/templates/knowledge-base/oad.yaml +38 -38
  127. package/templates/sales-assistant/README.md +26 -26
  128. package/templates/sales-assistant/oad.yaml +43 -43
  129. package/templates/tech-support/README.md +43 -0
  130. package/templates/tech-support/oad.yaml +45 -0
  131. package/tests/a2a.test.ts +66 -66
  132. package/tests/agent.test.ts +72 -72
  133. package/tests/analytics.test.ts +50 -50
  134. package/tests/channel.test.ts +39 -39
  135. package/tests/e2e.test.ts +134 -134
  136. package/tests/errors.test.ts +83 -83
  137. package/tests/gateway.test.ts +71 -0
  138. package/tests/hitl.test.ts +71 -71
  139. package/tests/i18n.test.ts +41 -41
  140. package/tests/mcp.test.ts +54 -54
  141. package/tests/oad.test.ts +68 -68
  142. package/tests/performance.test.ts +115 -115
  143. package/tests/plugin.test.ts +74 -74
  144. package/tests/room.test.ts +106 -106
  145. package/tests/runtime.test.ts +42 -42
  146. package/tests/sandbox.test.ts +46 -46
  147. package/tests/security.test.ts +60 -60
  148. package/tests/streaming.test.ts +109 -0
  149. package/tests/templates.test.ts +77 -77
  150. package/tests/v070.test.ts +76 -76
  151. package/tests/versioning.test.ts +75 -75
  152. package/tests/voice.test.ts +61 -61
  153. package/tests/webhook.test.ts +29 -29
  154. package/tests/workflow.test.ts +143 -143
  155. package/tsconfig.json +19 -19
  156. 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
+ };
@@ -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:
@@ -0,0 +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 实现订单状态实时同步
@@ -0,0 +1,47 @@
1
+ apiVersion: opc/v1
2
+ kind: Agent
3
+ metadata:
4
+ name: ecommerce-assistant
5
+ version: 1.0.0
6
+ description: "电商助手工位 - 商品推荐、订单查询、售后服务一体化"
7
+ author: Deepleaper
8
+ license: Apache-2.0
9
+ marketplace:
10
+ certified: false
11
+ category: ecommerce
12
+ spec:
13
+ provider:
14
+ default: deepseek
15
+ allowed: [openai, deepseek, qwen, gemini]
16
+ model: deepseek-chat
17
+ systemPrompt: |
18
+ 你是一名专业的电商购物助手。
19
+ 你帮助用户查询商品信息、比较价格、处理订单状态和售后问题。
20
+ 根据用户需求推荐合适的商品,推送当前促销活动,并协助用户做出购买决策。
21
+ 处理退换货申请时,需先核实订单信息,再按平台规则指引用户操作。
22
+ 始终保持友好、热情、专业的服务态度。
23
+ skills:
24
+ - name: product-search
25
+ description: "搜索商品信息,支持关键词、类目、价格区间筛选"
26
+ - name: order-query
27
+ description: "查询订单状态、物流轨迹和预计送达时间"
28
+ - name: after-sale
29
+ description: "处理退换货申请、投诉受理和赔偿协商"
30
+ - name: promotion
31
+ description: "推送个性化优惠券、限时活动和会员权益"
32
+ - name: recommendation
33
+ description: "基于用户偏好和购买历史做商品推荐"
34
+ channels:
35
+ - type: web
36
+ port: 3000
37
+ memory:
38
+ shortTerm: true
39
+ longTerm: true
40
+ knowledge:
41
+ enabled: true
42
+ deepbrain: auto
43
+ dtv:
44
+ trust:
45
+ level: sandbox
46
+ value:
47
+ metrics: [conversion_rate, customer_satisfaction, avg_order_value, refund_rate]