iachat/enterprise/app/services/captain/copilot/chat_service.rb
Pranav 6096932f76
feat: Add a review step for FAQs generated from conversations before using it (#10693)
This PR introduces a review step for generated FAQs, allowing a human to
validate and approve them before use in customer interactions. While
hallucinations are minimal, this step ensures accurate and reliable FAQs
for Captain to use during LLM calls when responding to customers.

- Added a status field for the FAQ
- Allow the filter on the UI.
<img width="1072" alt="Screenshot 2025-01-15 at 6 39 26 PM"
src="https://github.com/user-attachments/assets/81dfc038-31e9-40e6-8a09-586ebc4e8384"
/>
2025-01-16 09:54:34 +05:30

79 lines
2.1 KiB
Ruby

class Captain::Copilot::ChatService
def initialize(assistant, config)
@assistant = assistant
@conversation_history = config[:conversation_history]
@previous_messages = config[:previous_messages]
build_agent
register_search_documentation
end
def execute(input)
@agent.execute(input, conversation_history_context)
end
private
def build_agent
@agent = Captain::Agent.new(
name: 'Support Copilot',
config: {
description: 'an AI assistant helping support agents',
messages: @previous_messages,
persona: 'You are an AI copilot for customer support agents',
goal: "
Your goal is help the support agents with meaningful responses based on the knowledge you have
and you can gather using tools provided about the product or service.
",
secrets: {
OPENAI_API_KEY: InstallationConfig.find_by!(name: 'CAPTAIN_OPEN_AI_API_KEY').value
},
max_iterations: 2
}
)
end
def conversation_history_context
"
Message History with the user is below:
#{@conversation_history}
"
end
def register_search_documentation
tool = Captain::Tool.new(
name: 'search_documentation',
config: {
description: "Use this function to get documentation on functionalities you don't know about.",
properties: {
search_query: {
type: 'string',
description: 'The search query to look up in the documentation.',
required: true
}
},
memory: {
assistant_id: @assistant.id,
account_id: @assistant.account_id
}
}
)
register_tool tool
end
def register_tool(tool)
tool.register_method do |inputs, _, memory|
assistant = Captain::Assistant.find(memory[:assistant_id])
assistant
.responses
.approved
.search(inputs['search_query'])
.map do |response|
"\n\nQuestion: #{response[:question]}\nAnswer: #{response[:answer]}"
end.join
end
@agent.register_tool tool
end
end