feat(captain-memory): add PromptInjectionService formatting memories as XML
This commit is contained in:
parent
e1273f142b
commit
5d15f55a29
@ -0,0 +1,21 @@
|
|||||||
|
class Captain::ContactMemories::PromptInjectionService
|
||||||
|
def initialize(memories:)
|
||||||
|
@memories = memories
|
||||||
|
end
|
||||||
|
|
||||||
|
def call
|
||||||
|
return '' if @memories.blank?
|
||||||
|
|
||||||
|
lines = @memories.map do |memory|
|
||||||
|
%( <#{memory.memory_type} confidence="#{format('%.2f', memory.confidence)}">#{escape(memory.content)}</#{memory.memory_type}>)
|
||||||
|
end
|
||||||
|
|
||||||
|
"<memoria_cliente>\n#{lines.join("\n")}\n</memoria_cliente>"
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def escape(text)
|
||||||
|
text.to_s.gsub('&', '&').gsub('<', '<').gsub('>', '>')
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe Captain::ContactMemories::PromptInjectionService do
|
||||||
|
describe '#call' do
|
||||||
|
it 'returns empty string when memories empty' do
|
||||||
|
result = described_class.new(memories: []).call
|
||||||
|
expect(result).to eq('')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'formats memories as XML block' do
|
||||||
|
memories = [
|
||||||
|
build_stubbed(:captain_contact_memory, memory_type: 'preferencia', content: 'Prefere Stilo', confidence: 0.92),
|
||||||
|
build_stubbed(:captain_contact_memory, memory_type: 'data_comemorativa', content: 'Aniversário 14/02', confidence: 0.88)
|
||||||
|
]
|
||||||
|
|
||||||
|
result = described_class.new(memories: memories).call
|
||||||
|
|
||||||
|
expect(result).to include('<memoria_cliente>')
|
||||||
|
expect(result).to include('<preferencia confidence="0.92">Prefere Stilo</preferencia>')
|
||||||
|
expect(result).to include('<data_comemorativa confidence="0.88">Aniversário 14/02</data_comemorativa>')
|
||||||
|
expect(result).to include('</memoria_cliente>')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'escapes XML-unsafe chars in content' do
|
||||||
|
memories = [build_stubbed(:captain_contact_memory, content: 'texto com <tag> & ampersand')]
|
||||||
|
result = described_class.new(memories: memories).call
|
||||||
|
expect(result).to include('texto com <tag> & ampersand')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Reference in New Issue
Block a user