* update version
Browse files
app.py
CHANGED
@@ -41,6 +41,10 @@ Scanning prompt and output using [LLM Guard](https://laiyer-ai.github.io/llm-gua
|
|
41 |
|
42 |
scanner_type = st.sidebar.selectbox("Type", [PROMPT, OUTPUT], index=0)
|
43 |
|
|
|
|
|
|
|
|
|
44 |
enabled_scanners = None
|
45 |
settings = None
|
46 |
if scanner_type == PROMPT:
|
@@ -105,11 +109,11 @@ try:
|
|
105 |
start_time = time.monotonic()
|
106 |
if scanner_type == PROMPT:
|
107 |
st_result_text, results_valid, results_score = scan_prompt(
|
108 |
-
vault, enabled_scanners, settings, st_prompt_text
|
109 |
)
|
110 |
elif scanner_type == OUTPUT:
|
111 |
st_result_text, results_valid, results_score = scan_output(
|
112 |
-
vault, enabled_scanners, settings, st_prompt_text, st_output_text
|
113 |
)
|
114 |
end_time = time.monotonic()
|
115 |
st_time_delta = timedelta(seconds=end_time - start_time)
|
|
|
41 |
|
42 |
scanner_type = st.sidebar.selectbox("Type", [PROMPT, OUTPUT], index=0)
|
43 |
|
44 |
+
st_fail_fast = st.sidebar.checkbox(
|
45 |
+
"Fail fast", value=False, help="Stop scanning after first failure"
|
46 |
+
)
|
47 |
+
|
48 |
enabled_scanners = None
|
49 |
settings = None
|
50 |
if scanner_type == PROMPT:
|
|
|
109 |
start_time = time.monotonic()
|
110 |
if scanner_type == PROMPT:
|
111 |
st_result_text, results_valid, results_score = scan_prompt(
|
112 |
+
vault, enabled_scanners, settings, st_prompt_text, st_fail_fast
|
113 |
)
|
114 |
elif scanner_type == OUTPUT:
|
115 |
st_result_text, results_valid, results_score = scan_output(
|
116 |
+
vault, enabled_scanners, settings, st_prompt_text, st_output_text, st_fail_fast
|
117 |
)
|
118 |
end_time = time.monotonic()
|
119 |
st_time_delta = timedelta(seconds=end_time - start_time)
|
output.py
CHANGED
@@ -371,13 +371,22 @@ def get_scanner(scanner_name: str, vault: Vault, settings: Dict):
|
|
371 |
|
372 |
|
373 |
def scan(
|
374 |
-
vault: Vault,
|
|
|
|
|
|
|
|
|
|
|
375 |
) -> (str, Dict[str, bool], Dict[str, float]):
|
376 |
sanitized_output = text
|
377 |
results_valid = {}
|
378 |
results_score = {}
|
379 |
|
380 |
-
|
|
|
|
|
|
|
|
|
381 |
for scanner_name in enabled_scanners:
|
382 |
st.write(f"{scanner_name} scanner...")
|
383 |
scanner = get_scanner(
|
@@ -386,6 +395,10 @@ def scan(
|
|
386 |
sanitized_output, is_valid, risk_score = scanner.scan(prompt, sanitized_output)
|
387 |
results_valid[scanner_name] = is_valid
|
388 |
results_score[scanner_name] = risk_score
|
|
|
|
|
|
|
|
|
389 |
status.update(label="Scanning complete", state="complete", expanded=False)
|
390 |
|
391 |
return sanitized_output, results_valid, results_score
|
|
|
371 |
|
372 |
|
373 |
def scan(
|
374 |
+
vault: Vault,
|
375 |
+
enabled_scanners: List[str],
|
376 |
+
settings: Dict,
|
377 |
+
prompt: str,
|
378 |
+
text: str,
|
379 |
+
fail_fast: bool = False,
|
380 |
) -> (str, Dict[str, bool], Dict[str, float]):
|
381 |
sanitized_output = text
|
382 |
results_valid = {}
|
383 |
results_score = {}
|
384 |
|
385 |
+
status_text = "Scanning prompt..."
|
386 |
+
if fail_fast:
|
387 |
+
status_text = "Scanning prompt (fail fast mode)..."
|
388 |
+
|
389 |
+
with st.status(status_text, expanded=True) as status:
|
390 |
for scanner_name in enabled_scanners:
|
391 |
st.write(f"{scanner_name} scanner...")
|
392 |
scanner = get_scanner(
|
|
|
395 |
sanitized_output, is_valid, risk_score = scanner.scan(prompt, sanitized_output)
|
396 |
results_valid[scanner_name] = is_valid
|
397 |
results_score[scanner_name] = risk_score
|
398 |
+
|
399 |
+
if fail_fast and not is_valid:
|
400 |
+
break
|
401 |
+
|
402 |
status.update(label="Scanning complete", state="complete", expanded=False)
|
403 |
|
404 |
return sanitized_output, results_valid, results_score
|
prompt.py
CHANGED
@@ -320,19 +320,26 @@ def get_scanner(scanner_name: str, vault: Vault, settings: Dict):
|
|
320 |
|
321 |
|
322 |
def scan(
|
323 |
-
vault: Vault, enabled_scanners: List[str], settings: Dict, text: str
|
324 |
) -> (str, Dict[str, bool], Dict[str, float]):
|
325 |
sanitized_prompt = text
|
326 |
results_valid = {}
|
327 |
results_score = {}
|
328 |
|
329 |
-
|
|
|
|
|
|
|
|
|
330 |
for scanner_name in enabled_scanners:
|
331 |
st.write(f"{scanner_name} scanner...")
|
332 |
scanner = get_scanner(scanner_name, vault, settings[scanner_name])
|
333 |
sanitized_prompt, is_valid, risk_score = scanner.scan(sanitized_prompt)
|
334 |
results_valid[scanner_name] = is_valid
|
335 |
results_score[scanner_name] = risk_score
|
|
|
|
|
|
|
336 |
status.update(label="Scanning complete", state="complete", expanded=False)
|
337 |
|
338 |
return sanitized_prompt, results_valid, results_score
|
|
|
320 |
|
321 |
|
322 |
def scan(
|
323 |
+
vault: Vault, enabled_scanners: List[str], settings: Dict, text: str, fail_fast: bool = False
|
324 |
) -> (str, Dict[str, bool], Dict[str, float]):
|
325 |
sanitized_prompt = text
|
326 |
results_valid = {}
|
327 |
results_score = {}
|
328 |
|
329 |
+
status_text = "Scanning prompt..."
|
330 |
+
if fail_fast:
|
331 |
+
status_text = "Scanning prompt (fail fast mode)..."
|
332 |
+
|
333 |
+
with st.status(status_text, expanded=True) as status:
|
334 |
for scanner_name in enabled_scanners:
|
335 |
st.write(f"{scanner_name} scanner...")
|
336 |
scanner = get_scanner(scanner_name, vault, settings[scanner_name])
|
337 |
sanitized_prompt, is_valid, risk_score = scanner.scan(sanitized_prompt)
|
338 |
results_valid[scanner_name] = is_valid
|
339 |
results_score[scanner_name] = risk_score
|
340 |
+
|
341 |
+
if fail_fast and not is_valid:
|
342 |
+
break
|
343 |
status.update(label="Scanning complete", state="complete", expanded=False)
|
344 |
|
345 |
return sanitized_prompt, results_valid, results_score
|
requirements.txt
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
llm-guard==0.2.
|
2 |
pandas==2.1.0
|
3 |
streamlit==1.26.0
|
4 |
streamlit-tags==1.2.8
|
|
|
1 |
+
llm-guard==0.2.3
|
2 |
pandas==2.1.0
|
3 |
streamlit==1.26.0
|
4 |
streamlit-tags==1.2.8
|