opc-agent 1.1.0 → 1.1.2
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 +51 -51
- package/CONTRIBUTING.md +75 -75
- package/README.md +341 -101
- package/README.zh-CN.md +382 -55
- package/dist/channels/web.js +256 -256
- package/dist/cli.js +1 -32
- package/dist/deploy/hermes.js +22 -22
- package/dist/deploy/openclaw.js +31 -31
- package/dist/i18n/index.js +60 -9
- 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/docs/.vitepress/config.ts +103 -92
- 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 -0
- package/docs/zh/api/oad-schema.md +87 -3
- package/docs/zh/api/sdk.md +102 -0
- package/docs/zh/guide/concepts.md +104 -28
- package/docs/zh/guide/configuration.md +135 -39
- package/docs/zh/guide/deployment.md +81 -3
- package/docs/zh/guide/getting-started.md +82 -58
- package/docs/zh/guide/templates.md +84 -22
- package/docs/zh/guide/testing.md +88 -18
- 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 +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 +160 -160
- package/src/channels/telegram.ts +90 -90
- package/src/channels/voice.ts +106 -106
- package/src/channels/web.ts +596 -596
- 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 +1 -35
- 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/knowledge.ts +210 -210
- 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/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 -165
- package/src/index.ts +110 -110
- 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/providers/index.ts +183 -183
- 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/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/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/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/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/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,31 +1,31 @@
|
|
|
1
|
-
export const KNOWLEDGE_BASE_SYSTEM_PROMPT = `You are a knowledge base assistant. Answer questions using the company documents
|
|
2
|
-
and knowledge provided to you. If you don't have enough information, say so honestly.
|
|
3
|
-
Always cite sources when possible. Be accurate and concise.`;
|
|
4
|
-
|
|
5
|
-
export function createKnowledgeBaseConfig() {
|
|
6
|
-
return {
|
|
7
|
-
apiVersion: 'opc/v1' as const,
|
|
8
|
-
kind: 'Agent' as const,
|
|
9
|
-
metadata: {
|
|
10
|
-
name: 'knowledge-base',
|
|
11
|
-
version: '1.0.0',
|
|
12
|
-
description: 'RAG-powered knowledge base agent using DeepBrain for semantic search',
|
|
13
|
-
author: 'OPC Agent',
|
|
14
|
-
license: 'Apache-2.0',
|
|
15
|
-
},
|
|
16
|
-
spec: {
|
|
17
|
-
provider: { default: 'deepseek', allowed: ['openai', 'deepseek', 'qwen'] },
|
|
18
|
-
model: 'deepseek-chat',
|
|
19
|
-
systemPrompt: KNOWLEDGE_BASE_SYSTEM_PROMPT,
|
|
20
|
-
skills: [
|
|
21
|
-
{ name: 'doc-search', description: 'Search company documents' },
|
|
22
|
-
],
|
|
23
|
-
channels: [{ type: 'web' as const, port: 3000 }],
|
|
24
|
-
memory: { shortTerm: true, longTerm: { provider: 'deepbrain' as const, collection: 'company-knowledge' } },
|
|
25
|
-
dtv: {
|
|
26
|
-
trust: { level: 'sandbox' as const },
|
|
27
|
-
value: { metrics: ['queries_answered', 'docs_indexed'] },
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
}
|
|
1
|
+
export const KNOWLEDGE_BASE_SYSTEM_PROMPT = `You are a knowledge base assistant. Answer questions using the company documents
|
|
2
|
+
and knowledge provided to you. If you don't have enough information, say so honestly.
|
|
3
|
+
Always cite sources when possible. Be accurate and concise.`;
|
|
4
|
+
|
|
5
|
+
export function createKnowledgeBaseConfig() {
|
|
6
|
+
return {
|
|
7
|
+
apiVersion: 'opc/v1' as const,
|
|
8
|
+
kind: 'Agent' as const,
|
|
9
|
+
metadata: {
|
|
10
|
+
name: 'knowledge-base',
|
|
11
|
+
version: '1.0.0',
|
|
12
|
+
description: 'RAG-powered knowledge base agent using DeepBrain for semantic search',
|
|
13
|
+
author: 'OPC Agent',
|
|
14
|
+
license: 'Apache-2.0',
|
|
15
|
+
},
|
|
16
|
+
spec: {
|
|
17
|
+
provider: { default: 'deepseek', allowed: ['openai', 'deepseek', 'qwen'] },
|
|
18
|
+
model: 'deepseek-chat',
|
|
19
|
+
systemPrompt: KNOWLEDGE_BASE_SYSTEM_PROMPT,
|
|
20
|
+
skills: [
|
|
21
|
+
{ name: 'doc-search', description: 'Search company documents' },
|
|
22
|
+
],
|
|
23
|
+
channels: [{ type: 'web' as const, port: 3000 }],
|
|
24
|
+
memory: { shortTerm: true, longTerm: { provider: 'deepbrain' as const, collection: 'company-knowledge' } },
|
|
25
|
+
dtv: {
|
|
26
|
+
trust: { level: 'sandbox' as const },
|
|
27
|
+
value: { metrics: ['queries_answered', 'docs_indexed'] },
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -1,71 +1,71 @@
|
|
|
1
|
-
import { BaseSkill } from '../skills/base';
|
|
2
|
-
import type { AgentContext, Message, SkillResult } from '../core/types';
|
|
3
|
-
import type { OADDocument } from '../schema/oad';
|
|
4
|
-
|
|
5
|
-
const LEGAL_TERMS: Record<string, string> = {
|
|
6
|
-
'force majeure': 'A clause that frees parties from obligations due to extraordinary events.',
|
|
7
|
-
'indemnification': 'One party agrees to compensate the other for certain damages or losses.',
|
|
8
|
-
'limitation of liability': 'A cap on the amount one party can claim from the other.',
|
|
9
|
-
'non-compete': 'Restricts a party from competing within a specified scope and timeframe.',
|
|
10
|
-
'confidentiality': 'Obligations to keep certain information private.',
|
|
11
|
-
'termination': 'Conditions under which the agreement may be ended.',
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
export class ContractReviewSkill extends BaseSkill {
|
|
15
|
-
name = 'contract-review';
|
|
16
|
-
description = 'Review contracts and identify key clauses';
|
|
17
|
-
|
|
18
|
-
async execute(_context: AgentContext, message: Message): Promise<SkillResult> {
|
|
19
|
-
const lower = message.content.toLowerCase();
|
|
20
|
-
for (const [term, explanation] of Object.entries(LEGAL_TERMS)) {
|
|
21
|
-
if (lower.includes(term)) {
|
|
22
|
-
return this.match(`📋 **${term.toUpperCase()}**: ${explanation}`, 0.85);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
if (lower.includes('review') || lower.includes('contract')) {
|
|
26
|
-
return this.match('I can review contracts for key clauses like force majeure, indemnification, limitation of liability, non-compete, confidentiality, and termination provisions.', 0.7);
|
|
27
|
-
}
|
|
28
|
-
return this.noMatch();
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export class ComplianceCheckSkill extends BaseSkill {
|
|
33
|
-
name = 'compliance-check';
|
|
34
|
-
description = 'Check compliance with regulations';
|
|
35
|
-
|
|
36
|
-
async execute(_context: AgentContext, message: Message): Promise<SkillResult> {
|
|
37
|
-
const lower = message.content.toLowerCase();
|
|
38
|
-
if (lower.includes('gdpr') || lower.includes('privacy')) {
|
|
39
|
-
return this.match('GDPR compliance requires: data minimization, consent mechanisms, right to erasure, data protection officer, and breach notification within 72 hours.', 0.9);
|
|
40
|
-
}
|
|
41
|
-
if (lower.includes('compliance') || lower.includes('regulation')) {
|
|
42
|
-
return this.match('I can check compliance with GDPR, CCPA, SOX, HIPAA, and other major regulations. Please specify the regulation and context.', 0.7);
|
|
43
|
-
}
|
|
44
|
-
return this.noMatch();
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export function createLegalAssistantConfig(): OADDocument {
|
|
49
|
-
return {
|
|
50
|
-
apiVersion: 'opc/v1',
|
|
51
|
-
kind: 'Agent',
|
|
52
|
-
metadata: {
|
|
53
|
-
name: 'legal-assistant',
|
|
54
|
-
version: '1.0.0',
|
|
55
|
-
description: 'AI Legal Assistant - contract review, compliance checking, legal research',
|
|
56
|
-
author: 'OPC',
|
|
57
|
-
license: 'Apache-2.0',
|
|
58
|
-
},
|
|
59
|
-
spec: {
|
|
60
|
-
model: 'deepseek-chat',
|
|
61
|
-
systemPrompt: 'You are a legal assistant AI. Help users review contracts, check compliance, and research legal topics. Always recommend consulting a qualified attorney for binding decisions.',
|
|
62
|
-
skills: [
|
|
63
|
-
{ name: 'contract-review', description: 'Review contracts and identify key clauses' },
|
|
64
|
-
{ name: 'compliance-check', description: 'Check regulatory compliance' },
|
|
65
|
-
],
|
|
66
|
-
channels: [{ type: 'web', port: 3000 }],
|
|
67
|
-
memory: { shortTerm: true, longTerm: false },
|
|
68
|
-
streaming: false,
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
}
|
|
1
|
+
import { BaseSkill } from '../skills/base';
|
|
2
|
+
import type { AgentContext, Message, SkillResult } from '../core/types';
|
|
3
|
+
import type { OADDocument } from '../schema/oad';
|
|
4
|
+
|
|
5
|
+
const LEGAL_TERMS: Record<string, string> = {
|
|
6
|
+
'force majeure': 'A clause that frees parties from obligations due to extraordinary events.',
|
|
7
|
+
'indemnification': 'One party agrees to compensate the other for certain damages or losses.',
|
|
8
|
+
'limitation of liability': 'A cap on the amount one party can claim from the other.',
|
|
9
|
+
'non-compete': 'Restricts a party from competing within a specified scope and timeframe.',
|
|
10
|
+
'confidentiality': 'Obligations to keep certain information private.',
|
|
11
|
+
'termination': 'Conditions under which the agreement may be ended.',
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export class ContractReviewSkill extends BaseSkill {
|
|
15
|
+
name = 'contract-review';
|
|
16
|
+
description = 'Review contracts and identify key clauses';
|
|
17
|
+
|
|
18
|
+
async execute(_context: AgentContext, message: Message): Promise<SkillResult> {
|
|
19
|
+
const lower = message.content.toLowerCase();
|
|
20
|
+
for (const [term, explanation] of Object.entries(LEGAL_TERMS)) {
|
|
21
|
+
if (lower.includes(term)) {
|
|
22
|
+
return this.match(`📋 **${term.toUpperCase()}**: ${explanation}`, 0.85);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (lower.includes('review') || lower.includes('contract')) {
|
|
26
|
+
return this.match('I can review contracts for key clauses like force majeure, indemnification, limitation of liability, non-compete, confidentiality, and termination provisions.', 0.7);
|
|
27
|
+
}
|
|
28
|
+
return this.noMatch();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export class ComplianceCheckSkill extends BaseSkill {
|
|
33
|
+
name = 'compliance-check';
|
|
34
|
+
description = 'Check compliance with regulations';
|
|
35
|
+
|
|
36
|
+
async execute(_context: AgentContext, message: Message): Promise<SkillResult> {
|
|
37
|
+
const lower = message.content.toLowerCase();
|
|
38
|
+
if (lower.includes('gdpr') || lower.includes('privacy')) {
|
|
39
|
+
return this.match('GDPR compliance requires: data minimization, consent mechanisms, right to erasure, data protection officer, and breach notification within 72 hours.', 0.9);
|
|
40
|
+
}
|
|
41
|
+
if (lower.includes('compliance') || lower.includes('regulation')) {
|
|
42
|
+
return this.match('I can check compliance with GDPR, CCPA, SOX, HIPAA, and other major regulations. Please specify the regulation and context.', 0.7);
|
|
43
|
+
}
|
|
44
|
+
return this.noMatch();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function createLegalAssistantConfig(): OADDocument {
|
|
49
|
+
return {
|
|
50
|
+
apiVersion: 'opc/v1',
|
|
51
|
+
kind: 'Agent',
|
|
52
|
+
metadata: {
|
|
53
|
+
name: 'legal-assistant',
|
|
54
|
+
version: '1.0.0',
|
|
55
|
+
description: 'AI Legal Assistant - contract review, compliance checking, legal research',
|
|
56
|
+
author: 'OPC',
|
|
57
|
+
license: 'Apache-2.0',
|
|
58
|
+
},
|
|
59
|
+
spec: {
|
|
60
|
+
model: 'deepseek-chat',
|
|
61
|
+
systemPrompt: 'You are a legal assistant AI. Help users review contracts, check compliance, and research legal topics. Always recommend consulting a qualified attorney for binding decisions.',
|
|
62
|
+
skills: [
|
|
63
|
+
{ name: 'contract-review', description: 'Review contracts and identify key clauses' },
|
|
64
|
+
{ name: 'compliance-check', description: 'Check regulatory compliance' },
|
|
65
|
+
],
|
|
66
|
+
channels: [{ type: 'web', port: 3000 }],
|
|
67
|
+
memory: { shortTerm: true, longTerm: false },
|
|
68
|
+
streaming: false,
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
import { BaseSkill } from '../skills/base';
|
|
2
|
-
import type { AgentContext, Message, SkillResult } from '../core/types';
|
|
3
|
-
|
|
4
|
-
export class ProductQASkill extends BaseSkill {
|
|
5
|
-
name = 'product-qa';
|
|
6
|
-
description = 'Answer product-related questions';
|
|
7
|
-
private catalog: Record<string, string>;
|
|
8
|
-
|
|
9
|
-
constructor(catalog?: Record<string, string>) {
|
|
10
|
-
super();
|
|
11
|
-
this.catalog = catalog ?? {
|
|
12
|
-
pricing: 'Please visit our pricing page or contact sales for a custom quote.',
|
|
13
|
-
features: 'Our product includes AI-powered automation, analytics dashboard, and API access.',
|
|
14
|
-
demo: 'I\'d love to schedule a demo for you! Could you share your email and preferred time?',
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
async execute(_context: AgentContext, message: Message): Promise<SkillResult> {
|
|
19
|
-
const lower = message.content.toLowerCase();
|
|
20
|
-
for (const [key, answer] of Object.entries(this.catalog)) {
|
|
21
|
-
if (lower.includes(key)) return this.match(answer, 0.85);
|
|
22
|
-
}
|
|
23
|
-
return this.noMatch();
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export class LeadCaptureSkill extends BaseSkill {
|
|
28
|
-
name = 'lead-capture';
|
|
29
|
-
description = 'Capture prospect information';
|
|
30
|
-
private emailRegex = /[\w.-]+@[\w.-]+\.\w+/;
|
|
31
|
-
|
|
32
|
-
async execute(context: AgentContext, message: Message): Promise<SkillResult> {
|
|
33
|
-
const email = message.content.match(this.emailRegex);
|
|
34
|
-
if (email) {
|
|
35
|
-
await context.memory.set(`lead:${email[0]}`, {
|
|
36
|
-
email: email[0],
|
|
37
|
-
capturedAt: Date.now(),
|
|
38
|
-
messages: context.messages.length,
|
|
39
|
-
});
|
|
40
|
-
return this.match(`Thanks! I've noted your email (${email[0]}). Our team will reach out shortly.`, 0.95);
|
|
41
|
-
}
|
|
42
|
-
return this.noMatch();
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export const SALES_ASSISTANT_SYSTEM_PROMPT = `You are a professional sales assistant. Your goals:
|
|
47
|
-
1. Answer product questions accurately and enthusiastically
|
|
48
|
-
2. Capture leads by collecting name, email, and company info
|
|
49
|
-
3. Book appointments when prospects are ready
|
|
50
|
-
Be friendly, persuasive but not pushy. Always provide value first.`;
|
|
51
|
-
|
|
52
|
-
export function createSalesAssistantConfig() {
|
|
53
|
-
return {
|
|
54
|
-
apiVersion: 'opc/v1' as const,
|
|
55
|
-
kind: 'Agent' as const,
|
|
56
|
-
metadata: {
|
|
57
|
-
name: 'sales-assistant',
|
|
58
|
-
version: '1.0.0',
|
|
59
|
-
description: 'AI sales assistant with product Q&A, lead capture, and appointment booking',
|
|
60
|
-
author: 'OPC Agent',
|
|
61
|
-
license: 'Apache-2.0',
|
|
62
|
-
},
|
|
63
|
-
spec: {
|
|
64
|
-
provider: { default: 'deepseek', allowed: ['openai', 'deepseek', 'qwen'] },
|
|
65
|
-
model: 'deepseek-chat',
|
|
66
|
-
systemPrompt: SALES_ASSISTANT_SYSTEM_PROMPT,
|
|
67
|
-
skills: [
|
|
68
|
-
{ name: 'product-qa', description: 'Answer product questions' },
|
|
69
|
-
{ name: 'lead-capture', description: 'Capture prospect info' },
|
|
70
|
-
],
|
|
71
|
-
channels: [{ type: 'web' as const, port: 3000 }],
|
|
72
|
-
memory: { shortTerm: true, longTerm: false },
|
|
73
|
-
dtv: {
|
|
74
|
-
trust: { level: 'sandbox' as const },
|
|
75
|
-
value: { metrics: ['leads_captured', 'appointments_booked'] },
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
}
|
|
1
|
+
import { BaseSkill } from '../skills/base';
|
|
2
|
+
import type { AgentContext, Message, SkillResult } from '../core/types';
|
|
3
|
+
|
|
4
|
+
export class ProductQASkill extends BaseSkill {
|
|
5
|
+
name = 'product-qa';
|
|
6
|
+
description = 'Answer product-related questions';
|
|
7
|
+
private catalog: Record<string, string>;
|
|
8
|
+
|
|
9
|
+
constructor(catalog?: Record<string, string>) {
|
|
10
|
+
super();
|
|
11
|
+
this.catalog = catalog ?? {
|
|
12
|
+
pricing: 'Please visit our pricing page or contact sales for a custom quote.',
|
|
13
|
+
features: 'Our product includes AI-powered automation, analytics dashboard, and API access.',
|
|
14
|
+
demo: 'I\'d love to schedule a demo for you! Could you share your email and preferred time?',
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async execute(_context: AgentContext, message: Message): Promise<SkillResult> {
|
|
19
|
+
const lower = message.content.toLowerCase();
|
|
20
|
+
for (const [key, answer] of Object.entries(this.catalog)) {
|
|
21
|
+
if (lower.includes(key)) return this.match(answer, 0.85);
|
|
22
|
+
}
|
|
23
|
+
return this.noMatch();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class LeadCaptureSkill extends BaseSkill {
|
|
28
|
+
name = 'lead-capture';
|
|
29
|
+
description = 'Capture prospect information';
|
|
30
|
+
private emailRegex = /[\w.-]+@[\w.-]+\.\w+/;
|
|
31
|
+
|
|
32
|
+
async execute(context: AgentContext, message: Message): Promise<SkillResult> {
|
|
33
|
+
const email = message.content.match(this.emailRegex);
|
|
34
|
+
if (email) {
|
|
35
|
+
await context.memory.set(`lead:${email[0]}`, {
|
|
36
|
+
email: email[0],
|
|
37
|
+
capturedAt: Date.now(),
|
|
38
|
+
messages: context.messages.length,
|
|
39
|
+
});
|
|
40
|
+
return this.match(`Thanks! I've noted your email (${email[0]}). Our team will reach out shortly.`, 0.95);
|
|
41
|
+
}
|
|
42
|
+
return this.noMatch();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export const SALES_ASSISTANT_SYSTEM_PROMPT = `You are a professional sales assistant. Your goals:
|
|
47
|
+
1. Answer product questions accurately and enthusiastically
|
|
48
|
+
2. Capture leads by collecting name, email, and company info
|
|
49
|
+
3. Book appointments when prospects are ready
|
|
50
|
+
Be friendly, persuasive but not pushy. Always provide value first.`;
|
|
51
|
+
|
|
52
|
+
export function createSalesAssistantConfig() {
|
|
53
|
+
return {
|
|
54
|
+
apiVersion: 'opc/v1' as const,
|
|
55
|
+
kind: 'Agent' as const,
|
|
56
|
+
metadata: {
|
|
57
|
+
name: 'sales-assistant',
|
|
58
|
+
version: '1.0.0',
|
|
59
|
+
description: 'AI sales assistant with product Q&A, lead capture, and appointment booking',
|
|
60
|
+
author: 'OPC Agent',
|
|
61
|
+
license: 'Apache-2.0',
|
|
62
|
+
},
|
|
63
|
+
spec: {
|
|
64
|
+
provider: { default: 'deepseek', allowed: ['openai', 'deepseek', 'qwen'] },
|
|
65
|
+
model: 'deepseek-chat',
|
|
66
|
+
systemPrompt: SALES_ASSISTANT_SYSTEM_PROMPT,
|
|
67
|
+
skills: [
|
|
68
|
+
{ name: 'product-qa', description: 'Answer product questions' },
|
|
69
|
+
{ name: 'lead-capture', description: 'Capture prospect info' },
|
|
70
|
+
],
|
|
71
|
+
channels: [{ type: 'web' as const, port: 3000 }],
|
|
72
|
+
memory: { shortTerm: true, longTerm: false },
|
|
73
|
+
dtv: {
|
|
74
|
+
trust: { level: 'sandbox' as const },
|
|
75
|
+
value: { metrics: ['leads_captured', 'appointments_booked'] },
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
package/src/templates/teacher.ts
CHANGED
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
import { BaseSkill } from '../skills/base';
|
|
2
|
-
import type { AgentContext, Message, SkillResult } from '../core/types';
|
|
3
|
-
|
|
4
|
-
export class LessonPlanSkill extends BaseSkill {
|
|
5
|
-
name = 'lesson-plan';
|
|
6
|
-
description = 'Create and manage lesson plans';
|
|
7
|
-
|
|
8
|
-
async execute(_context: AgentContext, message: Message): Promise<SkillResult> {
|
|
9
|
-
const lower = message.content.toLowerCase();
|
|
10
|
-
if (lower.includes('lesson') || lower.includes('plan') || lower.includes('curriculum') || lower.includes('syllabus')) {
|
|
11
|
-
return this.match('I can help create a lesson plan. What subject, grade level, and learning objectives should I focus on?', 0.85);
|
|
12
|
-
}
|
|
13
|
-
return this.noMatch();
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export class QuizSkill extends BaseSkill {
|
|
18
|
-
name = 'quiz-generator';
|
|
19
|
-
description = 'Generate quizzes and assessments';
|
|
20
|
-
|
|
21
|
-
async execute(_context: AgentContext, message: Message): Promise<SkillResult> {
|
|
22
|
-
const lower = message.content.toLowerCase();
|
|
23
|
-
if (lower.includes('quiz') || lower.includes('test') || lower.includes('assessment') || lower.includes('exam') || lower.includes('question')) {
|
|
24
|
-
return this.match('I\'ll create a quiz for you. What topic, difficulty level, and number of questions would you like?', 0.85);
|
|
25
|
-
}
|
|
26
|
-
return this.noMatch();
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export class ExplainSkill extends BaseSkill {
|
|
31
|
-
name = 'concept-explainer';
|
|
32
|
-
description = 'Explain concepts at appropriate level';
|
|
33
|
-
|
|
34
|
-
async execute(_context: AgentContext, message: Message): Promise<SkillResult> {
|
|
35
|
-
const lower = message.content.toLowerCase();
|
|
36
|
-
if (lower.includes('explain') || lower.includes('what is') || lower.includes('how does') || lower.includes('why')) {
|
|
37
|
-
return this.match('Let me explain that concept. What\'s your current level of understanding so I can tailor my explanation?', 0.75);
|
|
38
|
-
}
|
|
39
|
-
return this.noMatch();
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export const TEACHER_SYSTEM_PROMPT = `You are a patient and encouraging teacher assistant. Your goals:
|
|
44
|
-
1. Create engaging lesson plans tailored to student level
|
|
45
|
-
2. Generate quizzes and assessments with answer keys
|
|
46
|
-
3. Explain complex concepts using analogies and examples
|
|
47
|
-
4. Provide constructive feedback and encouragement
|
|
48
|
-
5. Adapt teaching style to different learning preferences
|
|
49
|
-
Be patient, use clear language, and always check for understanding. Use the Socratic method when appropriate.`;
|
|
50
|
-
|
|
51
|
-
export function createTeacherConfig() {
|
|
52
|
-
return {
|
|
53
|
-
apiVersion: 'opc/v1' as const,
|
|
54
|
-
kind: 'Agent' as const,
|
|
55
|
-
metadata: {
|
|
56
|
-
name: 'teacher',
|
|
57
|
-
version: '1.0.0',
|
|
58
|
-
description: 'AI teacher assistant with lesson planning, quiz generation, and concept explanation',
|
|
59
|
-
author: 'OPC Agent',
|
|
60
|
-
license: 'Apache-2.0',
|
|
61
|
-
},
|
|
62
|
-
spec: {
|
|
63
|
-
provider: { default: 'openai', allowed: ['openai', 'deepseek', 'qwen'] },
|
|
64
|
-
model: 'gpt-4o-mini',
|
|
65
|
-
systemPrompt: TEACHER_SYSTEM_PROMPT,
|
|
66
|
-
skills: [
|
|
67
|
-
{ name: 'lesson-plan', description: 'Create lesson plans' },
|
|
68
|
-
{ name: 'quiz-generator', description: 'Generate quizzes' },
|
|
69
|
-
{ name: 'concept-explainer', description: 'Explain concepts' },
|
|
70
|
-
],
|
|
71
|
-
channels: [{ type: 'web' as const, port: 3000 }],
|
|
72
|
-
memory: { shortTerm: true, longTerm: true },
|
|
73
|
-
dtv: {
|
|
74
|
-
trust: { level: 'sandbox' as const },
|
|
75
|
-
value: { metrics: ['lessons_created', 'quizzes_generated', 'concepts_explained'] },
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
}
|
|
1
|
+
import { BaseSkill } from '../skills/base';
|
|
2
|
+
import type { AgentContext, Message, SkillResult } from '../core/types';
|
|
3
|
+
|
|
4
|
+
export class LessonPlanSkill extends BaseSkill {
|
|
5
|
+
name = 'lesson-plan';
|
|
6
|
+
description = 'Create and manage lesson plans';
|
|
7
|
+
|
|
8
|
+
async execute(_context: AgentContext, message: Message): Promise<SkillResult> {
|
|
9
|
+
const lower = message.content.toLowerCase();
|
|
10
|
+
if (lower.includes('lesson') || lower.includes('plan') || lower.includes('curriculum') || lower.includes('syllabus')) {
|
|
11
|
+
return this.match('I can help create a lesson plan. What subject, grade level, and learning objectives should I focus on?', 0.85);
|
|
12
|
+
}
|
|
13
|
+
return this.noMatch();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class QuizSkill extends BaseSkill {
|
|
18
|
+
name = 'quiz-generator';
|
|
19
|
+
description = 'Generate quizzes and assessments';
|
|
20
|
+
|
|
21
|
+
async execute(_context: AgentContext, message: Message): Promise<SkillResult> {
|
|
22
|
+
const lower = message.content.toLowerCase();
|
|
23
|
+
if (lower.includes('quiz') || lower.includes('test') || lower.includes('assessment') || lower.includes('exam') || lower.includes('question')) {
|
|
24
|
+
return this.match('I\'ll create a quiz for you. What topic, difficulty level, and number of questions would you like?', 0.85);
|
|
25
|
+
}
|
|
26
|
+
return this.noMatch();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export class ExplainSkill extends BaseSkill {
|
|
31
|
+
name = 'concept-explainer';
|
|
32
|
+
description = 'Explain concepts at appropriate level';
|
|
33
|
+
|
|
34
|
+
async execute(_context: AgentContext, message: Message): Promise<SkillResult> {
|
|
35
|
+
const lower = message.content.toLowerCase();
|
|
36
|
+
if (lower.includes('explain') || lower.includes('what is') || lower.includes('how does') || lower.includes('why')) {
|
|
37
|
+
return this.match('Let me explain that concept. What\'s your current level of understanding so I can tailor my explanation?', 0.75);
|
|
38
|
+
}
|
|
39
|
+
return this.noMatch();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export const TEACHER_SYSTEM_PROMPT = `You are a patient and encouraging teacher assistant. Your goals:
|
|
44
|
+
1. Create engaging lesson plans tailored to student level
|
|
45
|
+
2. Generate quizzes and assessments with answer keys
|
|
46
|
+
3. Explain complex concepts using analogies and examples
|
|
47
|
+
4. Provide constructive feedback and encouragement
|
|
48
|
+
5. Adapt teaching style to different learning preferences
|
|
49
|
+
Be patient, use clear language, and always check for understanding. Use the Socratic method when appropriate.`;
|
|
50
|
+
|
|
51
|
+
export function createTeacherConfig() {
|
|
52
|
+
return {
|
|
53
|
+
apiVersion: 'opc/v1' as const,
|
|
54
|
+
kind: 'Agent' as const,
|
|
55
|
+
metadata: {
|
|
56
|
+
name: 'teacher',
|
|
57
|
+
version: '1.0.0',
|
|
58
|
+
description: 'AI teacher assistant with lesson planning, quiz generation, and concept explanation',
|
|
59
|
+
author: 'OPC Agent',
|
|
60
|
+
license: 'Apache-2.0',
|
|
61
|
+
},
|
|
62
|
+
spec: {
|
|
63
|
+
provider: { default: 'openai', allowed: ['openai', 'deepseek', 'qwen'] },
|
|
64
|
+
model: 'gpt-4o-mini',
|
|
65
|
+
systemPrompt: TEACHER_SYSTEM_PROMPT,
|
|
66
|
+
skills: [
|
|
67
|
+
{ name: 'lesson-plan', description: 'Create lesson plans' },
|
|
68
|
+
{ name: 'quiz-generator', description: 'Generate quizzes' },
|
|
69
|
+
{ name: 'concept-explainer', description: 'Explain concepts' },
|
|
70
|
+
],
|
|
71
|
+
channels: [{ type: 'web' as const, port: 3000 }],
|
|
72
|
+
memory: { shortTerm: true, longTerm: true },
|
|
73
|
+
dtv: {
|
|
74
|
+
trust: { level: 'sandbox' as const },
|
|
75
|
+
value: { metrics: ['lessons_created', 'quizzes_generated', 'concepts_explained'] },
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|