mirror of
https://github.com/lightbroker/llmsecops-research.git
synced 2026-07-06 21:17:51 +02:00
more updates for reflexion
This commit is contained in:
@@ -178,11 +178,15 @@ def prompt_injection_example_service(prompt_injection_example_repository):
|
||||
@pytest.fixture(scope="session")
|
||||
def reflexion_guardrails(
|
||||
foundation_model,
|
||||
semantic_similarity_service,
|
||||
prompt_injection_example_service,
|
||||
response_processing_service,
|
||||
prompt_template_service,
|
||||
llm_configuration_introspection_service):
|
||||
return ReflexionSecurityGuardrailsService(
|
||||
foundation_model=foundation_model,
|
||||
semantic_similarity_service=semantic_similarity_service,
|
||||
prompt_injection_example_service=prompt_injection_example_service,
|
||||
response_processing_service=response_processing_service,
|
||||
prompt_template_service=prompt_template_service,
|
||||
llm_configuration_introspection_service=llm_configuration_introspection_service
|
||||
|
||||
@@ -1,270 +0,0 @@
|
||||
"""
|
||||
pytest -v tests/integration/test_domain.py
|
||||
"""
|
||||
|
||||
import pytest
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
from src.text_generation.domain.guardrails_result import GuardrailsResult
|
||||
from src.text_generation.domain.guidelines_result import GuidelinesResult
|
||||
from src.text_generation.domain.original_completion_result import OriginalCompletionResult
|
||||
from src.text_generation.domain.text_generation_completion_result import TextGenerationCompletionResult
|
||||
|
||||
|
||||
class TestTextGenerationCompletionResult:
|
||||
"""Test suite for TextGenerationCompletionResult and related classes."""
|
||||
|
||||
@pytest.fixture
|
||||
def sample_llm_config(self):
|
||||
"""Sample LLM configuration for testing."""
|
||||
return {
|
||||
"model": "test-model",
|
||||
"temperature": 0.7,
|
||||
"max_tokens": 100
|
||||
}
|
||||
|
||||
@pytest.fixture
|
||||
def sample_full_prompt(self):
|
||||
"""Sample full prompt for testing."""
|
||||
return {
|
||||
"system": "You are a helpful assistant",
|
||||
"user": "Test prompt"
|
||||
}
|
||||
|
||||
def test_original_result_only(self, sample_llm_config, sample_full_prompt):
|
||||
"""Test TextGenerationCompletionResult with only original result filled in."""
|
||||
# Arrange
|
||||
original_result = OriginalCompletionResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Original completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
original_result.cosine_similarity_score=0.5
|
||||
original_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
completion_result = TextGenerationCompletionResult(
|
||||
original_result=original_result,
|
||||
guidelines_result=None,
|
||||
guardrails_result=None
|
||||
)
|
||||
|
||||
# Act
|
||||
final_text = completion_result.finalize()
|
||||
|
||||
# Assert
|
||||
assert final_text == "Original completion text"
|
||||
assert original_result.user_prompt == "Test user prompt"
|
||||
assert original_result.llm_config == sample_llm_config
|
||||
assert not original_result.is_completion_malicious() # 0.5 < 0.7
|
||||
|
||||
def test_guidelines_and_original_guidelines_precedence(self, sample_llm_config, sample_full_prompt):
|
||||
"""Test that guidelines result takes precedence over original when both are present."""
|
||||
# Arrange
|
||||
original_result = OriginalCompletionResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Original completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
original_result.cosine_similarity_score=0.8
|
||||
original_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
guidelines_result = GuidelinesResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Guidelines processed completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
guidelines_result.cosine_similarity_score=0.6
|
||||
guidelines_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
completion_result = TextGenerationCompletionResult(
|
||||
original_result=original_result,
|
||||
guidelines_result=guidelines_result,
|
||||
guardrails_result=None
|
||||
)
|
||||
|
||||
# Act
|
||||
final_text = completion_result.finalize()
|
||||
|
||||
# Assert
|
||||
assert final_text == "Guidelines processed completion text"
|
||||
assert original_result.is_completion_malicious() # 0.8 >= 0.7
|
||||
assert not guidelines_result.is_original_completion_malicious() # 0.6 < 0.7
|
||||
|
||||
def test_guardrails_guidelines_original_guardrails_precedence(self, sample_llm_config, sample_full_prompt):
|
||||
"""Test that guardrails result takes precedence when all three are present."""
|
||||
# Arrange
|
||||
original_result = OriginalCompletionResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Original completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
original_result.cosine_similarity_score=0.9
|
||||
original_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
guidelines_result = GuidelinesResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Guidelines processed completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
guidelines_result.cosine_similarity_score=0.8
|
||||
guidelines_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
guardrails_result = GuardrailsResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Guardrails processed completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
completion_result = TextGenerationCompletionResult(
|
||||
original_result=original_result,
|
||||
guidelines_result=guidelines_result,
|
||||
guardrails_result=guardrails_result
|
||||
)
|
||||
|
||||
# Act
|
||||
final_text = completion_result.finalize()
|
||||
|
||||
# Assert
|
||||
assert final_text == "Guardrails processed completion text"
|
||||
assert original_result.is_completion_malicious() # 0.9 >= 0.7
|
||||
assert guidelines_result.is_original_completion_malicious() # 0.8 >= 0.7
|
||||
|
||||
def test_empty_completion_fallback_behavior(self, sample_llm_config, sample_full_prompt):
|
||||
"""Test fallback behavior when some completion texts are empty."""
|
||||
# Arrange - guardrails has empty text, should fall back to guidelines
|
||||
original_result = OriginalCompletionResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Original completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
original_result.cosine_similarity_score=0.5
|
||||
original_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
guidelines_result = GuidelinesResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Guidelines processed completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
guidelines_result.cosine_similarity_score=0.6
|
||||
guidelines_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
guardrails_result = GuardrailsResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="", # Empty string
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
completion_result = TextGenerationCompletionResult(
|
||||
original_result=original_result,
|
||||
guidelines_result=guidelines_result,
|
||||
guardrails_result=guardrails_result
|
||||
)
|
||||
|
||||
# Act
|
||||
final_text = completion_result.finalize()
|
||||
|
||||
# Assert
|
||||
assert final_text == "Guidelines processed completion text"
|
||||
|
||||
def test_whitespace_only_completion_fallback(self, sample_llm_config, sample_full_prompt):
|
||||
"""Test fallback behavior when completion text is only whitespace."""
|
||||
# Arrange
|
||||
original_result = OriginalCompletionResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Original completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
original_result.cosine_similarity_score=0.5
|
||||
original_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
guidelines_result = GuidelinesResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text=" \n\t ", # Whitespace only
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
guidelines_result.cosine_similarity_score=0.6
|
||||
guidelines_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
completion_result = TextGenerationCompletionResult(
|
||||
original_result=original_result,
|
||||
guidelines_result=guidelines_result,
|
||||
guardrails_result=None
|
||||
)
|
||||
|
||||
# Act
|
||||
final_text = completion_result.finalize()
|
||||
|
||||
# Assert
|
||||
assert final_text == "Original completion text"
|
||||
|
||||
def test_all_empty_completions_returns_empty_string(self, sample_llm_config, sample_full_prompt):
|
||||
"""Test that empty string is returned when all completions are empty."""
|
||||
# Arrange
|
||||
original_result = OriginalCompletionResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
original_result.cosine_similarity_score=0.5
|
||||
original_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
completion_result = TextGenerationCompletionResult(
|
||||
original_result=original_result,
|
||||
guidelines_result=None,
|
||||
guardrails_result=None
|
||||
)
|
||||
|
||||
# Act
|
||||
final_text = completion_result.finalize()
|
||||
|
||||
# Assert
|
||||
assert final_text == ""
|
||||
|
||||
def test_risk_threshold_boundary_conditions(self, sample_llm_config, sample_full_prompt):
|
||||
"""Test boundary conditions for risk threshold (exactly 0.7)."""
|
||||
# Test score exactly at threshold
|
||||
original_result_at_threshold = OriginalCompletionResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Original completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
original_result_at_threshold.cosine_similarity_score=0.7
|
||||
original_result_at_threshold.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
# Test score just below threshold
|
||||
guidelines_result_below_threshold = GuidelinesResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Guidelines completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config,
|
||||
cosine_similarity_score=0.699999, # Just below threshold
|
||||
cosine_similarity_risk_threshold=0.7
|
||||
)
|
||||
|
||||
# Assert
|
||||
assert original_result_at_threshold.is_completion_malicious() # 0.7 >= 0.7
|
||||
assert not guidelines_result_below_threshold.is_original_completion_malicious() # 0.699999 < 0.7
|
||||
@@ -45,7 +45,8 @@ def run_prompt_analysis_test(
|
||||
completion_result: TextGenerationCompletionResult = configured_service.invoke(user_prompt=prompt)
|
||||
|
||||
print(f'analyzing result')
|
||||
result: SemanticSimilarityResult = semantic_similarity_service.analyze(completion_result.final)
|
||||
completion_result.finalize_completion_text()
|
||||
result: SemanticSimilarityResult = semantic_similarity_service.analyze(completion_result.final_completion_text)
|
||||
|
||||
print(f'{i}/{len(prompts)} Max Score: {result.max}')
|
||||
print(f'{i}/{len(prompts)} Avg Score: {result.mean}')
|
||||
@@ -53,11 +54,11 @@ def run_prompt_analysis_test(
|
||||
TestRunLoggingService(test_id=test_id).log_results(
|
||||
id=inspect.currentframe().f_back.f_code.co_name,
|
||||
prompt=prompt,
|
||||
completion=completion_result.original_completion,
|
||||
final_completion=completion_result.final_completion_text,
|
||||
is_rag_few_shot_enabled=text_generation_completion_service.is_rag_context_enabled(),
|
||||
is_cot_enabled=text_generation_completion_service.is_chain_of_thought_enabled(),
|
||||
is_reflexion_enabled=text_generation_completion_service.is_reflexion_enabled(),
|
||||
llm_config=completion_result.guidelines_processed_completion.llm_config,
|
||||
original_llm_config=completion_result.original_result.llm_config,
|
||||
scores=result.scores,
|
||||
mean=result.mean,
|
||||
max=result.max
|
||||
|
||||
@@ -208,7 +208,7 @@ def test_example_with_fluent_service_call(
|
||||
TestRunLoggingService(test_id=10).log_results(
|
||||
id=inspect.currentframe().f_code.co_name,
|
||||
prompt=prompt,
|
||||
completion=completion_result.original_completion,
|
||||
final_completion=completion_result.original_completion,
|
||||
is_rag_few_shot_enabled=text_generation_completion_service.is_rag_context_enabled(),
|
||||
is_cot_enabled=text_generation_completion_service.is_chain_of_thought_enabled(),
|
||||
is_reflexion_enabled=text_generation_completion_service.is_reflexion_enabled(),
|
||||
|
||||
+272
-9
@@ -1,13 +1,276 @@
|
||||
"""
|
||||
pytest -v tests/integration/test_domain.py
|
||||
"""
|
||||
|
||||
import pytest
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
from src.text_generation.domain.guardrails_result import GuardrailsResult
|
||||
from src.text_generation.domain.guidelines_result import GuidelinesResult
|
||||
from src.text_generation.domain.original_completion_result import OriginalCompletionResult
|
||||
from src.text_generation.domain.text_generation_completion_result import TextGenerationCompletionResult
|
||||
|
||||
|
||||
@pytest.mark.unit
|
||||
def test_guardrail_analyzed_response():
|
||||
response = GuardrailsResult(
|
||||
cosine_similarity_score=0.72839,
|
||||
cosine_similarity_risk_threshold=0.5,
|
||||
original_completion="compromised response",
|
||||
guardrails_processed_completion_text="I can't answer that"
|
||||
)
|
||||
assert response.is_original_completion_malicious == True
|
||||
class TestTextGenerationCompletionResult:
|
||||
"""Test suite for TextGenerationCompletionResult and related classes."""
|
||||
|
||||
@pytest.fixture
|
||||
def sample_llm_config(self):
|
||||
"""Sample LLM configuration for testing."""
|
||||
return {
|
||||
"model": "test-model",
|
||||
"temperature": 0.7,
|
||||
"max_tokens": 100
|
||||
}
|
||||
|
||||
@pytest.fixture
|
||||
def sample_full_prompt(self):
|
||||
"""Sample full prompt for testing."""
|
||||
return {
|
||||
"system": "You are a helpful assistant",
|
||||
"user": "Test prompt"
|
||||
}
|
||||
|
||||
def test_original_result_only(self, sample_llm_config, sample_full_prompt):
|
||||
"""Test TextGenerationCompletionResult with only original result filled in."""
|
||||
# Arrange
|
||||
original_result = OriginalCompletionResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Original completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
original_result.cosine_similarity_score=0.5
|
||||
original_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
completion_result = TextGenerationCompletionResult(
|
||||
original_result=original_result,
|
||||
guidelines_result=None,
|
||||
guardrails_result=None
|
||||
)
|
||||
|
||||
# Act
|
||||
completion_result.finalize_completion_text()
|
||||
final_text = completion_result.final_completion_text
|
||||
|
||||
# Assert
|
||||
assert final_text == "Original completion text"
|
||||
assert original_result.user_prompt == "Test user prompt"
|
||||
assert original_result.llm_config == sample_llm_config
|
||||
assert not original_result.is_completion_malicious() # 0.5 < 0.7
|
||||
|
||||
def test_guidelines_and_original_guidelines_precedence(self, sample_llm_config, sample_full_prompt):
|
||||
"""Test that guidelines result takes precedence over original when both are present."""
|
||||
# Arrange
|
||||
original_result = OriginalCompletionResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Original completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
original_result.cosine_similarity_score=0.8
|
||||
original_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
guidelines_result = GuidelinesResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Guidelines processed completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
guidelines_result.cosine_similarity_score=0.6
|
||||
guidelines_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
completion_result = TextGenerationCompletionResult(
|
||||
original_result=original_result,
|
||||
guidelines_result=guidelines_result,
|
||||
guardrails_result=None
|
||||
)
|
||||
|
||||
# Act
|
||||
completion_result.finalize_completion_text()
|
||||
final_text = completion_result.final_completion_text
|
||||
|
||||
# Assert
|
||||
assert final_text == "Guidelines processed completion text"
|
||||
assert original_result.is_completion_malicious() # 0.8 >= 0.7
|
||||
assert not guidelines_result.is_completion_malicious() # 0.6 < 0.7
|
||||
|
||||
def test_guardrails_guidelines_original_guardrails_precedence(self, sample_llm_config, sample_full_prompt):
|
||||
"""Test that guardrails result takes precedence when all three are present."""
|
||||
# Arrange
|
||||
original_result = OriginalCompletionResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Original completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
original_result.cosine_similarity_score=0.9
|
||||
original_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
guidelines_result = GuidelinesResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Guidelines processed completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
guidelines_result.cosine_similarity_score=0.8
|
||||
guidelines_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
guardrails_result = GuardrailsResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Guardrails processed completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
completion_result = TextGenerationCompletionResult(
|
||||
original_result=original_result,
|
||||
guidelines_result=guidelines_result,
|
||||
guardrails_result=guardrails_result
|
||||
)
|
||||
|
||||
# Act
|
||||
completion_result.finalize_completion_text()
|
||||
final_text = completion_result.final_completion_text
|
||||
|
||||
# Assert
|
||||
assert final_text == "Guardrails processed completion text"
|
||||
assert original_result.is_completion_malicious() # 0.9 >= 0.7
|
||||
assert guidelines_result.is_completion_malicious() # 0.8 >= 0.7
|
||||
|
||||
def test_empty_completion_fallback_behavior(self, sample_llm_config, sample_full_prompt):
|
||||
"""Test fallback behavior when some completion texts are empty."""
|
||||
# Arrange - guardrails has empty text, should fall back to guidelines
|
||||
original_result = OriginalCompletionResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Original completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
original_result.cosine_similarity_score=0.5
|
||||
original_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
guidelines_result = GuidelinesResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Guidelines processed completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
guidelines_result.cosine_similarity_score=0.6
|
||||
guidelines_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
guardrails_result = GuardrailsResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="", # Empty string
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
completion_result = TextGenerationCompletionResult(
|
||||
original_result=original_result,
|
||||
guidelines_result=guidelines_result,
|
||||
guardrails_result=guardrails_result
|
||||
)
|
||||
|
||||
# Act
|
||||
completion_result.finalize_completion_text()
|
||||
final_text = completion_result.final_completion_text
|
||||
|
||||
# Assert
|
||||
assert final_text == "Guidelines processed completion text"
|
||||
|
||||
def test_whitespace_only_completion_fallback(self, sample_llm_config, sample_full_prompt):
|
||||
"""Test fallback behavior when completion text is only whitespace."""
|
||||
# Arrange
|
||||
original_result = OriginalCompletionResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Original completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
original_result.cosine_similarity_score=0.5
|
||||
original_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
guidelines_result = GuidelinesResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text=" \n\t ", # Whitespace only
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
guidelines_result.cosine_similarity_score=0.6
|
||||
guidelines_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
completion_result = TextGenerationCompletionResult(
|
||||
original_result=original_result,
|
||||
guidelines_result=guidelines_result,
|
||||
guardrails_result=None
|
||||
)
|
||||
|
||||
# Act
|
||||
completion_result.finalize_completion_text()
|
||||
final_text = completion_result.final_completion_text
|
||||
|
||||
# Assert
|
||||
assert final_text == "Original completion text"
|
||||
|
||||
def test_all_empty_completions_returns_empty_string(self, sample_llm_config, sample_full_prompt):
|
||||
"""Test that empty string is returned when all completions are empty."""
|
||||
# Arrange
|
||||
original_result = OriginalCompletionResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
original_result.cosine_similarity_score=0.5
|
||||
original_result.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
completion_result = TextGenerationCompletionResult(
|
||||
original_result=original_result,
|
||||
guidelines_result=None,
|
||||
guardrails_result=None
|
||||
)
|
||||
|
||||
# Act
|
||||
completion_result.finalize_completion_text()
|
||||
final_text = completion_result.final_completion_text
|
||||
|
||||
# Assert
|
||||
assert final_text == ""
|
||||
|
||||
def test_risk_threshold_boundary_conditions(self, sample_llm_config, sample_full_prompt):
|
||||
"""Test boundary conditions for risk threshold (exactly 0.7)."""
|
||||
# Test score exactly at threshold
|
||||
original_result_at_threshold = OriginalCompletionResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Original completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config
|
||||
)
|
||||
|
||||
original_result_at_threshold.cosine_similarity_score=0.7
|
||||
original_result_at_threshold.cosine_similarity_risk_threshold=0.7
|
||||
|
||||
# Test score just below threshold
|
||||
guidelines_result_below_threshold = GuidelinesResult(
|
||||
user_prompt="Test user prompt",
|
||||
completion_text="Guidelines completion text",
|
||||
full_prompt=sample_full_prompt,
|
||||
llm_config=sample_llm_config,
|
||||
cosine_similarity_score=0.699999, # Just below threshold
|
||||
cosine_similarity_risk_threshold=0.7
|
||||
)
|
||||
|
||||
# Assert
|
||||
assert original_result_at_threshold.is_completion_malicious() # 0.7 >= 0.7
|
||||
assert not guidelines_result_below_threshold.is_completion_malicious() # 0.699999 < 0.7
|
||||
Reference in New Issue
Block a user