26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
# File 'app/controllers/rails_mcp_engine/chat_controller.rb', line 26
def send_message
user_message = params[:message].to_s
model = params[:model].to_s
conversation_history = JSON.parse(params[:conversation_history] || '[]', symbolize_names: true)
if user_message.strip.empty?
render json: { error: 'Message is required' }, status: :bad_request
return
end
provider = if model.start_with?('gemini')
:gemini
elsif model.start_with?('claude')
:anthropic
else
:openai
end
chat = RubyLLM.chat(
provider: provider,
model: model
)
tool_classes = get_tool_classes
chat = tool_classes.reduce(chat) { |c, tool_class| c.with_tool(tool_class) }
if conversation_history.empty?
full_message = user_message
else
context_parts = ['Previous conversation:']
conversation_history.each do |msg|
role_label = msg[:role] == 'user' ? 'User' : 'Assistant'
context_parts << "#{role_label}: #{msg[:content]}"
end
context_parts << "\nCurrent question:"
context_parts << user_message
full_message = context_parts.join("\n\n")
end
begin
response = chat.ask(full_message)
assistant_content = response.content
conversation_history << { role: 'user', content: user_message }
conversation_history << { role: 'assistant', content: assistant_content }
tool_results = []
render json: {
conversation_history: conversation_history,
tool_results: tool_results
}
rescue StandardError => e
render json: { error: e.message }, status: :bad_request
end
end
|