Skip to content

minisundev/AgentRegressionTester

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

81 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Agent Regression Tester

LLM μ—μ΄μ „νŠΈμ˜ λΆˆν™•μ‹€ν•œ 응닡 ν’ˆμ§ˆμ„ μžλ™ν™”λœ νŒŒμ΄ν”„λΌμΈμœΌλ‘œ κ²€μ¦ν•˜κ³  κ΄€λ¦¬ν•©λ‹ˆλ‹€.

Why This Project?

LLM μ—μ΄μ „νŠΈ κ°œλ°œμ€ 일반적인 λ°±μ—”λ“œ 개발과 λ‹€λ¦…λ‹ˆλ‹€. ν”„λ‘¬ν”„νŠΈ ν•œ 쀄, μ†ŒμŠ€μ½”λ“œ ν•œ μ€„μ˜ μˆ˜μ •μ΄ 수백 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— μ–΄λ–€ 영ν–₯을 쀄지 μ˜ˆμΈ‘ν•˜κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€. 이 ν”„λ‘œμ νŠΈλŠ” "λ”± λ–¨μ–΄μ§€μ§€ μ•ŠλŠ” LLM 응닡"을 효율적으둜 κ²€μ¦ν•˜κΈ° μœ„ν•΄ μ‹œμž‘λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 맀일 λ°˜λ³΅λ˜λŠ” μˆ˜λ™ ν…ŒμŠ€νŠΈμ™€ λ²ˆμ—­ μž‘μ—…μ„ μžλ™ν™”ν•˜κ³ , λ‚˜μ•„κ°€ ν…ŒμŠ€νŠΈ β†’ ν”„λ‘¬ν”„νŠΈ μˆ˜μ • β†’ 반영 β†’ μž¬μΈ‘μ •μ˜ κ°œμ„  루프 전체λ₯Ό μžλ™ν™”ν•©λ‹ˆλ‹€.

Impact

  • 검증 λ¦¬μ†ŒμŠ€ 95.8% 절감: κΈ°μ‘΄ 8μ‹œκ°„ μ†Œμš”λ˜λ˜ μ „μˆ˜ 검사λ₯Ό 20λΆ„ λ‚΄μ™Έ(κ²€ν†  μ‹œκ°„ κΈ°μ€€)둜 단좕.
  • ν’ˆμ§ˆ μ•ˆμ •μ„± 확보: 수백 개의 μΌ€μ΄μŠ€λ₯Ό μƒμ‹œ κ²€μ¦ν•˜μ—¬ 곡식 μ‹œμ—° 및 UAT 리슀크 μ΅œμ†Œν™”.

μ‹œμŠ€ν…œ ꡬ성

                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                        β”‚              μ—μ΄μ „νŠΈ μ„œλ²„ (μ™ΈλΆ€)              β”‚
                        β”‚   agentChat / agentChatStream  ← Redis μ°Έμ‘°   β”‚
                        β””β”€β”€β”€β”€β”€β”€β”€β–²β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–²β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                β”‚ API 호좜                  β”‚ llm_prompt:* / config:llm:*
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”              β”Œβ”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚ e2e_regression                  β”‚              β”‚ Redis                          β”‚
  β”‚ YAML μΌ€μ΄μŠ€ β†’ API 호좜 β†’ 검증    β”‚              β”‚   β–² 파일 sync    β–² DB sync      β”‚
  β”‚ (entity golden, judge)          β”‚              β”‚ prompt_update   db_to_redis    β”‚
  β”‚ β†’ μ‹œνŠΈ/μŠ¬λž™/터미널/JSON 리포트   β”‚              β”‚ (prompts/*.md)  (PostgreSQL)   β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β–²β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
          β”‚ μ‹€νŒ¨ μˆ˜μ§‘ / μž¬μΈ‘μ •
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚ prompt_optimizer                β”‚   β”‚ model_payload_test                     β”‚
  β”‚ μ‹€νŒ¨ 뢄석 β†’ LLM μˆ˜μ •μ•ˆ           β”‚   β”‚ LLM 직전 payload 슀트림 μ†ŒλΉ„            β”‚
  β”‚ β†’ prompt_update둜 반영 β†’ μž¬μΈ‘μ •  β”‚   β”‚ β†’ λ©€ν‹°λͺ¨λΈ/μ˜¨λ„ 비ꡐ + GPT judge        β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                        β”‚ cache_probe: κ²Œμ΄νŠΈμ›¨μ΄ μΊμ‹œ μ •ν•©μ„± ν”„λ‘œλΈŒ β”‚
                                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
νŒ¨ν‚€μ§€ μ—­ν•  상세
packages/e2e_regression E2E νšŒκ·€ λŸ¬λ„ˆ β€” YAML μΌ€μ΄μŠ€λ‘œ μ—μ΄μ „νŠΈ API 검증, μ‹œνŠΈ/μŠ¬λž™ 리포트 이 레포의 쀑심
packages/prompt_update prompts/*.md 파일 β†’ Redis ν”„λ‘¬ν”„νŠΈ μ‹€μ‹œκ°„ 반영 μ„œλ²„ (8083) 파일이 μ†ŒμŠ€ 였브 트루슀
packages/prompt_optimizer ν”„λ‘¬ν”„νŠΈ μžλ™ κ°œμ„  루프 (μ‹€νŒ¨ μˆ˜μ§‘ β†’ LLM μˆ˜μ •μ•ˆ β†’ 반영 β†’ μž¬μΈ‘μ • β†’ 채택/λ‘€λ°±) flaky 뢄리, μ˜¨λ„ ν”„λ‘œλΈŒ 포함
packages/db_to_redis PostgreSQL(CMS) β†’ Redis 동기화 μ„œλ²„ (8082) μΊμ‹œ/ν”„λ‘¬ν”„νŠΈ/LLM μ„€μ •
packages/model_payload_test LLM 직전 payloadλ₯Ό 슀트림으둜 λ°›μ•„ λ©€ν‹°λͺ¨λΈ/μ˜¨λ„ 비ꡐ + judge μƒμ‹œ watcher
packages/cache_probe api-gateway 날씨 μΊμ‹œ μ •ν•©μ„± 증거 μˆ˜μ§‘ ν”„λ‘œλΈŒ ν¬λ Œμ‹ 도ꡬ

ν”„λ‘¬ν”„νŠΈ 원본은 레포 루트 prompts/*.md + λ§€ν•‘ μ„ μ–Έ prompts/manifest.yaml, μ—μ΄μ „νŠΈ μ •μ±… λ¬Έμ„œλŠ” spec/weather_agent_policy.md, ν”„λ‘¬ν”„νŠΈ λ³€κ²½ 이λ ₯(μ™œ/μ–΄λ–»κ²Œ)은 prompts/CHANGELOG.md에 μžˆλ‹€.


Setup

1. μ„€μΉ˜

npm install                                # 루트 (e2e_regression, optimizer, watcher, probe 곡용)
cd packages/prompt_update && npm install   # μ„œλ²„ νŒ¨ν‚€μ§€λŠ” κ°œλ³„ μ„€μΉ˜
cd packages/db_to_redis && npm install

2. .env μ„€μ •

루트 .env(μ˜ˆμ‹œλŠ” μ•„λž˜ "ν™˜κ²½λ³€μˆ˜ μ±„μš°λŠ” 법" μ°Έκ³ )와 각 μ„œλ²„ νŒ¨ν‚€μ§€μ˜ .env(.env.example μ°Έκ³ )λ₯Ό μž‘μ„±ν•œλ‹€. .envλŠ” μ ˆλŒ€ 컀밋 κΈˆμ§€.

ν•„μˆ˜ μ΅œμ†Œ μ…‹:

# 루트 .env
CONTROL_BASE_URL="http://localhost:8080/aia-control/v1/agentChat"   # ν”„λ‘œν•„ λ―Έμ‚¬μš© μ‹œ 폴백
X_API_KEY=""
AI_API_KEY=""            # Gemini (judge, prompt_optimizer)
REDIS_URL="redis://127.0.0.1:6379"
# μ‹œνŠΈ 리포트λ₯Ό μ“°λ €λ©΄: GOOGLE_SHEET_ID / GOOGLE_SERVICE_ACCOUNT_EMAIL / GOOGLE_PRIVATE_KEY
# μŠ¬λž™ μ•Œλ¦Όμ„ μ“°λ €λ©΄: SLACK_WEBHOOK_URL

3. ν™˜κ²½(ν”„λ‘œν•„) μ •μ˜ β€” packages/e2e_regression/config/settings/profiles.yaml

profiles:
  local:
    baseUrl: http://localhost:8080/aia-control/v1/agentChat
    sheetName: local_260714
  stg:
    baseUrl: https://…-staging…/aia-control/v1/agentChat
    sheetName: stg_260627

μƒˆ ν™˜κ²½μ€ 여기에 μΆ”κ°€λ§Œ ν•˜λ©΄ μ½”λ“œ μˆ˜μ • 없이 test:*:<ν”„λ‘œν•„>둜 λ°”λ‘œ μ“Έ 수 μžˆλ‹€.


μ‹€ν–‰ μΉ˜νŠΈμ‹œνŠΈ

νšŒκ·€ ν…ŒμŠ€νŠΈ (e2e_regression)

μ„ νƒμž: terminal[:ai][:ν”„λ‘œν•„] λ˜λŠ” sheet:<judge>[:ν”„λ‘œν•„] (judge = none|internal|api|gpt|local)

npm run test:terminal:local                            # 터미널 리포트
npm run test:sheet:none:local                          # μ‹œνŠΈ 기둝, judge μ—†μŒ
npm run test:profile -- sheet:gpt:local --mode sync    # GPT judge
npm run test:profile -- sheet:api:stg --mode stream    # Gemini judge + 슀트리밍(TTFT μΈ‘μ •)
npm run test:profile -- terminal:local -- -t "νŒ¨ν„΄"    # jest -t ν•„ν„°
  • ν™œμ„± μΌ€μ΄μŠ€ 파일 λͺ©λ‘: packages/e2e_regression/data/testcase_groups.ts의 CASE_GROUPS
  • 이어 돌리기: 같은 λ‚  μž¬μ‹€ν–‰ν•˜λ©΄ .checkpoint.json κΈ°μ€€μœΌλ‘œ 성곡 μΌ€μ΄μŠ€ skip, μ‹€νŒ¨λ§Œ μž¬μ‹œλ„

ν”„λ‘¬ν”„νŠΈ μˆ˜μ • β†’ μ‹€μ‹œκ°„ 반영 (prompt_update)

cd packages/prompt_update && npm run dev               # μ„œλ²„ 기동 (8083)

# prompts/weather_answer.md μˆ˜μ • ν›„:
curl -X POST localhost:8083/promptUpdate -H 'Content-Type: application/json' -d '{}'
curl localhost:8083/status                             # νŒŒμΌβ†”Redis 일치/llm_id 확인

ν”„λ‘¬ν”„νŠΈ μžλ™ κ°œμ„  (prompt_optimizer)

μ „μ œ: μ—μ΄μ „νŠΈ μ„œλ²„ + prompt_update μ„œλ²„(8083) μ‹€ν–‰ 쀑. μˆ˜λ™ ν…ŒμŠ€νŠΈ 런과 λ™μ‹œ μ‹€ν–‰ κΈˆμ§€.

npm run optimize:prompt -- --analyze-only              # μ‹€νŒ¨ μˆ˜μ§‘ + flaky/μ§„μ§œ μ‹€νŒ¨ λΆ„λ₯˜λ§Œ
npm run optimize:prompt                                # κ°œμ„  루프 (κΈ°λ³Έ weather_entity.md, 3회)
npm run optimize:prompt -- --prompt weather_answer.md --iterations 5 --repeat 3 --temps 0,0.7
# λλ‚˜λ©΄: git diff prompts/ 둜 리뷰 ν›„ 컀밋

κ°œμ„ μ•ˆμ΄ μ±„νƒλ˜λ©΄ λ³€κ²½ 이유(LLM 뢄석)κ°€ prompts/CHANGELOG.md에 μžλ™ κΈ°λ‘λœλ‹€. 컀밋 μ‹œ ν•¨κ»˜ 담을 것 (컀밋 λ©”μ‹œμ§€ κ·œμΉ™μ€ CLAUDE.md μ°Έκ³ ).

DB β†’ Redis 동기화 (db_to_redis)

cd packages/db_to_redis && npm run dev                 # μ„œλ²„ 기동 (8082)
curl -X POST localhost:8082/dbToRedis -H 'Content-Type: application/json' -d '{"type": "prompt"}'

주의: 전체 동기화({})λŠ” ν”„λ‘¬ν”„νŠΈ/llm_idλ₯Ό DB κ°’μœΌλ‘œ λ˜λŒλ¦°λ‹€ β†’ 이후 POST localhost:8083/promptUpdate둜 볡ꡬ.

λͺ¨λΈ 비ꡐ watcher (model_payload_test)

npm run watch:weather:answer-compare                   # 터미널
REPORT_TO=sheet EVALUATE_WITH_GPT=1 npm run watch:weather:answer-compare   # μ‹œνŠΈ + judge

end-to-end 감사: νšŒκ·€ λŸ¬λ„ˆμ— PUBLISH_AGENT_RESPONSE_STREAM=1, watcher에 JOIN_AGENT_RESPONSE_STREAM=1.

μΊμ‹œ ν”„λ‘œλΈŒ (cache_probe)

npm run probe:cache
CACHE_PROBE_ROUNDS=0 CACHE_PROBE_STOP_ON_DIVERGENCE=1 npm run probe:cache   # λ¬΄ν•œ, 발견 μ‹œ 쀑단

μœ ν‹Έ 슀크립트

npm run llm:list                                       # Redis config:llm:* λͺ©λ‘ (llm_id ↔ λͺ¨λΈ 확인)
npm run llm:list -- --verbose                          # 전체 JSON 포함
tsx scripts/generate-entity-goldens.ts                 # entity golden 일괄 생성
                                                       # ⚠ testcase YAML을 직접 μˆ˜μ •ν•¨. ENTITY_PARSER_PROMPT_FILE μ§€μ • ν•„μš”
npm run typecheck                                      # 전체 νƒ€μž…μ²΄ν¬

ν™˜κ²½λ³€μˆ˜ μ±„μš°λŠ” 법

  • Google Sheets API

    https://console.cloud.google.com/welcome/new μ—μ„œ ν”„λ‘œμ νŠΈ 생성 β†’ Google Sheets API Enable β†’ Credentials β†’ Create Credentials β†’ Service Account β†’ Keys β†’ Create private key (JSON)

    λ‹€μš΄λ‘œλ“œλœ JSONμ—μ„œ client_email β†’ GOOGLE_SERVICE_ACCOUNT_EMAIL, private_key β†’ GOOGLE_PRIVATE_KEY. μŠ€ν”„λ ˆλ“œμ‹œνŠΈλ₯Ό λ§Œλ“€κ³  URL의 https://docs.google.com/spreadsheets/d/<이 λΆ€λΆ„>/edit을 GOOGLE_SHEET_ID에. ν•΄λ‹Ή μ‹œνŠΈλ₯Ό μ„œλΉ„μŠ€ 계정 이메일에 νŽΈμ§‘μžλ‘œ κ³΅μœ ν•΄μ•Ό ν•œλ‹€. κ²°κ³Ό νƒ­ 이름은 ν”„λ‘œν•„μ˜ sheetName이 μš°μ„ ν•˜λ©°, 탭이 μ—†μœΌλ©΄ μžλ™ μƒμ„±λœλ‹€.

  • Gemini: https://ai.google.dev/gemini-api/docs/models μ—μ„œ λͺ¨λΈ 선택 β†’ AI_MODEL, API ν‚€ β†’ AI_API_KEY

  • Ollama (JUDGE_MODE=local용): https://ollama.com μ„€μΉ˜ β†’ ollama pull gemma2:27b β†’ LOCAL_AI_MODEL='gemma2:27b'

  • μ‹œνŠΈ wrap μ„€μ •: packages/e2e_regression/config/settings/sheet.yaml의 wrapColumns(κΈ°λ³Έ E,F,G,H)

각 νŒ¨ν‚€μ§€κ°€ μ½λŠ” env의 전체 λͺ©λ‘μ€ 각 νŒ¨ν‚€μ§€ README의 ν™˜κ²½λ³€μˆ˜ ν‘œ μ°Έκ³ .


AI μ—μ΄μ „νŠΈ(Claude Code / Codex CLI)둜 μžλ™ν™”ν•˜κΈ°

이 λ ˆν¬λŠ” CLI μ—μ΄μ „νŠΈκ°€ "ν…ŒμŠ€νŠΈ 돌리고 ν”„λ‘¬ν”„νŠΈ κ°œμ„ ν•΄μ€˜" ν•œ λ§ˆλ””λ‘œ 전체 루프λ₯Ό 자율 μˆ˜ν–‰ν•  수 μžˆλ„λ‘ μ„ΈνŒ…λ˜μ–΄ μžˆλ‹€:

파일 μ—­ν• 
CLAUDE.md (= AGENTS.md 심링크) μ—μ΄μ „νŠΈκ°€ μ„Έμ…˜ μ‹œμž‘ μ‹œ μžλ™μœΌλ‘œ μ½λŠ” 운영 κ°€μ΄λ“œ. 핡심 사싀, λͺ…λ Ήμ–΄, κΈˆμ§€ κ·œμΉ™(λ™μ‹œ μ‹€ν–‰ κΈˆμ§€, promptUpdate ν•„μˆ˜, λ°±μ—”λ“œ μ‹€νŒ¨ ꡬ뢄, flaky λ¬΄μ‹œ λ“±), 컀밋 λ©”μ‹œμ§€ κ·œμΉ™
.claude/skills/improve-prompts/ ν”„λ‘¬ν”„νŠΈ κ°œμ„  ν”Œλ ˆμ΄λΆ μŠ€ν‚¬. Claude Codeμ—μ„œ /improve-prompts둜 ν˜ΈμΆœν•˜κ±°λ‚˜ "ν”„λ‘¬ν”„νŠΈ κ°œμ„ ν•΄μ€˜"라고 ν•˜λ©΄ μžλ™ λ°œλ™. 사전 확인 β†’ 진단 β†’ κ°œμ„  β†’ 기둝 β†’ 보고 μˆœμ„œ κ°•μ œ
prompts/CHANGELOG.md ν”„λ‘¬ν”„νŠΈ λ³€κ²½μ˜ "μ™œ/μ–΄λ–»κ²Œ" 영ꡬ 기둝 (μ΅œμ‹ μ΄ μœ„). prompt_optimizerκ°€ κ°œμ„ μ•ˆμ„ μ±„νƒν•˜λ©΄ μžλ™ append, μˆ˜λ™ μˆ˜μ • μ‹œμ—” 같은 ν˜•μ‹μœΌλ‘œ 직접 μΆ”κ°€
.claude/settings.json μ›Œν¬ν”Œλ‘œ λͺ…λ Ή κΆŒν•œ allowlist (npm run test/optimize/typecheck/llm:list, curl localhost:8083/8082, 읽기 μ „μš© redis-cli). μ“°κΈ°μ„± λͺ…령은 μ˜λ„μ μœΌλ‘œ μ œμ™Έ β€” 물어보고 μ‹€ν–‰

ν”„λ‘¬ν”„νŠΈ λ³€κ²½ 컀밋 κ·œμΉ™

ν”„λ‘¬ν”„νŠΈ μ»€λ°‹μ—λŠ” λ°˜λ“œμ‹œ "μ™œ"κ°€ 남아야 ν•œλ‹€:

prompt(weather_entity): tuαΊ§n nΓ y ν‘œν˜„μ˜ weekPart μ˜€μΆ”μΆœ μˆ˜μ •

- fail 5 β†’ 2 (Weather_Week_Matrix κΈ°μ€€)
- κ·Όκ±°/뢄석: prompts/CHANGELOG.md 및 packages/prompt_optimizer/runs/<run디렉토리>

ν”„λ‘¬ν”„νŠΈ λ³€κ²½κ³Ό μ½”λ“œ 변경은 컀밋을 λΆ„λ¦¬ν•œλ‹€. 상세 κ·œμΉ™μ€ CLAUDE.md μ°Έκ³ .


DEMO

ν…ŒμŠ€νŠΈκ°€ μ™„λ£Œλ˜λ©΄ μŠ¬λž™μ— λ©”μ‹œμ§€κ°€ μ „μ†‘λ©λ‹ˆλ‹€. slack report

ꡬ글 μ‹œνŠΈμ—λŠ” μΌ€μ΄μŠ€λ³„ κ²°κ³Όκ°€ μ •λ¦¬λ˜μ–΄ Fail인 κ²ƒλ§Œ κ²€ν† ν•˜λ©΄ λ©λ‹ˆλ‹€. sheet report


Contributing

이 ν”„λ‘œμ νŠΈλŠ” 더 효율적인 AI μ—μ΄μ „νŠΈ 개발 λ¬Έν™”λ₯Ό μ§€ν–₯ν•©λ‹ˆλ‹€. 버그 λ¦¬ν¬νŠΈλ‚˜ κΈ°λŠ₯ μ œμ•ˆμ€ μ–Έμ œλ‚˜ ν™˜μ˜ν•©λ‹ˆλ‹€!

About

Universal regression test runner for multi-agent LLM APIs. Automates test execution, response evaluation, and quality reporting

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors