opc-agent 1.1.1 → 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.
Files changed (139) hide show
  1. package/CHANGELOG.md +51 -51
  2. package/CONTRIBUTING.md +75 -75
  3. package/README.md +222 -126
  4. package/README.zh-CN.md +129 -80
  5. package/dist/channels/web.js +256 -256
  6. package/dist/deploy/hermes.js +22 -22
  7. package/dist/deploy/openclaw.js +31 -31
  8. package/dist/templates/code-reviewer.js +5 -5
  9. package/dist/templates/customer-service.js +2 -2
  10. package/dist/templates/data-analyst.js +5 -5
  11. package/dist/templates/knowledge-base.js +2 -2
  12. package/dist/templates/sales-assistant.js +4 -4
  13. package/dist/templates/teacher.js +6 -6
  14. package/docs/.vitepress/config.ts +103 -103
  15. package/docs/api/cli.md +48 -48
  16. package/docs/api/oad-schema.md +64 -64
  17. package/docs/api/sdk.md +80 -80
  18. package/docs/guide/concepts.md +51 -51
  19. package/docs/guide/configuration.md +79 -79
  20. package/docs/guide/deployment.md +42 -42
  21. package/docs/guide/getting-started.md +44 -44
  22. package/docs/guide/templates.md +28 -28
  23. package/docs/guide/testing.md +84 -84
  24. package/docs/index.md +27 -27
  25. package/docs/zh/api/cli.md +54 -54
  26. package/docs/zh/api/oad-schema.md +87 -87
  27. package/docs/zh/api/sdk.md +102 -102
  28. package/docs/zh/guide/concepts.md +104 -104
  29. package/docs/zh/guide/configuration.md +135 -135
  30. package/docs/zh/guide/deployment.md +81 -81
  31. package/docs/zh/guide/getting-started.md +82 -82
  32. package/docs/zh/guide/templates.md +84 -84
  33. package/docs/zh/guide/testing.md +88 -88
  34. package/docs/zh/index.md +27 -27
  35. package/examples/customer-service-demo/README.md +90 -90
  36. package/examples/customer-service-demo/oad.yaml +107 -107
  37. package/package.json +1 -1
  38. package/src/analytics/index.ts +66 -66
  39. package/src/channels/discord.ts +192 -192
  40. package/src/channels/email.ts +177 -177
  41. package/src/channels/feishu.ts +236 -236
  42. package/src/channels/index.ts +15 -15
  43. package/src/channels/slack.ts +160 -160
  44. package/src/channels/telegram.ts +90 -90
  45. package/src/channels/voice.ts +106 -106
  46. package/src/channels/web.ts +596 -596
  47. package/src/channels/webhook.ts +199 -199
  48. package/src/channels/websocket.ts +87 -87
  49. package/src/channels/wechat.ts +149 -149
  50. package/src/core/a2a.ts +143 -143
  51. package/src/core/agent.ts +152 -152
  52. package/src/core/analytics-engine.ts +186 -186
  53. package/src/core/auth.ts +57 -57
  54. package/src/core/cache.ts +141 -141
  55. package/src/core/compose.ts +77 -77
  56. package/src/core/config.ts +14 -14
  57. package/src/core/errors.ts +148 -148
  58. package/src/core/hitl.ts +138 -138
  59. package/src/core/knowledge.ts +210 -210
  60. package/src/core/logger.ts +57 -57
  61. package/src/core/orchestrator.ts +215 -215
  62. package/src/core/performance.ts +187 -187
  63. package/src/core/rate-limiter.ts +128 -128
  64. package/src/core/room.ts +109 -109
  65. package/src/core/runtime.ts +152 -152
  66. package/src/core/sandbox.ts +101 -101
  67. package/src/core/security.ts +171 -171
  68. package/src/core/types.ts +68 -68
  69. package/src/core/versioning.ts +106 -106
  70. package/src/core/watch.ts +178 -178
  71. package/src/core/workflow.ts +235 -235
  72. package/src/deploy/hermes.ts +156 -156
  73. package/src/deploy/openclaw.ts +200 -200
  74. package/src/dtv/data.ts +29 -29
  75. package/src/dtv/trust.ts +43 -43
  76. package/src/dtv/value.ts +47 -47
  77. package/src/i18n/index.ts +216 -216
  78. package/src/index.ts +110 -110
  79. package/src/marketplace/index.ts +223 -223
  80. package/src/memory/deepbrain.ts +108 -108
  81. package/src/memory/index.ts +34 -34
  82. package/src/plugins/index.ts +208 -208
  83. package/src/providers/index.ts +183 -183
  84. package/src/schema/oad.ts +155 -155
  85. package/src/skills/base.ts +16 -16
  86. package/src/skills/document.ts +100 -100
  87. package/src/skills/http.ts +35 -35
  88. package/src/skills/index.ts +27 -27
  89. package/src/skills/scheduler.ts +80 -80
  90. package/src/skills/webhook-trigger.ts +59 -59
  91. package/src/templates/code-reviewer.ts +34 -34
  92. package/src/templates/customer-service.ts +80 -80
  93. package/src/templates/data-analyst.ts +70 -70
  94. package/src/templates/executive-assistant.ts +71 -71
  95. package/src/templates/financial-advisor.ts +60 -60
  96. package/src/templates/knowledge-base.ts +31 -31
  97. package/src/templates/legal-assistant.ts +71 -71
  98. package/src/templates/sales-assistant.ts +79 -79
  99. package/src/templates/teacher.ts +79 -79
  100. package/src/testing/index.ts +181 -181
  101. package/src/tools/calculator.ts +73 -73
  102. package/src/tools/datetime.ts +149 -149
  103. package/src/tools/json-transform.ts +187 -187
  104. package/src/tools/mcp.ts +76 -76
  105. package/src/tools/text-analysis.ts +116 -116
  106. package/templates/Dockerfile +15 -15
  107. package/templates/code-reviewer/README.md +27 -27
  108. package/templates/code-reviewer/oad.yaml +41 -41
  109. package/templates/customer-service/README.md +22 -22
  110. package/templates/customer-service/oad.yaml +36 -36
  111. package/templates/docker-compose.yml +21 -21
  112. package/templates/knowledge-base/README.md +28 -28
  113. package/templates/knowledge-base/oad.yaml +38 -38
  114. package/templates/sales-assistant/README.md +26 -26
  115. package/templates/sales-assistant/oad.yaml +43 -43
  116. package/tests/a2a.test.ts +66 -66
  117. package/tests/agent.test.ts +72 -72
  118. package/tests/analytics.test.ts +50 -50
  119. package/tests/channel.test.ts +39 -39
  120. package/tests/e2e.test.ts +134 -134
  121. package/tests/errors.test.ts +83 -83
  122. package/tests/hitl.test.ts +71 -71
  123. package/tests/i18n.test.ts +41 -41
  124. package/tests/mcp.test.ts +54 -54
  125. package/tests/oad.test.ts +68 -68
  126. package/tests/performance.test.ts +115 -115
  127. package/tests/plugin.test.ts +74 -74
  128. package/tests/room.test.ts +106 -106
  129. package/tests/runtime.test.ts +42 -42
  130. package/tests/sandbox.test.ts +46 -46
  131. package/tests/security.test.ts +60 -60
  132. package/tests/templates.test.ts +77 -77
  133. package/tests/v070.test.ts +76 -76
  134. package/tests/versioning.test.ts +75 -75
  135. package/tests/voice.test.ts +61 -61
  136. package/tests/webhook.test.ts +29 -29
  137. package/tests/workflow.test.ts +143 -143
  138. package/tsconfig.json +19 -19
  139. 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
+ }
@@ -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
+ }