@yrpri/api 9.0.85 → 9.0.87
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/agents/assistants/baseAssistant.js +16 -4
- package/agents/assistants/modes/agentDirectConnection.js +0 -1
- package/agents/assistants/modes/tools/agentTools.js +20 -3
- package/agents/assistants/voiceAssistant.js +1 -1
- package/agents/controllers/agentSubscriptionController.js +29 -2
- package/agents/controllers/assistantsController.js +30 -2
- package/agents/models/testData/createEvolyAgentProduct.js +1 -1
- package/agents/models/testData/updateAgentWorkflowConfiguration.js +24 -1
- package/package.json +1 -1
|
@@ -22,9 +22,21 @@ export class YpBaseAssistant extends YpBaseChatBot {
|
|
|
22
22
|
this.toolCallTimeout = 30000; // 30 seconds
|
|
23
23
|
this.maxModeTransitions = 10;
|
|
24
24
|
this.modelName = "gpt-4o";
|
|
25
|
-
this.defaultSystemPrompt =
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
this.defaultSystemPrompt = `# Basic instructions
|
|
26
|
+
You are a helpful, witty, and friendly AI. Act like a human, but remember that you aren't a human and that you can't do human things in the real world.
|
|
27
|
+
Your voice and personality should be warm and engaging, with a lively and playful tone. If interacting in a non-English language, start by using the standard
|
|
28
|
+
accent or dialect familiar to the user. Talk quickly. You should always call a function/tool if you can to help the user with their request.
|
|
29
|
+
Never try to start workflows without using functions/tools, using some tools will unlock other function/tools that might help the user with their request.
|
|
30
|
+
Functions/tools will become available to you as the user progresses through the workflow.
|
|
31
|
+
|
|
32
|
+
# Typical start of a user workflow is:
|
|
33
|
+
1) The user chooses an agent to subscribe to.
|
|
34
|
+
2) The agent offers to show the user a workflow overview and informs the user about the subscription process.
|
|
35
|
+
3) The user logs in or creates an account, if not logged in.
|
|
36
|
+
4) The user verbally confirms a subscription to the agent.
|
|
37
|
+
5) The user fills out the configuration UI widget.
|
|
38
|
+
6) The user submits from the configuration UI widget.
|
|
39
|
+
7) The user starts the workflow.`;
|
|
28
40
|
this.voiceEnabled = false;
|
|
29
41
|
this.domainId = domainId;
|
|
30
42
|
if (!domainId) {
|
|
@@ -463,7 +475,7 @@ export class YpBaseAssistant extends YpBaseChatBot {
|
|
|
463
475
|
console.error(`No current mode found: ${this.memory.currentMode}`);
|
|
464
476
|
return this.defaultSystemPrompt;
|
|
465
477
|
}
|
|
466
|
-
return `${this.defaultSystemPrompt}\n\n${currentMode.systemPrompt}`;
|
|
478
|
+
return `${this.defaultSystemPrompt}\n\n# Current agent instructions:\n${currentMode.systemPrompt}`;
|
|
467
479
|
}
|
|
468
480
|
sendAvatarUrlChange(url, avatarName) {
|
|
469
481
|
this.wsClientSocket.send(JSON.stringify({
|
|
@@ -30,10 +30,26 @@ export class AgentTools extends BaseAssistantTools {
|
|
|
30
30
|
workflow="${base64Workflow}"
|
|
31
31
|
workflowStatus="${run?.status || "not_started"}"
|
|
32
32
|
></yp-agent-workflow-widget>`;
|
|
33
|
+
let message;
|
|
34
|
+
if (!this.assistant.isSubscribedToCurrentAgentProduct) {
|
|
35
|
+
if (this.assistant.isLoggedIn) {
|
|
36
|
+
message =
|
|
37
|
+
"Inform the user that the next step is to subscribe to the agent plan to start the workflow. Offer the user to explain the workflow to them first.";
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
message =
|
|
41
|
+
"Inform the user that the next step is to login, then subscribe to the agent plan to start the workflow. You can also offer the user to explain the workflow to them first.";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
message =
|
|
46
|
+
"Inform the user that the next step is to start the workflow. You can also ffer the user to explain the workflow to them first.";
|
|
47
|
+
}
|
|
48
|
+
this.assistant.emit("update-ai-model-session", message);
|
|
33
49
|
return {
|
|
34
50
|
success: true,
|
|
35
51
|
html,
|
|
36
|
-
data: { agent, run, workflowJson },
|
|
52
|
+
data: { message, agent, run, workflowJson },
|
|
37
53
|
};
|
|
38
54
|
}
|
|
39
55
|
catch (error) {
|
|
@@ -315,7 +331,8 @@ export class AgentTools extends BaseAssistantTools {
|
|
|
315
331
|
get showConfigurationWidget() {
|
|
316
332
|
return {
|
|
317
333
|
name: "show_configuration_widget_if_needed_or_user_asks_to_show_it",
|
|
318
|
-
description: "Show the configuration widget for the current agent. The user needs to fill out the configuration before running the agent workflow to make sure to offer it to the user.
|
|
334
|
+
description: "Show the configuration widget for the current agent. The user needs to fill out the configuration before running the agent workflow to make sure to offer it to the user. \
|
|
335
|
+
The user can not provide you with the confiruation verbally or through chat, the user must provide the configuration through the configuration widget.",
|
|
319
336
|
type: "function",
|
|
320
337
|
parameters: {
|
|
321
338
|
type: "object",
|
|
@@ -367,7 +384,7 @@ export class AgentTools extends BaseAssistantTools {
|
|
|
367
384
|
get submitConfiguration() {
|
|
368
385
|
return {
|
|
369
386
|
name: "submit_configuration",
|
|
370
|
-
description: "Submit the configuration for the current agent by clicking the submit button for the user",
|
|
387
|
+
description: "Submit the configuration for the current agent by clicking the submit button for the user. The only way for the user to provide the configuration is through the configuration widget.",
|
|
371
388
|
type: "function",
|
|
372
389
|
parameters: {
|
|
373
390
|
type: "object",
|
|
@@ -106,7 +106,7 @@ export class YpBaseChatBotWithVoice extends YpBaseChatBot {
|
|
|
106
106
|
model: this.voiceConfig.model,
|
|
107
107
|
voice: this.voiceConfig.voice,
|
|
108
108
|
};
|
|
109
|
-
this.initializeVoiceSession("Say hi and welcome the user, offer to explain and
|
|
109
|
+
this.initializeVoiceSession("Say hi and welcome the user, offer to explain and show the user a workflow overview with the 'show_agent_workflow_overview_widget' function/tool you have access to call");
|
|
110
110
|
});
|
|
111
111
|
ws.on("close", () => {
|
|
112
112
|
console.log("Agent voice connection to OpenAI closed");
|
|
@@ -9,6 +9,31 @@ export class AgentSubscriptionController {
|
|
|
9
9
|
constructor(wsClients) {
|
|
10
10
|
this.path = "/api/subscriptions";
|
|
11
11
|
this.router = express.Router();
|
|
12
|
+
this.getAgentConfigurationAnswers = async (req, res) => {
|
|
13
|
+
try {
|
|
14
|
+
const subscriptionId = parseInt(req.params.subscriptionId);
|
|
15
|
+
// Make sure the user can only fetch their own subscription
|
|
16
|
+
const subscription = await YpSubscription.findOne({
|
|
17
|
+
where: {
|
|
18
|
+
id: subscriptionId,
|
|
19
|
+
user_id: req.user.id
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
if (!subscription) {
|
|
23
|
+
return res.status(404).json({ error: "Subscription not found" });
|
|
24
|
+
}
|
|
25
|
+
// Extract the requiredQuestionsAnswered from subscription.configuration
|
|
26
|
+
const answers = subscription.configuration?.requiredQuestionsAnswered || [];
|
|
27
|
+
return res.status(200).json({
|
|
28
|
+
success: true,
|
|
29
|
+
data: answers,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error("Error retrieving subscription agent configuration:", error);
|
|
34
|
+
return res.status(500).json({ error: error.message });
|
|
35
|
+
}
|
|
36
|
+
};
|
|
12
37
|
this.updateAgentConfiguration = async (req, res) => {
|
|
13
38
|
try {
|
|
14
39
|
const subscriptionId = parseInt(req.params.subscriptionId);
|
|
@@ -207,7 +232,8 @@ export class AgentSubscriptionController {
|
|
|
207
232
|
this.router.get("/", auth.can("view subscriptions"), this.getSubscriptions);
|
|
208
233
|
this.router.delete("/:subscriptionId", this.cancelSubscription);
|
|
209
234
|
this.router.put("/:subscriptionId", this.updateSubscription);
|
|
210
|
-
this.router.put("/:subscriptionId/
|
|
235
|
+
this.router.put("/:subscriptionId/updateAgentConfiguration", this.updateAgentConfiguration);
|
|
236
|
+
this.router.get("/:subscriptionId/getConfigurationAnswers", this.getAgentConfigurationAnswers);
|
|
211
237
|
// Add new payment-related routes
|
|
212
238
|
this.router.post("/stripe-create-payment-intent", this.createPaymentIntent);
|
|
213
239
|
this.router.post("/stripe-webhook", express.raw({ type: "application/json" }), this.handleWebhook);
|
|
@@ -215,7 +241,8 @@ export class AgentSubscriptionController {
|
|
|
215
241
|
initializeRoutesSecure() {
|
|
216
242
|
this.router.get("/plans", auth.can("view subscriptions"), this.getPlans);
|
|
217
243
|
this.router.post("/", auth.can("create subscriptions"), this.createSubscriptions);
|
|
218
|
-
this.router.put("/:subscriptionId/
|
|
244
|
+
this.router.put("/:subscriptionId/updateAgentConfiguration", auth.can("edit subscriptions"), this.updateAgentConfiguration);
|
|
245
|
+
this.router.get("/:subscriptionId/getConfigurationAnswers", auth.can("view subscriptions"), this.getAgentConfigurationAnswers);
|
|
219
246
|
this.router.post("/:subscriptionId/start", auth.can("edit subscriptions"), this.startAgentRun);
|
|
220
247
|
this.router.post("/:subscriptionId/stop", auth.can("edit subscriptions"), this.stopAgentRun);
|
|
221
248
|
// Additional routes
|
|
@@ -111,6 +111,31 @@ export class AssistantController {
|
|
|
111
111
|
res.sendStatus(500);
|
|
112
112
|
}
|
|
113
113
|
};
|
|
114
|
+
this.getAgentConfigurationAnswers = async (req, res) => {
|
|
115
|
+
try {
|
|
116
|
+
const subscriptionId = parseInt(req.params.subscriptionId);
|
|
117
|
+
// Make sure the user can only fetch their own subscription
|
|
118
|
+
const subscription = await YpSubscription.findOne({
|
|
119
|
+
where: {
|
|
120
|
+
id: subscriptionId,
|
|
121
|
+
user_id: req.user.id
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
if (!subscription) {
|
|
125
|
+
return res.status(404).json({ error: "Subscription not found" });
|
|
126
|
+
}
|
|
127
|
+
// Extract the requiredQuestionsAnswered from subscription.configuration
|
|
128
|
+
const answers = subscription.configuration?.requiredQuestionsAnswered || [];
|
|
129
|
+
return res.status(200).json({
|
|
130
|
+
success: true,
|
|
131
|
+
data: answers,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
console.error("Error retrieving subscription agent configuration:", error);
|
|
136
|
+
return res.status(500).json({ error: error.message });
|
|
137
|
+
}
|
|
138
|
+
};
|
|
114
139
|
this.getUpdatedWorkflow = async (req, res) => {
|
|
115
140
|
const { runId } = req.params;
|
|
116
141
|
const userId = req.user?.id;
|
|
@@ -153,13 +178,15 @@ export class AssistantController {
|
|
|
153
178
|
};
|
|
154
179
|
this.submitAgentConfiguration = async (req, res) => {
|
|
155
180
|
console.log(`submitAgentConfiguration: ${JSON.stringify(req.body, null, 2)}`);
|
|
156
|
-
const {
|
|
181
|
+
const { requiredQuestionsAnswers } = req.body;
|
|
182
|
+
const subscriptionId = parseInt(req.params.subscriptionId);
|
|
157
183
|
try {
|
|
158
184
|
const memoryId = this.getMemoryUserId(req);
|
|
159
185
|
// Get subscription
|
|
160
186
|
const subscription = await YpSubscription.findOne({
|
|
161
187
|
where: {
|
|
162
188
|
id: subscriptionId,
|
|
189
|
+
user_id: req.user?.id, //TODO: Move to move this access check to the group level
|
|
163
190
|
},
|
|
164
191
|
});
|
|
165
192
|
if (!subscription) {
|
|
@@ -314,7 +341,8 @@ export class AssistantController {
|
|
|
314
341
|
this.router.delete("/:domainId/chatlog", auth.can("view domain"), this.clearChatLog.bind(this));
|
|
315
342
|
//TODO: Add auth for below
|
|
316
343
|
this.router.put("/:domainId/updateAssistantMemoryLoginStatus", this.updateAssistantMemoryLoginStatus.bind(this));
|
|
317
|
-
this.router.put("/:domainId/submitAgentConfiguration", this.submitAgentConfiguration.bind(this));
|
|
344
|
+
this.router.put("/:domainId/:subscriptionId/submitAgentConfiguration", this.submitAgentConfiguration.bind(this));
|
|
345
|
+
this.router.get("/:domainId/:subscriptionId/getConfigurationAnswers", this.getAgentConfigurationAnswers.bind(this));
|
|
318
346
|
this.router.put("/:groupId/:agentId/startWorkflowAgent", this.startWorkflowAgent.bind(this));
|
|
319
347
|
this.router.get("/:groupId/:runId/updatedWorkflow", this.getUpdatedWorkflow.bind(this));
|
|
320
348
|
this.router.post("/:groupId/:agentId/startNextWorkflowStep", this.startNextWorkflowStep.bind(this));
|
|
@@ -221,7 +221,7 @@ async function createAgentProductsAndPlans() {
|
|
|
221
221
|
requiredStructuredQuestions: [
|
|
222
222
|
{
|
|
223
223
|
uniqueId: "businessDescription",
|
|
224
|
-
type: "
|
|
224
|
+
type: "textAreaLong",
|
|
225
225
|
description: "Detailed description of the business, this is critical for the agent to understand the business and provide accurate results.",
|
|
226
226
|
value: "",
|
|
227
227
|
maxLength: 7500,
|
|
@@ -150,7 +150,7 @@ async function setupAgentProductsConfiguration() {
|
|
|
150
150
|
fundingSubscriptionPlan.set("configuration.requiredStructuredQuestions", [
|
|
151
151
|
{
|
|
152
152
|
uniqueId: "businessDescription",
|
|
153
|
-
type: "
|
|
153
|
+
type: "textAreaLong",
|
|
154
154
|
description: "Detailed description of the business, this is critical for the agent to understand the business and provide accurate results.",
|
|
155
155
|
value: "",
|
|
156
156
|
maxLength: 7500,
|
|
@@ -203,5 +203,28 @@ async function setupAgentProductsConfiguration() {
|
|
|
203
203
|
console.log(`SubscriptionPlan ${planId} not found`);
|
|
204
204
|
}
|
|
205
205
|
}
|
|
206
|
+
for (let planId = 1; planId <= 2; planId++) {
|
|
207
|
+
const subscriptionPlan = await YpSubscriptionPlan.findByPk(planId);
|
|
208
|
+
if (subscriptionPlan) {
|
|
209
|
+
subscriptionPlan.set("configuration.requiredStructuredQuestions", [
|
|
210
|
+
{
|
|
211
|
+
uniqueId: "businessDescription",
|
|
212
|
+
type: "textAreaLong",
|
|
213
|
+
description: "Detailed description of the business, this is critical for the agent to understand the business and provide accurate results.",
|
|
214
|
+
value: "",
|
|
215
|
+
maxLength: 7500,
|
|
216
|
+
required: true,
|
|
217
|
+
rows: 5,
|
|
218
|
+
charCounter: true,
|
|
219
|
+
text: "Business Description",
|
|
220
|
+
}
|
|
221
|
+
]);
|
|
222
|
+
subscriptionPlan.changed("configuration", true);
|
|
223
|
+
await subscriptionPlan.save();
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
console.log(`SubscriptionPlan ${planId} not found`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
206
229
|
}
|
|
207
230
|
setupAgentProductsConfiguration();
|