From b0613d54ab918c4b522c96e1be416d054bef5781 Mon Sep 17 00:00:00 2001 From: "cristiano.hoshikawa" Date: Wed, 9 Sep 2026 19:05:12 -0300 Subject: [PATCH] adding: OUTPUT_FILENAME_PATTERN --- .DS_Store | Bin 10244 -> 0 bytes .env.example | 3 +- Dockerfile | 0 Documentation/llm-as-a-judge.pdf | Bin README.en-US.md | 12 +++++++- README.md | 12 +++++++- configs/.DS_Store | Bin 6148 -> 0 bytes configs/identity.yaml | 0 configs/judge/agents.yaml | 0 configs/judge/session_metrics.yaml | 0 configs/judge/storage.yaml | 0 configs/judge/trace_metrics.yaml | 0 .../langfuse_credentials.example.yaml | 0 configs/llm_profiles/llm_profiles.yaml | 0 deploy/.DS_Store | Bin 6148 -> 0 bytes deploy/README.md | 0 deploy/env/evaluator.env.example | 1 + deploy/k8s/.DS_Store | Bin 6148 -> 0 bytes deploy/k8s/base/configmap.yaml | 1 + deploy/k8s/base/cronjob.yaml | 0 deploy/k8s/base/init-db-job.yaml | 0 deploy/k8s/base/kustomization.yaml | 0 deploy/k8s/base/monitor-deployment.yaml | 0 deploy/k8s/base/monitor-service.yaml | 0 deploy/k8s/base/namespace.yaml | 0 deploy/k8s/base/secret-template.yaml | 0 deploy/k8s/base/serviceaccount.yaml | 0 deploy/k8s/overlays/dev/kustomization.yaml | 0 deploy/k8s/overlays/hml/kustomization.yaml | 0 deploy/k8s/overlays/prod/kustomization.yaml | 0 .../langfuse_credentials.example.yaml | 0 deploy/scripts/build-push.sh | 0 deploy/scripts/common.sh | 0 deploy/scripts/create-secrets.sh | 0 deploy/scripts/deploy.sh | 0 deploy/scripts/run-now.sh | 0 deploy/scripts/status.sh | 0 deploy/scripts/undeploy.sh | 0 evaluator/.DS_Store | Bin 8196 -> 0 bytes evaluator/__init__.py | 0 .../__pycache__/__init__.cpython-313.pyc | Bin evaluator/__pycache__/cli.cpython-313.pyc | Bin evaluator/__pycache__/engine.cpython-313.pyc | Bin .../__pycache__/time_utils.cpython-313.pyc | Bin evaluator/analytics/__init__.py | 0 .../__pycache__/__init__.cpython-313.pyc | Bin .../__pycache__/vloop.cpython-313.pyc | Bin evaluator/analytics/vloop.py | 0 evaluator/cli.py | 0 .../agent_framework.cpython-313.pyc | Bin .../__pycache__/base.cpython-313.pyc | Bin .../__pycache__/langfuse.cpython-313.pyc | Bin .../langfuse_credentials.cpython-313.pyc | Bin .../__pycache__/mock.cpython-313.pyc | Bin evaluator/collectors/agent_framework.py | 0 evaluator/collectors/base.py | 0 evaluator/collectors/langfuse.py | 0 evaluator/collectors/langfuse_credentials.py | 0 evaluator/collectors/mock.py | 0 .../config/__pycache__/agents.cpython-313.pyc | Bin .../__pycache__/settings.cpython-313.pyc | Bin evaluator/config/agents.py | 0 evaluator/config/settings.py | 4 +++ .../core/__pycache__/models.cpython-313.pyc | Bin evaluator/core/models.py | 0 evaluator/engine.py | 0 .../__pycache__/resolver.cpython-313.pyc | Bin evaluator/identity/resolver.py | 0 .../__pycache__/llm_judge.cpython-313.pyc | Bin evaluator/judges/llm_judge.py | 0 .../llm/__pycache__/client.cpython-313.pyc | Bin .../profile_resolver.cpython-313.pyc | Bin evaluator/llm/client.py | 0 evaluator/llm/profile_resolver.py | 0 .../legacy_exporter.cpython-313.pyc | Bin evaluator/output/legacy_exporter.py | 27 +++++++++++++++++- .../__pycache__/oracle_store.cpython-313.pyc | Bin .../__pycache__/repository.cpython-313.pyc | Bin evaluator/persistence/oracle_store.py | 0 evaluator/persistence/repository.py | 0 .../__pycache__/loader.cpython-313.pyc | Bin evaluator/prompts/loader.py | 0 .../__pycache__/gcs_export.cpython-313.pyc | Bin .../langfuse_job_audit.cpython-313.pyc | Bin .../langfuse_scores.cpython-313.pyc | Bin evaluator/publishers/gcs_export.py | 0 evaluator/publishers/langfuse_job_audit.py | 0 evaluator/publishers/langfuse_scores.py | 0 evaluator/time_utils.py | 0 evaluator_monitor/__init__.py | 0 .../__pycache__/__init__.cpython-313.pyc | Bin .../__pycache__/app.cpython-313.pyc | Bin evaluator_monitor/app.py | 0 pyproject.toml | 0 tests/__init__.py | 0 tests/__pycache__/__init__.cpython-313.pyc | Bin ...im_compliance.cpython-313-pytest-9.0.2.pyc | Bin ...or_and_run_id.cpython-313-pytest-9.0.2.pyc | Bin ...uct_hardcodes.cpython-313-pytest-9.0.2.pyc | Bin ...test_tim_spec.cpython-313-pytest-9.0.2.pyc | Bin tests/test_full_tim_compliance.py | 0 tests/test_monitor_and_run_id.py | 0 tests/test_no_product_hardcodes.py | 0 tests/test_tim_spec.py | 16 ++++++++++- 104 files changed, 71 insertions(+), 5 deletions(-) delete mode 100644 .DS_Store mode change 100644 => 100755 .env.example mode change 100644 => 100755 Dockerfile mode change 100644 => 100755 Documentation/llm-as-a-judge.pdf mode change 100644 => 100755 README.en-US.md mode change 100644 => 100755 README.md delete mode 100644 configs/.DS_Store mode change 100644 => 100755 configs/identity.yaml mode change 100644 => 100755 configs/judge/agents.yaml mode change 100644 => 100755 configs/judge/session_metrics.yaml mode change 100644 => 100755 configs/judge/storage.yaml mode change 100644 => 100755 configs/judge/trace_metrics.yaml mode change 100644 => 100755 configs/langfuse/langfuse_credentials.example.yaml mode change 100644 => 100755 configs/llm_profiles/llm_profiles.yaml delete mode 100644 deploy/.DS_Store mode change 100644 => 100755 deploy/README.md mode change 100644 => 100755 deploy/env/evaluator.env.example delete mode 100644 deploy/k8s/.DS_Store mode change 100644 => 100755 deploy/k8s/base/configmap.yaml mode change 100644 => 100755 deploy/k8s/base/cronjob.yaml mode change 100644 => 100755 deploy/k8s/base/init-db-job.yaml mode change 100644 => 100755 deploy/k8s/base/kustomization.yaml mode change 100644 => 100755 deploy/k8s/base/monitor-deployment.yaml mode change 100644 => 100755 deploy/k8s/base/monitor-service.yaml mode change 100644 => 100755 deploy/k8s/base/namespace.yaml mode change 100644 => 100755 deploy/k8s/base/secret-template.yaml mode change 100644 => 100755 deploy/k8s/base/serviceaccount.yaml mode change 100644 => 100755 deploy/k8s/overlays/dev/kustomization.yaml mode change 100644 => 100755 deploy/k8s/overlays/hml/kustomization.yaml mode change 100644 => 100755 deploy/k8s/overlays/prod/kustomization.yaml mode change 100644 => 100755 deploy/langfuse/langfuse_credentials.example.yaml mode change 100644 => 100755 deploy/scripts/build-push.sh mode change 100644 => 100755 deploy/scripts/common.sh mode change 100644 => 100755 deploy/scripts/create-secrets.sh mode change 100644 => 100755 deploy/scripts/deploy.sh mode change 100644 => 100755 deploy/scripts/run-now.sh mode change 100644 => 100755 deploy/scripts/status.sh mode change 100644 => 100755 deploy/scripts/undeploy.sh delete mode 100644 evaluator/.DS_Store mode change 100644 => 100755 evaluator/__init__.py mode change 100644 => 100755 evaluator/__pycache__/__init__.cpython-313.pyc mode change 100644 => 100755 evaluator/__pycache__/cli.cpython-313.pyc mode change 100644 => 100755 evaluator/__pycache__/engine.cpython-313.pyc mode change 100644 => 100755 evaluator/__pycache__/time_utils.cpython-313.pyc mode change 100644 => 100755 evaluator/analytics/__init__.py mode change 100644 => 100755 evaluator/analytics/__pycache__/__init__.cpython-313.pyc mode change 100644 => 100755 evaluator/analytics/__pycache__/vloop.cpython-313.pyc mode change 100644 => 100755 evaluator/analytics/vloop.py mode change 100644 => 100755 evaluator/cli.py mode change 100644 => 100755 evaluator/collectors/__pycache__/agent_framework.cpython-313.pyc mode change 100644 => 100755 evaluator/collectors/__pycache__/base.cpython-313.pyc mode change 100644 => 100755 evaluator/collectors/__pycache__/langfuse.cpython-313.pyc mode change 100644 => 100755 evaluator/collectors/__pycache__/langfuse_credentials.cpython-313.pyc mode change 100644 => 100755 evaluator/collectors/__pycache__/mock.cpython-313.pyc mode change 100644 => 100755 evaluator/collectors/agent_framework.py mode change 100644 => 100755 evaluator/collectors/base.py mode change 100644 => 100755 evaluator/collectors/langfuse.py mode change 100644 => 100755 evaluator/collectors/langfuse_credentials.py mode change 100644 => 100755 evaluator/collectors/mock.py mode change 100644 => 100755 evaluator/config/__pycache__/agents.cpython-313.pyc mode change 100644 => 100755 evaluator/config/__pycache__/settings.cpython-313.pyc mode change 100644 => 100755 evaluator/config/agents.py mode change 100644 => 100755 evaluator/config/settings.py mode change 100644 => 100755 evaluator/core/__pycache__/models.cpython-313.pyc mode change 100644 => 100755 evaluator/core/models.py mode change 100644 => 100755 evaluator/engine.py mode change 100644 => 100755 evaluator/identity/__pycache__/resolver.cpython-313.pyc mode change 100644 => 100755 evaluator/identity/resolver.py mode change 100644 => 100755 evaluator/judges/__pycache__/llm_judge.cpython-313.pyc mode change 100644 => 100755 evaluator/judges/llm_judge.py mode change 100644 => 100755 evaluator/llm/__pycache__/client.cpython-313.pyc mode change 100644 => 100755 evaluator/llm/__pycache__/profile_resolver.cpython-313.pyc mode change 100644 => 100755 evaluator/llm/client.py mode change 100644 => 100755 evaluator/llm/profile_resolver.py mode change 100644 => 100755 evaluator/output/__pycache__/legacy_exporter.cpython-313.pyc mode change 100644 => 100755 evaluator/output/legacy_exporter.py mode change 100644 => 100755 evaluator/persistence/__pycache__/oracle_store.cpython-313.pyc mode change 100644 => 100755 evaluator/persistence/__pycache__/repository.cpython-313.pyc mode change 100644 => 100755 evaluator/persistence/oracle_store.py mode change 100644 => 100755 evaluator/persistence/repository.py mode change 100644 => 100755 evaluator/prompts/__pycache__/loader.cpython-313.pyc mode change 100644 => 100755 evaluator/prompts/loader.py mode change 100644 => 100755 evaluator/publishers/__pycache__/gcs_export.cpython-313.pyc mode change 100644 => 100755 evaluator/publishers/__pycache__/langfuse_job_audit.cpython-313.pyc mode change 100644 => 100755 evaluator/publishers/__pycache__/langfuse_scores.cpython-313.pyc mode change 100644 => 100755 evaluator/publishers/gcs_export.py mode change 100644 => 100755 evaluator/publishers/langfuse_job_audit.py mode change 100644 => 100755 evaluator/publishers/langfuse_scores.py mode change 100644 => 100755 evaluator/time_utils.py mode change 100644 => 100755 evaluator_monitor/__init__.py mode change 100644 => 100755 evaluator_monitor/__pycache__/__init__.cpython-313.pyc mode change 100644 => 100755 evaluator_monitor/__pycache__/app.cpython-313.pyc mode change 100644 => 100755 evaluator_monitor/app.py mode change 100644 => 100755 pyproject.toml mode change 100644 => 100755 tests/__init__.py mode change 100644 => 100755 tests/__pycache__/__init__.cpython-313.pyc mode change 100644 => 100755 tests/__pycache__/test_full_tim_compliance.cpython-313-pytest-9.0.2.pyc mode change 100644 => 100755 tests/__pycache__/test_monitor_and_run_id.cpython-313-pytest-9.0.2.pyc mode change 100644 => 100755 tests/__pycache__/test_no_product_hardcodes.cpython-313-pytest-9.0.2.pyc mode change 100644 => 100755 tests/__pycache__/test_tim_spec.cpython-313-pytest-9.0.2.pyc mode change 100644 => 100755 tests/test_full_tim_compliance.py mode change 100644 => 100755 tests/test_monitor_and_run_id.py mode change 100644 => 100755 tests/test_no_product_hardcodes.py mode change 100644 => 100755 tests/test_tim_spec.py diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 5cf0f444884a20a595d005db3a209ca3f4b2f412..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeHMYitx%6uxJ=ZD%Y)r#z%viYyedN|91Zd5YV1QQCr3wr`Mjc4ufO%+A!E+1)}V zsS(s@LWu9j4*|O8eQu$%T%uQy_ zz2|Z7x!;^~=iV7Y2-GE{rGx|sAuL{$3RCblPN8yojVX-72_OZuCu;A~a8!@=kJ0oP z9s(W$9s(W$9s(W${}lxAolOf{U{mkzA>bk4AuxgfT^|B?Q5tmUkWH$50I3hz zR>8VJD@X$l4LWqlrYOMzwkcBE6r3Xl*yhL&IC?>c4%yT;C*T}Dz!@2w6AD-3svbcedo&lm|E>IZty?Z-mG}2$ zd>epfG$r{YN_3);9XNI`G2Ejs${VYZ=>s|V$Jw>TmJg%)iRqU-nOMu^4>>^n$s-bx zNk381t6gqy_U<1o&-7&h8S%x{N2Vte>A3uW=cyk&384p3k{~hkMzzx1^IV{`}9=U6wQQDC&stZR*SByk#t>*v?+3`TbNO= zYo@4Za@;adBpFqbu|&wjBcSQDyq?hDw=Yw zs#0a6OB`sC2h6l#G_I>^vu-G+qHCQU=0u{7E<=x-^;W;#f{-xeEi!hiB;^oxjw4N@ z18?r9-570h+(23uthAxx4i^^BnZIyR}3=2imrq7tk^IiBjG*j83$nn;c zBAI=iq7jufNzr=SlZv54RJlbHV{#E};JD%GMbiX-iNBN;%Gi!XM7cYmn7b@4Ki5Bx z6W(CAN$AWbU7|fow*FlI^(?!U^6TR=-fcEt?!So>M7G61OzbWe^Gi6v;97QK%-E(? zd^IabT&pTZWYuP^;8(Fi6W5-!XJ|9m^6S_lsNg#ATVV|6W7zCke?2Q4XSdU_H;RV2 zxnI^Ud38I>c2Y^LBq391Xl&ZJ$?u;Cg)XB{jLVx-7~jH4mbLWnM1AYoqlEUqUQ$dw z?g(2gp`d6<1(OFKhMhw!%asMo?Wa;^6GF<4q|R7%3u{iGdzZPSoUA5wqz!Y`Aoq~{ zDFAm(ID4542+b$O97vvXD_hZl>fJfjl zcpRR9=imi+(F**-R^Y!5Z^JwAE*ycQZ~{JoPvJB898SV%_zup)&!YnS4tHR~FWCb- z^9BFXh58@Am}PA?vZO-h>wa<;u9rU(qz-23KN*f|s;>2-7EM+THwQ^vZdBYT&<%o4 z;;xsc@5IOBYh}*tHu2B&Hfo&yGG~-s(>0U49vqkyjrEUo2GLo-Z>|dTpE|QtmA9A z#s_DgK)vvahk%EGhrksekYn2f==cBi6aW9ef}TAS4*?H>s|5k@g~Fja^frA29PK#$ z)*isC2QONv-jGc#6TDfUp?0 --events 100 | `JUDGE_GCS_BUCKET` | bucket override | | `GOOGLE_APPLICATION_CREDENTIALS` | GCP credentials | | `OUTPUT_DIR` | temporary export directory | +| `OUTPUT_FILENAME_PATTERN` | configurable output filename template | --- diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 3c798cc..f54c548 --- a/README.md +++ b/README.md @@ -688,7 +688,16 @@ GOOGLE_APPLICATION_CREDENTIALS=/path/GCP_ACCESS_KEY.json ## 12. Arquivo de saída -Padrão: +O nome é configurado diretamente no `.env`: + +```env +OUTPUT_FILENAME_PATTERN=AGENTE_{agent_id}_LLM_JUDGE_{timestamp}.TXT.GZ +``` + +Os placeholders disponíveis são `{agent_id}`, `{run_id}` e `{timestamp}`. O +`timestamp` é gerado no formato `YYYYMMDD_HHMMSS`, no fuso de São Paulo. + +Padrão resultante: ```text AGENTE_{agentId}_LLM_JUDGE_{YYYYMMDD}_{HHMMSS}.TXT.GZ @@ -1478,6 +1487,7 @@ Abra `http://localhost:8080/ui`. Em Kubernetes, prefira `kubectl port-forward sv | `JUDGE_GCS_BUCKET` | override de bucket | | `GOOGLE_APPLICATION_CREDENTIALS` | credencial GCP | | `OUTPUT_DIR` | diretório temporário de export | +| `OUTPUT_FILENAME_PATTERN` | template configurável do nome do arquivo de saída | --- diff --git a/configs/.DS_Store b/configs/.DS_Store deleted file mode 100644 index 08521bca051d31fcb8a2c300f287847e40dff155..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKy-ve05I(m>N=1hbNHBV0?;DsZY;1jiLP=Xd35lq>F=S)s4R{+~fR|u_N8mf# zg#0xyA%yOv^Jib~?8_G?7ZZ`1Zlej&n1})>V{eG2Mff^vLwepa0xCPlGG0$+muZqU ze8uoL8Q^EPM>n*kh}Kkle#2GuYLbTGB2E{u2FFkDuP=wsCv}hL8;|U&yh9AavAJTp zpj)iJLLQrX7X5jfPdS%^`?t?r8gnJ-S4Lfa)x7w9pb_$lDWN%KbVn(&yT*7)o7yga z?D8$=`EXWnwsY=szCZDA$(wT*5e9?-VW5iv)NGbu-=Va^fG{8o6b$h9K|>jh$K0X) zbfB?E0N?;-E9l#QC!l5n(0I%p!U9n)6zD>gKVm2s4!ib##$)c#g_E)?V;;Y<@+TB! zSBG6&cT&cow8DTeP-UR+hGVY(r@PPp)gT!O1H!<+Vn7YTSvbWl`P$mJIj*%DdJbh_ nzuaLFf{rc4@a0l`1hoRY<_^$!%pJl4kskp|gEYdxuQKof84p1n(*u4^Zj*idg@yHYpnUDyDFzc zzH2(6v7fKCQ(D}7o#goN@xbQOaigrvSGD^2-Z)=KDV<}7L%N^|jcMR#4$hYOxHUYd zAG1AI)^e*^=jYd@dDuiPJ-VeU%IR*AkKHM%TJUgddU}~Zhl*Fp&uTBf9{FhV59OZ; zdNxbAZBS-mKo}4P<_z%nA;MscEfxm#rvsBd0sw1JYr(bdZNP{Xz}RA85E_Uwp+FO= z>=8qmaOflJ7h5b0ns8D&GuE-0l|7*-ogMl}yOW9y$}9{B13m+Rxvg{mZ>>K6`$2Li z3lQ;71ww1}n6PH2?qr diff --git a/deploy/README.md b/deploy/README.md old mode 100644 new mode 100755 diff --git a/deploy/env/evaluator.env.example b/deploy/env/evaluator.env.example old mode 100644 new mode 100755 index 4d80ed3..400bbd3 --- a/deploy/env/evaluator.env.example +++ b/deploy/env/evaluator.env.example @@ -17,6 +17,7 @@ ENABLE_GCS_UPLOAD=true JUDGE_GCS_BUCKET= STORAGE_CONFIG_PATH=configs/judge/storage.yaml GOOGLE_APPLICATION_CREDENTIALS=/var/secrets/google/GCP_ACCESS_KEY.json +OUTPUT_FILENAME_PATTERN=AGENTE_{agent_id}_LLM_JUDGE_{timestamp}.TXT.GZ # Langfuse per-agent credentials are supplied by the mounted YAML file, not env names. LANGFUSE_CREDENTIALS_CONFIG_PATH=/var/secrets/langfuse/langfuse_credentials.yaml diff --git a/deploy/k8s/.DS_Store b/deploy/k8s/.DS_Store deleted file mode 100644 index 707cc982b9c3b344c1d7e485fce508d9fc1062f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKOHRWu5FM8Y1+kzzSbD{p?pT^CoS+wg&V$FGExgW9j{ScPi9w5-3}tn z@Lw6=XO~e)m$als`uvVx`o6j;in3}-*z(ug_VfMl?JV`rH~QO~{=4yvRJ>FTJ<@{i zsKWkFv`qKkyX93&H!pQOTI5?qcLC% z7y~N?`1|0Yj6tyzjGqn+u>}BTFh{|hdkN0*ib1gxga_gz6)34rTMQ@ZuzQUQik+aO zlhfwI>CR3&6c=~L`aXt}3xYNp1I9qgz>Zvwx&EL3-v6gbc4Z7016##_%Zgbs#Vu)V x9o!t(S`WQ|vT$4{xJtn!mSV(mDL#Tmf!*^27!*4}SRnQz5NWW%82D2Lz5$YCO@ROa diff --git a/deploy/k8s/base/configmap.yaml b/deploy/k8s/base/configmap.yaml old mode 100644 new mode 100755 index 22edd21..f677fd4 --- a/deploy/k8s/base/configmap.yaml +++ b/deploy/k8s/base/configmap.yaml @@ -20,6 +20,7 @@ data: BATCH_SIZE: "50" MAX_ATTEMPTS: "3" ENABLE_GCS_UPLOAD: "true" + OUTPUT_FILENAME_PATTERN: "AGENTE_{agent_id}_LLM_JUDGE_{timestamp}.TXT.GZ" STORAGE_CONFIG_PATH: "configs/judge/storage.yaml" ADB_TABLE_PREFIX: "AGENTFW" ADB_WALLET_LOCATION: "/opt/oracle/wallet" diff --git a/deploy/k8s/base/cronjob.yaml b/deploy/k8s/base/cronjob.yaml old mode 100644 new mode 100755 diff --git a/deploy/k8s/base/init-db-job.yaml b/deploy/k8s/base/init-db-job.yaml old mode 100644 new mode 100755 diff --git a/deploy/k8s/base/kustomization.yaml b/deploy/k8s/base/kustomization.yaml old mode 100644 new mode 100755 diff --git a/deploy/k8s/base/monitor-deployment.yaml b/deploy/k8s/base/monitor-deployment.yaml old mode 100644 new mode 100755 diff --git a/deploy/k8s/base/monitor-service.yaml b/deploy/k8s/base/monitor-service.yaml old mode 100644 new mode 100755 diff --git a/deploy/k8s/base/namespace.yaml b/deploy/k8s/base/namespace.yaml old mode 100644 new mode 100755 diff --git a/deploy/k8s/base/secret-template.yaml b/deploy/k8s/base/secret-template.yaml old mode 100644 new mode 100755 diff --git a/deploy/k8s/base/serviceaccount.yaml b/deploy/k8s/base/serviceaccount.yaml old mode 100644 new mode 100755 diff --git a/deploy/k8s/overlays/dev/kustomization.yaml b/deploy/k8s/overlays/dev/kustomization.yaml old mode 100644 new mode 100755 diff --git a/deploy/k8s/overlays/hml/kustomization.yaml b/deploy/k8s/overlays/hml/kustomization.yaml old mode 100644 new mode 100755 diff --git a/deploy/k8s/overlays/prod/kustomization.yaml b/deploy/k8s/overlays/prod/kustomization.yaml old mode 100644 new mode 100755 diff --git a/deploy/langfuse/langfuse_credentials.example.yaml b/deploy/langfuse/langfuse_credentials.example.yaml old mode 100644 new mode 100755 diff --git a/deploy/scripts/build-push.sh b/deploy/scripts/build-push.sh old mode 100644 new mode 100755 diff --git a/deploy/scripts/common.sh b/deploy/scripts/common.sh old mode 100644 new mode 100755 diff --git a/deploy/scripts/create-secrets.sh b/deploy/scripts/create-secrets.sh old mode 100644 new mode 100755 diff --git a/deploy/scripts/deploy.sh b/deploy/scripts/deploy.sh old mode 100644 new mode 100755 diff --git a/deploy/scripts/run-now.sh b/deploy/scripts/run-now.sh old mode 100644 new mode 100755 diff --git a/deploy/scripts/status.sh b/deploy/scripts/status.sh old mode 100644 new mode 100755 diff --git a/deploy/scripts/undeploy.sh b/deploy/scripts/undeploy.sh old mode 100644 new mode 100755 diff --git a/evaluator/.DS_Store b/evaluator/.DS_Store deleted file mode 100644 index fe416d7402a51081a7f92d332af8a4d2a441ea5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMzi-n(6n;me5E>ydAhk;+OGuSqN(LC1LJ5Kmq_C&tM^hkWuV1|a zUV*h#fbS0hCfkO#v9j{kfkn0euq7Op1E0|c$e2LehPJV?G8B8N?m_5Kp<4{0!r>1X z4%^T+R#t_RP~jwWW}!P2A+sYckZ=+WW&P?E@CxJ=;NHE8ZoN%onp^#QdpM}Kx=}b* zLE*6*8Ai=!XBc&Ws62f2?fciQPq&t#dw+o*ADS#)V_Uj_w+ti9AsA2TF<2kjT(=lj zfHHZ0IDNn1S%^$IE=St@SWemmqX_JVcn{JA!-ysshGOT23ukh?`ZoNbwJh8-j8c}X zuoh1dGtaW*Iidq-IItCLUCH`QUcbK77TQ^Rn0#CqiwBAhqa=AusBd$){L=K9`CmLu z@+Yxo?jpaPH{iS#oOch`Xe6s>N^?8^#gih8$>aHMeW62cFO$zQTmi2#J)s$x4Ztl^ z+1KBJljS%0RBtD`WH4!+xG*-42dvMAtl`jB?)e+zyp27~Yv97zJmh&-!JyCIS=7f7_;7`EGu0^qhB}ZYx08E` zE>3i+(`vNESJYUy^WZyyb|LIETQQ~kd4$Pt_j7Y`kIC#~s^>;oeAJJ&O?d@7s2 dict[str, int]: return {sid: max_consecutive_intent_streak(items) for sid, items in grouped.items()} +def build_output_filename( + agent_id: str, + run_id: str, + now_brt: datetime, + pattern: str | None = None, +) -> str: + """Build the export filename from the environment-configurable template.""" + template = pattern or settings.output_filename_pattern + try: + filename = template.format( + agent_id=agent_id, + run_id=run_id, + timestamp=now_brt.strftime("%Y%m%d_%H%M%S"), + ) + except KeyError as exc: + raise ValueError( + f"Unknown placeholder {exc} in OUTPUT_FILENAME_PATTERN. " + "Supported placeholders: {agent_id}, {run_id}, {timestamp}." + ) from exc + + if not filename or Path(filename).name != filename or filename in {".", ".."}: + raise ValueError("OUTPUT_FILENAME_PATTERN must produce a filename without directories") + return filename + + def export_legacy_txt_gz(repo: EvaluationRepository, run_id: str, agent_id: str) -> Path: output_dir = settings.path(settings.output_dir) output_dir.mkdir(parents=True, exist_ok=True) now_brt = datetime.now(ZoneInfo("America/Sao_Paulo")) - path = output_dir / f"AGENTE_{agent_id}_LLM_JUDGE_{now_brt.strftime('%Y%m%d_%H%M%S')}.TXT.GZ" + path = output_dir / build_output_filename(agent_id, run_id, now_brt) with repo.store.connect() as conn: cur = conn.cursor() diff --git a/evaluator/persistence/__pycache__/oracle_store.cpython-313.pyc b/evaluator/persistence/__pycache__/oracle_store.cpython-313.pyc old mode 100644 new mode 100755 diff --git a/evaluator/persistence/__pycache__/repository.cpython-313.pyc b/evaluator/persistence/__pycache__/repository.cpython-313.pyc old mode 100644 new mode 100755 diff --git a/evaluator/persistence/oracle_store.py b/evaluator/persistence/oracle_store.py old mode 100644 new mode 100755 diff --git a/evaluator/persistence/repository.py b/evaluator/persistence/repository.py old mode 100644 new mode 100755 diff --git a/evaluator/prompts/__pycache__/loader.cpython-313.pyc b/evaluator/prompts/__pycache__/loader.cpython-313.pyc old mode 100644 new mode 100755 diff --git a/evaluator/prompts/loader.py b/evaluator/prompts/loader.py old mode 100644 new mode 100755 diff --git a/evaluator/publishers/__pycache__/gcs_export.cpython-313.pyc b/evaluator/publishers/__pycache__/gcs_export.cpython-313.pyc old mode 100644 new mode 100755 diff --git a/evaluator/publishers/__pycache__/langfuse_job_audit.cpython-313.pyc b/evaluator/publishers/__pycache__/langfuse_job_audit.cpython-313.pyc old mode 100644 new mode 100755 diff --git a/evaluator/publishers/__pycache__/langfuse_scores.cpython-313.pyc b/evaluator/publishers/__pycache__/langfuse_scores.cpython-313.pyc old mode 100644 new mode 100755 diff --git a/evaluator/publishers/gcs_export.py b/evaluator/publishers/gcs_export.py old mode 100644 new mode 100755 diff --git a/evaluator/publishers/langfuse_job_audit.py b/evaluator/publishers/langfuse_job_audit.py old mode 100644 new mode 100755 diff --git a/evaluator/publishers/langfuse_scores.py b/evaluator/publishers/langfuse_scores.py old mode 100644 new mode 100755 diff --git a/evaluator/time_utils.py b/evaluator/time_utils.py old mode 100644 new mode 100755 diff --git a/evaluator_monitor/__init__.py b/evaluator_monitor/__init__.py old mode 100644 new mode 100755 diff --git a/evaluator_monitor/__pycache__/__init__.cpython-313.pyc b/evaluator_monitor/__pycache__/__init__.cpython-313.pyc old mode 100644 new mode 100755 diff --git a/evaluator_monitor/__pycache__/app.cpython-313.pyc b/evaluator_monitor/__pycache__/app.cpython-313.pyc old mode 100644 new mode 100755 diff --git a/evaluator_monitor/app.py b/evaluator_monitor/app.py old mode 100644 new mode 100755 diff --git a/pyproject.toml b/pyproject.toml old mode 100644 new mode 100755 diff --git a/tests/__init__.py b/tests/__init__.py old mode 100644 new mode 100755 diff --git a/tests/__pycache__/__init__.cpython-313.pyc b/tests/__pycache__/__init__.cpython-313.pyc old mode 100644 new mode 100755 diff --git a/tests/__pycache__/test_full_tim_compliance.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_full_tim_compliance.cpython-313-pytest-9.0.2.pyc old mode 100644 new mode 100755 diff --git a/tests/__pycache__/test_monitor_and_run_id.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_monitor_and_run_id.cpython-313-pytest-9.0.2.pyc old mode 100644 new mode 100755 diff --git a/tests/__pycache__/test_no_product_hardcodes.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_no_product_hardcodes.cpython-313-pytest-9.0.2.pyc old mode 100644 new mode 100755 diff --git a/tests/__pycache__/test_tim_spec.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_tim_spec.cpython-313-pytest-9.0.2.pyc old mode 100644 new mode 100755 diff --git a/tests/test_full_tim_compliance.py b/tests/test_full_tim_compliance.py old mode 100644 new mode 100755 diff --git a/tests/test_monitor_and_run_id.py b/tests/test_monitor_and_run_id.py old mode 100644 new mode 100755 diff --git a/tests/test_no_product_hardcodes.py b/tests/test_no_product_hardcodes.py old mode 100644 new mode 100755 diff --git a/tests/test_tim_spec.py b/tests/test_tim_spec.py old mode 100644 new mode 100755 index 5dac84d..d1b153e --- a/tests/test_tim_spec.py +++ b/tests/test_tim_spec.py @@ -10,7 +10,7 @@ from evaluator.config.agents import load_agents from evaluator.core.models import ConversationRecord from evaluator.engine import EvaluationEngine from evaluator.judges.llm_judge import TIMStyleLLMJudge -from evaluator.output.legacy_exporter import extract_prompt_length +from evaluator.output.legacy_exporter import build_output_filename, extract_prompt_length from evaluator.time_utils import brt_day_window, to_utc_z @@ -25,6 +25,20 @@ class FakeLLM: class TIMSpecTests(unittest.TestCase): + def test_output_filename_pattern_is_configurable(self): + now_brt = datetime(2026, 9, 9, 18, 45, 12) + filename = build_output_filename( + "billing", + "run-123", + now_brt, + pattern="judge_{agent_id}_{run_id}_{timestamp}.csv.gz", + ) + self.assertEqual(filename, "judge_billing_run-123_20260909_184512.csv.gz") + + def test_output_filename_pattern_rejects_directories(self): + with self.assertRaisesRegex(ValueError, "without directories"): + build_output_filename("billing", "run-123", datetime.now(), pattern="../{run_id}.gz") + def test_brt_day_converts_to_expected_utc(self): start, end = brt_day_window(date(2026, 8, 12)) self.assertEqual(to_utc_z(start), "2026-08-12T03:00:00Z")