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.
- whatap/agent/darwin/amd64/whatap_python +0 -0
- whatap/agent/darwin/arm64/whatap_python +0 -0
- whatap/agent/linux/amd64/whatap_python +0 -0
- whatap/agent/linux/arm64/whatap_python +0 -0
- whatap/agent/windows/whatap_python.exe +0 -0
- whatap/build.py +2 -2
- whatap/conf/configuration.py +31 -11
- whatap/counter/tasks/llm_evaluator_task.py +66 -98
- whatap/counter/tasks/llm_log_sink_task.py +23 -34
- whatap/doctor.py +13 -6
- whatap/llm/api/prompt_meta.py +0 -1
- whatap/llm/evaluators/base.py +6 -3
- whatap/llm/evaluators/builtins/__init__.py +5 -1
- whatap/llm/evaluators/builtins/judge_factories.py +260 -27
- whatap/llm/evaluators/builtins/llm_judge.py +68 -5
- whatap/llm/evaluators/hooks.py +182 -0
- whatap/llm/evaluators/registry.py +38 -6
- whatap/llm/log_sink_packs/__init__.py +2 -0
- whatap/llm/log_sink_packs/llm_step_status.py +4 -4
- whatap/llm/providers/bedrock/runtime.py +9 -1
- whatap/llm/providers/interceptor.py +17 -39
- whatap/llm/stats/__init__.py +4 -0
- whatap/skills/whatap-python-install/references/llm-evaluation.md +60 -3
- whatap/trace/trace_handler.py +19 -5
- {whatap_python-2.2.2.dist-info → whatap_python-2.3.0.dist-info}/METADATA +1 -1
- {whatap_python-2.2.2.dist-info → whatap_python-2.3.0.dist-info}/RECORD +29 -28
- {whatap_python-2.2.2.dist-info → whatap_python-2.3.0.dist-info}/WHEEL +1 -1
- {whatap_python-2.2.2.dist-info → whatap_python-2.3.0.dist-info}/entry_points.txt +0 -0
- {whatap_python-2.2.2.dist-info → whatap_python-2.3.0.dist-info}/top_level.txt +0 -0
|
@@ -204,12 +204,15 @@ def _maybe_register_conf_judge():
|
|
|
204
204
|
|
|
205
205
|
- 앱 코드에서 ``set_default_judge_fn()`` 을 이미 호출했으면 그쪽이 우선 (미적용).
|
|
206
206
|
- provider 미지정 + base_url 만 있으면 openai(호환) 으로 간주.
|
|
207
|
-
-
|
|
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
|
-
#
|
|
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 "
|
|
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
|
|
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
|
-
"""인터셉트 시점의 부가 메타 세팅 —
|
|
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
|
-
#
|
|
87
|
-
#
|
|
88
|
-
#
|
|
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
|
-
|
|
93
|
-
|
|
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.
|
|
338
|
-
if
|
|
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)
|
whatap/llm/stats/__init__.py
CHANGED
|
@@ -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
|
-
수 있어 클라우드 기본 모델을 가정 못 함).
|
|
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
|
-
|
|
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
|
-
|
|
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
|
| 키 | 기본 | 설명 |
|
whatap/trace/trace_handler.py
CHANGED
|
@@ -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.
|
|
26
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
@@ -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=
|
|
6
|
-
whatap/doctor.py,sha256=
|
|
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=
|
|
9
|
-
whatap/agent/darwin/arm64/whatap_python,sha256=
|
|
10
|
-
whatap/agent/linux/amd64/whatap_python,sha256=
|
|
11
|
-
whatap/agent/linux/arm64/whatap_python,sha256=
|
|
12
|
-
whatap/agent/windows/whatap_python.exe,sha256=
|
|
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=
|
|
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=
|
|
25
|
-
whatap/counter/tasks/llm_log_sink_task.py,sha256=
|
|
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=
|
|
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=
|
|
48
|
-
whatap/llm/evaluators/
|
|
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=
|
|
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=
|
|
58
|
-
whatap/llm/evaluators/builtins/llm_judge.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
283
|
-
whatap_python-2.
|
|
284
|
-
whatap_python-2.
|
|
285
|
-
whatap_python-2.
|
|
286
|
-
whatap_python-2.
|
|
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,,
|
|
File without changes
|
|
File without changes
|