whatap-python 2.2.2__py3-none-any.whl → 2.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -204,12 +204,15 @@ def _maybe_register_conf_judge():
204
204
 
205
205
  - 앱 코드에서 ``set_default_judge_fn()`` 을 이미 호출했으면 그쪽이 우선 (미적용).
206
206
  - provider 미지정 + base_url 만 있으면 openai(호환) 으로 간주.
207
- - judge 설정이 하나도 없으면 조용히 종료 — 기존 ③/④ 폴백 동작 그대로.
207
+ - provider=bedrock 은 model 필수(기본 모델 없음). AWS 자격증명으로 서명하므로 api_key
208
+ 는 쓰지 않고, region / aws_profile / base_url(=endpoint_url) 을 쓴다.
209
+ - provider · base_url 이 없으면 종료 — 기존 ③/④ 폴백 동작 그대로. 모델·키 등만 넣었으면
210
+ 적용되지 않는다고 LLM056 경고를 남긴다.
208
211
  """
209
212
  try:
210
213
  from whatap.llm.evaluators.builtins.llm_judge import (
211
214
  get_default_judge_fn, set_default_judge_fn,
212
- make_openai_judge, make_anthropic_judge, _judge_timeout_sec,
215
+ make_openai_judge, make_anthropic_judge, make_bedrock_judge, _judge_timeout_sec,
213
216
  )
214
217
  except Exception as e:
215
218
  logging.warning('[LLM] conf judge bootstrap: import failed: %s' % e,
@@ -225,6 +228,8 @@ def _maybe_register_conf_judge():
225
228
  base_url = str(getattr(conf, 'llm_eval_judge_base_url', '') or '').strip()
226
229
  key_env = str(getattr(conf, 'llm_eval_judge_api_key_env', '') or '').strip()
227
230
  api_key = str(getattr(conf, 'llm_eval_judge_api_key', '') or '').strip()
231
+ region = str(getattr(conf, 'llm_eval_judge_region', '') or '').strip()
232
+ aws_profile = str(getattr(conf, 'llm_eval_judge_aws_profile', '') or '').strip()
228
233
 
229
234
  if key_env:
230
235
  import os
@@ -241,7 +246,17 @@ def _maybe_register_conf_judge():
241
246
  if base_url:
242
247
  provider = 'openai'
243
248
  else:
244
- # 설정된 judge 값이 없음 — 기존 ③/④ 폴백 유지.
249
+ # provider · base_url 이 없으면 conf judge 를 만들지 않는다 — 기존 ③/④ 폴백 유지.
250
+ # 모델·키 등만 넣은 설정은 적용되지 않으니 알린다(③ 은 계속 앱 모델로 평가한다).
251
+ ignored = [name for name in ('llm_eval_judge_model', 'llm_eval_judge_api_key_env',
252
+ 'llm_eval_judge_api_key', 'llm_eval_judge_region',
253
+ 'llm_eval_judge_aws_profile')
254
+ if str(getattr(conf, name, '') or '').strip()]
255
+ if ignored:
256
+ logging.warning(
257
+ '[LLM] conf judge bootstrap: %s set without llm_eval_judge_provider or '
258
+ 'llm_eval_judge_base_url - ignored, the judge keeps following the app '
259
+ 'client' % ', '.join(ignored), extra={'id': 'LLM056'})
245
260
  return
246
261
 
247
262
  kwargs = {}
@@ -260,10 +275,26 @@ def _maybe_register_conf_judge():
260
275
  if base_url:
261
276
  kwargs['base_url'] = base_url
262
277
  judge_fn = make_openai_judge(**kwargs)
278
+ elif provider == 'bedrock':
279
+ if not model:
280
+ logging.warning(
281
+ '[LLM] conf judge bootstrap: llm_eval_judge_provider=bedrock needs '
282
+ 'llm_eval_judge_model (Bedrock modelId or inference profile ID)',
283
+ extra={'id': 'LLM054'})
284
+ return
285
+ if api_key:
286
+ logging.warning(
287
+ '[LLM] conf judge bootstrap: llm_eval_judge_api_key is ignored for bedrock '
288
+ '— the judge signs with AWS credentials (env / profile / IAM role)',
289
+ extra={'id': 'LLM055'})
290
+ judge_fn = make_bedrock_judge(
291
+ model=model, region_name=region or None, endpoint_url=base_url or None,
292
+ profile_name=aws_profile or None, timeout=timeout,
293
+ )
263
294
  else:
264
295
  logging.warning(
265
296
  '[LLM] conf judge bootstrap: unknown llm_eval_judge_provider=%r '
266
- '(use "openai" or "anthropic")' % provider, extra={'id': 'LLM050'})
297
+ '(use "openai", "anthropic" or "bedrock")' % provider, extra={'id': 'LLM050'})
267
298
  return
268
299
  except Exception as e:
269
300
  logging.warning('[LLM] conf judge bootstrap: failed to build judge: %s' % e,
@@ -272,8 +303,9 @@ def _maybe_register_conf_judge():
272
303
 
273
304
  set_default_judge_fn(judge_fn)
274
305
  logging.info(
275
- '[LLM] registered conf-based default judge (provider=%s, model=%s, base_url=%s)'
276
- % (provider, model or '<provider-default>', base_url or '<sdk-default>'),
306
+ '[LLM] registered conf-based default judge (provider=%s, model=%s, base_url=%s%s)'
307
+ % (provider, model or '<provider-default>', base_url or '<sdk-default>',
308
+ ', region=%s' % (region or '<aws-default>') if provider == 'bedrock' else ''),
277
309
  extra={'id': 'LLM052'})
278
310
 
279
311
 
@@ -1,6 +1,8 @@
1
1
  from whatap.llm.log_sink_packs.llm_log_sink_pack import LlmLogSinkPack
2
2
  from whatap.llm.log_sink_packs.llm_step_status import LlmStepStatus
3
+ # >>> LLM-EVAL: 평가 결과 pack (llm_log_type=llm_step_eval_status)
3
4
  from whatap.llm.log_sink_packs.llm_step_eval_status import LlmStepEvalStatus
5
+ # <<< LLM-EVAL
4
6
  from whatap.llm.log_sink_packs.llm_system_message import LlmSystemMessage
5
7
  from whatap.llm.log_sink_packs.llm_input_message import LlmInputMessage
6
8
  from whatap.llm.log_sink_packs.llm_output_message import LlmOutputMessage
@@ -4,11 +4,11 @@ from whatap.llm.log_sink_packs.llm_log_sink_pack import LlmLogSinkPack
4
4
 
5
5
 
6
6
  class LlmStepStatus(LlmLogSinkPack):
7
- """LLM API 호출 단위의 상태, 토큰, 비용, 지연시간 데이터를 담는 팩.
7
+ """LLM API 호출 단위의 상태, 토큰, 비용, 지연시간 데이터를 담는 팩."""
8
8
 
9
- 평가 결과는 별도 ``LlmStepEvalStatus`` pack 으로 송출되며 (txid, step_id) 결합 키로
10
- 백엔드에서 사후 결합. LlmStepStatus 자체는 평가 결과를 담지 않는다.
11
- """
9
+ # >>> LLM-EVAL: 평가 결과는 별도 ``LlmStepEvalStatus`` pack 으로 송출되며 (txid, step_id)
10
+ # 결합 키로 백엔드에서 사후 결합. LlmStepStatus 자체는 평가 결과를 담지 않는다.
11
+ # <<< LLM-EVAL
12
12
 
13
13
  LLM_LOG_TYPE = 'llm_step_status'
14
14
 
@@ -172,7 +172,15 @@ def _start(args, spec):
172
172
  call.pack = call.active_key = None
173
173
  try:
174
174
  call.pack, call.ctx, call.features = spec.build_context(api_params, call.stream)
175
- capture_client(call.pack, call.ctx, ()) # 빈 args — boto3 클라이언트엔 잡을 judge 자격증명이 없다
175
+ capture_client(call.pack, call.ctx, ()) # 빈 args — boto3 client 는 SDK 리소스(``_client``) 모양이 아니다
176
+ # >>> LLM-EVAL: judge 대상 스냅샷 — 이 client 의 리전·엔드포인트·자격증명. 평가(judge)도
177
+ # 앱과 같은 신원으로 Bedrock Runtime 을 부른다.
178
+ try:
179
+ from whatap.llm.evaluators.hooks import snapshot_bedrock_client
180
+ snapshot_bedrock_client(call.pack, client)
181
+ except Exception:
182
+ pass
183
+ # <<< LLM-EVAL
176
184
  call.active_key = (call.pack.model, call.pack.operation_type,
177
185
  getattr(call.pack, 'prompt_version', 'v1'))
178
186
  before_call(call.pack, call.active_key)
@@ -20,30 +20,16 @@ from whatap.trace.patch import patch_method # noqa: F401
20
20
 
21
21
 
22
22
  def capture_client(pack, ctx, args):
23
- """인터셉트 시점의 부가 메타 세팅 — judge 자격증명 스냅샷 + prompt_meta /
24
- operation_type / eval-worker override.
25
-
26
- judge 자격증명: 앱 client 가 쓰는 base_url/api_key 를 캡처 시점(client 살아있을 때)에
27
- **'문자열만' 복사**해 pack 에 stash 한다. **client 인스턴스/event loop 는 잡지 않는다**
28
- — 요청 스코프면 평가(비동기)가 도는 시점에 이미 닫혀 죽으므로. 평가는 이 값으로 자기
29
- 소유의 durable judge client 를 만든다(앱과 같은 엔드포인트/키 → 설정 0). 읽기 실패나
30
- OAuth(평문 key 없음) 등은 None → conf/env 로 폴백.
23
+ """인터셉트 시점의 부가 메타 세팅 — provider 판별 + prompt_meta / operation_type.
31
24
 
32
25
  실패해도 silently 무시 (인터셉트 자체는 절대 깨면 안 됨).
33
26
  """
34
- # judge 자격증명 스냅샷 — 인스턴스가 아니라 base_url/api_key '값'만 복사.
35
27
  if args:
36
28
  try:
37
29
  llm_client = getattr(args[0], '_client', None)
38
30
  if llm_client is not None:
39
31
  cls = type(llm_client).__name__
40
- pack._llm_judge_kind = 'anthropic' if 'Anthropic' in cls else 'openai'
41
- api_key = getattr(llm_client, 'api_key', None)
42
- if api_key:
43
- pack._llm_judge_api_key = str(api_key)
44
32
  base_url = getattr(llm_client, 'base_url', None)
45
- if base_url:
46
- pack._llm_judge_base_url = str(base_url)
47
33
  # Bedrock 을 SDK 로 부르는 경우(anthropic ``AnthropicBedrock``/
48
34
  # ``AnthropicBedrockMantle``, openai SDK → Bedrock OpenAI 호환 엔드포인트).
49
35
  # provider 를 못박지 않으면 요율·토큰 필드셋이 나간 호스트 문자열 유추에
@@ -52,6 +38,11 @@ def capture_client(pack, ctx, args):
52
38
  'Bedrock' in cls or 'bedrock-runtime' in str(base_url or '')
53
39
  or 'bedrock-mantle' in str(base_url or '')):
54
40
  pack._provider_key = 'bedrock'
41
+ # >>> LLM-EVAL: judge 대상 스냅샷 — 앱 client 의 엔드포인트·자격증명을 '값'으로
42
+ # 떠 둔다(인스턴스는 잡지 않는다 — 요청 스코프면 평가 시점엔 닫혀 있다).
43
+ from whatap.llm.evaluators.hooks import snapshot_judge_client
44
+ snapshot_judge_client(pack, llm_client)
45
+ # <<< LLM-EVAL
55
46
  except Exception:
56
47
  pass
57
48
 
@@ -83,28 +74,15 @@ def capture_client(pack, ctx, args):
83
74
  except Exception:
84
75
  pass
85
76
 
86
- # ★ judge LLM call (eval 워커 안에서 발생한 호출) 인 경우 — operation_type 을
87
- # 'whatap_evaluation' 로 + parent step ids 를 user step 으로 override.
88
- # capture_client 시점에 set 해야 (intercept_create 의 active_key 가 이 직후 계산되므로)
89
- # 메트릭 (active_stat / perf_stat / token_usage_stat) 의 operation_type 라벨이
90
- # 'whatap_evaluation' 로 정확하게 분리됨. dispatch 에서 override 하면 active_key 가 stale.
77
+ # >>> LLM-EVAL: judge 호출(평가 워커 안에서 난 호출)이면 operation_type='whatap_evaluation'
78
+ # + 부모(사용자) 스텝 좌표로 덮는다. 여기서 해야 한다 — intercept_create 의 active_key 가 이
79
+ # 직후 계산되므로, dispatch 에서 덮으면 active/perf/token 메트릭 라벨이 어긋난다.
91
80
  try:
92
- # cycle-break(llm↔counter): 함수 스코프 지연 import (표준 방향의 역방향).
93
- from whatap.counter.tasks.llm_evaluator_task import (
94
- _is_in_evaluator_worker, _get_eval_worker_state,
95
- )
96
- if _is_in_evaluator_worker():
97
- state = _get_eval_worker_state() or {}
98
- pack.operation_type = 'whatap_evaluation'
99
- pack.prompt_version = 'v1'
100
- if state.get('parent_txid'):
101
- pack.txid = state['parent_txid']
102
- if state.get('parent_step_id'):
103
- pack.step_id = state['parent_step_id']
104
- if state.get('parent_index') is not None:
105
- pack.index = state['parent_index']
81
+ from whatap.llm.evaluators.hooks import mark_judge_call
82
+ mark_judge_call(pack)
106
83
  except Exception:
107
84
  pass
85
+ # <<< LLM-EVAL
108
86
 
109
87
 
110
88
  def _stat_task():
@@ -327,18 +305,18 @@ def extract_response(response, finalize_fn, pack, *finalize_args):
327
305
  def _dispatch_input_early(pack):
328
306
  """완료 전 입력쪽(system/input) 로그싱크만 미리 송출 — in-flight 호출의 프롬프트 가시화.
329
307
  완료 dispatch(_process_pack full)는 pack._input_sent 가드로 입력을 재전송하지 않는다.
330
-
331
- eval/judge 워커 호출은 dispatch() 의 parent_txid/step_id override 가 완료 시점에
332
- 적용돼, 선-전송하면 override 전 좌표로 나가 어긋난다 → 선-전송 생략(완료 시 정상 송출).
333
308
  완료 전 실패(after_call 미도달)면 여기 안 오므로 완료 dispatch 가 입력을 정상 송출한다."""
334
309
  if getattr(pack, '_input_sent', False):
335
310
  return
311
+ # >>> LLM-EVAL: judge 호출은 선-전송하지 않는다 — dispatch() 의 부모 좌표 덮기가 완료
312
+ # 시점에 적용돼, 미리 보내면 덮기 전 좌표로 나가 어긋난다(완료 시 정상 송출).
336
313
  try:
337
- from whatap.counter.tasks.llm_evaluator_task import _is_in_evaluator_worker
338
- if _is_in_evaluator_worker():
314
+ from whatap.llm.evaluators.hooks import is_judge_call
315
+ if is_judge_call():
339
316
  return
340
317
  except Exception:
341
318
  pass
319
+ # <<< LLM-EVAL
342
320
  pack._input_sent = True
343
321
  from whatap.counter.tasks.llm_log_sink_task import dispatch_llm_input_pack
344
322
  dispatch_llm_input_pack(pack)
@@ -8,6 +8,7 @@ from whatap.llm.stats.error_stat import ErrorStat
8
8
  from whatap.llm.stats.feature_stat import FeatureStat
9
9
  from whatap.llm.stats.finish_stat import FinishStat
10
10
  from whatap.llm.stats.api_status_stat import ApiStatusStat
11
+ # >>> LLM-EVAL: 평가 메트릭 (llm_eval_stat + 라벨별 점수 히스토그램)
11
12
  from whatap.llm.stats.eval_stat import EvalStat
12
13
  from whatap.llm.stats.hallucination_eval_stat import HallucinationEvalStat
13
14
  from whatap.llm.stats.answer_relevance_eval_stat import AnswerRelevanceEvalStat
@@ -17,6 +18,7 @@ from whatap.llm.stats.prompt_injection_eval_stat import PromptInjectionEvalStat
17
18
  from whatap.llm.stats.factuality_eval_stat import FactualityEvalStat
18
19
  from whatap.llm.stats.pii_leak_eval_stat import PIILeakEvalStat
19
20
  from whatap.llm.stats.url_scan_eval_stat import URLScanEvalStat
21
+ # <<< LLM-EVAL
20
22
 
21
23
  LLM_STAT_CLASSES = [
22
24
  TokenUsageStat,
@@ -29,6 +31,7 @@ LLM_STAT_CLASSES = [
29
31
  FeatureStat,
30
32
  FinishStat,
31
33
  ApiStatusStat,
34
+ # >>> LLM-EVAL: 평가 메트릭
32
35
  EvalStat,
33
36
  HallucinationEvalStat,
34
37
  AnswerRelevanceEvalStat,
@@ -38,4 +41,5 @@ LLM_STAT_CLASSES = [
38
41
  FactualityEvalStat,
39
42
  PIILeakEvalStat,
40
43
  URLScanEvalStat,
44
+ # <<< LLM-EVAL
41
45
  ]
@@ -18,6 +18,16 @@ LLM 응답에 대해 할루시네이션·관련성·유해성·프롬프트 인
18
18
  llm_eval_enabled=true
19
19
  ```
20
20
 
21
+ > whatap.conf 는 `#` 로 시작하는 줄만 주석이다. 값 뒤에 `# 설명` 을 붙이면 그것까지 값이 된다
22
+ > (`llm_eval_enabled=true # 켜기` 는 켜지지 않는다). 설명은 따로 줄에 쓴다.
23
+
24
+ 평가 대상은 텍스트 응답이 있는 호출이다.
25
+ - 임베딩 호출(OpenAI embeddings, Bedrock Titan Embeddings · Cohere Embed 등)은 평가하지 않는다.
26
+ - 응답 텍스트가 없는 호출(도구만 부른 에이전트 단계, 실패한 호출)은 judge 평가자를 건너뛴다 —
27
+ 채점할 답이 없다. 규칙 기반 평가자(`pii_leak` · `url_scan`)는 그대로 돈다. 에이전트는 최종
28
+ 답변 단계의 입력에 앞 단계의 도구 결과가 모두 들어가므로, 도구 결과로 들어온 프롬프트
29
+ 인젝션도 그 단계에서 본다.
30
+
21
31
  ## 2. 평가자 선택
22
32
 
23
33
  - **LLM judge 기반**(judge 호출 비용): `hallucination` · `answer_relevance` ·
@@ -33,7 +43,20 @@ llm_eval_enabled=true
33
43
  기본은 **사용자 호출에서 계측이 캡처한 자격증명(엔드포인트·API 키) 스냅샷**을
34
44
  재사용해 judge용 client 를 별도로 만든다(요청마다 client 를 만들고 닫는 앱에서도 안전).
35
45
  judge 모델은 **앱이 쓴 모델과 동일**하게 설정된다(스냅샷 엔드포인트가 자체호스팅·프록시일
36
- 수 있어 클라우드 기본 모델을 가정 못 함). 모델을 바꾸려면 `llm_eval_judge_model` 명시.
46
+ 수 있어 클라우드 기본 모델을 가정 못 함). 모델만 바꾸는 설정은 없다 — 다른 모델로 평가하려면
47
+ 아래 직접 지정 모드로 `llm_eval_judge_provider`(또는 `llm_eval_judge_base_url`)와 모델·자격증명을
48
+ 함께 지정한다. `llm_eval_judge_model` 만 넣으면 적용되지 않고 LLM056 경고를 남긴다.
49
+
50
+ 모델마다 받는 옵션이 달라도 judge 가 맞춰 보낸다 — 한 번 거절당하면 그 뒤로는 바꾼 모양으로 보낸다.
51
+ - temperature 를 받지 않는 모델(Claude Opus 4.7 이후 · Sonnet 5 · 5.5 · Haiku 5.5, OpenAI o 시리즈 ·
52
+ gpt-5 같은 reasoning 모델)은 temperature 없이.
53
+ - 입력은 자르지 않는다 — 앱의 입력·출력 전체를 judge 에 넣는다.
54
+ - 출력 한도는 빼면 안 되는 곳에만 보낸다.
55
+ - OpenAI(호환 엔드포인트 포함): 보내지 않는다(모델 기본값). 한도가 작은 자체 호스팅 모델도,
56
+ `max_tokens` 를 받지 않는 reasoning 모델도 거절하지 않는다.
57
+ - Anthropic: API 가 `max_tokens` 를 요구해 16000 을 보낸다. Claude 5 계열은 thinking 토큰도 이 한도에
58
+ 들어가 작으면 판정이 잘린다. 서비스 중인 Claude 모델은 모두 받는 값이다.
59
+ - Bedrock: 아래 AWS Bedrock 참고.
37
60
 
38
61
  다음 경우에만 conf 에 자격증명을 **직접** 지정한다(지정 시 스냅샷 경로를 완전 대체):
39
62
  - 스냅샷이 OAuth 라 평문 API 키가 없음
@@ -43,7 +66,8 @@ judge 모델은 **앱이 쓴 모델과 동일**하게 설정된다(스냅샷 엔
43
66
  ### OpenAI 호환 커스텀 엔드포인트
44
67
  ```
45
68
  llm_eval_judge_base_url=http://10.0.0.5:8000/v1
46
- llm_eval_judge_api_key=EMPTY # 키 불필요 로컬 엔진이면 EMPTY
69
+ # 키가 필요 없는 로컬 엔진이면 EMPTY
70
+ llm_eval_judge_api_key=EMPTY
47
71
  llm_eval_judge_model=qwen2.5-7b-instruct
48
72
  ```
49
73
  `base_url` 이 있으면 openai 호환으로 간주(`llm_eval_judge_provider` 생략 가능).
@@ -51,12 +75,45 @@ llm_eval_judge_model=qwen2.5-7b-instruct
51
75
 
52
76
  ### 클라우드 프로바이더 직접
53
77
  ```
54
- llm_eval_judge_provider=openai # openai | anthropic
78
+ # openai | anthropic | bedrock
79
+ llm_eval_judge_provider=openai
55
80
  llm_eval_judge_api_key=<KEY>
56
81
  llm_eval_judge_model=gpt-4o-mini
57
82
  # base_url 은 지정하지 않음(SDK 기본 엔드포인트)
58
83
  ```
59
84
 
85
+ ### AWS Bedrock
86
+
87
+ **Bedrock 을 부르는 앱**(boto3 · aioboto3 · langchain-aws · AnthropicBedrock · LiteLLM)은
88
+ 설정 없이 judge 도 Bedrock Runtime(Converse API)으로 간다 — 앱 호출과 **같은 리전·엔드포인트·
89
+ AWS 자격증명·모델**.
90
+ - 자격증명: boto3 는 앱 client 의 자격증명 그대로(assume-role·SSO 같은 갱신형 포함),
91
+ AnthropicBedrock 은 같은 프로파일/명시 키, aioboto3·LiteLLM 은 AWS 기본 자격증명 체인
92
+ (환경변수 → `~/.aws` → IAM 역할).
93
+ - 권한: judge 모델에 대한 `bedrock:InvokeModel` (Converse 도 이 권한을 쓴다).
94
+ - system 프롬프트나 temperature 를 받지 않는 모델(Titan Text, Claude Opus 4.7 이후 ·
95
+ Sonnet 5 · 5.5 · Haiku 5.5 등)도 자동으로 맞춰 보낸다 — 한 번 거절당하면 그 값을 빼고 다시 보낸다.
96
+ - 출력 한도는 16000 토큰(Claude 5 계열은 thinking 토큰도 들어간다). 한도가 더 작은 모델(Llama ·
97
+ Titan · Nova 등)은 한 번 거절당한 뒤 2048 로 보낸다. 한도를 빼지 않는 건 Bedrock 이 요청마다
98
+ 이 값만큼 계정 TPM 할당량을 먼저 잡기 때문이다 — 빼면 모델 최대치를 잡아 같은 모델을 쓰는 앱
99
+ 호출이 throttle 될 수 있다.
100
+ - 임베딩 호출(InvokeModel 로 부르는 Titan Embeddings · Cohere Embed 등)은 평가하지 않는다.
101
+
102
+ **다른 앱(OpenAI 등)도 judge 만 Bedrock 으로** 보내거나 judge 모델을 바꾸려면:
103
+ ```
104
+ llm_eval_judge_provider=bedrock
105
+ # 필수 — modelId 또는 추론 프로파일 ID
106
+ llm_eval_judge_model=us.anthropic.claude-haiku-4-5-20251001-v1:0
107
+ # 생략 시 AWS_DEFAULT_REGION / ~/.aws/config (botocore 는 AWS_REGION 을 읽지 않는다)
108
+ llm_eval_judge_region=us-east-1
109
+ # 생략 시 기본 자격증명 체인
110
+ llm_eval_judge_aws_profile=eval
111
+ # VPC 엔드포인트를 쓰면 아래 줄의 맨 앞 # 를 지운다
112
+ # llm_eval_judge_base_url=https://vpce-xxxx.bedrock-runtime.us-east-1.vpce.amazonaws.com
113
+ ```
114
+ Bedrock 엔 기본 judge 모델이 없다(계정·리전마다 열린 모델이 다르다) — `llm_eval_judge_model`
115
+ 필수. `llm_eval_judge_api_key` 는 쓰지 않는다(AWS 서명).
116
+
60
117
  ## 4. 비용 / 성능 옵션
61
118
 
62
119
  | 키 | 기본 | 설명 |
@@ -2,6 +2,8 @@ from functools import wraps
2
2
  from whatap.trace.trace_context_manager import TraceContextManager
3
3
 
4
4
 
5
+ # >>> LLM-EVAL: 평가 워커의 judge 호출도 계측할지 — 워커엔 트레이스 컨텍스트가 없어 아래
6
+ # 우회(bypass)에 걸리므로, 추적 옵션이 켜져 있으면 judge 호출만 우회를 푼다.
5
7
  def _in_eval_worker():
6
8
  """평가 워커 안에서 호출되었고 + judge tracking 옵션이 켜져있는지.
7
9
 
@@ -11,7 +13,8 @@ def _in_eval_worker():
11
13
 
12
14
  재귀 방지는 ``LlmEvaluatorTask.enqueue`` 의 동일 가드로 차단됨.
13
15
  Conf 값이 string 'true'/'false' 일 수도 있어 (Configure.setProperty 의 reload 버그)
14
- 안전하게 string interpret.
16
+ 안전하게 string interpret. 옵션을 먼저 본다 — 꺼져 있으면(기본) 평가 모듈을 import 하지
17
+ 않는다(컨텍스트 밖 계측 호출마다 지나는 자리다).
15
18
  """
16
19
  try:
17
20
  from whatap.conf.configure import Configure as conf
@@ -22,10 +25,11 @@ def _in_eval_worker():
22
25
  enabled = bool(val)
23
26
  if not enabled:
24
27
  return False
25
- from whatap.counter.tasks.llm_evaluator_task import _is_in_evaluator_worker
26
- return _is_in_evaluator_worker()
28
+ from whatap.llm.evaluators.hooks import is_judge_call
29
+ return is_judge_call()
27
30
  except Exception:
28
31
  return False
32
+ # <<< LLM-EVAL
29
33
 
30
34
 
31
35
  def trace_handler(fn, start=False, preload=None):
@@ -37,7 +41,12 @@ def trace_handler(fn, start=False, preload=None):
37
41
 
38
42
  ctx = TraceContextManager.getLocalContext()
39
43
 
40
- if not start and not ctx and not _in_eval_worker():
44
+ bypass = not start and not ctx
45
+ # >>> LLM-EVAL: judge 호출 추적 (llm_eval_track_judge_calls)
46
+ if bypass and _in_eval_worker():
47
+ bypass = False
48
+ # <<< LLM-EVAL
49
+ if bypass:
41
50
  return fn(*args, **kwargs)
42
51
 
43
52
  try:
@@ -67,7 +76,12 @@ def async_trace_handler(fn, start=False, preload=None):
67
76
 
68
77
  ctx = TraceContextManager.getLocalContext()
69
78
 
70
- if not start and not ctx and not _in_eval_worker():
79
+ bypass = not start and not ctx
80
+ # >>> LLM-EVAL: judge 호출 추적 (llm_eval_track_judge_calls)
81
+ if bypass and _in_eval_worker():
82
+ bypass = False
83
+ # <<< LLM-EVAL
84
+ if bypass:
71
85
  return await fn(*args, **kwargs)
72
86
 
73
87
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: whatap-python
3
- Version: 2.2.2
3
+ Version: 2.3.0
4
4
  Summary: Monitoring and Profiling Service
5
5
  Home-page: https://www.whatap.io
6
6
  Author: whatap
@@ -2,18 +2,18 @@ whatap/LICENSE,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  whatap/README.rst,sha256=M4dohffaOQQcSlo02OgWplEr9SlffyjV3v7w9vHf1RI,967
3
3
  whatap/__init__.py,sha256=gXCQ6VEDiGJsMNhVA6KdcegbHOwmCRf6ftPvT-yBdvg,54023
4
4
  whatap/__main__.py,sha256=9fgK-V2eh7rZQ0OKWjpYsWRCyhOx35zRK6XUvJXWuUo,64
5
- whatap/build.py,sha256=ab3K4uWR5PPACWXHNhutJKQosLm-1lNVKOBXOwNmBHs,82
6
- whatap/doctor.py,sha256=ZVg8tYrm5KcPNsShen_PwmTviLLMK7e0ZRRoqth6WNE,15063
5
+ whatap/build.py,sha256=EU3peF-ek7cU2vdWizUvqrbuI2WC16o4r9B55twdxpg,82
6
+ whatap/doctor.py,sha256=7Zes4Pzj3nldYzT-GeOEE4CvcyUIM_z9vIq99bj9XDA,15276
7
7
  whatap/whatap.conf,sha256=E3UACbCDQ3-3XgDJWovbAtEN6LVLa7BQuCA0NXtX3CY,457
8
- whatap/agent/darwin/amd64/whatap_python,sha256=dLdQ2aVjuinboro4S8600b4sEA73RpFIHw72lvkSvRk,20802384
9
- whatap/agent/darwin/arm64/whatap_python,sha256=ar2scLqop8rVxB_ITdOrSIMlyTThQ6rF1V6pf1acqag,19784050
10
- whatap/agent/linux/amd64/whatap_python,sha256=t8A7lHwhw-LgY5il53CRT5GGpVUSrRnMlSnLM9mlgSM,21665720
11
- whatap/agent/linux/arm64/whatap_python,sha256=l3271u-FFlipfOTKtZM1r9Iz5YnbJx_cI7QuBuNoPjI,21840824
12
- whatap/agent/windows/whatap_python.exe,sha256=ZmZIlcLD8yecsTOlqR6SBnLVQvlbtN70Wv0bb83j8f4,30576618
8
+ whatap/agent/darwin/amd64/whatap_python,sha256=KbCTayTyxm790OSO6gxXSUGOGS36PtnW3h1rflryS2Q,14361296
9
+ whatap/agent/darwin/arm64/whatap_python,sha256=DFPjwyPYOKqaqRs2ldUCps6jORP-JGtKx7Igck7OQSo,13528978
10
+ whatap/agent/linux/amd64/whatap_python,sha256=JZ2zphOemFkLl-F-RI18QKEGl5xBpdQdOupXde8IKvs,22242432
11
+ whatap/agent/linux/arm64/whatap_python,sha256=h2n3WoIYN8RzyL-ggoHsypmUrjVn8yqDW7UmibMgnJU,20602912
12
+ whatap/agent/windows/whatap_python.exe,sha256=7FDPOkSf0Zuq6uWGVT-WtiRKWanxVWcKyJXlxtUCiVQ,20064591
13
13
  whatap/bootstrap/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  whatap/bootstrap/sitecustomize.py,sha256=snxCliLZwT8oel1rLL6-F-mQ9nYeDFCA5WQV97ijwTM,505
15
15
  whatap/conf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- whatap/conf/configuration.py,sha256=L0UM_JL0bUNa-IInisJoUMAJZXw_SF7G-BdCivucqUc,31181
16
+ whatap/conf/configuration.py,sha256=mlcxS29Y6f4gnNB0wNPh93ldJGaE3DGJtkBM0acAg6M,32873
17
17
  whatap/conf/configure.py,sha256=r1mPjLuvhtcrwflMq9tmfYnh9r7vz6OvEAQITgCTrOw,6598
18
18
  whatap/conf/license.py,sha256=5Hzi2uZDYAVNkoquL5Jg7f6afvynfyeXJghUHKaMegQ,1320
19
19
  whatap/control/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -21,8 +21,8 @@ whatap/counter/__init__.py,sha256=ph50ubap0uxvnZuqE_3H4QpnG4CrLN9wVD-l_DO5nU4,19
21
21
  whatap/counter/counter_manager.py,sha256=8FwhZCWBuUhEw37AXDRv1eI3CRCp59kBeEjFbiV6bc8,1321
22
22
  whatap/counter/tasks/__init__.py,sha256=anF0CU_8jETDbY1hu_OIPCzBfeq1Yh0uVtqUu3n1sv8,116
23
23
  whatap/counter/tasks/base_task.py,sha256=ZpOwzkbAic92Zeq_QFxCwRRJr8burPiOMba3J_lloVY,1371
24
- whatap/counter/tasks/llm_evaluator_task.py,sha256=r-QVcYueT91K1e_9Zlpc18A4Tz8JFpoz0H2wlx8tFQ0,23100
25
- whatap/counter/tasks/llm_log_sink_task.py,sha256=rfdq30fwgZsEPS172V-1_CzHx2NxeUL31sQkf3kLTA0,16308
24
+ whatap/counter/tasks/llm_evaluator_task.py,sha256=Hdo5pUnFc8q9nuNXcLqalzjMzyQ89irae9KhWx5hCww,22260
25
+ whatap/counter/tasks/llm_log_sink_task.py,sha256=m1OQ0qZ1C5oQKdgTd5BBRx6c6yVmOPmBy33NsrCpmK8,15733
26
26
  whatap/counter/tasks/llm_stat_task.py,sha256=UCtQeRhGXiM0j-bC5pu2TuWlkNgXg1udNZGOF-T_6AI,6636
27
27
  whatap/counter/tasks/openfiledescriptor.py,sha256=F-dcFWzPOkoCtqkyS7utxcSaf6zLzL5EPCIDpQCh2N4,1857
28
28
  whatap/io/__init__.py,sha256=rGgryvBxYaaMDlT7DhEVwwz4ejb1P7Q5RX_t-82oajM,46
@@ -34,7 +34,7 @@ whatap/llm/features.py,sha256=pxGnzj7RQZf2E6WmYpqlMfCAKr_etoA59F92rd7GMdU,3006
34
34
  whatap/llm/pricing.py,sha256=28wCOUPCz1U5DHcGk69RZPJVz9lw24isL_gngXREghg,8111
35
35
  whatap/llm/api/__init__.py,sha256=hH3DY5t0rQhqJ2HeisuSiAbg5pI5MBt65_fZOcpFvQo,1079
36
36
  whatap/llm/api/agent_name.py,sha256=gcam4NnR-b7wQGiDRH--v-NZMx4SNTfnRP9nacQG3KM,3166
37
- whatap/llm/api/prompt_meta.py,sha256=_IkOAUtNdiurPTcD821VV1CfIBsrKQxYOt6iE5gHGMU,11875
37
+ whatap/llm/api/prompt_meta.py,sha256=23dqYu3CzzIWnVXb_itRH_TeqAEUv2a0nULRotNI7Mw,11824
38
38
  whatap/llm/api/session.py,sha256=Uv4WHYmOd22Fz08Qv5xB0ye3i6ula9ZMoz1_6kBND5E,7217
39
39
  whatap/llm/api/turn.py,sha256=iBrjWGrVAukPxCz39_jUQlegW8Hga5kDsOr1SovaMIk,4199
40
40
  whatap/llm/api/user.py,sha256=8sqt-Y5t0RH6Z8fhggpA91H_X7oVReRYycFWiIPFNU0,7177
@@ -44,18 +44,19 @@ whatap/llm/control/cut.py,sha256=R4X5ONA14loWMzqVBJqwy6ifIXaCJE4XWSvjVZM-ano,236
44
44
  whatap/llm/control/guard.py,sha256=RWUdrZgH6PAPH4nXx_qlix0xlxmKgT-5VeOR746mEmU,9952
45
45
  whatap/llm/control/trajectory.py,sha256=ccKkv0gfsJDchR7j-QbyvdQV9RUP_PaI6_4p09Ta36Q,25530
46
46
  whatap/llm/evaluators/__init__.py,sha256=QqQau57veT4v0bTKrOSYV8msjJ6MIJfjqIl4o_SQ0M0,5739
47
- whatap/llm/evaluators/base.py,sha256=ntpXeRpXazmW8i0024QsC77BoOh3wUspVGS4t6veWFc,5775
48
- whatap/llm/evaluators/registry.py,sha256=MN5z3oQGV5ufUCWzWyuBe8Q_JpMSfA6-lNV7S3YCX5k,10427
47
+ whatap/llm/evaluators/base.py,sha256=AlWR_TH4racCoOZIeatiM57mgjB_hpoB4doihyOd6jE,6144
48
+ whatap/llm/evaluators/hooks.py,sha256=Jxa71P79Mynqv2WDvt0RMm31zVpKsK7eMdbI46tMXt4,8588
49
+ whatap/llm/evaluators/registry.py,sha256=7Jv-DPqpKr5U_xVQJW0NSiCmpAxZfJq5TL_whdZKWko,12634
49
50
  whatap/llm/evaluators/sampler.py,sha256=1FrpJ_dLnO4Vv4k5o4U0FDR-5LvGPrqmH5o51y9Lz0U,2785
50
51
  whatap/llm/evaluators/scope.py,sha256=rvTWFOQPUbiXRtqag_nm0QQELhW4V5UC-Zlkr2uOknE,14434
51
- whatap/llm/evaluators/builtins/__init__.py,sha256=GhBmELkX3Sj0kViXAfFfHVtjV-h32F6Ea0c-wi-ZTsc,3861
52
+ whatap/llm/evaluators/builtins/__init__.py,sha256=h70YS1VyQBarc0g0LN_nr1oWivzJjkNiul8Jd1q5vuE,4077
52
53
  whatap/llm/evaluators/builtins/_json_repair.py,sha256=eM_Q_izH7pFCDDBpw0UTi6ohOsq9j34M9yi5Vg9hRtM,4013
53
54
  whatap/llm/evaluators/builtins/answer_relevance.py,sha256=IlgzwXw4H_v2-L5UklinrnOxIk3o1kPLjx5-R3H93Oc,1732
54
55
  whatap/llm/evaluators/builtins/combined_judge.py,sha256=5sNV8lmwe4TTfTbaTTudXB1sHx9S3GfDrfV02qmKq70,13386
55
56
  whatap/llm/evaluators/builtins/factuality.py,sha256=zjB1iGE0p7vEK_2MH5Z3e-1xU2mNnFPUYqANENbKQUk,2871
56
57
  whatap/llm/evaluators/builtins/hallucination.py,sha256=vYlZwQNc2Blzv1QUp_wllrTzJNxNxsJ0sS_KA4bT4Gc,4248
57
- whatap/llm/evaluators/builtins/judge_factories.py,sha256=IYOBVt0RMmvSik3rBvEMS_nsye4hUS8y7hIV7KmIUVw,3960
58
- whatap/llm/evaluators/builtins/llm_judge.py,sha256=Fu7G0R8zuFc-K4121PFK0RpVvd5CaS55MTVx63NvsbM,11786
58
+ whatap/llm/evaluators/builtins/judge_factories.py,sha256=kwUkD72N3o-fdiaAiBvOTD4H5dKfGzOVU_fpz9SfcZU,16772
59
+ whatap/llm/evaluators/builtins/llm_judge.py,sha256=M0I-zyOKLWI0vUsHPu7bkAK7Jn1LBsx7cS7Qsw9estE,15483
59
60
  whatap/llm/evaluators/builtins/pii_leak.py,sha256=Ux6223e08h1P0IzqGeZqz9K6aLWS-nfMPnsswNiRAFs,7588
60
61
  whatap/llm/evaluators/builtins/prompt_injection.py,sha256=JyOKoXfiUBq21vgJ2GJHFS2dQSR3T3PojUAj1gVCW2A,2827
61
62
  whatap/llm/evaluators/builtins/toxicity.py,sha256=6FxAlujrYmBAa39WDjGGONd5ta4Fw7hjKQyLtXTEkP4,1947
@@ -65,12 +66,12 @@ whatap/llm/instrument/_boundary.py,sha256=yUUq3k8YoNqlgoggV5OfxzgHX9946eHSrdU5Tz
65
66
  whatap/llm/instrument/agent.py,sha256=fX7p7QVjsLGLRAu9pycyjStdagF-L65nCh3NiY7U1sY,1811
66
67
  whatap/llm/instrument/llm_api.py,sha256=jdFPXLPlQUoMqBmK-wMnlFztOcKY28QAho6AaFPjGPk,4560
67
68
  whatap/llm/instrument/workflow.py,sha256=ld2LzaH8DP9dHm9gtOv0SQMvBatd1eS6c_iIOpays_g,2508
68
- whatap/llm/log_sink_packs/__init__.py,sha256=kWSu4UYjF0zB0ylvjnkYVmwMEx8vUp1xdbQTIkv_W1k,636
69
+ whatap/llm/log_sink_packs/__init__.py,sha256=hbKZwWFT5Huh350ZMkEwBFEhXuir3XIgafJNGJsNOwI,722
69
70
  whatap/llm/log_sink_packs/llm_input_message.py,sha256=mOCo559f6vHFQlK8UPQYhu57FtcPTSuhoZxtmLTdg0c,464
70
71
  whatap/llm/log_sink_packs/llm_log_sink_pack.py,sha256=x0oMMyrvAGgeVyCmlyhFDMpfaBFKVScehVQrhlgJ5Cs,4438
71
72
  whatap/llm/log_sink_packs/llm_output_message.py,sha256=OBMpTOY8qNBBBBOkq_xEUCltKFIxRI6uad7Ik5XgGXw,680
72
73
  whatap/llm/log_sink_packs/llm_step_eval_status.py,sha256=KeAWR26GltQgZIquzkP5boEiP8dTSBhrl3zjjoE9-uo,4555
73
- whatap/llm/log_sink_packs/llm_step_status.py,sha256=hHjlM0nVIJDsXtnrV8CtBPPAxRJYO7qARBWiy4bgLmQ,4790
74
+ whatap/llm/log_sink_packs/llm_step_status.py,sha256=3K-Dq4psMoU3mtwYoXkE9kp484RcDp1t7mm6ozwX7VE,4822
74
75
  whatap/llm/log_sink_packs/llm_system_message.py,sha256=ncl5eFPRQ5gyV1EfCeHTD34RXbbBI7zwUAtxb_6IXmM,462
75
76
  whatap/llm/log_sink_packs/llm_tool_calls.py,sha256=CIYbIsjUQWBr4qetAfLNAVjIFnv-lVkZoJmJ7C6Tvz4,1552
76
77
  whatap/llm/log_sink_packs/llm_tool_results.py,sha256=bbg71I_p6ICVsoqMyIJJ-dpvuhjaeAe7Go3JHYPuxB0,465
@@ -81,7 +82,7 @@ whatap/llm/orchestration/hermes/gateway.py,sha256=rnk6N0JEYqw_pygZJ7rNlALxjG1Z38
81
82
  whatap/llm/orchestration/hermes/kanban.py,sha256=y0ynOUHbouNwQ2I7qiYjloh7zA25xSWZrgnmIHSxfuA,16048
82
83
  whatap/llm/orchestration/langgraph/__init__.py,sha256=HVD79s-cXmzrS5Njv2KdvNpaJ6_whwO2cHeDrsTsMR0,6309
83
84
  whatap/llm/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
- whatap/llm/providers/interceptor.py,sha256=tNyslUWJQUbK8Yc1pmluM6HZ3NwwJvxQDDA6MaftKhs,18568
85
+ whatap/llm/providers/interceptor.py,sha256=YfB0fwuk-gP9qEFQG-UyrWbrNvsut04UJ_b6khSmvrY,17228
85
86
  whatap/llm/providers/stream_accumulator.py,sha256=M1B7ZVc7qnAYcoReA1vriJDF6FhBy3J36QoLdvMRnNw,13323
86
87
  whatap/llm/providers/workflow.py,sha256=HD2T02YD_QM3rdwPRFbs4FyiPSQGY9GjtG7u2Zcj0Bw,40984
87
88
  whatap/llm/providers/anthropic/__init__.py,sha256=Y2EM1A0p_-plsq8I8ll3saFZUNWmqe2eciVLIV3vPcg,2978
@@ -94,7 +95,7 @@ whatap/llm/providers/bedrock/__init__.py,sha256=fL0VHcA5XfMlPfwr1HuKF7QUD795clD7
94
95
  whatap/llm/providers/bedrock/_content.py,sha256=s-HmZXj7tyXzZlI4WMimtx1TsPGNe11EY0xHzjzRltI,3270
95
96
  whatap/llm/providers/bedrock/event_stream.py,sha256=VEjXovhVaNLxYswxy8s4fDQwpxFBYvV6aYAjJrtBkX4,11418
96
97
  whatap/llm/providers/bedrock/http.py,sha256=5h4vO-tKpqq8Es9KdWtGOXQEgSYnLiqtlJQYnIpQ37g,15725
97
- whatap/llm/providers/bedrock/runtime.py,sha256=1g8y6tJzJ9rI13IOjdHqxMp4uOQ9cObmBwspE8i-NCs,12834
98
+ whatap/llm/providers/bedrock/runtime.py,sha256=NCwQB-VPmGOyUnmmuNlNulpKb15yLBt8lO-rGADsmm4,13237
98
99
  whatap/llm/providers/bedrock/step.py,sha256=OKnuvQ7QDT10Y-dLxQJF_EbVt_mA_lboUAX1aP5ipgQ,2984
99
100
  whatap/llm/providers/bedrock/converse/__init__.py,sha256=aPcS5Apy2-AfNw2N1_AXz29UUzmQbPtFjNXoyz7vkZk,95
100
101
  whatap/llm/providers/bedrock/converse/converse_context.py,sha256=uSGClT7gkTZlzyy2JcPHd8J_IsnldzpThQc4ftWx9-4,6540
@@ -120,7 +121,7 @@ whatap/llm/providers/openai/responses/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCe
120
121
  whatap/llm/providers/openai/responses/responses.py,sha256=-BxwWBBIINTr5o71XPw2plQL8w4741lOiqCiN9IYvus,3538
121
122
  whatap/llm/providers/openai/responses/responses_context.py,sha256=8ZzqEbG4LFi8nhHggMkx7xoL3HNV8_HVShyqD7BSnmc,3308
122
123
  whatap/llm/providers/openai/responses/responses_extractor.py,sha256=HinUvPiQplM_lRUiR694a5DJOmCA8RlPJztdvaayQ6k,5500
123
- whatap/llm/stats/__init__.py,sha256=HuScBcbs0hz0zh5JRPAx-w0JxRrPWpjmaDlaNZhaVuk,1573
124
+ whatap/llm/stats/__init__.py,sha256=09MHRMUeZnxJnTYsSdWrsZ4FFVqQ_XJgsdlM6kME6hE,1728
124
125
  whatap/llm/stats/active_agent_stat.py,sha256=KPVUoKJsadFBw_D98Qc5HbK5kHzFD36q8odYhab-Ago,3675
125
126
  whatap/llm/stats/active_stat.py,sha256=ythk4qg9axSQQ84Ju64gp4bZM3SzdsqzQVwCQ2GWqnk,3724
126
127
  whatap/llm/stats/actx_stat.py,sha256=JQP55wRsVuEwUK2OmAF8ggvIVAhhLawJMX4fwzrRdZ8,4097
@@ -161,7 +162,7 @@ whatap/skills/whatap-python-install/SKILL.md,sha256=9_c3LjfiXc-jA8WuoO0w2weaDZhc
161
162
  whatap/skills/whatap-python-install/references/config-keys.md,sha256=uJfouPJwyHVP499cavWzMw4he76QlIqgC5fcY7FLqC0,2395
162
163
  whatap/skills/whatap-python-install/references/frameworks.md,sha256=5WBg4ayXrbGjZIZDEUr8p8XSR4yxL8iJcvtGKORLZXE,2205
163
164
  whatap/skills/whatap-python-install/references/llm-api-usage.md,sha256=oLfQDy8OcFsg4L4rEXSRcyMeheAXIt6mdnVn7p4QD50,5068
164
- whatap/skills/whatap-python-install/references/llm-evaluation.md,sha256=nRVmeu7vBqX5KGi19gOKOdkuKheJI_AELo1xVmNT3-A,5339
165
+ whatap/skills/whatap-python-install/references/llm-evaluation.md,sha256=dABU3Kyqq9Qjzy2o43AuxXu6Mj4pcx8TqI8ksLR2NAc,9497
165
166
  whatap/skills/whatap-python-install/references/llm-observability.md,sha256=5GFOzLXQ82uFZ6sjOPLbWg2YHex7OJ_Um2HsNzt3D1g,5057
166
167
  whatap/skills/whatap-python-install/references/troubleshooting.md,sha256=p4TC1l9G-E-ZOIMYlkN8WcIbeN6Qpm5_ICKRLi2mC3Q,2313
167
168
  whatap/trace/__init__.py,sha256=1UfEhctKqrEwFa6-MXr996ZHEGXQsgdWlXbX_YQdWF8,289
@@ -171,7 +172,7 @@ whatap/trace/simple_trace_context.py,sha256=TrpXyKbEpMcLawLC-QymsRkxxDwPhwVYcCks
171
172
  whatap/trace/trace_context.py,sha256=53RpOAo96arrYkRENGFA43qqtsFFUwget9TwjCKuMLY,13402
172
173
  whatap/trace/trace_context_manager.py,sha256=uwO-jRXOWhFxv3IIKYUKXy7qVtTM2e6zaikEv6QAiv8,52700
173
174
  whatap/trace/trace_error.py,sha256=f9j4mgpHQnHm1dX7gcNVj9UTcDSRq4LYnnywosBwrDw,3549
174
- whatap/trace/trace_handler.py,sha256=wxKfNyLbq8dAq9Oh6VZM2D4FTtB85_3mhdLPAagdLc0,2951
175
+ whatap/trace/trace_handler.py,sha256=xlGRZDqtdp2huv6VV0XNDTY0eqq9Mc9nNSMpEBwK7qU,3676
175
176
  whatap/trace/trace_import.py,sha256=cDFr4HgWejZoYeh8WRJH7SgX92ejswfTffIy5a5oi-k,6600
176
177
  whatap/trace/trace_module_definition.py,sha256=TmEnViaZ-wJI_M5n5bf_4eqWlzgxgJ4ZTzhNC4AGVoc,7576
177
178
  whatap/trace/mod/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -279,8 +280,8 @@ whatap/value/text_hash_value.py,sha256=WPsSWzkR17plw3sgGjhJK0heCQiy0XdDYhawvBvQl
279
280
  whatap/value/text_value.py,sha256=8CWF57POGgosr5zEnGc0BdY0pYF0Vh8EsifHaRgfEwU,1148
280
281
  whatap/value/value.py,sha256=puRYlGm7q0iX3TKOqe_e0NdgK9Zj2J1t7NzqaQ8g7bU,578
281
282
  whatap/value/value_enum.py,sha256=AoUU4HUWC1bPan8k8CRBE9ayl0rGvJJHdRCTsamkWxE,2577
282
- whatap_python-2.2.2.dist-info/METADATA,sha256=MKczs0MoeyBrvlqnzkIXytQTQu5ZQ-v2CtrotViuhxI,2244
283
- whatap_python-2.2.2.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
284
- whatap_python-2.2.2.dist-info/entry_points.txt,sha256=NuYrKebhdkLc7lRw5RlShwy5T-sf9Yj3f3HTe2uhqWY,379
285
- whatap_python-2.2.2.dist-info/top_level.txt,sha256=8bRV-cNhEi4cSEIRQm5zDLRqkH1ki9YVrcfLIUVs5jg,7
286
- whatap_python-2.2.2.dist-info/RECORD,,
283
+ whatap_python-2.3.0.dist-info/METADATA,sha256=XV7qnYe14StTf2UNhP4H0Y4dpkVUz9NZh78NLyIR2K8,2244
284
+ whatap_python-2.3.0.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
285
+ whatap_python-2.3.0.dist-info/entry_points.txt,sha256=NuYrKebhdkLc7lRw5RlShwy5T-sf9Yj3f3HTe2uhqWY,379
286
+ whatap_python-2.3.0.dist-info/top_level.txt,sha256=8bRV-cNhEi4cSEIRQm5zDLRqkH1ki9YVrcfLIUVs5jg,7
287
+ whatap_python-2.3.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (84.0.0)
2
+ Generator: setuptools (84.2.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5