first commit
This commit is contained in:
@@ -0,0 +1,350 @@
|
||||
const queryModelService = require('../services/queryModelService');
|
||||
const { Plan, ToolExecution, Conversation, Message } = require('../models');
|
||||
const logger = require('../utils/logger');
|
||||
|
||||
const executePlan = async (req, res) => {
|
||||
try {
|
||||
const { planId, options = {} } = req.body;
|
||||
const userId = req.user.userId;
|
||||
|
||||
if (!planId) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
error: 'Plan ID is required'
|
||||
});
|
||||
}
|
||||
|
||||
// Verify plan belongs to user
|
||||
const plan = await Plan.findOne({
|
||||
where: {
|
||||
id: planId
|
||||
},
|
||||
include: [
|
||||
{
|
||||
model: Conversation,
|
||||
where: {
|
||||
user_id: userId
|
||||
},
|
||||
attributes: ['id', 'title', 'user_id']
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
if (!plan) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
error: 'Plan not found'
|
||||
});
|
||||
}
|
||||
|
||||
if (plan.status !== 'approved') {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
error: 'Plan must be approved before execution'
|
||||
});
|
||||
}
|
||||
|
||||
// Execute plan using QUERYMODEL
|
||||
const result = await queryModelService.executePlan(planId, options);
|
||||
|
||||
logger.info(`QUERYMODEL execution completed for plan: ${planId}`);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: result
|
||||
});
|
||||
} catch (error) {
|
||||
logger.error('QUERYMODEL execution error:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const executeTool = async (req, res) => {
|
||||
try {
|
||||
const { planId, toolName, toolType, inputParameters } = req.body;
|
||||
const userId = req.user.userId;
|
||||
|
||||
if (!planId || !toolName || !toolType || !inputParameters) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
error: 'Plan ID, tool name, type, and input parameters are required'
|
||||
});
|
||||
}
|
||||
|
||||
// Verify plan belongs to user
|
||||
const plan = await Plan.findOne({
|
||||
where: {
|
||||
id: planId
|
||||
},
|
||||
include: [
|
||||
{
|
||||
model: Conversation,
|
||||
where: {
|
||||
user_id: userId
|
||||
},
|
||||
attributes: ['id', 'title', 'user_id']
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
if (!plan) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
error: 'Plan not found'
|
||||
});
|
||||
}
|
||||
|
||||
// Execute tool using QUERYMODEL
|
||||
const result = await queryModelService.executeTool(toolName, toolType, inputParameters, planId);
|
||||
|
||||
logger.info(`Tool executed: ${toolName} for plan: ${planId}`);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: { toolExecution: result }
|
||||
});
|
||||
} catch (error) {
|
||||
logger.error('Execute tool error:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: 'Internal server error'
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const orchestratePlan = async (req, res) => {
|
||||
try {
|
||||
const { planId, options = {} } = req.body;
|
||||
const userId = req.user.userId;
|
||||
|
||||
if (!planId) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
error: 'Plan ID is required'
|
||||
});
|
||||
}
|
||||
|
||||
// Verify plan belongs to user
|
||||
const plan = await Plan.findOne({
|
||||
where: {
|
||||
id: planId
|
||||
},
|
||||
include: [
|
||||
{
|
||||
model: Conversation,
|
||||
where: {
|
||||
user_id: userId
|
||||
},
|
||||
attributes: ['id', 'title', 'user_id']
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
if (!plan) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
error: 'Plan not found'
|
||||
});
|
||||
}
|
||||
|
||||
if (plan.status !== 'approved') {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
error: 'Plan must be approved before orchestration'
|
||||
});
|
||||
}
|
||||
|
||||
// Get the original user query from the conversation
|
||||
const originalMessage = await Message.findOne({
|
||||
where: {
|
||||
conversation_id: plan.conversation_id,
|
||||
role: 'user'
|
||||
},
|
||||
order: [['created_at', 'DESC']]
|
||||
});
|
||||
|
||||
const originalQuery = originalMessage ? originalMessage.content : plan.title;
|
||||
|
||||
// Execute orchestration using QUERYMODEL
|
||||
const result = await queryModelService.executeOrchestrate({
|
||||
query: originalQuery,
|
||||
category: 'engineering',
|
||||
topK: options.topK || 5,
|
||||
generateReport: true
|
||||
});
|
||||
|
||||
logger.info(`QUERYMODEL orchestration completed for plan: ${planId}`);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: { toolExecution: result }
|
||||
});
|
||||
} catch (error) {
|
||||
logger.error('QUERYMODEL orchestration error:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const getExecutionStatus = async (req, res) => {
|
||||
try {
|
||||
const { planId } = req.params;
|
||||
const userId = req.user.userId;
|
||||
|
||||
const plan = await Plan.findOne({
|
||||
where: {
|
||||
id: planId
|
||||
},
|
||||
include: [
|
||||
{
|
||||
model: Conversation,
|
||||
where: {
|
||||
user_id: userId
|
||||
},
|
||||
attributes: ['id', 'title', 'user_id']
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
if (!plan) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
error: 'Plan not found'
|
||||
});
|
||||
}
|
||||
|
||||
// Get tool executions for this plan
|
||||
const toolExecutions = await ToolExecution.findAll({
|
||||
where: {
|
||||
plan_id: planId
|
||||
},
|
||||
order: [['created_at', 'DESC']]
|
||||
});
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: {
|
||||
plan,
|
||||
toolExecutions
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
logger.error('Get execution status error:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: 'Internal server error'
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const getToolExecutions = async (req, res) => {
|
||||
try {
|
||||
const { planId, toolType, status, page = 1, limit = 10 } = req.query;
|
||||
const userId = req.user.userId;
|
||||
|
||||
const whereClause = {};
|
||||
if (planId) whereClause.plan_id = planId;
|
||||
if (toolType) whereClause.tool_type = toolType;
|
||||
if (status) whereClause.status = status;
|
||||
|
||||
// Verify plan belongs to user if planId provided
|
||||
if (planId) {
|
||||
const plan = await Plan.findOne({
|
||||
where: {
|
||||
id: planId
|
||||
},
|
||||
include: [
|
||||
{
|
||||
model: Conversation,
|
||||
where: {
|
||||
user_id: userId
|
||||
},
|
||||
attributes: ['id', 'title', 'user_id']
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
if (!plan) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
error: 'Plan not found'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const offset = (page - 1) * limit;
|
||||
|
||||
const { count, rows: executions } = await ToolExecution.findAndCountAll({
|
||||
where: whereClause,
|
||||
include: [
|
||||
{
|
||||
model: Plan,
|
||||
where: {
|
||||
conversation: {
|
||||
user_id: userId
|
||||
}
|
||||
},
|
||||
include: [
|
||||
{
|
||||
model: Conversation,
|
||||
attributes: ['id', 'title', 'user_id']
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
order: [['created_at', 'DESC']],
|
||||
limit: parseInt(limit),
|
||||
offset: parseInt(offset)
|
||||
});
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: {
|
||||
executions,
|
||||
pagination: {
|
||||
page: parseInt(page),
|
||||
limit: parseInt(limit),
|
||||
total: count,
|
||||
pages: Math.ceil(count / limit)
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
logger.error('Get tool executions error:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: 'Internal server error'
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const getModelStatus = async (req, res) => {
|
||||
try {
|
||||
const status = await queryModelService.getModelStatus();
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: status
|
||||
});
|
||||
} catch (error) {
|
||||
logger.error('QUERYMODEL status error:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
executePlan,
|
||||
executeTool,
|
||||
orchestratePlan,
|
||||
getExecutionStatus,
|
||||
getToolExecutions,
|
||||
getModelStatus
|
||||
};
|
||||
Reference in New Issue
Block a user