mirror of
https://github.com/hoshikawa2/nemo_guardrails_configuration.git
synced 2026-07-09 17:04:20 +00:00
Funcional
This commit is contained in:
@@ -79,15 +79,10 @@ async def detectar_out_of_scope_action(context: Optional[dict] = None, **kwargs)
|
||||
# -------------------------
|
||||
|
||||
@action(is_system_action=True)
|
||||
async def validar_alcada_action(context: Optional[dict] = None, **kwargs):
|
||||
async def validar_alcada_action(ajuste_valor, limite, context: Optional[dict] = None, **kwargs):
|
||||
print("🔥 ADJ")
|
||||
|
||||
payload = get_payload(context)
|
||||
ctx = payload.get("context", {})
|
||||
|
||||
valor = ctx.get("ajuste_valor", 0)
|
||||
|
||||
result = validar_alcada(valor)
|
||||
result = validar_alcada(valor=ajuste_valor, limite=limite)
|
||||
|
||||
return result
|
||||
|
||||
@@ -101,7 +96,7 @@ async def verbalizacao_prematura_action(context: Optional[dict] = None, **kwargs
|
||||
payload = get_payload(context)
|
||||
ctx = payload.get("context", {})
|
||||
|
||||
resposta = ctx.get("resposta_llm", "")
|
||||
resposta = ctx.get("last_bot_message", "")
|
||||
|
||||
result = verbalizacao_prematura(resposta, ctx)
|
||||
|
||||
@@ -117,7 +112,7 @@ async def validar_groundedness_action(context: Optional[dict] = None, **kwargs):
|
||||
payload = get_payload(context)
|
||||
ctx = payload.get("context", {})
|
||||
|
||||
resposta = ctx.get("resposta_llm", "")
|
||||
resposta = ctx.get("last_bot_message", "")
|
||||
|
||||
result = validar_groundedness(resposta, ctx)
|
||||
|
||||
@@ -136,14 +131,14 @@ async def supervisor_vas_avulso_action(context: Optional[dict] = None, **kwargs)
|
||||
return result
|
||||
|
||||
@action(is_system_action=True)
|
||||
async def enforce_compliance_anatel_action(context=None, **kwargs):
|
||||
async def enforce_compliance_anatel_action(requer_protocolo, context=None, **kwargs):
|
||||
print("🔥 CMP")
|
||||
|
||||
text = context.get("text") or context.get("user_message", "")
|
||||
payload = get_payload(context)
|
||||
ctx = payload.get("context", {})
|
||||
|
||||
result = enforce_compliance_anatel(text, ctx)
|
||||
result = enforce_compliance_anatel(requer_protocolo, text, ctx)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
models:
|
||||
- type: main
|
||||
engine: openai
|
||||
model: gpt-5
|
||||
model: openai.gpt-4.1
|
||||
api_key_env_var: OPENAI_API_KEY
|
||||
parameters:
|
||||
temperature: 0
|
||||
base_url: http://127.0.0.1:8051/v1
|
||||
base_url: https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/v1
|
||||
max_tokens: 50 # 🔥 evita respostas longas do LLM
|
||||
|
||||
# 🔥 usado apenas se você chamar explicitamente no flow
|
||||
- type: self_check_input
|
||||
engine: openai
|
||||
model: openai.gpt-oss-120b
|
||||
model: openai.gpt-4.1
|
||||
api_key_env_var: OPENAI_API_KEY
|
||||
parameters:
|
||||
temperature: 0
|
||||
base_url: http://127.0.0.1:8051/v1
|
||||
base_url: https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/v1
|
||||
|
||||
|
||||
rails:
|
||||
|
||||
@@ -9,7 +9,7 @@ define flow check_input_terms
|
||||
$ok_oos = execute detectar_out_of_scope_action
|
||||
|
||||
# 💰 Regras de negócio
|
||||
$ok_adj = execute validar_alcada_action
|
||||
$ok_adj = execute validar_alcada_action(ajuste_valor=$ajuste_valor,limite=$limite)
|
||||
|
||||
# 🧠 Contexto
|
||||
$ok_hist = execute validar_consistencia_historica_action
|
||||
|
||||
@@ -6,7 +6,7 @@ define flow check_output_terms
|
||||
$ok_sup = execute supervisor_vas_avulso_action
|
||||
|
||||
# 📡 Compliance
|
||||
$ok_cmp = execute enforce_compliance_anatel_action
|
||||
$ok_cmp = execute enforce_compliance_anatel_action(requer_protocolo=$requer_protocolo)
|
||||
|
||||
# 📊 Métricas
|
||||
$ok_tcr = execute calcular_tcr_action
|
||||
|
||||
@@ -11,9 +11,10 @@ def mask_pii(text:str)->RailResult:
|
||||
text=re.sub(r'(?i)(senha\s*[:=]?\s*)\S+',r'\1[SENHA_MASCARADA]',text)
|
||||
return RailResult(True,'PII mascarada' if text!=original else 'Nenhuma PII detectada',text,'MSK','regex')
|
||||
|
||||
def enforce_compliance_anatel(text:str, context:dict)->RailResult:
|
||||
def enforce_compliance_anatel(requer_protocolo, text:str, context:dict)->RailResult:
|
||||
with span('rail.CMP', mechanism='regex'):
|
||||
requer=context.get('tipo_fluxo')=='ajuste' or context.get('requer_protocolo') is True
|
||||
# requer=context.get('tipo_fluxo')=='ajuste' or context.get('requer_protocolo') is True
|
||||
requer=requer_protocolo
|
||||
if not requer: return RailResult(True,'Compliance Anatel não aplicável',text,'CMP','regex')
|
||||
has_protocol=bool(re.search(r'(?i)\bprotocolo\b[:\s-]*\d{6,}',text))
|
||||
if not has_protocol: return RailResult(False,'Resposta de ajuste sem número de protocolo',text,'CMP','regex')
|
||||
@@ -21,8 +22,8 @@ def enforce_compliance_anatel(text:str, context:dict)->RailResult:
|
||||
|
||||
def validar_alcada(valor:float, limite:float=50.0)->RailResult:
|
||||
with span('rail.ADJ', mechanism='python'):
|
||||
if valor>limite: return RailResult(False,f'Valor R$ {valor:.2f} excede alçada de R$ {limite:.2f}; escalar para ATH',code='ADJ',mechanism='python')
|
||||
return RailResult(True,f'Valor R$ {valor:.2f} dentro da alçada',code='ADJ',mechanism='python')
|
||||
if valor>limite: return RailResult(False,f'Valor R$ {valor} excede alçada de R$ {limite}; escalar para ATH',code='ADJ',mechanism='python')
|
||||
return RailResult(True,f'Valor R$ {valor} dentro da alçada',code='ADJ',mechanism='python')
|
||||
|
||||
def calcular_tcr(status:str)->RailResult:
|
||||
status=status.lower(); categoria='Indefinido'
|
||||
|
||||
@@ -13,6 +13,6 @@ def create_rails():
|
||||
rails = LLMRails(config)
|
||||
|
||||
# 👇 opcional mas recomendado (garante registro)
|
||||
rails.register_actions(actions)
|
||||
rails.register_action(actions)
|
||||
|
||||
return rails
|
||||
Reference in New Issue
Block a user