whatap-python 2.0.2rc1__tar.gz → 2.1.0__tar.gz
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_python-2.0.2rc1 → whatap_python-2.1.0}/PKG-INFO +1 -1
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/__init__.py +89 -8
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/agent/linux/amd64/whatap_python +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/agent/linux/arm64/whatap_python +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/agent/windows/whatap_python.exe +0 -0
- whatap_python-2.1.0/whatap/build.py +4 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/conf/configuration.py +52 -1
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/conf/configure.py +1 -1
- whatap_python-2.1.0/whatap/counter/tasks/llm_evaluator_task.py +501 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/counter/tasks/llm_log_sink_task.py +67 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/counter/tasks/llm_stat_task.py +1 -0
- whatap_python-2.1.0/whatap/llm/__init__.py +17 -0
- whatap_python-2.1.0/whatap/llm/evaluators/__init__.py +136 -0
- whatap_python-2.1.0/whatap/llm/evaluators/base.py +114 -0
- whatap_python-2.1.0/whatap/llm/evaluators/builtins/__init__.py +91 -0
- whatap_python-2.1.0/whatap/llm/evaluators/builtins/answer_relevance.py +46 -0
- whatap_python-2.1.0/whatap/llm/evaluators/builtins/combined_judge.py +271 -0
- whatap_python-2.1.0/whatap/llm/evaluators/builtins/factuality.py +71 -0
- whatap_python-2.1.0/whatap/llm/evaluators/builtins/hallucination.py +97 -0
- whatap_python-2.1.0/whatap/llm/evaluators/builtins/llm_judge.py +516 -0
- whatap_python-2.1.0/whatap/llm/evaluators/builtins/pii_leak.py +214 -0
- whatap_python-2.1.0/whatap/llm/evaluators/builtins/prompt_injection.py +71 -0
- whatap_python-2.1.0/whatap/llm/evaluators/builtins/toxicity.py +53 -0
- whatap_python-2.1.0/whatap/llm/evaluators/builtins/url_scan.py +194 -0
- whatap_python-2.1.0/whatap/llm/evaluators/registry.py +192 -0
- whatap_python-2.1.0/whatap/llm/evaluators/sampler.py +83 -0
- whatap_python-2.1.0/whatap/llm/evaluators/scope.py +334 -0
- whatap_python-2.1.0/whatap/llm/features.py +66 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/log_sink_packs/__init__.py +1 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/log_sink_packs/llm_log_sink_pack.py +11 -3
- whatap_python-2.1.0/whatap/llm/log_sink_packs/llm_step_eval_status.py +94 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/log_sink_packs/llm_step_status.py +7 -3
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/log_sink_packs/llm_tx_status.py +8 -2
- whatap_python-2.1.0/whatap/llm/prompt_meta.py +288 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/anthropic/messages/messages.py +5 -2
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/anthropic/messages/messages_context.py +5 -5
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/anthropic/messages/messages_extractor.py +5 -2
- whatap_python-2.1.0/whatap/llm/providers/interceptor.py +182 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/chat/chat.py +5 -2
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/chat/chat_context.py +5 -5
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/chat/chat_extractor.py +9 -8
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/completions/completions.py +5 -2
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/completions/completions_context.py +0 -1
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/embeddings/embeddings.py +8 -3
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/embeddings/embeddings_context.py +0 -1
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/responses/responses.py +5 -2
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/responses/responses_context.py +4 -4
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/responses/responses_extractor.py +7 -6
- whatap_python-2.1.0/whatap/llm/stats/__init__.py +35 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/stats/active_stat.py +14 -5
- whatap_python-2.1.0/whatap/llm/stats/answer_relevance_eval_stat.py +10 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/stats/api_status_stat.py +9 -2
- whatap_python-2.1.0/whatap/llm/stats/base_stat.py +107 -0
- whatap_python-2.1.0/whatap/llm/stats/combined_judge_eval_stat.py +11 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/stats/error_stat.py +7 -4
- whatap_python-2.1.0/whatap/llm/stats/eval_stat.py +225 -0
- whatap_python-2.1.0/whatap/llm/stats/factuality_eval_stat.py +10 -0
- whatap_python-2.1.0/whatap/llm/stats/feature_stat.py +104 -0
- whatap_python-2.1.0/whatap/llm/stats/finish_stat.py +105 -0
- whatap_python-2.1.0/whatap/llm/stats/hallucination_eval_stat.py +10 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/stats/perf_stat.py +15 -3
- whatap_python-2.1.0/whatap/llm/stats/pii_leak_eval_stat.py +12 -0
- whatap_python-2.1.0/whatap/llm/stats/prompt_injection_eval_stat.py +10 -0
- whatap_python-2.1.0/whatap/llm/stats/token_usage_stat.py +133 -0
- whatap_python-2.1.0/whatap/llm/stats/toxicity_eval_stat.py +10 -0
- whatap_python-2.1.0/whatap/llm/stats/url_scan_eval_stat.py +12 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/net/async_sender.py +19 -2
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/net/udp_session.py +31 -2
- whatap_python-2.1.0/whatap/trace/mod/application/fastapi/__init__.py +31 -0
- whatap_python-2.1.0/whatap/trace/mod/application/fastapi/endpoint.py +73 -0
- whatap_python-2.1.0/whatap/trace/mod/application/fastapi/exception_log.py +63 -0
- whatap_python-2.1.0/whatap/trace/mod/application/fastapi/instrumentation.py +204 -0
- whatap_python-2.1.0/whatap/trace/mod/application/fastapi/scope.py +115 -0
- whatap_python-2.1.0/whatap/trace/mod/application/fastapi/transaction.py +67 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/database/util.py +29 -3
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/httpc/util.py +61 -19
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/trace_handler.py +28 -7
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap_python.egg-info/PKG-INFO +1 -1
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap_python.egg-info/SOURCES.txt +35 -1
- whatap_python-2.0.2rc1/whatap/build.py +0 -4
- whatap_python-2.0.2rc1/whatap/llm/__init__.py +0 -1
- whatap_python-2.0.2rc1/whatap/llm/providers/interceptor.py +0 -85
- whatap_python-2.0.2rc1/whatap/llm/stats/__init__.py +0 -15
- whatap_python-2.0.2rc1/whatap/llm/stats/base_stat.py +0 -67
- whatap_python-2.0.2rc1/whatap/llm/stats/feature_stat.py +0 -63
- whatap_python-2.0.2rc1/whatap/llm/stats/token_usage_stat.py +0 -104
- whatap_python-2.0.2rc1/whatap/trace/mod/application/fastapi.py +0 -476
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/README.md +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/pyproject.toml +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/setup.cfg +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/setup.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/LICENSE +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/README.rst +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/__main__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/agent/darwin/amd64/whatap_python +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/agent/darwin/arm64/whatap_python +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/bootstrap/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/bootstrap/sitecustomize.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/conf/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/conf/license.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/control/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/counter/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/counter/counter_manager.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/counter/tasks/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/counter/tasks/base_task.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/counter/tasks/openfiledescriptor.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/io/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/io/data_inputx.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/io/data_outputx.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/definitions.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/log_sink_packs/llm_input_message.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/log_sink_packs/llm_output_message.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/log_sink_packs/llm_system_message.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/log_sink_packs/llm_tool_calls.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/log_sink_packs/llm_tool_results.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/pricing.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/anthropic/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/anthropic/messages/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/chat/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/completions/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/completions/completions_extractor.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/content_parser.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/embeddings/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/embeddings/embeddings_extractor.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/openai/responses/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/providers/stream_accumulator.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/llm/stats/meter.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/net/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/net/packet_enum.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/net/packet_type_enum.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/net/param_def.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/net/stackhelper.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/net/udp_thread.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/pack/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/pack/logSinkPack.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/pack/pack.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/pack/pack_enum.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/pack/tagCountPack.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/scripts/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/amqp/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/amqp/kombu.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/amqp/pika.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/application/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/application/bottle.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/application/celery.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/application/cherrypy.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/application/django.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/application/django_asgi.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/application/django_py3.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/application/flask.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/application/frappe.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/application/graphql.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/application/nameko.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/application/odoo.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/application/starlette.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/application/tornado.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/application/wsgi.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/database/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/database/cxoracle.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/database/mongo.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/database/mysql.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/database/neo4j.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/database/psycopg2.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/database/psycopg3.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/database/redis.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/database/sqlalchemy.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/database/sqlite3.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/email/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/email/smtp.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/httpc/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/httpc/django.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/httpc/httplib.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/httpc/httpx.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/httpc/requests.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/httpc/urllib3.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/logging.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/plugin.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/standalone/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/standalone/multiple.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/mod/standalone/single.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/simple_trace_context.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/trace_context.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/trace_context_manager.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/trace_error.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/trace_import.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/trace/trace_module_definition.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/bit_util.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/cardinality/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/cardinality/hyperloglog.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/cardinality/murmurhash.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/cardinality/registerset.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/compare_util.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/date_util.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/debug_util.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/escape_literal_sql.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/frame_util.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/hash_util.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/hexa32.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/int_set.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/ip_util.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/keygen.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/linked_list.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/linked_map.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/metering_util.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/request_double_queue.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/request_queue.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/string_util.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/throttle_util.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/util/userid_util.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/__init__.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/blob_value.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/boolean_value.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/decimal_value.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/double_summary.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/double_value.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/float_array.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/float_value.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/int_array.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/ip4_value.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/list_value.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/long_array.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/long_summary.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/map_value.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/null_value.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/number_value.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/summary_value.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/text_array.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/text_hash_value.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/text_value.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/value.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/value/value_enum.py +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap/whatap.conf +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap_python.egg-info/dependency_links.txt +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap_python.egg-info/entry_points.txt +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap_python.egg-info/not-zip-safe +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap_python.egg-info/requires.txt +0 -0
- {whatap_python-2.0.2rc1 → whatap_python-2.1.0}/whatap_python.egg-info/top_level.txt +0 -0
|
@@ -301,9 +301,45 @@ from whatap.trace.trace_module_definition import DEFINITION, IMPORT_HOOKS, \
|
|
|
301
301
|
PLUGIN
|
|
302
302
|
|
|
303
303
|
|
|
304
|
+
def _build_ignore_instrumentation_set():
|
|
305
|
+
"""whatap.conf 의 ignore_instrumentation_set 값을 정규화하여 반환.
|
|
306
|
+
Configure.load() 가 _set 접미사 키를 콤마 split 해 list 로 만들지만,
|
|
307
|
+
환경변수/직접 setProperty 등 다른 경로로 들어온 경우(str)도 함께 처리한다.
|
|
308
|
+
"""
|
|
309
|
+
raw = getattr(conf, 'ignore_instrumentation_set', None) or []
|
|
310
|
+
if isinstance(raw, str):
|
|
311
|
+
raw = raw.split(',')
|
|
312
|
+
return {str(item).strip().lower() for item in raw if item and str(item).strip()}
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def _is_instrumentation_ignored(definition_key, ignore_set):
|
|
316
|
+
"""DEFINITION 키(예: 'database.redis', 'logging')가 무시 대상인지 판정.
|
|
317
|
+
|
|
318
|
+
매칭 규칙(셋 중 하나라도 맞으면 True):
|
|
319
|
+
1) 키 전체가 일치 예: 'database.redis' == 'database.redis'
|
|
320
|
+
2) 카테고리(점 앞)와 일치 예: 'database' → 'database.*' 모두
|
|
321
|
+
3) 라이브러리(점 뒤)와 일치 예: 'redis' → 'database.redis'
|
|
322
|
+
"""
|
|
323
|
+
if not ignore_set:
|
|
324
|
+
return False
|
|
325
|
+
key_lower = definition_key.lower()
|
|
326
|
+
if key_lower in ignore_set:
|
|
327
|
+
return True
|
|
328
|
+
if '.' in key_lower:
|
|
329
|
+
category, lib = key_lower.split('.', 1)
|
|
330
|
+
if category in ignore_set or lib in ignore_set:
|
|
331
|
+
return True
|
|
332
|
+
return False
|
|
333
|
+
|
|
334
|
+
|
|
304
335
|
def hooks(home):
|
|
336
|
+
ignore_set = _build_ignore_instrumentation_set()
|
|
337
|
+
skipped_keys = []
|
|
305
338
|
try:
|
|
306
339
|
for key, value_list in DEFINITION.items():
|
|
340
|
+
if _is_instrumentation_ignored(key, ignore_set):
|
|
341
|
+
skipped_keys.append(key)
|
|
342
|
+
continue
|
|
307
343
|
for value in value_list:
|
|
308
344
|
if len(value) >= 3 and isinstance(value[2], str):
|
|
309
345
|
module_path = value[2]
|
|
@@ -318,7 +354,14 @@ def hooks(home):
|
|
|
318
354
|
logging.debug(e, extra={'id': 'MODULE ERROR'})
|
|
319
355
|
finally:
|
|
320
356
|
try:
|
|
321
|
-
if
|
|
357
|
+
if skipped_keys:
|
|
358
|
+
logging.debug(
|
|
359
|
+
'WHATAP: ignore_instrumentation_set skipped: {}'.format(
|
|
360
|
+
','.join(skipped_keys)),
|
|
361
|
+
extra={'id': 'WA_IGN'})
|
|
362
|
+
|
|
363
|
+
if conf.trace_logging_enabled and not _is_instrumentation_ignored(
|
|
364
|
+
'logging', ignore_set):
|
|
322
365
|
logging_module = sys.modules.get("logging")
|
|
323
366
|
from whatap.trace.mod.logging import instrument_logging
|
|
324
367
|
instrument_logging(logging_module)
|
|
@@ -535,12 +578,47 @@ def go(batch=False, opts={}, llm=False):
|
|
|
535
578
|
label = 'LLM golang module' if llm else 'golang module'
|
|
536
579
|
|
|
537
580
|
if sys.platform == 'win32':
|
|
538
|
-
|
|
581
|
+
# SESSIONNAME 환경변수는 NSSM이 부모 세션에서 상속받아 부정확함
|
|
582
|
+
# ProcessIdToSessionId로 실제 프로세스 세션 ID 확인
|
|
583
|
+
try:
|
|
584
|
+
import ctypes
|
|
585
|
+
_sid = ctypes.c_ulong(0)
|
|
586
|
+
ctypes.windll.kernel32.ProcessIdToSessionId(
|
|
587
|
+
ctypes.windll.kernel32.GetCurrentProcessId(),
|
|
588
|
+
ctypes.byref(_sid)
|
|
589
|
+
)
|
|
590
|
+
is_session0 = (_sid.value == 0)
|
|
591
|
+
except Exception:
|
|
592
|
+
is_session0 = not os.environ.get('SESSIONNAME')
|
|
593
|
+
|
|
539
594
|
cmd_args.append('foreground')
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
595
|
+
|
|
596
|
+
if is_session0:
|
|
597
|
+
# Session 0에서만 WHATAP_FOREGROUND=1 추가 주입.
|
|
598
|
+
# IsAnInteractiveSession()이 false로 떨어지는 경로에서
|
|
599
|
+
# foreground CLI 인자를 보강하는 안전망.
|
|
600
|
+
newenv['WHATAP_FOREGROUND'] = '1'
|
|
601
|
+
|
|
602
|
+
# Session 0에서는 PIPE를 읽지 않으면 버퍼 고갈로 Go 프로세스가 블로킹됨
|
|
603
|
+
# 로그 파일로 리디렉션
|
|
604
|
+
# CREATE_NO_WINDOW: Session 0 서비스 컨텍스트에 적합한 플래그
|
|
605
|
+
CREATE_NO_WINDOW = 0x08000000
|
|
606
|
+
log_dir = os.path.join(home_path, 'logs')
|
|
607
|
+
go_log_path = os.path.join(log_dir, AGENT_NAME + '.log')
|
|
608
|
+
try:
|
|
609
|
+
go_out = open(go_log_path, 'ab')
|
|
610
|
+
except Exception:
|
|
611
|
+
go_out = subprocess.DEVNULL
|
|
612
|
+
process = subprocess.Popen(cmd_args,
|
|
613
|
+
cwd=home_path, env=newenv,
|
|
614
|
+
creationflags=CREATE_NO_WINDOW,
|
|
615
|
+
stdout=go_out, stderr=go_out)
|
|
616
|
+
else:
|
|
617
|
+
DETACHED_PROCESS = 0x00000008
|
|
618
|
+
process = subprocess.Popen(cmd_args,
|
|
619
|
+
cwd=home_path, env=newenv,
|
|
620
|
+
creationflags=DETACHED_PROCESS,
|
|
621
|
+
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
544
622
|
else:
|
|
545
623
|
process = subprocess.Popen(cmd_args,
|
|
546
624
|
cwd=home_path, env=newenv,
|
|
@@ -549,8 +627,11 @@ def go(batch=False, opts={}, llm=False):
|
|
|
549
627
|
|
|
550
628
|
time.sleep(0.5)
|
|
551
629
|
if process.poll() is not None:
|
|
552
|
-
|
|
553
|
-
|
|
630
|
+
if sys.platform == 'win32' and is_session0:
|
|
631
|
+
whatap_print("executed {} (exit code: {}, log: {})".format(label, process.returncode, go_log_path))
|
|
632
|
+
else:
|
|
633
|
+
stdouts, errs = process.communicate()
|
|
634
|
+
whatap_print("executed {} ".format(label), str(stdouts,"utf8"), str(errs, "utf8"))
|
|
554
635
|
else:
|
|
555
636
|
write_file(home, file_name, str(process.pid))
|
|
556
637
|
whatap_print("executed {} in background (PID: {})".format(label, process.pid))
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -19,6 +19,13 @@ Configuration = {
|
|
|
19
19
|
"trace_ignore_url_prefix": None,
|
|
20
20
|
"trace_websocket_enabled": False,
|
|
21
21
|
|
|
22
|
+
# 자동 계측에서 제외할 라이브러리 목록(콤마 구분).
|
|
23
|
+
# - DEFINITION 키 전체: database.redis, llm.openai
|
|
24
|
+
# - 카테고리만: database (database.* 전부 스킵)
|
|
25
|
+
# - 라이브러리 이름만: redis, openai, django (해당 키만 스킵)
|
|
26
|
+
# 예: ignore_instrumentation_set=redis,openai,application.django
|
|
27
|
+
"ignore_instrumentation_set": [],
|
|
28
|
+
|
|
22
29
|
"llm_api_hosts": "",
|
|
23
30
|
|
|
24
31
|
"debug": False,
|
|
@@ -225,5 +232,49 @@ Configuration = {
|
|
|
225
232
|
"force_llm_net_udp_port": False,
|
|
226
233
|
"llm_model_pricing": "",
|
|
227
234
|
"llm_perf_sketch_enabled": True,
|
|
228
|
-
"llm_perf_sketch_k": 200
|
|
235
|
+
"llm_perf_sketch_k": 200,
|
|
236
|
+
|
|
237
|
+
# ── LLM Evaluation ──
|
|
238
|
+
# 평가 파이프라인 마스터 토글. false면 enqueue/worker가 동작하지 않음.
|
|
239
|
+
"llm_eval_enabled": False,
|
|
240
|
+
# judge LLM 호출 평가자의 샘플링 비율 (0.0 ~ 1.0).
|
|
241
|
+
# 1.0 (기본) — 모든 judge 평가자 항상 실행
|
|
242
|
+
# 0.1 — judge 평가자 10% 만 실행 (비용 1/10)
|
|
243
|
+
# 0.0 — judge 평가자 전부 skip
|
|
244
|
+
# 규칙 기반 평가자 (PIILeak / URLScan 등 USES_LLM_JUDGE=False) 는 영향 X.
|
|
245
|
+
# 결정론적 샘플링 — 같은 txid 는 항상 같은 결정.
|
|
246
|
+
"llm_eval_sample_rate": 1.0,
|
|
247
|
+
# 평가 큐 최대 크기. 초과 시 drop + LLM030 경고.
|
|
248
|
+
"llm_eval_buffer_limit": 1000,
|
|
249
|
+
# 평가자 실행에 쓸 ThreadPoolExecutor worker 수.
|
|
250
|
+
"llm_eval_workers": 4,
|
|
251
|
+
# judge LLM 1회 호출의 최대 대기 시간 (초). 초과 시 TimeoutError → judge_error
|
|
252
|
+
# 로 graceful degrade. user app 의 event loop 가 hang/backpressure 일 때
|
|
253
|
+
# 평가 워커가 무기한 블록되는 것을 차단. 0 또는 음수면 무제한 (legacy 동작).
|
|
254
|
+
"llm_eval_judge_timeout_sec": 30,
|
|
255
|
+
# judge LLM 호출도 기존 인스트루멘테이션 (intercept) 으로 추적할지 여부.
|
|
256
|
+
# False (기본): judge 호출은 intercept 우회 → 메트릭/logsink 에 안 잡힘.
|
|
257
|
+
# (eval 결과 점수만 LlmStepEvalStatus + llm_eval_stat 로 송출)
|
|
258
|
+
# True : judge 호출이 llm_step_status pack + 메트릭에 잡힘 (사용자 호출과 동일).
|
|
259
|
+
# cost/token/latency 가시화. 메트릭 카운트 2배 증가 가능 (user + judge).
|
|
260
|
+
"llm_eval_track_judge_calls": False,
|
|
261
|
+
# 활성 평가자 csv. 미지정 (빈 값) 이면 default 3 종 자동 활성:
|
|
262
|
+
# combined_judge, pii_leak, url_scan
|
|
263
|
+
# 개별 aspect evaluator (hallucination / answer_relevance / toxicity /
|
|
264
|
+
# prompt_injection / factuality) 는 combined_judge 가 1회 judge 호출로 이미
|
|
265
|
+
# 모두 산출하므로 default 에서 제외 — 명시 활성 시에만 별도 evaluator 가 추가
|
|
266
|
+
# judge 호출을 발생시킴.
|
|
267
|
+
#
|
|
268
|
+
# 가용 라벨 (각 라벨이 evaluator 1개 + 동명 stat 카테고리에 매핑):
|
|
269
|
+
# combined_judge — 1번의 LLM judge 호출로 5 의미 aspect 동시 평가
|
|
270
|
+
# (hallucination / answer_relevance / toxicity /
|
|
271
|
+
# prompt_injection / factuality)
|
|
272
|
+
# pii_leak — 정규식 + Luhn 으로 PII 노출 탐지 (LLM 호출 X)
|
|
273
|
+
# url_scan — URL 추출 + suspicious 패턴 매칭 (LLM 호출 X)
|
|
274
|
+
# hallucination / answer_relevance / toxicity / prompt_injection / factuality
|
|
275
|
+
# — combined_judge 대신 개별 evaluator 만 쓰고 싶을 때
|
|
276
|
+
# 예: "combined_judge,pii_leak,url_scan" (default 와 동일)
|
|
277
|
+
# 예: "pii_leak,url_scan" (정형 평가만, LLM judge 0회)
|
|
278
|
+
# 예: "hallucination,toxicity,pii_leak" (개별 aspect — combined 대신)
|
|
279
|
+
"llm_eval_evaluators": "",
|
|
229
280
|
}
|
|
@@ -60,7 +60,7 @@ class Configure(object):
|
|
|
60
60
|
except Exception as e:
|
|
61
61
|
print('WHATAP: ', e)
|
|
62
62
|
continue
|
|
63
|
-
if not getattr(cls, "license") and getattr(cls, "accesskey"):
|
|
63
|
+
if not getattr(cls, "license", None) and getattr(cls, "accesskey", None):
|
|
64
64
|
setattr(cls, "license", getattr(cls, "accesskey"))
|
|
65
65
|
for callback in cls.observers:
|
|
66
66
|
callback()
|