persona-core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/db/client.d.ts +55 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +157 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/index.d.ts +7 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/repositories/executionRepository.d.ts +15 -0
- package/dist/db/repositories/executionRepository.d.ts.map +1 -0
- package/dist/db/repositories/executionRepository.js +41 -0
- package/dist/db/repositories/executionRepository.js.map +1 -0
- package/dist/db/repositories/index.d.ts +10 -0
- package/dist/db/repositories/index.d.ts.map +1 -0
- package/dist/db/repositories/index.js +10 -0
- package/dist/db/repositories/index.js.map +1 -0
- package/dist/db/repositories/nodeRepository.d.ts +15 -0
- package/dist/db/repositories/nodeRepository.d.ts.map +1 -0
- package/dist/db/repositories/nodeRepository.js +61 -0
- package/dist/db/repositories/nodeRepository.js.map +1 -0
- package/dist/db/repositories/personaRepository.d.ts +13 -0
- package/dist/db/repositories/personaRepository.d.ts.map +1 -0
- package/dist/db/repositories/personaRepository.js +42 -0
- package/dist/db/repositories/personaRepository.js.map +1 -0
- package/dist/db/repositories/planResultRepository.d.ts +13 -0
- package/dist/db/repositories/planResultRepository.d.ts.map +1 -0
- package/dist/db/repositories/planResultRepository.js +30 -0
- package/dist/db/repositories/planResultRepository.js.map +1 -0
- package/dist/db/repositories/scheduleRepository.d.ts +27 -0
- package/dist/db/repositories/scheduleRepository.d.ts.map +1 -0
- package/dist/db/repositories/scheduleRepository.js +187 -0
- package/dist/db/repositories/scheduleRepository.js.map +1 -0
- package/dist/db/repositories/types.d.ts +132 -0
- package/dist/db/repositories/types.d.ts.map +1 -0
- package/dist/db/repositories/types.js +5 -0
- package/dist/db/repositories/types.js.map +1 -0
- package/dist/db/schema.d.ts +742 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +85 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/capabilities.d.ts +56 -0
- package/dist/llm/capabilities.d.ts.map +1 -0
- package/dist/llm/capabilities.js +305 -0
- package/dist/llm/capabilities.js.map +1 -0
- package/dist/llm/index.d.ts +7 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +10 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/interfaces.d.ts +249 -0
- package/dist/llm/interfaces.d.ts.map +1 -0
- package/dist/llm/interfaces.js +5 -0
- package/dist/llm/interfaces.js.map +1 -0
- package/dist/llm/providers/anthropic-compatible.d.ts +48 -0
- package/dist/llm/providers/anthropic-compatible.d.ts.map +1 -0
- package/dist/llm/providers/anthropic-compatible.js +163 -0
- package/dist/llm/providers/anthropic-compatible.js.map +1 -0
- package/dist/llm/providers/index.d.ts +14 -0
- package/dist/llm/providers/index.d.ts.map +1 -0
- package/dist/llm/providers/index.js +12 -0
- package/dist/llm/providers/index.js.map +1 -0
- package/dist/llm/providers/openai-compatible.d.ts +59 -0
- package/dist/llm/providers/openai-compatible.d.ts.map +1 -0
- package/dist/llm/providers/openai-compatible.js +207 -0
- package/dist/llm/providers/openai-compatible.js.map +1 -0
- package/dist/services/actionService.d.ts +132 -0
- package/dist/services/actionService.d.ts.map +1 -0
- package/dist/services/actionService.js +971 -0
- package/dist/services/actionService.js.map +1 -0
- package/dist/services/branchService.d.ts +19 -0
- package/dist/services/branchService.d.ts.map +1 -0
- package/dist/services/branchService.js +50 -0
- package/dist/services/branchService.js.map +1 -0
- package/dist/services/expressionEvaluator.d.ts +16 -0
- package/dist/services/expressionEvaluator.d.ts.map +1 -0
- package/dist/services/expressionEvaluator.js +70 -0
- package/dist/services/expressionEvaluator.js.map +1 -0
- package/dist/services/factory.d.ts +43 -0
- package/dist/services/factory.d.ts.map +1 -0
- package/dist/services/factory.js +30 -0
- package/dist/services/factory.js.map +1 -0
- package/dist/services/index.d.ts +15 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +17 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/interfaces.d.ts +117 -0
- package/dist/services/interfaces.d.ts.map +1 -0
- package/dist/services/interfaces.js +5 -0
- package/dist/services/interfaces.js.map +1 -0
- package/dist/services/loaders/fileLoader.d.ts +56 -0
- package/dist/services/loaders/fileLoader.d.ts.map +1 -0
- package/dist/services/loaders/fileLoader.js +161 -0
- package/dist/services/loaders/fileLoader.js.map +1 -0
- package/dist/services/loaders/index.d.ts +6 -0
- package/dist/services/loaders/index.d.ts.map +1 -0
- package/dist/services/loaders/index.js +6 -0
- package/dist/services/loaders/index.js.map +1 -0
- package/dist/services/loaders/transformers.d.ts +32 -0
- package/dist/services/loaders/transformers.d.ts.map +1 -0
- package/dist/services/loaders/transformers.js +78 -0
- package/dist/services/loaders/transformers.js.map +1 -0
- package/dist/services/mockAction.d.ts +65 -0
- package/dist/services/mockAction.d.ts.map +1 -0
- package/dist/services/mockAction.js +153 -0
- package/dist/services/mockAction.js.map +1 -0
- package/dist/services/mockBranch.d.ts +50 -0
- package/dist/services/mockBranch.d.ts.map +1 -0
- package/dist/services/mockBranch.js +75 -0
- package/dist/services/mockBranch.js.map +1 -0
- package/dist/services/mockThinking.d.ts +68 -0
- package/dist/services/mockThinking.d.ts.map +1 -0
- package/dist/services/mockThinking.js +89 -0
- package/dist/services/mockThinking.js.map +1 -0
- package/dist/services/thinkingService.d.ts +15 -0
- package/dist/services/thinkingService.d.ts.map +1 -0
- package/dist/services/thinkingService.js +117 -0
- package/dist/services/thinkingService.js.map +1 -0
- package/dist/temporal/activities/actionActivities.d.ts +15 -0
- package/dist/temporal/activities/actionActivities.d.ts.map +1 -0
- package/dist/temporal/activities/actionActivities.js +140 -0
- package/dist/temporal/activities/actionActivities.js.map +1 -0
- package/dist/temporal/activities/branchActivities.d.ts +13 -0
- package/dist/temporal/activities/branchActivities.d.ts.map +1 -0
- package/dist/temporal/activities/branchActivities.js +26 -0
- package/dist/temporal/activities/branchActivities.js.map +1 -0
- package/dist/temporal/activities/dbActivities.d.ts +14 -0
- package/dist/temporal/activities/dbActivities.d.ts.map +1 -0
- package/dist/temporal/activities/dbActivities.js +84 -0
- package/dist/temporal/activities/dbActivities.js.map +1 -0
- package/dist/temporal/activities/index.d.ts +9 -0
- package/dist/temporal/activities/index.d.ts.map +1 -0
- package/dist/temporal/activities/index.js +9 -0
- package/dist/temporal/activities/index.js.map +1 -0
- package/dist/temporal/activities/thinkingActivities.d.ts +17 -0
- package/dist/temporal/activities/thinkingActivities.d.ts.map +1 -0
- package/dist/temporal/activities/thinkingActivities.js +145 -0
- package/dist/temporal/activities/thinkingActivities.js.map +1 -0
- package/dist/temporal/activities/types.d.ts +100 -0
- package/dist/temporal/activities/types.d.ts.map +1 -0
- package/dist/temporal/activities/types.js +5 -0
- package/dist/temporal/activities/types.js.map +1 -0
- package/dist/temporal/client.d.ts +43 -0
- package/dist/temporal/client.d.ts.map +1 -0
- package/dist/temporal/client.js +75 -0
- package/dist/temporal/client.js.map +1 -0
- package/dist/temporal/index.d.ts +10 -0
- package/dist/temporal/index.d.ts.map +1 -0
- package/dist/temporal/index.js +12 -0
- package/dist/temporal/index.js.map +1 -0
- package/dist/temporal/personaCoreClient.d.ts +199 -0
- package/dist/temporal/personaCoreClient.d.ts.map +1 -0
- package/dist/temporal/personaCoreClient.js +233 -0
- package/dist/temporal/personaCoreClient.js.map +1 -0
- package/dist/temporal/personaWorker.d.ts +141 -0
- package/dist/temporal/personaWorker.d.ts.map +1 -0
- package/dist/temporal/personaWorker.js +93 -0
- package/dist/temporal/personaWorker.js.map +1 -0
- package/dist/temporal/worker.d.ts +66 -0
- package/dist/temporal/worker.d.ts.map +1 -0
- package/dist/temporal/worker.js +109 -0
- package/dist/temporal/worker.js.map +1 -0
- package/dist/temporal/workflows/index.d.ts +5 -0
- package/dist/temporal/workflows/index.d.ts.map +1 -0
- package/dist/temporal/workflows/index.js +5 -0
- package/dist/temporal/workflows/index.js.map +1 -0
- package/dist/temporal/workflows/scheduleWorkflow.d.ts +31 -0
- package/dist/temporal/workflows/scheduleWorkflow.d.ts.map +1 -0
- package/dist/temporal/workflows/scheduleWorkflow.js +256 -0
- package/dist/temporal/workflows/scheduleWorkflow.js.map +1 -0
- package/dist/types/common.d.ts +81 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +5 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/nodes.d.ts +496 -0
- package/dist/types/nodes.d.ts.map +1 -0
- package/dist/types/nodes.js +5 -0
- package/dist/types/nodes.js.map +1 -0
- package/dist/types/persona.d.ts +59 -0
- package/dist/types/persona.d.ts.map +1 -0
- package/dist/types/persona.js +36 -0
- package/dist/types/persona.js.map +1 -0
- package/dist/types/schedule.d.ts +143 -0
- package/dist/types/schedule.d.ts.map +1 -0
- package/dist/types/schedule.js +155 -0
- package/dist/types/schedule.js.map +1 -0
- package/dist/utils/dateUtils.d.ts +31 -0
- package/dist/utils/dateUtils.d.ts.map +1 -0
- package/dist/utils/dateUtils.js +53 -0
- package/dist/utils/dateUtils.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/inputResolver.d.ts +43 -0
- package/dist/utils/inputResolver.d.ts.map +1 -0
- package/dist/utils/inputResolver.js +137 -0
- package/dist/utils/inputResolver.js.map +1 -0
- package/dist/utils/sharedDataUtils.d.ts +36 -0
- package/dist/utils/sharedDataUtils.d.ts.map +1 -0
- package/dist/utils/sharedDataUtils.js +84 -0
- package/dist/utils/sharedDataUtils.js.map +1 -0
- package/dist/utils/typeGuards.d.ts +33 -0
- package/dist/utils/typeGuards.d.ts.map +1 -0
- package/dist/utils/typeGuards.js +50 -0
- package/dist/utils/typeGuards.js.map +1 -0
- package/docs/add-llm-provider.md +353 -0
- package/docs/external/deepseek-v32.md +28 -0
- package/docs/quick-start.md +849 -0
- package/docs/suite-guide.md +148 -0
- package/docs/usage-guide.md +1487 -0
- package/package.json +80 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PersonaCore 高级客户端
|
|
3
|
+
*
|
|
4
|
+
* 纯 Temporal 客户端封装,不直接连接数据库。
|
|
5
|
+
* Schedule 通过 Workflow 输入传递,由 Worker 负责写入数据库。
|
|
6
|
+
*/
|
|
7
|
+
import { Client } from '@temporalio/client';
|
|
8
|
+
import { ScheduleExecutionStatus } from './workflows/scheduleWorkflow.js';
|
|
9
|
+
import { Persona, Schedule, SharedDataValue } from '../types/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* 启动参数:使用已存在的 Schedule
|
|
12
|
+
*/
|
|
13
|
+
export interface StartScheduleParams {
|
|
14
|
+
/** 已存在于数据库中的 Schedule ID */
|
|
15
|
+
scheduleId: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 启动参数:传入完整的 Persona 和 Schedule 定义
|
|
19
|
+
*/
|
|
20
|
+
export interface StartWithPersonaParams {
|
|
21
|
+
/** 完整的 Persona 定义 */
|
|
22
|
+
persona: Persona;
|
|
23
|
+
/** 完整的 Schedule 定义 */
|
|
24
|
+
schedule: Schedule;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 启动参数:传入 Persona 定义和初始思考提示
|
|
28
|
+
* 系统会自动创建一个只有入口思考节点的 Schedule
|
|
29
|
+
*/
|
|
30
|
+
export interface StartWithThinkingParams {
|
|
31
|
+
/** 完整的 Persona 定义 */
|
|
32
|
+
persona: Persona;
|
|
33
|
+
/** 初始思考节点的提示 */
|
|
34
|
+
thinkingPrompt: string;
|
|
35
|
+
/** 可选:Schedule 名称 */
|
|
36
|
+
scheduleName?: string;
|
|
37
|
+
/** 可选:初始共享数据 */
|
|
38
|
+
initialSharedData?: Record<string, SharedDataValue>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Workflow 执行句柄
|
|
42
|
+
*/
|
|
43
|
+
export interface WorkflowHandle {
|
|
44
|
+
/** Workflow ID */
|
|
45
|
+
workflowId: string;
|
|
46
|
+
/** Schedule ID */
|
|
47
|
+
scheduleId: string;
|
|
48
|
+
/** Persona ID */
|
|
49
|
+
personaId: string;
|
|
50
|
+
/** 获取执行状态 */
|
|
51
|
+
getStatus(): Promise<ScheduleExecutionStatus>;
|
|
52
|
+
/** 暂停执行 */
|
|
53
|
+
pause(): Promise<void>;
|
|
54
|
+
/** 恢复执行 */
|
|
55
|
+
resume(): Promise<void>;
|
|
56
|
+
/** 取消执行 */
|
|
57
|
+
cancel(): Promise<void>;
|
|
58
|
+
/** 等待执行完成 */
|
|
59
|
+
waitForCompletion(): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* PersonaCore 客户端配置
|
|
63
|
+
*
|
|
64
|
+
* 注意:Client 不再需要数据库连接,所有数据操作由 Worker 完成。
|
|
65
|
+
*/
|
|
66
|
+
export interface PersonaCoreClientConfig {
|
|
67
|
+
/** Temporal Server 地址(与 temporalClient 二选一) */
|
|
68
|
+
temporalAddress?: string;
|
|
69
|
+
/** 已有的 Temporal Client(与 temporalAddress 二选一,用于测试) */
|
|
70
|
+
temporalClient?: Client;
|
|
71
|
+
/** 任务队列名称 */
|
|
72
|
+
taskQueue: string;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* PersonaCore 高级客户端
|
|
76
|
+
*
|
|
77
|
+
* 纯 Temporal 客户端,不直接连接数据库。
|
|
78
|
+
* Schedule 通过 Workflow 输入传递,由 Worker 负责持久化。
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```typescript
|
|
82
|
+
* // 创建客户端(无需数据库配置)
|
|
83
|
+
* const client = await PersonaCoreClient.create({
|
|
84
|
+
* temporalAddress: 'localhost:7233',
|
|
85
|
+
* taskQueue: 'my-queue',
|
|
86
|
+
* });
|
|
87
|
+
*
|
|
88
|
+
* // 方式一:传入完整的 Persona 和思考提示
|
|
89
|
+
* const handle = await client.startWithThinking({
|
|
90
|
+
* persona: myPersona,
|
|
91
|
+
* thinkingPrompt: '帮我规划一个任务...',
|
|
92
|
+
* });
|
|
93
|
+
*
|
|
94
|
+
* // 方式二:传入完整的 Persona 和 Schedule
|
|
95
|
+
* const handle = await client.startWithPersona({
|
|
96
|
+
* persona: myPersona,
|
|
97
|
+
* schedule: mySchedule,
|
|
98
|
+
* });
|
|
99
|
+
*
|
|
100
|
+
* // 等待完成
|
|
101
|
+
* await handle.waitForCompletion();
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export declare class PersonaCoreClient {
|
|
105
|
+
private client;
|
|
106
|
+
private taskQueue;
|
|
107
|
+
private constructor();
|
|
108
|
+
/**
|
|
109
|
+
* 创建 PersonaCore 客户端
|
|
110
|
+
*/
|
|
111
|
+
static create(config: PersonaCoreClientConfig): Promise<PersonaCoreClient>;
|
|
112
|
+
/**
|
|
113
|
+
* 使用完整的 Persona 和 Schedule 启动 Workflow
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```typescript
|
|
117
|
+
* const handle = await client.startWithPersona({
|
|
118
|
+
* persona: {
|
|
119
|
+
* id: 'my-persona',
|
|
120
|
+
* name: '示例人格',
|
|
121
|
+
* systemPrompt: '你是一个有帮助的助手',
|
|
122
|
+
* actionTypes: [...],
|
|
123
|
+
* createdAt: new Date(),
|
|
124
|
+
* updatedAt: new Date(),
|
|
125
|
+
* },
|
|
126
|
+
* schedule: {
|
|
127
|
+
* id: 'my-schedule',
|
|
128
|
+
* personaId: 'my-persona',
|
|
129
|
+
* name: '示例任务',
|
|
130
|
+
* entryNodeId: 'think-1',
|
|
131
|
+
* nodes: { ... },
|
|
132
|
+
* sharedData: { data: {}, fieldTypes: {} },
|
|
133
|
+
* status: 'pending',
|
|
134
|
+
* executionHistory: [],
|
|
135
|
+
* createdAt: new Date(),
|
|
136
|
+
* updatedAt: new Date(),
|
|
137
|
+
* },
|
|
138
|
+
* });
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
startWithPersona(params: StartWithPersonaParams): Promise<WorkflowHandle>;
|
|
142
|
+
/**
|
|
143
|
+
* 使用 Persona 和思考提示启动 Workflow
|
|
144
|
+
* 系统会自动创建一个只有入口思考节点的 Schedule
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```typescript
|
|
148
|
+
* const handle = await client.startWithThinking({
|
|
149
|
+
* persona: {
|
|
150
|
+
* id: 'humor-bot',
|
|
151
|
+
* name: '幽默机器人',
|
|
152
|
+
* systemPrompt: '你是一个幽默的助手...',
|
|
153
|
+
* actionTypes: [
|
|
154
|
+
* {
|
|
155
|
+
* kind: 'action',
|
|
156
|
+
* id: 'reply',
|
|
157
|
+
* name: '回复',
|
|
158
|
+
* executionType: 'llm_call',
|
|
159
|
+
* inputFields: [...],
|
|
160
|
+
* outputFields: [...],
|
|
161
|
+
* },
|
|
162
|
+
* ],
|
|
163
|
+
* createdAt: new Date(),
|
|
164
|
+
* updatedAt: new Date(),
|
|
165
|
+
* },
|
|
166
|
+
* thinkingPrompt: '用户说他今天很累,请给他一个幽默的回复',
|
|
167
|
+
* scheduleName: '幽默回复任务',
|
|
168
|
+
* });
|
|
169
|
+
* ```
|
|
170
|
+
*/
|
|
171
|
+
startWithThinking(params: StartWithThinkingParams): Promise<WorkflowHandle>;
|
|
172
|
+
/**
|
|
173
|
+
* 使用已存在的 Schedule ID 启动 Workflow
|
|
174
|
+
*
|
|
175
|
+
* 注意:此方法假设 Schedule 已存在于数据库中。
|
|
176
|
+
* 如果 Schedule 不存在,Workflow 执行时会失败。
|
|
177
|
+
*
|
|
178
|
+
* @deprecated 推荐使用 startWithPersona 或 startWithThinking,它们会自动创建 Schedule
|
|
179
|
+
*/
|
|
180
|
+
startSchedule(params: StartScheduleParams & {
|
|
181
|
+
personaId: string;
|
|
182
|
+
}): Promise<WorkflowHandle>;
|
|
183
|
+
/**
|
|
184
|
+
* 内部方法:启动 Workflow
|
|
185
|
+
* @param scheduleId - Schedule ID
|
|
186
|
+
* @param personaId - Persona ID
|
|
187
|
+
* @param schedule - 可选的完整 Schedule(首次启动时传入,由 Worker 写入数据库)
|
|
188
|
+
*/
|
|
189
|
+
private startWorkflow;
|
|
190
|
+
/**
|
|
191
|
+
* 获取内部 Temporal Client
|
|
192
|
+
*/
|
|
193
|
+
getTemporalClient(): Client;
|
|
194
|
+
/**
|
|
195
|
+
* 获取 Workflow Handle(用于查询已有的 Workflow)
|
|
196
|
+
*/
|
|
197
|
+
getWorkflowHandle(workflowId: string): import("@temporalio/client").WorkflowHandle<import("@temporalio/client").Workflow>;
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=personaCoreClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personaCoreClient.d.ts","sourceRoot":"","sources":["../../src/temporal/personaCoreClient.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAc,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAML,uBAAuB,EACxB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAwB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE7F;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,qBAAqB;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,sBAAsB;IACtB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,qBAAqB;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAElB,aAAa;IACb,SAAS,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC9C,WAAW;IACX,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,WAAW;IACX,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,WAAW;IACX,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,aAAa;IACb,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sDAAsD;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO;IAKP;;OAEG;WACU,MAAM,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAehF;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACG,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC;IAoB/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACG,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,cAAc,CAAC;IAyCjF;;;;;;;OAOG;IACG,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAOjG;;;;;OAKG;YACW,aAAa;IAwC3B;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM;CAGrC"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PersonaCore 高级客户端
|
|
3
|
+
*
|
|
4
|
+
* 纯 Temporal 客户端封装,不直接连接数据库。
|
|
5
|
+
* Schedule 通过 Workflow 输入传递,由 Worker 负责写入数据库。
|
|
6
|
+
*/
|
|
7
|
+
import { Client, Connection } from '@temporalio/client';
|
|
8
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
9
|
+
import { scheduleWorkflow, getStatusQuery, pauseSignal, resumeSignal, cancelSignal, } from './workflows/scheduleWorkflow.js';
|
|
10
|
+
/**
|
|
11
|
+
* PersonaCore 高级客户端
|
|
12
|
+
*
|
|
13
|
+
* 纯 Temporal 客户端,不直接连接数据库。
|
|
14
|
+
* Schedule 通过 Workflow 输入传递,由 Worker 负责持久化。
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // 创建客户端(无需数据库配置)
|
|
19
|
+
* const client = await PersonaCoreClient.create({
|
|
20
|
+
* temporalAddress: 'localhost:7233',
|
|
21
|
+
* taskQueue: 'my-queue',
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // 方式一:传入完整的 Persona 和思考提示
|
|
25
|
+
* const handle = await client.startWithThinking({
|
|
26
|
+
* persona: myPersona,
|
|
27
|
+
* thinkingPrompt: '帮我规划一个任务...',
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* // 方式二:传入完整的 Persona 和 Schedule
|
|
31
|
+
* const handle = await client.startWithPersona({
|
|
32
|
+
* persona: myPersona,
|
|
33
|
+
* schedule: mySchedule,
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* // 等待完成
|
|
37
|
+
* await handle.waitForCompletion();
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export class PersonaCoreClient {
|
|
41
|
+
client;
|
|
42
|
+
taskQueue;
|
|
43
|
+
constructor(client, taskQueue) {
|
|
44
|
+
this.client = client;
|
|
45
|
+
this.taskQueue = taskQueue;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 创建 PersonaCore 客户端
|
|
49
|
+
*/
|
|
50
|
+
static async create(config) {
|
|
51
|
+
// 获取或创建 Temporal Client
|
|
52
|
+
let client;
|
|
53
|
+
if (config.temporalClient) {
|
|
54
|
+
client = config.temporalClient;
|
|
55
|
+
}
|
|
56
|
+
else if (config.temporalAddress) {
|
|
57
|
+
const connection = await Connection.connect({ address: config.temporalAddress });
|
|
58
|
+
client = new Client({ connection });
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
throw new Error('Either temporalAddress or temporalClient must be provided');
|
|
62
|
+
}
|
|
63
|
+
return new PersonaCoreClient(client, config.taskQueue);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 使用完整的 Persona 和 Schedule 启动 Workflow
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const handle = await client.startWithPersona({
|
|
71
|
+
* persona: {
|
|
72
|
+
* id: 'my-persona',
|
|
73
|
+
* name: '示例人格',
|
|
74
|
+
* systemPrompt: '你是一个有帮助的助手',
|
|
75
|
+
* actionTypes: [...],
|
|
76
|
+
* createdAt: new Date(),
|
|
77
|
+
* updatedAt: new Date(),
|
|
78
|
+
* },
|
|
79
|
+
* schedule: {
|
|
80
|
+
* id: 'my-schedule',
|
|
81
|
+
* personaId: 'my-persona',
|
|
82
|
+
* name: '示例任务',
|
|
83
|
+
* entryNodeId: 'think-1',
|
|
84
|
+
* nodes: { ... },
|
|
85
|
+
* sharedData: { data: {}, fieldTypes: {} },
|
|
86
|
+
* status: 'pending',
|
|
87
|
+
* executionHistory: [],
|
|
88
|
+
* createdAt: new Date(),
|
|
89
|
+
* updatedAt: new Date(),
|
|
90
|
+
* },
|
|
91
|
+
* });
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
async startWithPersona(params) {
|
|
95
|
+
const { persona, schedule } = params;
|
|
96
|
+
// 确保 schedule.personaId 与 persona.id 一致
|
|
97
|
+
if (schedule.personaId !== persona.id) {
|
|
98
|
+
throw new Error(`Schedule.personaId (${schedule.personaId}) must match Persona.id (${persona.id})`);
|
|
99
|
+
}
|
|
100
|
+
// 确保 schedule 包含 persona 快照
|
|
101
|
+
const scheduleWithPersona = {
|
|
102
|
+
...schedule,
|
|
103
|
+
persona, // 嵌入 persona 快照
|
|
104
|
+
};
|
|
105
|
+
// 启动 Workflow,传入完整的 Schedule(由 Worker 写入数据库)
|
|
106
|
+
return this.startWorkflow(schedule.id, persona.id, scheduleWithPersona);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 使用 Persona 和思考提示启动 Workflow
|
|
110
|
+
* 系统会自动创建一个只有入口思考节点的 Schedule
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```typescript
|
|
114
|
+
* const handle = await client.startWithThinking({
|
|
115
|
+
* persona: {
|
|
116
|
+
* id: 'humor-bot',
|
|
117
|
+
* name: '幽默机器人',
|
|
118
|
+
* systemPrompt: '你是一个幽默的助手...',
|
|
119
|
+
* actionTypes: [
|
|
120
|
+
* {
|
|
121
|
+
* kind: 'action',
|
|
122
|
+
* id: 'reply',
|
|
123
|
+
* name: '回复',
|
|
124
|
+
* executionType: 'llm_call',
|
|
125
|
+
* inputFields: [...],
|
|
126
|
+
* outputFields: [...],
|
|
127
|
+
* },
|
|
128
|
+
* ],
|
|
129
|
+
* createdAt: new Date(),
|
|
130
|
+
* updatedAt: new Date(),
|
|
131
|
+
* },
|
|
132
|
+
* thinkingPrompt: '用户说他今天很累,请给他一个幽默的回复',
|
|
133
|
+
* scheduleName: '幽默回复任务',
|
|
134
|
+
* });
|
|
135
|
+
* ```
|
|
136
|
+
*/
|
|
137
|
+
async startWithThinking(params) {
|
|
138
|
+
const { persona, thinkingPrompt, scheduleName, initialSharedData } = params;
|
|
139
|
+
// 生成 IDs(使用短 UUID 以确保节点 ID 不超过 64 字符限制)
|
|
140
|
+
const shortUuid = () => uuidv4().slice(0, 8);
|
|
141
|
+
const scheduleId = `sched-${shortUuid()}`;
|
|
142
|
+
const thinkingNodeId = `think-${shortUuid()}`;
|
|
143
|
+
// 创建入口思考节点
|
|
144
|
+
const thinkingNode = {
|
|
145
|
+
id: thinkingNodeId,
|
|
146
|
+
kind: 'thinking',
|
|
147
|
+
thinkingPrompt,
|
|
148
|
+
inputs: {},
|
|
149
|
+
nextNodeId: null,
|
|
150
|
+
};
|
|
151
|
+
// 创建 Schedule(包含 persona 快照)
|
|
152
|
+
const schedule = {
|
|
153
|
+
id: scheduleId,
|
|
154
|
+
personaId: persona.id,
|
|
155
|
+
persona, // 嵌入 persona 快照
|
|
156
|
+
name: scheduleName ?? `Task-${Date.now()}`,
|
|
157
|
+
entryNodeId: thinkingNodeId,
|
|
158
|
+
nodes: {
|
|
159
|
+
[thinkingNodeId]: thinkingNode,
|
|
160
|
+
},
|
|
161
|
+
sharedData: {
|
|
162
|
+
data: initialSharedData ?? {},
|
|
163
|
+
fieldTypes: {},
|
|
164
|
+
},
|
|
165
|
+
status: 'pending',
|
|
166
|
+
executionHistory: [],
|
|
167
|
+
createdAt: new Date(),
|
|
168
|
+
updatedAt: new Date(),
|
|
169
|
+
};
|
|
170
|
+
// 使用 startWithPersona 完成剩余工作
|
|
171
|
+
return this.startWithPersona({ persona, schedule });
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* 使用已存在的 Schedule ID 启动 Workflow
|
|
175
|
+
*
|
|
176
|
+
* 注意:此方法假设 Schedule 已存在于数据库中。
|
|
177
|
+
* 如果 Schedule 不存在,Workflow 执行时会失败。
|
|
178
|
+
*
|
|
179
|
+
* @deprecated 推荐使用 startWithPersona 或 startWithThinking,它们会自动创建 Schedule
|
|
180
|
+
*/
|
|
181
|
+
async startSchedule(params) {
|
|
182
|
+
const { scheduleId, personaId } = params;
|
|
183
|
+
// 启动 Workflow(不传入 schedule,假设已存在)
|
|
184
|
+
return this.startWorkflow(scheduleId, personaId);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* 内部方法:启动 Workflow
|
|
188
|
+
* @param scheduleId - Schedule ID
|
|
189
|
+
* @param personaId - Persona ID
|
|
190
|
+
* @param schedule - 可选的完整 Schedule(首次启动时传入,由 Worker 写入数据库)
|
|
191
|
+
*/
|
|
192
|
+
async startWorkflow(scheduleId, personaId, schedule) {
|
|
193
|
+
const handle = await this.client.workflow.start(scheduleWorkflow, {
|
|
194
|
+
args: [{ scheduleId, schedule }],
|
|
195
|
+
taskQueue: this.taskQueue,
|
|
196
|
+
workflowId: `schedule-${scheduleId}`,
|
|
197
|
+
});
|
|
198
|
+
const workflowId = handle.workflowId;
|
|
199
|
+
return {
|
|
200
|
+
workflowId,
|
|
201
|
+
scheduleId,
|
|
202
|
+
personaId,
|
|
203
|
+
async getStatus() {
|
|
204
|
+
return handle.query(getStatusQuery);
|
|
205
|
+
},
|
|
206
|
+
async pause() {
|
|
207
|
+
await handle.signal(pauseSignal);
|
|
208
|
+
},
|
|
209
|
+
async resume() {
|
|
210
|
+
await handle.signal(resumeSignal);
|
|
211
|
+
},
|
|
212
|
+
async cancel() {
|
|
213
|
+
await handle.signal(cancelSignal);
|
|
214
|
+
},
|
|
215
|
+
async waitForCompletion() {
|
|
216
|
+
await handle.result();
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* 获取内部 Temporal Client
|
|
222
|
+
*/
|
|
223
|
+
getTemporalClient() {
|
|
224
|
+
return this.client;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* 获取 Workflow Handle(用于查询已有的 Workflow)
|
|
228
|
+
*/
|
|
229
|
+
getWorkflowHandle(workflowId) {
|
|
230
|
+
return this.client.workflow.getHandle(workflowId);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=personaCoreClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personaCoreClient.js","sourceRoot":"","sources":["../../src/temporal/personaCoreClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persona Worker 简化创建函数
|
|
3
|
+
*
|
|
4
|
+
* 提供开箱即用的 Worker 创建方式,用户只需提供:
|
|
5
|
+
* - LLM Provider
|
|
6
|
+
* - Temporal 地址
|
|
7
|
+
* - 可选的 PostgreSQL 连接字符串
|
|
8
|
+
*/
|
|
9
|
+
import { LLMProvider } from '../llm/interfaces.js';
|
|
10
|
+
import { DatabaseHandle } from '../db/client.js';
|
|
11
|
+
import { WorkerHandle } from './worker.js';
|
|
12
|
+
/**
|
|
13
|
+
* PersonaWorker 配置
|
|
14
|
+
*/
|
|
15
|
+
export interface PersonaWorkerConfig {
|
|
16
|
+
/**
|
|
17
|
+
* Temporal Server 地址(与 nativeConnection 二选一)
|
|
18
|
+
* @example "localhost:7233"
|
|
19
|
+
*/
|
|
20
|
+
temporalAddress?: string;
|
|
21
|
+
/**
|
|
22
|
+
* 已有的 NativeConnection(与 temporalAddress 二选一,用于测试)
|
|
23
|
+
* 如果提供,将使用此连接而不是创建新连接
|
|
24
|
+
*/
|
|
25
|
+
nativeConnection?: import('@temporalio/worker').NativeConnection;
|
|
26
|
+
/**
|
|
27
|
+
* Temporal 任务队列名称
|
|
28
|
+
* @default "persona-core-queue"
|
|
29
|
+
*/
|
|
30
|
+
taskQueue?: string;
|
|
31
|
+
/**
|
|
32
|
+
* LLM 提供者(必需)
|
|
33
|
+
* 用于思考节点、内容生成、分支决策等
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* import { OpenAICompatibleProvider } from 'persona-core';
|
|
38
|
+
*
|
|
39
|
+
* const llmProvider = new OpenAICompatibleProvider({
|
|
40
|
+
* apiKey: 'your-api-key',
|
|
41
|
+
* baseUrl: 'https://api.openai.com/v1',
|
|
42
|
+
* model: 'gpt-4',
|
|
43
|
+
* });
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
llmProvider: LLMProvider;
|
|
47
|
+
/**
|
|
48
|
+
* 可选:为不同场景配置不同的 LLM 提供者
|
|
49
|
+
*/
|
|
50
|
+
providers?: {
|
|
51
|
+
/** 规划专用 Provider(用于思考节点,可能需要更强大的模型) */
|
|
52
|
+
planning?: LLMProvider;
|
|
53
|
+
/** 分支决策专用 Provider(可使用更快的模型以降低延迟) */
|
|
54
|
+
branch?: LLMProvider;
|
|
55
|
+
/** 内容生成专用 Provider(可使用领域优化的模型) */
|
|
56
|
+
content?: LLMProvider;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* 可选:PostgreSQL 数据库连接字符串
|
|
60
|
+
* 如果不提供,将使用 PGlite 内存数据库
|
|
61
|
+
*
|
|
62
|
+
* @example "postgres://user:password@localhost:5432/persona_pilot"
|
|
63
|
+
*/
|
|
64
|
+
postgresUrl?: string;
|
|
65
|
+
/**
|
|
66
|
+
* 可选:已有的数据库句柄(用于测试或共享数据库)
|
|
67
|
+
* 如果提供,将忽略 postgresUrl
|
|
68
|
+
*/
|
|
69
|
+
databaseHandle?: DatabaseHandle;
|
|
70
|
+
/**
|
|
71
|
+
* 可选:文件操作配置
|
|
72
|
+
*/
|
|
73
|
+
fileConfig?: {
|
|
74
|
+
/** 文件操作的基础目录 */
|
|
75
|
+
baseDir?: string;
|
|
76
|
+
/** 最大文件大小(字节) */
|
|
77
|
+
maxFileSize?: number;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* 可选:Temporal 连接超时时间(毫秒)
|
|
81
|
+
* @default 10000
|
|
82
|
+
*/
|
|
83
|
+
connectTimeout?: number;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* PersonaWorker 句柄
|
|
87
|
+
* 包含 Worker 实例和资源清理方法
|
|
88
|
+
*/
|
|
89
|
+
export interface PersonaWorkerHandle {
|
|
90
|
+
/** Temporal Worker 句柄 */
|
|
91
|
+
workerHandle: WorkerHandle;
|
|
92
|
+
/** 数据库句柄 */
|
|
93
|
+
databaseHandle: DatabaseHandle;
|
|
94
|
+
/**
|
|
95
|
+
* 优雅关闭所有资源
|
|
96
|
+
* 包括 Worker、Temporal 连接和数据库连接
|
|
97
|
+
*/
|
|
98
|
+
shutdown: () => Promise<void>;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 创建 PersonaWorker
|
|
102
|
+
*
|
|
103
|
+
* 简化的 Worker 创建函数,自动使用默认的服务实现。
|
|
104
|
+
* 用户只需提供 LLM Provider 和 Temporal 地址即可。
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```typescript
|
|
108
|
+
* import { createPersonaWorker, OpenAICompatibleProvider } from 'persona-core';
|
|
109
|
+
*
|
|
110
|
+
* // 使用 PGlite 内存数据库(开发/测试)
|
|
111
|
+
* const worker = await createPersonaWorker({
|
|
112
|
+
* temporalAddress: 'localhost:7233',
|
|
113
|
+
* llmProvider: new OpenAICompatibleProvider({
|
|
114
|
+
* apiKey: process.env.OPENAI_API_KEY!,
|
|
115
|
+
* model: 'gpt-4',
|
|
116
|
+
* }),
|
|
117
|
+
* });
|
|
118
|
+
*
|
|
119
|
+
* // 运行 Worker
|
|
120
|
+
* await worker.workerHandle.worker.run();
|
|
121
|
+
*
|
|
122
|
+
* // 优雅关闭
|
|
123
|
+
* await worker.shutdown();
|
|
124
|
+
* ```
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* ```typescript
|
|
128
|
+
* // 使用 PostgreSQL 数据库(生产)
|
|
129
|
+
* const worker = await createPersonaWorker({
|
|
130
|
+
* temporalAddress: 'temporal.example.com:7233',
|
|
131
|
+
* postgresUrl: 'postgres://user:pass@db.example.com:5432/persona_pilot',
|
|
132
|
+
* llmProvider: new OpenAICompatibleProvider({
|
|
133
|
+
* apiKey: process.env.OPENAI_API_KEY!,
|
|
134
|
+
* baseUrl: 'https://api.openai.com/v1',
|
|
135
|
+
* model: 'gpt-4-turbo',
|
|
136
|
+
* }),
|
|
137
|
+
* });
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
export declare function createPersonaWorker(config: PersonaWorkerConfig): Promise<PersonaWorkerHandle>;
|
|
141
|
+
//# sourceMappingURL=personaWorker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personaWorker.d.ts","sourceRoot":"","sources":["../../src/temporal/personaWorker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAkB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAA8B,YAAY,EAAE,MAAM,aAAa,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,oBAAoB,EAAE,gBAAgB,CAAC;IAEjE;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;;;;;;;;OAcG;IACH,WAAW,EAAE,WAAW,CAAC;IAEzB;;OAEG;IACH,SAAS,CAAC,EAAE;QACV,uCAAuC;QACvC,QAAQ,CAAC,EAAE,WAAW,CAAC;QACvB,qCAAqC;QACrC,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,kCAAkC;QAClC,OAAO,CAAC,EAAE,WAAW,CAAC;KACvB,CAAC;IAEF;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;OAEG;IACH,UAAU,CAAC,EAAE;QACX,gBAAgB;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,iBAAiB;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IAEF;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,yBAAyB;IACzB,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY;IACZ,cAAc,EAAE,cAAc,CAAC;IAC/B;;;OAGG;IACH,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CA6C9B"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persona Worker 简化创建函数
|
|
3
|
+
*
|
|
4
|
+
* 提供开箱即用的 Worker 创建方式,用户只需提供:
|
|
5
|
+
* - LLM Provider
|
|
6
|
+
* - Temporal 地址
|
|
7
|
+
* - 可选的 PostgreSQL 连接字符串
|
|
8
|
+
*/
|
|
9
|
+
import { createServices } from '../services/factory.js';
|
|
10
|
+
import { createDatabase } from '../db/client.js';
|
|
11
|
+
import { createWorker } from './worker.js';
|
|
12
|
+
/**
|
|
13
|
+
* 创建 PersonaWorker
|
|
14
|
+
*
|
|
15
|
+
* 简化的 Worker 创建函数,自动使用默认的服务实现。
|
|
16
|
+
* 用户只需提供 LLM Provider 和 Temporal 地址即可。
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* import { createPersonaWorker, OpenAICompatibleProvider } from 'persona-core';
|
|
21
|
+
*
|
|
22
|
+
* // 使用 PGlite 内存数据库(开发/测试)
|
|
23
|
+
* const worker = await createPersonaWorker({
|
|
24
|
+
* temporalAddress: 'localhost:7233',
|
|
25
|
+
* llmProvider: new OpenAICompatibleProvider({
|
|
26
|
+
* apiKey: process.env.OPENAI_API_KEY!,
|
|
27
|
+
* model: 'gpt-4',
|
|
28
|
+
* }),
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* // 运行 Worker
|
|
32
|
+
* await worker.workerHandle.worker.run();
|
|
33
|
+
*
|
|
34
|
+
* // 优雅关闭
|
|
35
|
+
* await worker.shutdown();
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* // 使用 PostgreSQL 数据库(生产)
|
|
41
|
+
* const worker = await createPersonaWorker({
|
|
42
|
+
* temporalAddress: 'temporal.example.com:7233',
|
|
43
|
+
* postgresUrl: 'postgres://user:pass@db.example.com:5432/persona_pilot',
|
|
44
|
+
* llmProvider: new OpenAICompatibleProvider({
|
|
45
|
+
* apiKey: process.env.OPENAI_API_KEY!,
|
|
46
|
+
* baseUrl: 'https://api.openai.com/v1',
|
|
47
|
+
* model: 'gpt-4-turbo',
|
|
48
|
+
* }),
|
|
49
|
+
* });
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export async function createPersonaWorker(config) {
|
|
53
|
+
// 1. 创建或使用已有的数据库连接
|
|
54
|
+
const ownDatabase = !config.databaseHandle;
|
|
55
|
+
const databaseHandle = config.databaseHandle ?? await createDatabase(config.postgresUrl);
|
|
56
|
+
// 2. 创建服务配置
|
|
57
|
+
const serviceConfig = {
|
|
58
|
+
llmProvider: config.llmProvider,
|
|
59
|
+
planningProvider: config.providers?.planning,
|
|
60
|
+
branchProvider: config.providers?.branch,
|
|
61
|
+
contentProvider: config.providers?.content,
|
|
62
|
+
fileConfig: config.fileConfig,
|
|
63
|
+
};
|
|
64
|
+
// 3. 使用工厂创建所有默认服务
|
|
65
|
+
const services = createServices(serviceConfig);
|
|
66
|
+
// 4. 创建 Worker 配置
|
|
67
|
+
const workerConfig = {
|
|
68
|
+
temporalAddress: config.temporalAddress,
|
|
69
|
+
nativeConnection: config.nativeConnection,
|
|
70
|
+
taskQueue: config.taskQueue ?? 'persona-core-queue',
|
|
71
|
+
db: databaseHandle.db,
|
|
72
|
+
thinkingService: services.thinkingService,
|
|
73
|
+
actionService: services.actionService,
|
|
74
|
+
branchService: services.branchService,
|
|
75
|
+
connectTimeout: config.connectTimeout,
|
|
76
|
+
};
|
|
77
|
+
// 5. 创建 Worker
|
|
78
|
+
const workerHandle = await createWorker(workerConfig);
|
|
79
|
+
// 6. 返回句柄
|
|
80
|
+
return {
|
|
81
|
+
workerHandle,
|
|
82
|
+
databaseHandle,
|
|
83
|
+
shutdown: async () => {
|
|
84
|
+
// 优雅关闭 Worker
|
|
85
|
+
await workerHandle.shutdown();
|
|
86
|
+
// 只有自己创建的数据库连接才需要关闭
|
|
87
|
+
if (ownDatabase) {
|
|
88
|
+
await databaseHandle.close();
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=personaWorker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personaWorker.js","sourceRoot":"","sources":["../../src/temporal/personaWorker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,cAAc,EAAiB,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAkB,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,YAAY,EAA8B,MAAM,aAAa,CAAC;AAoGvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAA2B;IAE3B,mBAAmB;IACnB,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC;IAC3C,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,MAAM,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAEzF,YAAY;IACZ,MAAM,aAAa,GAAkB;QACnC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,gBAAgB,EAAE,MAAM,CAAC,SAAS,EAAE,QAAQ;QAC5C,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM;QACxC,eAAe,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO;QAC1C,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;IAEF,kBAAkB;IAClB,MAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAE/C,kBAAkB;IAClB,MAAM,YAAY,GAAiB;QACjC,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,oBAAoB;QACnD,EAAE,EAAE,cAAc,CAAC,EAAE;QACrB,eAAe,EAAE,QAAQ,CAAC,eAAe;QACzC,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC;IAEF,eAAe;IACf,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;IAEtD,UAAU;IACV,OAAO;QACL,YAAY;QACZ,cAAc;QACd,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,cAAc;YACd,MAAM,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC9B,oBAAoB;YACpB,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|