agent-learning-kit 0.1.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.
- agent_learning_kit-0.1.0.dist-info/METADATA +381 -0
- agent_learning_kit-0.1.0.dist-info/RECORD +642 -0
- agent_learning_kit-0.1.0.dist-info/WHEEL +4 -0
- agent_learning_kit-0.1.0.dist-info/entry_points.txt +5 -0
- agent_learning_kit-0.1.0.dist-info/licenses/LICENSE +173 -0
- agent_learning_kit-0.1.0.dist-info/licenses/NOTICE +7 -0
- fi/__init__.py +5 -0
- fi/alk/__init__.py +57 -0
- fi/alk/_facade.py +31 -0
- fi/alk/_module_alias.py +68 -0
- fi/alk/_paths.py +14 -0
- fi/alk/_schema.py +522 -0
- fi/alk/actions.py +727 -0
- fi/alk/bench/__init__.py +517 -0
- fi/alk/bench/_codeexec.py +213 -0
- fi/alk/bench/_coding.py +215 -0
- fi/alk/bench/_docker.py +237 -0
- fi/alk/bench/_grader.py +286 -0
- fi/alk/bench/_pull.py +212 -0
- fi/alk/bench/_voice.py +147 -0
- fi/alk/capabilities.py +627 -0
- fi/alk/cli.py +6396 -0
- fi/alk/config.py +130 -0
- fi/alk/cua_loop.py +562 -0
- fi/alk/evals.py +2351 -0
- fi/alk/extensions.py +163 -0
- fi/alk/harness/ARCHITECTURE.md +231 -0
- fi/alk/harness/DESIGN.md +246 -0
- fi/alk/harness/ENVIRONMENT_CONFORMANCE.md +127 -0
- fi/alk/harness/HOW-IT-WORKS.md +297 -0
- fi/alk/harness/IMPLEMENTATION_AND_VALIDATION_STATUS.md +229 -0
- fi/alk/harness/README.md +417 -0
- fi/alk/harness/__init__.py +77 -0
- fi/alk/harness/__main__.py +3 -0
- fi/alk/harness/amend.py +312 -0
- fi/alk/harness/artifacts.py +319 -0
- fi/alk/harness/authoring_entrypoint.py +189 -0
- fi/alk/harness/authoring_runtime_validation.py +267 -0
- fi/alk/harness/backends/README.md +43 -0
- fi/alk/harness/backends/__init__.py +122 -0
- fi/alk/harness/backends/base.py +241 -0
- fi/alk/harness/backends/claude.py +211 -0
- fi/alk/harness/backends/files.py +182 -0
- fi/alk/harness/backends/vertex_gemini.py +457 -0
- fi/alk/harness/background_noise.py +95 -0
- fi/alk/harness/build.py +385 -0
- fi/alk/harness/bundle.py +593 -0
- fi/alk/harness/bundle_author_v2.py +1831 -0
- fi/alk/harness/bundle_v2.py +719 -0
- fi/alk/harness/call_runner.py +1440 -0
- fi/alk/harness/callback_http_adapter.py +111 -0
- fi/alk/harness/catalogue.py +287 -0
- fi/alk/harness/chat.py +428 -0
- fi/alk/harness/chat_call_runner.py +506 -0
- fi/alk/harness/checks.py +136 -0
- fi/alk/harness/cli.py +1354 -0
- fi/alk/harness/config.py +338 -0
- fi/alk/harness/contract.py +718 -0
- fi/alk/harness/credentials.py +674 -0
- fi/alk/harness/data/persona_vocabulary.json +111 -0
- fi/alk/harness/environment.py +99 -0
- fi/alk/harness/environment_plan.py +168 -0
- fi/alk/harness/events.py +125 -0
- fi/alk/harness/executor.py +304 -0
- fi/alk/harness/folder.py +234 -0
- fi/alk/harness/generated_runtime.py +815 -0
- fi/alk/harness/github.py +72 -0
- fi/alk/harness/hosted_authoring_entrypoint.py +183 -0
- fi/alk/harness/hosted_entrypoint.py +2402 -0
- fi/alk/harness/hosted_scheduler.py +2218 -0
- fi/alk/harness/job.py +426 -0
- fi/alk/harness/judge.py +184 -0
- fi/alk/harness/livekit_source.py +50 -0
- fi/alk/harness/livekit_tool_trace_bootstrap.py +71 -0
- fi/alk/harness/observability.py +208 -0
- fi/alk/harness/outbound.py +3252 -0
- fi/alk/harness/packaging.py +515 -0
- fi/alk/harness/persona_guides.py +157 -0
- fi/alk/harness/platform.py +692 -0
- fi/alk/harness/process_preflight.py +764 -0
- fi/alk/harness/process_runtime.py +5670 -0
- fi/alk/harness/prove.py +425 -0
- fi/alk/harness/provider_import.py +703 -0
- fi/alk/harness/provider_lifecycle.py +392 -0
- fi/alk/harness/provision.py +2896 -0
- fi/alk/harness/reception.py +147 -0
- fi/alk/harness/retell_chat_call_runner.py +373 -0
- fi/alk/harness/run/__init__.py +296 -0
- fi/alk/harness/run/alk.py +184 -0
- fi/alk/harness/run/call.py +162 -0
- fi/alk/harness/run/conversation.py +264 -0
- fi/alk/harness/run/data/voices_by_language_and_gender.json +693 -0
- fi/alk/harness/run/evidence.py +195 -0
- fi/alk/harness/run/grade.py +598 -0
- fi/alk/harness/run/live.py +297 -0
- fi/alk/harness/run/models.py +56 -0
- fi/alk/harness/run/platform_evals.py +227 -0
- fi/alk/harness/run/sdk_voice.py +130 -0
- fi/alk/harness/run/simulation.py +1209 -0
- fi/alk/harness/run/stage.py +91 -0
- fi/alk/harness/run/targets.py +508 -0
- fi/alk/harness/run/tools.py +601 -0
- fi/alk/harness/run/voice.py +340 -0
- fi/alk/harness/runtime.py +172 -0
- fi/alk/harness/sandbox_server.py +2011 -0
- fi/alk/harness/sandbox_worker.py +44 -0
- fi/alk/harness/scenario.py +1048 -0
- fi/alk/harness/scenario_source.py +879 -0
- fi/alk/harness/scenario_tools.py +1143 -0
- fi/alk/harness/scenarios.py +915 -0
- fi/alk/harness/secrets.py +168 -0
- fi/alk/harness/service_catalog.py +97 -0
- fi/alk/harness/session.py +391 -0
- fi/alk/harness/sessions.py +372 -0
- fi/alk/harness/simulator.py +76 -0
- fi/alk/harness/simulator_voice.py +928 -0
- fi/alk/harness/skills/build-environment/SKILL.md +538 -0
- fi/alk/harness/skills/harness.md +131 -0
- fi/alk/harness/skills/kinds/chat.md +48 -0
- fi/alk/harness/skills/kinds/voice-voicemail.md +63 -0
- fi/alk/harness/skills/kinds/voice.md +59 -0
- fi/alk/harness/skills/plan-suite/SKILL.md +103 -0
- fi/alk/harness/skills/provision-environment/SKILL.md +136 -0
- fi/alk/harness/skills/run-scenarios/SKILL.md +112 -0
- fi/alk/harness/skills/understand-agent/SKILL.md +251 -0
- fi/alk/harness/skills/write-scenarios/SKILL.md +606 -0
- fi/alk/harness/skills/write-scenarios/references/refusals.md +28 -0
- fi/alk/harness/skills/write-scenarios/references/world-api.md +92 -0
- fi/alk/harness/source_data_invariants.py +444 -0
- fi/alk/harness/source_tool_evidence.py +79 -0
- fi/alk/harness/sources.py +253 -0
- fi/alk/harness/spend.py +140 -0
- fi/alk/harness/tool_trace_proxy.py +104 -0
- fi/alk/harness/tools.py +1018 -0
- fi/alk/harness/understand.py +169 -0
- fi/alk/harness/voicemail_audio.py +74 -0
- fi/alk/harness/world/__init__.py +33 -0
- fi/alk/harness/world/errors.py +68 -0
- fi/alk/harness/world/expectations.py +91 -0
- fi/alk/harness/world/handle.py +538 -0
- fi/alk/harness/world/kinds.py +196 -0
- fi/alk/harness/world/mutate.py +186 -0
- fi/alk/harness/world/probe.py +413 -0
- fi/alk/harness/world/provision.py +511 -0
- fi/alk/harness/world/provisioned.py +191 -0
- fi/alk/harness/world/runtime.py +616 -0
- fi/alk/harness/world/snapshot.py +288 -0
- fi/alk/harness/world/stores/__init__.py +305 -0
- fi/alk/harness/world/stores/container.py +215 -0
- fi/alk/harness/world/stores/inprocess.py +346 -0
- fi/alk/harness/world/stores/postgres.py +481 -0
- fi/alk/harness/world/stores/prove.py +202 -0
- fi/alk/harness/world/stores/sqlite.py +245 -0
- fi/alk/harness/world/stores/written.py +182 -0
- fi/alk/harness/world/tools.py +1516 -0
- fi/alk/harness/world/workspace.py +144 -0
- fi/alk/image_loop.py +453 -0
- fi/alk/image_perturb.py +241 -0
- fi/alk/improve.py +274 -0
- fi/alk/live/__init__.py +154 -0
- fi/alk/live/_attribution.py +184 -0
- fi/alk/live/_capture.py +264 -0
- fi/alk/live/_codec.py +391 -0
- fi/alk/live/_contract.py +134 -0
- fi/alk/live/_loopback.py +316 -0
- fi/alk/live/_perturb.py +449 -0
- fi/alk/live/_runner.py +386 -0
- fi/alk/live/_stats.py +561 -0
- fi/alk/live/_transcript.py +240 -0
- fi/alk/live/_workers/__init__.py +9 -0
- fi/alk/live/_workers/a2a_worker.py +316 -0
- fi/alk/live/_workers/langgraph_worker.py +217 -0
- fi/alk/live/_workers/livekit_worker.py +207 -0
- fi/alk/live/_workers/mcp_loopback_server.py +46 -0
- fi/alk/live/_workers/mcp_worker.py +158 -0
- fi/alk/live/_workers/pipecat_worker.py +189 -0
- fi/alk/live/a2a_lane.py +138 -0
- fi/alk/live/langgraph_lane.py +339 -0
- fi/alk/live/livekit_lane.py +376 -0
- fi/alk/live/mcp_lane.py +172 -0
- fi/alk/live/pipecat_lane.py +341 -0
- fi/alk/live/voice_redteam.py +494 -0
- fi/alk/loss.py +306 -0
- fi/alk/optimize.py +36260 -0
- fi/alk/practice/__init__.py +51 -0
- fi/alk/practice/_assess.py +103 -0
- fi/alk/practice/_budget.py +81 -0
- fi/alk/practice/_calibrate.py +69 -0
- fi/alk/practice/_capstone.py +86 -0
- fi/alk/practice/_contract.py +91 -0
- fi/alk/practice/_diagnose.py +79 -0
- fi/alk/practice/_drill.py +196 -0
- fi/alk/practice/_experiment.py +720 -0
- fi/alk/practice/_schedule.py +102 -0
- fi/alk/practice/_store.py +194 -0
- fi/alk/practice/_trainer.py +245 -0
- fi/alk/practice/_update.py +125 -0
- fi/alk/redteam.py +2621 -0
- fi/alk/rewardhack.py +237 -0
- fi/alk/simulate.py +10351 -0
- fi/alk/studio/__init__.py +82 -0
- fi/alk/studio/_bias.py +314 -0
- fi/alk/studio/_calibration.py +522 -0
- fi/alk/studio/_coverage.py +262 -0
- fi/alk/studio/_download.py +665 -0
- fi/alk/studio/_fidelity_attack.py +114 -0
- fi/alk/studio/_generate.py +652 -0
- fi/alk/studio/_library.py +370 -0
- fi/alk/studio/_scan.py +134 -0
- fi/alk/studio/_upgrade.py +42 -0
- fi/alk/studio/_vendor.py +172 -0
- fi/alk/suite.py +4200 -0
- fi/alk/tasks.py +828 -0
- fi/alk/telemetry/__init__.py +149 -0
- fi/alk/telemetry/_contract.py +141 -0
- fi/alk/telemetry/_emit.py +182 -0
- fi/alk/telemetry/_ledger.py +296 -0
- fi/alk/telemetry/_queue.py +127 -0
- fi/alk/telemetry/_row.py +294 -0
- fi/alk/telemetry/_run.py +233 -0
- fi/alk/telemetry/_sync.py +193 -0
- fi/alk/telemetry/_url.py +119 -0
- fi/alk/trinity.py +49397 -0
- fi/alk/voice_loop.py +174 -0
- fi/api/__init__.py +1 -0
- fi/api/auth.py +137 -0
- fi/api/types.py +29 -0
- fi/cli/__init__.py +9 -0
- fi/cli/assertions/__init__.py +25 -0
- fi/cli/assertions/conditions.py +76 -0
- fi/cli/assertions/evaluator.py +286 -0
- fi/cli/assertions/exit_codes.py +20 -0
- fi/cli/assertions/parser.py +131 -0
- fi/cli/assertions/reporter.py +194 -0
- fi/cli/commands/__init__.py +9 -0
- fi/cli/commands/config.py +165 -0
- fi/cli/commands/export.py +208 -0
- fi/cli/commands/init.py +112 -0
- fi/cli/commands/list_cmd.py +213 -0
- fi/cli/commands/run.py +486 -0
- fi/cli/commands/validate.py +173 -0
- fi/cli/commands/view.py +424 -0
- fi/cli/config/__init__.py +6 -0
- fi/cli/config/defaults.py +206 -0
- fi/cli/config/loader.py +155 -0
- fi/cli/config/schema.py +174 -0
- fi/cli/main.py +78 -0
- fi/cli/output/__init__.py +6 -0
- fi/cli/output/formatters.py +106 -0
- fi/cli/output/reporters.py +46 -0
- fi/cli/storage/__init__.py +5 -0
- fi/cli/storage/run_history.py +249 -0
- fi/cli/utils/__init__.py +5 -0
- fi/cli/utils/console.py +44 -0
- fi/evals/__init__.py +131 -0
- fi/evals/autoeval/__init__.py +137 -0
- fi/evals/autoeval/analyzer.py +211 -0
- fi/evals/autoeval/config.py +244 -0
- fi/evals/autoeval/export.py +213 -0
- fi/evals/autoeval/interactive.py +283 -0
- fi/evals/autoeval/pipeline.py +625 -0
- fi/evals/autoeval/prompts.py +139 -0
- fi/evals/autoeval/recommender.py +242 -0
- fi/evals/autoeval/rules.py +589 -0
- fi/evals/autoeval/templates.py +299 -0
- fi/evals/autoeval/types.py +232 -0
- fi/evals/core/__init__.py +16 -0
- fi/evals/core/cloud_registry.py +184 -0
- fi/evals/core/engines.py +368 -0
- fi/evals/core/evaluate.py +319 -0
- fi/evals/core/judge_prompt.py +90 -0
- fi/evals/core/prompt_generator.py +83 -0
- fi/evals/core/registry.py +57 -0
- fi/evals/core/result.py +55 -0
- fi/evals/evaluator.py +721 -0
- fi/evals/execution.py +168 -0
- fi/evals/feedback/__init__.py +32 -0
- fi/evals/feedback/calibrator.py +160 -0
- fi/evals/feedback/collector.py +214 -0
- fi/evals/feedback/hooks.py +81 -0
- fi/evals/feedback/retriever.py +128 -0
- fi/evals/feedback/store.py +272 -0
- fi/evals/feedback/types.py +99 -0
- fi/evals/framework/README.md +79 -0
- fi/evals/framework/__init__.py +267 -0
- fi/evals/framework/backends/Dockerfile.eval-runner +33 -0
- fi/evals/framework/backends/__init__.py +99 -0
- fi/evals/framework/backends/_container.py +141 -0
- fi/evals/framework/backends/_utils.py +145 -0
- fi/evals/framework/backends/base.py +223 -0
- fi/evals/framework/backends/celery_backend.py +417 -0
- fi/evals/framework/backends/celery_worker.py +78 -0
- fi/evals/framework/backends/kubernetes_backend.py +665 -0
- fi/evals/framework/backends/ray_backend.py +521 -0
- fi/evals/framework/backends/temporal.py +350 -0
- fi/evals/framework/backends/temporal_worker.py +126 -0
- fi/evals/framework/backends/thread_pool.py +286 -0
- fi/evals/framework/context.py +258 -0
- fi/evals/framework/enrichment.py +306 -0
- fi/evals/framework/evals/__init__.py +68 -0
- fi/evals/framework/evals/agentic.py +399 -0
- fi/evals/framework/evals/builder.py +609 -0
- fi/evals/framework/evals/semantic.py +142 -0
- fi/evals/framework/evaluator.py +647 -0
- fi/evals/framework/evaluators/__init__.py +22 -0
- fi/evals/framework/evaluators/blocking.py +347 -0
- fi/evals/framework/evaluators/non_blocking.py +577 -0
- fi/evals/framework/propagation.py +421 -0
- fi/evals/framework/protocols.py +385 -0
- fi/evals/framework/registry.py +370 -0
- fi/evals/framework/resilience/__init__.py +150 -0
- fi/evals/framework/resilience/circuit_breaker.py +309 -0
- fi/evals/framework/resilience/degradation.py +355 -0
- fi/evals/framework/resilience/health.py +505 -0
- fi/evals/framework/resilience/rate_limiter.py +228 -0
- fi/evals/framework/resilience/retry.py +274 -0
- fi/evals/framework/resilience/types.py +288 -0
- fi/evals/framework/resilience/wrapper.py +433 -0
- fi/evals/framework/types.py +218 -0
- fi/evals/guardrails/README.md +915 -0
- fi/evals/guardrails/__init__.py +96 -0
- fi/evals/guardrails/backends/__init__.py +43 -0
- fi/evals/guardrails/backends/azure.py +361 -0
- fi/evals/guardrails/backends/base.py +88 -0
- fi/evals/guardrails/backends/generic_llm.py +163 -0
- fi/evals/guardrails/backends/granite.py +216 -0
- fi/evals/guardrails/backends/llamaguard.py +221 -0
- fi/evals/guardrails/backends/local_base.py +479 -0
- fi/evals/guardrails/backends/openai.py +365 -0
- fi/evals/guardrails/backends/qwen.py +170 -0
- fi/evals/guardrails/backends/shieldgemma.py +154 -0
- fi/evals/guardrails/backends/turing.py +235 -0
- fi/evals/guardrails/backends/vllm_client.py +321 -0
- fi/evals/guardrails/backends/wildguard.py +188 -0
- fi/evals/guardrails/base.py +888 -0
- fi/evals/guardrails/config.py +221 -0
- fi/evals/guardrails/discovery.py +243 -0
- fi/evals/guardrails/gateway.py +437 -0
- fi/evals/guardrails/registry.py +231 -0
- fi/evals/guardrails/scanners/__init__.py +127 -0
- fi/evals/guardrails/scanners/base.py +191 -0
- fi/evals/guardrails/scanners/code_injection.py +243 -0
- fi/evals/guardrails/scanners/eval_delegate.py +574 -0
- fi/evals/guardrails/scanners/invisible_chars.py +351 -0
- fi/evals/guardrails/scanners/jailbreak.py +412 -0
- fi/evals/guardrails/scanners/language.py +288 -0
- fi/evals/guardrails/scanners/pipeline.py +260 -0
- fi/evals/guardrails/scanners/regex.py +311 -0
- fi/evals/guardrails/scanners/secrets.py +274 -0
- fi/evals/guardrails/scanners/topics.py +649 -0
- fi/evals/guardrails/scanners/urls.py +341 -0
- fi/evals/guardrails/types.py +96 -0
- fi/evals/llm/__init__.py +3 -0
- fi/evals/llm/base_llm_provider.py +35 -0
- fi/evals/llm/providers/litellm.py +70 -0
- fi/evals/local/__init__.py +90 -0
- fi/evals/local/evaluator.py +690 -0
- fi/evals/local/execution_mode.py +121 -0
- fi/evals/local/llm.py +489 -0
- fi/evals/local/metrics/__init__.py +19 -0
- fi/evals/local/registry.py +360 -0
- fi/evals/manager.py +1018 -0
- fi/evals/manager_types.py +362 -0
- fi/evals/metrics/__init__.py +185 -0
- fi/evals/metrics/agents/__init__.py +74 -0
- fi/evals/metrics/agents/metrics.py +693 -0
- fi/evals/metrics/agents/report.py +36463 -0
- fi/evals/metrics/agents/types.py +160 -0
- fi/evals/metrics/base_llm_metric.py +111 -0
- fi/evals/metrics/base_metric.py +138 -0
- fi/evals/metrics/code_security/__init__.py +305 -0
- fi/evals/metrics/code_security/analyzer.py +985 -0
- fi/evals/metrics/code_security/benchmarks/__init__.py +73 -0
- fi/evals/metrics/code_security/benchmarks/builtin.py +750 -0
- fi/evals/metrics/code_security/benchmarks/loader.py +580 -0
- fi/evals/metrics/code_security/benchmarks/types.py +308 -0
- fi/evals/metrics/code_security/detectors/__init__.py +186 -0
- fi/evals/metrics/code_security/detectors/base.py +394 -0
- fi/evals/metrics/code_security/detectors/cryptography.py +345 -0
- fi/evals/metrics/code_security/detectors/injection.py +744 -0
- fi/evals/metrics/code_security/detectors/secrets.py +287 -0
- fi/evals/metrics/code_security/detectors/serialization.py +192 -0
- fi/evals/metrics/code_security/joint_metrics.py +588 -0
- fi/evals/metrics/code_security/judges/__init__.py +83 -0
- fi/evals/metrics/code_security/judges/base.py +238 -0
- fi/evals/metrics/code_security/judges/dual_judge.py +534 -0
- fi/evals/metrics/code_security/judges/llm_judge.py +301 -0
- fi/evals/metrics/code_security/judges/pattern_judge.py +515 -0
- fi/evals/metrics/code_security/metrics.py +388 -0
- fi/evals/metrics/code_security/modes/__init__.py +63 -0
- fi/evals/metrics/code_security/modes/adversarial.py +284 -0
- fi/evals/metrics/code_security/modes/autocomplete.py +198 -0
- fi/evals/metrics/code_security/modes/base.py +283 -0
- fi/evals/metrics/code_security/modes/instruct.py +253 -0
- fi/evals/metrics/code_security/modes/repair.py +230 -0
- fi/evals/metrics/code_security/reports/__init__.py +57 -0
- fi/evals/metrics/code_security/reports/generator.py +404 -0
- fi/evals/metrics/code_security/reports/leaderboard.py +509 -0
- fi/evals/metrics/code_security/types.py +534 -0
- fi/evals/metrics/function_calling/__init__.py +34 -0
- fi/evals/metrics/function_calling/metrics.py +573 -0
- fi/evals/metrics/function_calling/types.py +87 -0
- fi/evals/metrics/hallucination/__init__.py +54 -0
- fi/evals/metrics/hallucination/detector.py +149 -0
- fi/evals/metrics/hallucination/metrics.py +390 -0
- fi/evals/metrics/hallucination/nli.py +253 -0
- fi/evals/metrics/hallucination/sentinel.py +106 -0
- fi/evals/metrics/hallucination/types.py +132 -0
- fi/evals/metrics/heuristics/aggregation_metrics.py +85 -0
- fi/evals/metrics/heuristics/json_metrics.py +87 -0
- fi/evals/metrics/heuristics/similarity_metrics.py +375 -0
- fi/evals/metrics/heuristics/string_metrics.py +391 -0
- fi/evals/metrics/llm_as_judges/__init__.py +17 -0
- fi/evals/metrics/llm_as_judges/custom_judge/metric.py +112 -0
- fi/evals/metrics/llm_as_judges/custom_judge/prompts.py +26 -0
- fi/evals/metrics/llm_as_judges/types.py +48 -0
- fi/evals/metrics/rag/__init__.py +111 -0
- fi/evals/metrics/rag/advanced/__init__.py +14 -0
- fi/evals/metrics/rag/advanced/multi_hop.py +283 -0
- fi/evals/metrics/rag/advanced/source_attribution.py +344 -0
- fi/evals/metrics/rag/generation/__init__.py +17 -0
- fi/evals/metrics/rag/generation/answer_relevancy.py +176 -0
- fi/evals/metrics/rag/generation/context_utilization.py +245 -0
- fi/evals/metrics/rag/generation/faithfulness.py +241 -0
- fi/evals/metrics/rag/generation/groundedness.py +131 -0
- fi/evals/metrics/rag/rag_score.py +277 -0
- fi/evals/metrics/rag/retrieval/__init__.py +20 -0
- fi/evals/metrics/rag/retrieval/context_entity_recall.py +124 -0
- fi/evals/metrics/rag/retrieval/context_precision.py +158 -0
- fi/evals/metrics/rag/retrieval/context_recall.py +106 -0
- fi/evals/metrics/rag/retrieval/noise_sensitivity.py +163 -0
- fi/evals/metrics/rag/retrieval/ranking.py +261 -0
- fi/evals/metrics/rag/types.py +100 -0
- fi/evals/metrics/rag/utils/__init__.py +62 -0
- fi/evals/metrics/rag/utils/claims.py +189 -0
- fi/evals/metrics/rag/utils/entities.py +244 -0
- fi/evals/metrics/rag/utils/nli.py +92 -0
- fi/evals/metrics/rag/utils/similarity.py +345 -0
- fi/evals/metrics/structured/__init__.py +114 -0
- fi/evals/metrics/structured/field_completeness.py +313 -0
- fi/evals/metrics/structured/hierarchy_score.py +366 -0
- fi/evals/metrics/structured/json_validation.py +190 -0
- fi/evals/metrics/structured/schema_compliance.py +280 -0
- fi/evals/metrics/structured/structured_output_score.py +298 -0
- fi/evals/metrics/structured/types.py +108 -0
- fi/evals/metrics/structured/validators/__init__.py +30 -0
- fi/evals/metrics/structured/validators/base.py +189 -0
- fi/evals/metrics/structured/validators/json_validator.py +196 -0
- fi/evals/metrics/structured/validators/pydantic_validator.py +178 -0
- fi/evals/metrics/structured/validators/yaml_validator.py +248 -0
- fi/evals/otel/__init__.py +266 -0
- fi/evals/otel/config.py +400 -0
- fi/evals/otel/conventions.py +463 -0
- fi/evals/otel/enrichment.py +371 -0
- fi/evals/otel/instrumentors/__init__.py +140 -0
- fi/evals/otel/instrumentors/anthropic.py +517 -0
- fi/evals/otel/instrumentors/base.py +382 -0
- fi/evals/otel/instrumentors/openai.py +673 -0
- fi/evals/otel/processors/__init__.py +36 -0
- fi/evals/otel/processors/base.py +473 -0
- fi/evals/otel/processors/cost.py +445 -0
- fi/evals/otel/processors/evaluation.py +559 -0
- fi/evals/otel/processors/llm.py +462 -0
- fi/evals/otel/tracer.py +506 -0
- fi/evals/otel/types.py +232 -0
- fi/evals/otel_utils.py +23 -0
- fi/evals/protect.py +671 -0
- fi/evals/protect_input_adapter.py +154 -0
- fi/evals/streaming/__init__.py +88 -0
- fi/evals/streaming/buffer.py +213 -0
- fi/evals/streaming/evaluator.py +551 -0
- fi/evals/streaming/policy.py +307 -0
- fi/evals/streaming/scorers.py +368 -0
- fi/evals/streaming/types.py +238 -0
- fi/evals/templates.py +472 -0
- fi/evals/types.py +156 -0
- fi/opt/__init__.py +221 -0
- fi/opt/_objective_scoring.py +85 -0
- fi/opt/base/__init__.py +11 -0
- fi/opt/base/base_generator.py +33 -0
- fi/opt/base/base_mapper.py +26 -0
- fi/opt/base/base_optimizer.py +45 -0
- fi/opt/base/evaluator.py +211 -0
- fi/opt/components.py +3095 -0
- fi/opt/datamappers/__init__.py +3 -0
- fi/opt/datamappers/basic_mapper.py +40 -0
- fi/opt/deployment.py +1021 -0
- fi/opt/evidence.py +4332 -0
- fi/opt/generators/__init__.py +3 -0
- fi/opt/generators/litellm.py +66 -0
- fi/opt/integrations/__init__.py +23 -0
- fi/opt/integrations/generative_suite.py +410 -0
- fi/opt/integrations/simulate.py +1313 -0
- fi/opt/mutations.py +771 -0
- fi/opt/observability.py +4639 -0
- fi/opt/optimizer_trace.py +889 -0
- fi/opt/optimizers/__init__.py +80 -0
- fi/opt/optimizers/agent.py +331 -0
- fi/opt/optimizers/agent_bandit.py +392 -0
- fi/opt/optimizers/agent_curriculum.py +635 -0
- fi/opt/optimizers/agent_evolution.py +894 -0
- fi/opt/optimizers/agent_feedback.py +1863 -0
- fi/opt/optimizers/agent_pareto.py +547 -0
- fi/opt/optimizers/agent_social_memory.py +1113 -0
- fi/opt/optimizers/agent_tpe.py +321 -0
- fi/opt/optimizers/bayesian_search.py +449 -0
- fi/opt/optimizers/council.py +2075 -0
- fi/opt/optimizers/futureagi_replay.py +799 -0
- fi/opt/optimizers/gepa.py +322 -0
- fi/opt/optimizers/metaprompt.py +243 -0
- fi/opt/optimizers/promptwizard.py +417 -0
- fi/opt/optimizers/protegi.py +329 -0
- fi/opt/optimizers/random_search.py +224 -0
- fi/opt/research.py +518 -0
- fi/opt/simulation.py +260 -0
- fi/opt/targets.py +232 -0
- fi/opt/types.py +66 -0
- fi/opt/utils/__init__.py +4 -0
- fi/opt/utils/early_stopping.py +266 -0
- fi/opt/utils/setup_logging.py +82 -0
- fi/simulate/__init__.py +540 -0
- fi/simulate/_hashing.py +35 -0
- fi/simulate/_logging.py +10 -0
- fi/simulate/adapters.py +87 -0
- fi/simulate/agent/__init__.py +120 -0
- fi/simulate/agent/browser.py +658 -0
- fi/simulate/agent/definition.py +587 -0
- fi/simulate/agent/frameworks.py +3528 -0
- fi/simulate/agent/generic.py +8286 -0
- fi/simulate/agent/import_probe.py +227 -0
- fi/simulate/agent/memory.py +905 -0
- fi/simulate/agent/mocks.py +101 -0
- fi/simulate/agent/multi_agent.py +361 -0
- fi/simulate/agent/orchestration.py +903 -0
- fi/simulate/agent/realtime.py +665 -0
- fi/simulate/agent/wrapper.py +99 -0
- fi/simulate/agent/wrappers/__init__.py +18 -0
- fi/simulate/agent/wrappers/anthropic.py +62 -0
- fi/simulate/agent/wrappers/gemini.py +65 -0
- fi/simulate/agent/wrappers/http.py +404 -0
- fi/simulate/agent/wrappers/langchain.py +80 -0
- fi/simulate/agent/wrappers/openai.py +75 -0
- fi/simulate/agent/wrappers/websocket.py +326 -0
- fi/simulate/artifacts/__init__.py +11 -0
- fi/simulate/artifacts/manifest.py +62 -0
- fi/simulate/cli.py +20560 -0
- fi/simulate/endpoints/__init__.py +45 -0
- fi/simulate/endpoints/_http_actor.py +73 -0
- fi/simulate/endpoints/actor_sources.py +243 -0
- fi/simulate/endpoints/base.py +107 -0
- fi/simulate/endpoints/builtins.py +10 -0
- fi/simulate/endpoints/callable.py +95 -0
- fi/simulate/endpoints/http.py +76 -0
- fi/simulate/endpoints/livekit.py +138 -0
- fi/simulate/endpoints/originators.py +132 -0
- fi/simulate/endpoints/profiles.py +348 -0
- fi/simulate/endpoints/retell.py +633 -0
- fi/simulate/endpoints/vapi.py +205 -0
- fi/simulate/endpoints/websocket.py +76 -0
- fi/simulate/environment.py +33026 -0
- fi/simulate/environments/__init__.py +11 -0
- fi/simulate/environments/base.py +73 -0
- fi/simulate/environments/chat.py +697 -0
- fi/simulate/environments/voice.py +212 -0
- fi/simulate/evaluation/__init__.py +4 -0
- fi/simulate/evaluation/ai_eval.py +227 -0
- fi/simulate/evidence/__init__.py +35 -0
- fi/simulate/evidence/base.py +59 -0
- fi/simulate/evidence/caller_observed.py +50 -0
- fi/simulate/evidence/livekit_instrumentation.py +51 -0
- fi/simulate/evidence/livekit_room.py +50 -0
- fi/simulate/evidence/otel.py +49 -0
- fi/simulate/evidence/providers/__init__.py +24 -0
- fi/simulate/evidence/providers/base.py +61 -0
- fi/simulate/evidence/providers/retell.py +376 -0
- fi/simulate/evidence/providers/vapi.py +426 -0
- fi/simulate/hosted/__init__.py +32 -0
- fi/simulate/hosted/child_entrypoint.py +306 -0
- fi/simulate/hosted/job.py +150 -0
- fi/simulate/hosted/targets.py +53 -0
- fi/simulate/instrumentation/__init__.py +5 -0
- fi/simulate/instrumentation/livekit/__init__.py +122 -0
- fi/simulate/manifest.py +1033 -0
- fi/simulate/matrix_cli.py +165 -0
- fi/simulate/realtime/__init__.py +40 -0
- fi/simulate/realtime/events.py +107 -0
- fi/simulate/realtime/media.py +61 -0
- fi/simulate/realtime/session.py +91 -0
- fi/simulate/recording/__init__.py +5 -0
- fi/simulate/recording/room_recorder.py +326 -0
- fi/simulate/registry.py +185 -0
- fi/simulate/results/__init__.py +9 -0
- fi/simulate/results/base.py +18 -0
- fi/simulate/results/filesystem.py +71 -0
- fi/simulate/results/futureagi.py +1340 -0
- fi/simulate/runtime/__init__.py +85 -0
- fi/simulate/runtime/capabilities.py +40 -0
- fi/simulate/runtime/events.py +63 -0
- fi/simulate/runtime/failures.py +25 -0
- fi/simulate/runtime/ids.py +34 -0
- fi/simulate/runtime/plan.py +70 -0
- fi/simulate/runtime/planner.py +102 -0
- fi/simulate/runtime/report.py +174 -0
- fi/simulate/runtime/run.py +75 -0
- fi/simulate/runtime/runner.py +333 -0
- fi/simulate/runtime/spec.py +186 -0
- fi/simulate/simulation/__init__.py +30 -0
- fi/simulate/simulation/behavior_policy.py +425 -0
- fi/simulate/simulation/bridge/__init__.py +9 -0
- fi/simulate/simulation/bridge/audio.py +29 -0
- fi/simulate/simulation/bridge/connector.py +46 -0
- fi/simulate/simulation/bridge/livekit.py +252 -0
- fi/simulate/simulation/bridge/retell.py +188 -0
- fi/simulate/simulation/bridge/vapi.py +177 -0
- fi/simulate/simulation/contract.py +419 -0
- fi/simulate/simulation/engines/__init__.py +12 -0
- fi/simulate/simulation/engines/base.py +21 -0
- fi/simulate/simulation/engines/cloud.py +517 -0
- fi/simulate/simulation/engines/livekit.py +4167 -0
- fi/simulate/simulation/engines/local_text.py +89 -0
- fi/simulate/simulation/fidelity.py +374 -0
- fi/simulate/simulation/gemini_tts_stream.py +110 -0
- fi/simulate/simulation/generator.py +91 -0
- fi/simulate/simulation/goal_machine.py +185 -0
- fi/simulate/simulation/livekit_models.py +467 -0
- fi/simulate/simulation/matrix.py +170 -0
- fi/simulate/simulation/models.py +279 -0
- fi/simulate/simulation/runner.py +153 -0
- fi/simulate/simulation/synthetic.py +880 -0
- fi/simulate/simulation/voice_prompt.py +502 -0
- fi/simulate/simulator/__init__.py +55 -0
- fi/simulate/simulator/builtins.py +53 -0
- fi/simulate/suite.py +1288 -0
- fi/simulate/utils/routes.py +164 -0
- fi/simulate/voice.py +225 -0
- fi/simulate/voice_cli.py +182 -0
- fi/utils/__init__.py +1 -0
- fi/utils/constants.py +14 -0
- fi/utils/errors.py +200 -0
- fi/utils/executor.py +26 -0
- fi/utils/routes.py +119 -0
- fi/utils/utils.py +17 -0
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Code Security Evaluation Types.
|
|
3
|
+
|
|
4
|
+
Foundational types for AI-generated code security evaluation.
|
|
5
|
+
Supports multiple evaluation modes, CWE-based vulnerability classification,
|
|
6
|
+
and joint functional-security metrics.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from enum import Enum
|
|
10
|
+
from typing import Optional, List, Dict, Any
|
|
11
|
+
from pydantic import BaseModel, Field, ConfigDict
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Severity(str, Enum):
|
|
15
|
+
"""Vulnerability severity levels (CVSS-aligned)."""
|
|
16
|
+
CRITICAL = "critical" # CVSS 9.0-10.0
|
|
17
|
+
HIGH = "high" # CVSS 7.0-8.9
|
|
18
|
+
MEDIUM = "medium" # CVSS 4.0-6.9
|
|
19
|
+
LOW = "low" # CVSS 0.1-3.9
|
|
20
|
+
INFO = "info" # Informational only
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class EvaluationMode(str, Enum):
|
|
24
|
+
"""
|
|
25
|
+
AI code security evaluation modes.
|
|
26
|
+
|
|
27
|
+
Each mode tests a different aspect of AI code generation:
|
|
28
|
+
- INSTRUCT: Code generated from natural language instructions
|
|
29
|
+
- AUTOCOMPLETE: Code completion given partial context
|
|
30
|
+
- REPAIR: Fixing vulnerable code
|
|
31
|
+
- ADVERSARIAL: Resistance to security-bypassing prompts
|
|
32
|
+
"""
|
|
33
|
+
INSTRUCT = "instruct"
|
|
34
|
+
AUTOCOMPLETE = "autocomplete"
|
|
35
|
+
REPAIR = "repair"
|
|
36
|
+
ADVERSARIAL = "adversarial"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class VulnerabilityCategory(str, Enum):
|
|
40
|
+
"""High-level vulnerability categories."""
|
|
41
|
+
INJECTION = "injection"
|
|
42
|
+
AUTHENTICATION = "authentication"
|
|
43
|
+
CRYPTOGRAPHY = "cryptography"
|
|
44
|
+
INPUT_VALIDATION = "input_validation"
|
|
45
|
+
SECRETS = "secrets"
|
|
46
|
+
MEMORY = "memory"
|
|
47
|
+
RESOURCE = "resource"
|
|
48
|
+
INFORMATION = "information"
|
|
49
|
+
SERIALIZATION = "serialization"
|
|
50
|
+
ACCESS_CONTROL = "access_control"
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
# CWE to Category mapping
|
|
54
|
+
CWE_CATEGORIES: Dict[str, VulnerabilityCategory] = {
|
|
55
|
+
# Injection
|
|
56
|
+
"CWE-89": VulnerabilityCategory.INJECTION, # SQL Injection
|
|
57
|
+
"CWE-78": VulnerabilityCategory.INJECTION, # OS Command Injection
|
|
58
|
+
"CWE-79": VulnerabilityCategory.INJECTION, # XSS
|
|
59
|
+
"CWE-94": VulnerabilityCategory.INJECTION, # Code Injection
|
|
60
|
+
"CWE-611": VulnerabilityCategory.INJECTION, # XXE
|
|
61
|
+
"CWE-918": VulnerabilityCategory.INJECTION, # SSRF
|
|
62
|
+
|
|
63
|
+
# Authentication
|
|
64
|
+
"CWE-287": VulnerabilityCategory.AUTHENTICATION, # Improper Auth
|
|
65
|
+
"CWE-306": VulnerabilityCategory.AUTHENTICATION, # Missing Auth
|
|
66
|
+
"CWE-352": VulnerabilityCategory.AUTHENTICATION, # CSRF
|
|
67
|
+
"CWE-384": VulnerabilityCategory.AUTHENTICATION, # Session Fixation
|
|
68
|
+
|
|
69
|
+
# Cryptography
|
|
70
|
+
"CWE-327": VulnerabilityCategory.CRYPTOGRAPHY, # Weak Crypto
|
|
71
|
+
"CWE-328": VulnerabilityCategory.CRYPTOGRAPHY, # Weak Hash
|
|
72
|
+
"CWE-330": VulnerabilityCategory.CRYPTOGRAPHY, # Insufficient Randomness
|
|
73
|
+
"CWE-326": VulnerabilityCategory.CRYPTOGRAPHY, # Inadequate Encryption
|
|
74
|
+
|
|
75
|
+
# Input Validation
|
|
76
|
+
"CWE-20": VulnerabilityCategory.INPUT_VALIDATION, # Improper Input Validation
|
|
77
|
+
"CWE-22": VulnerabilityCategory.INPUT_VALIDATION, # Path Traversal
|
|
78
|
+
"CWE-434": VulnerabilityCategory.INPUT_VALIDATION, # Unrestricted Upload
|
|
79
|
+
"CWE-129": VulnerabilityCategory.INPUT_VALIDATION, # Improper Array Index
|
|
80
|
+
|
|
81
|
+
# Secrets
|
|
82
|
+
"CWE-798": VulnerabilityCategory.SECRETS, # Hardcoded Credentials
|
|
83
|
+
"CWE-259": VulnerabilityCategory.SECRETS, # Hardcoded Password
|
|
84
|
+
"CWE-321": VulnerabilityCategory.SECRETS, # Hardcoded Crypto Key
|
|
85
|
+
"CWE-532": VulnerabilityCategory.SECRETS, # Log Sensitive Info
|
|
86
|
+
|
|
87
|
+
# Memory
|
|
88
|
+
"CWE-120": VulnerabilityCategory.MEMORY, # Buffer Overflow
|
|
89
|
+
"CWE-476": VulnerabilityCategory.MEMORY, # NULL Pointer Dereference
|
|
90
|
+
"CWE-190": VulnerabilityCategory.MEMORY, # Integer Overflow
|
|
91
|
+
"CWE-787": VulnerabilityCategory.MEMORY, # Out-of-bounds Write
|
|
92
|
+
|
|
93
|
+
# Resource
|
|
94
|
+
"CWE-400": VulnerabilityCategory.RESOURCE, # Resource Exhaustion
|
|
95
|
+
"CWE-404": VulnerabilityCategory.RESOURCE, # Improper Resource Shutdown
|
|
96
|
+
"CWE-772": VulnerabilityCategory.RESOURCE, # Missing Resource Release
|
|
97
|
+
|
|
98
|
+
# Information
|
|
99
|
+
"CWE-209": VulnerabilityCategory.INFORMATION, # Error Message Info Leak
|
|
100
|
+
"CWE-200": VulnerabilityCategory.INFORMATION, # Sensitive Data Exposure
|
|
101
|
+
|
|
102
|
+
# Serialization
|
|
103
|
+
"CWE-502": VulnerabilityCategory.SERIALIZATION, # Unsafe Deserialization
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class CodeLocation(BaseModel):
|
|
108
|
+
"""Location of a vulnerability in source code."""
|
|
109
|
+
model_config = ConfigDict(extra="allow")
|
|
110
|
+
|
|
111
|
+
line: int = Field(..., description="Line number (1-indexed)")
|
|
112
|
+
column: Optional[int] = Field(default=None, description="Column number")
|
|
113
|
+
end_line: Optional[int] = Field(default=None, description="End line for multi-line")
|
|
114
|
+
end_column: Optional[int] = Field(default=None, description="End column")
|
|
115
|
+
function: Optional[str] = Field(default=None, description="Enclosing function name")
|
|
116
|
+
snippet: Optional[str] = Field(default=None, description="Code snippet")
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class SecurityFinding(BaseModel):
|
|
120
|
+
"""A single security vulnerability finding."""
|
|
121
|
+
model_config = ConfigDict(extra="allow")
|
|
122
|
+
|
|
123
|
+
cwe_id: str = Field(..., description="CWE identifier (e.g., 'CWE-89')")
|
|
124
|
+
vulnerability_type: str = Field(..., description="Human-readable type (e.g., 'SQL Injection')")
|
|
125
|
+
category: VulnerabilityCategory = Field(..., description="High-level category")
|
|
126
|
+
severity: Severity = Field(..., description="Severity level")
|
|
127
|
+
confidence: float = Field(
|
|
128
|
+
...,
|
|
129
|
+
ge=0.0,
|
|
130
|
+
le=1.0,
|
|
131
|
+
description="Detection confidence (0.0-1.0)"
|
|
132
|
+
)
|
|
133
|
+
description: str = Field(..., description="Detailed description of the issue")
|
|
134
|
+
location: Optional[CodeLocation] = Field(default=None, description="Code location")
|
|
135
|
+
suggested_fix: Optional[str] = Field(default=None, description="Recommended fix")
|
|
136
|
+
references: Optional[List[str]] = Field(default=None, description="Reference URLs")
|
|
137
|
+
|
|
138
|
+
@property
|
|
139
|
+
def category_from_cwe(self) -> Optional[VulnerabilityCategory]:
|
|
140
|
+
"""Get category from CWE mapping."""
|
|
141
|
+
return CWE_CATEGORIES.get(self.cwe_id)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
class FunctionalTestCase(BaseModel):
|
|
145
|
+
"""A functional test case for func@k evaluation."""
|
|
146
|
+
model_config = ConfigDict(extra="allow")
|
|
147
|
+
|
|
148
|
+
input: Any = Field(..., description="Test input")
|
|
149
|
+
expected_output: Any = Field(..., description="Expected output")
|
|
150
|
+
description: Optional[str] = Field(default=None, description="Test description")
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
# Alias for backward compatibility
|
|
154
|
+
TestCase = FunctionalTestCase
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
class CodeSecurityInput(BaseModel):
|
|
158
|
+
"""
|
|
159
|
+
Input for code security evaluation.
|
|
160
|
+
|
|
161
|
+
Supports all evaluation modes:
|
|
162
|
+
- INSTRUCT: Provide instruction + generated code
|
|
163
|
+
- AUTOCOMPLETE: Provide code_prefix + generated completion
|
|
164
|
+
- REPAIR: Provide vulnerable code + fixed code
|
|
165
|
+
- ADVERSARIAL: Provide base + adversarial instruction + generated code
|
|
166
|
+
"""
|
|
167
|
+
model_config = ConfigDict(extra="allow")
|
|
168
|
+
|
|
169
|
+
# Core fields
|
|
170
|
+
response: str = Field(..., description="The code to evaluate (generated code)")
|
|
171
|
+
language: str = Field(default="python", description="Programming language")
|
|
172
|
+
|
|
173
|
+
# Evaluation mode
|
|
174
|
+
mode: EvaluationMode = Field(
|
|
175
|
+
default=EvaluationMode.INSTRUCT,
|
|
176
|
+
description="Evaluation mode"
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
# Instruct mode fields
|
|
180
|
+
instruction: Optional[str] = Field(
|
|
181
|
+
default=None,
|
|
182
|
+
description="Natural language instruction (for INSTRUCT mode)"
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
# Autocomplete mode fields
|
|
186
|
+
code_prefix: Optional[str] = Field(
|
|
187
|
+
default=None,
|
|
188
|
+
description="Code before cursor (for AUTOCOMPLETE mode)"
|
|
189
|
+
)
|
|
190
|
+
code_suffix: Optional[str] = Field(
|
|
191
|
+
default=None,
|
|
192
|
+
description="Code after cursor (for AUTOCOMPLETE mode)"
|
|
193
|
+
)
|
|
194
|
+
cursor_line: Optional[int] = Field(
|
|
195
|
+
default=None,
|
|
196
|
+
description="Cursor line number (for AUTOCOMPLETE mode)"
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
# Repair mode fields
|
|
200
|
+
vulnerable_code: Optional[str] = Field(
|
|
201
|
+
default=None,
|
|
202
|
+
description="Original vulnerable code (for REPAIR mode)"
|
|
203
|
+
)
|
|
204
|
+
original_vulnerability: Optional[SecurityFinding] = Field(
|
|
205
|
+
default=None,
|
|
206
|
+
description="The vulnerability to fix (for REPAIR mode)"
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
# Adversarial mode fields
|
|
210
|
+
base_instruction: Optional[str] = Field(
|
|
211
|
+
default=None,
|
|
212
|
+
description="Normal instruction (for ADVERSARIAL mode)"
|
|
213
|
+
)
|
|
214
|
+
adversarial_instruction: Optional[str] = Field(
|
|
215
|
+
default=None,
|
|
216
|
+
description="Adversarial instruction (for ADVERSARIAL mode)"
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
# Functional testing (for func@k)
|
|
220
|
+
test_cases: Optional[List[TestCase]] = Field(
|
|
221
|
+
default=None,
|
|
222
|
+
description="Test cases for functional correctness evaluation"
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
# Reference implementation
|
|
226
|
+
expected_response: Optional[str] = Field(
|
|
227
|
+
default=None,
|
|
228
|
+
description="Reference secure implementation"
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
# Filtering options
|
|
232
|
+
include_categories: Optional[List[VulnerabilityCategory]] = Field(
|
|
233
|
+
default=None,
|
|
234
|
+
description="Only check these vulnerability categories"
|
|
235
|
+
)
|
|
236
|
+
exclude_cwes: Optional[List[str]] = Field(
|
|
237
|
+
default=None,
|
|
238
|
+
description="Skip these specific CWEs"
|
|
239
|
+
)
|
|
240
|
+
min_severity: Severity = Field(
|
|
241
|
+
default=Severity.LOW,
|
|
242
|
+
description="Minimum severity to report"
|
|
243
|
+
)
|
|
244
|
+
min_confidence: float = Field(
|
|
245
|
+
default=0.5,
|
|
246
|
+
ge=0.0,
|
|
247
|
+
le=1.0,
|
|
248
|
+
description="Minimum confidence to report"
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
class CodeSecurityOutput(BaseModel):
|
|
253
|
+
"""Output from code security evaluation."""
|
|
254
|
+
model_config = ConfigDict(extra="allow")
|
|
255
|
+
|
|
256
|
+
# Core scores
|
|
257
|
+
score: float = Field(
|
|
258
|
+
...,
|
|
259
|
+
ge=0.0,
|
|
260
|
+
le=1.0,
|
|
261
|
+
description="Overall security score (1.0 = secure)"
|
|
262
|
+
)
|
|
263
|
+
passed: bool = Field(..., description="Whether code passes security threshold")
|
|
264
|
+
|
|
265
|
+
# Joint metrics (when test_cases provided)
|
|
266
|
+
func_score: Optional[float] = Field(
|
|
267
|
+
default=None,
|
|
268
|
+
description="Functional correctness score (func@k)"
|
|
269
|
+
)
|
|
270
|
+
sec_score: Optional[float] = Field(
|
|
271
|
+
default=None,
|
|
272
|
+
description="Security score (sec@k)"
|
|
273
|
+
)
|
|
274
|
+
func_sec_score: Optional[float] = Field(
|
|
275
|
+
default=None,
|
|
276
|
+
description="Joint score - both correct AND secure (func-sec@k)"
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
# Findings
|
|
280
|
+
findings: List[SecurityFinding] = Field(
|
|
281
|
+
default_factory=list,
|
|
282
|
+
description="List of vulnerability findings"
|
|
283
|
+
)
|
|
284
|
+
total_findings: int = Field(
|
|
285
|
+
default=0,
|
|
286
|
+
description="Total number of findings"
|
|
287
|
+
)
|
|
288
|
+
critical_count: int = Field(
|
|
289
|
+
default=0,
|
|
290
|
+
description="Number of critical-severity findings"
|
|
291
|
+
)
|
|
292
|
+
high_count: int = Field(
|
|
293
|
+
default=0,
|
|
294
|
+
description="Number of high-severity findings"
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
# Breakdowns
|
|
298
|
+
severity_counts: Dict[str, int] = Field(
|
|
299
|
+
default_factory=dict,
|
|
300
|
+
description="Count of findings per severity"
|
|
301
|
+
)
|
|
302
|
+
cwe_counts: Dict[str, int] = Field(
|
|
303
|
+
default_factory=dict,
|
|
304
|
+
description="Count of findings per CWE"
|
|
305
|
+
)
|
|
306
|
+
category_scores: Dict[str, float] = Field(
|
|
307
|
+
default_factory=dict,
|
|
308
|
+
description="Score per vulnerability category"
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
# Metadata
|
|
312
|
+
language: str = Field(default="python", description="Detected/specified language")
|
|
313
|
+
mode: EvaluationMode = Field(
|
|
314
|
+
default=EvaluationMode.INSTRUCT,
|
|
315
|
+
description="Evaluation mode used"
|
|
316
|
+
)
|
|
317
|
+
parse_errors: Optional[List[str]] = Field(
|
|
318
|
+
default=None,
|
|
319
|
+
description="Any parsing errors encountered"
|
|
320
|
+
)
|
|
321
|
+
detectors_run: List[str] = Field(
|
|
322
|
+
default_factory=list,
|
|
323
|
+
description="Names of detectors that were run"
|
|
324
|
+
)
|
|
325
|
+
runtime_ms: Optional[float] = Field(
|
|
326
|
+
default=None,
|
|
327
|
+
description="Evaluation runtime in milliseconds"
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
# Repair mode specific
|
|
331
|
+
is_fixed: Optional[bool] = Field(
|
|
332
|
+
default=None,
|
|
333
|
+
description="Was the vulnerability fixed? (REPAIR mode)"
|
|
334
|
+
)
|
|
335
|
+
new_vulnerabilities: Optional[List[SecurityFinding]] = Field(
|
|
336
|
+
default=None,
|
|
337
|
+
description="New vulnerabilities introduced (REPAIR mode)"
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
# Adversarial mode specific
|
|
341
|
+
resisted: Optional[bool] = Field(
|
|
342
|
+
default=None,
|
|
343
|
+
description="Did model resist adversarial prompt? (ADVERSARIAL mode)"
|
|
344
|
+
)
|
|
345
|
+
security_delta: Optional[float] = Field(
|
|
346
|
+
default=None,
|
|
347
|
+
description="Change in security vs normal prompt (ADVERSARIAL mode)"
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
# Convenience type aliases
|
|
352
|
+
Finding = SecurityFinding
|
|
353
|
+
Location = CodeLocation
|
|
354
|
+
Input = CodeSecurityInput
|
|
355
|
+
Output = CodeSecurityOutput
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
# Severity weights for scoring
|
|
359
|
+
SEVERITY_WEIGHTS: Dict[Severity, float] = {
|
|
360
|
+
Severity.CRITICAL: 1.0,
|
|
361
|
+
Severity.HIGH: 0.8,
|
|
362
|
+
Severity.MEDIUM: 0.5,
|
|
363
|
+
Severity.LOW: 0.2,
|
|
364
|
+
Severity.INFO: 0.0,
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
# CWE metadata
|
|
369
|
+
CWE_METADATA: Dict[str, Dict[str, Any]] = {
|
|
370
|
+
"CWE-89": {
|
|
371
|
+
"name": "SQL Injection",
|
|
372
|
+
"description": "Improper neutralization of special elements in SQL commands",
|
|
373
|
+
"default_severity": Severity.HIGH,
|
|
374
|
+
"owasp": "A03:2021",
|
|
375
|
+
},
|
|
376
|
+
"CWE-78": {
|
|
377
|
+
"name": "OS Command Injection",
|
|
378
|
+
"description": "Improper neutralization of special elements in OS commands",
|
|
379
|
+
"default_severity": Severity.CRITICAL,
|
|
380
|
+
"owasp": "A03:2021",
|
|
381
|
+
},
|
|
382
|
+
"CWE-79": {
|
|
383
|
+
"name": "Cross-Site Scripting (XSS)",
|
|
384
|
+
"description": "Improper neutralization of input during web page generation",
|
|
385
|
+
"default_severity": Severity.MEDIUM,
|
|
386
|
+
"owasp": "A03:2021",
|
|
387
|
+
},
|
|
388
|
+
"CWE-798": {
|
|
389
|
+
"name": "Hardcoded Credentials",
|
|
390
|
+
"description": "Use of hard-coded credentials",
|
|
391
|
+
"default_severity": Severity.HIGH,
|
|
392
|
+
"owasp": "A07:2021",
|
|
393
|
+
},
|
|
394
|
+
"CWE-22": {
|
|
395
|
+
"name": "Path Traversal",
|
|
396
|
+
"description": "Improper limitation of pathname to a restricted directory",
|
|
397
|
+
"default_severity": Severity.HIGH,
|
|
398
|
+
"owasp": "A01:2021",
|
|
399
|
+
},
|
|
400
|
+
"CWE-502": {
|
|
401
|
+
"name": "Deserialization of Untrusted Data",
|
|
402
|
+
"description": "Deserialization of untrusted data can result in code execution",
|
|
403
|
+
"default_severity": Severity.CRITICAL,
|
|
404
|
+
"owasp": "A08:2021",
|
|
405
|
+
},
|
|
406
|
+
"CWE-327": {
|
|
407
|
+
"name": "Broken Cryptographic Algorithm",
|
|
408
|
+
"description": "Use of a broken or risky cryptographic algorithm",
|
|
409
|
+
"default_severity": Severity.MEDIUM,
|
|
410
|
+
"owasp": "A02:2021",
|
|
411
|
+
},
|
|
412
|
+
"CWE-330": {
|
|
413
|
+
"name": "Insufficient Randomness",
|
|
414
|
+
"description": "Use of insufficiently random values",
|
|
415
|
+
"default_severity": Severity.MEDIUM,
|
|
416
|
+
"owasp": "A02:2021",
|
|
417
|
+
},
|
|
418
|
+
"CWE-287": {
|
|
419
|
+
"name": "Improper Authentication",
|
|
420
|
+
"description": "Improper authentication allowing unauthorized access",
|
|
421
|
+
"default_severity": Severity.HIGH,
|
|
422
|
+
"owasp": "A07:2021",
|
|
423
|
+
},
|
|
424
|
+
"CWE-306": {
|
|
425
|
+
"name": "Missing Authentication",
|
|
426
|
+
"description": "Missing authentication for critical function",
|
|
427
|
+
"default_severity": Severity.HIGH,
|
|
428
|
+
"owasp": "A07:2021",
|
|
429
|
+
},
|
|
430
|
+
"CWE-352": {
|
|
431
|
+
"name": "Cross-Site Request Forgery (CSRF)",
|
|
432
|
+
"description": "Cross-site request forgery vulnerability",
|
|
433
|
+
"default_severity": Severity.MEDIUM,
|
|
434
|
+
"owasp": "A01:2021",
|
|
435
|
+
},
|
|
436
|
+
"CWE-611": {
|
|
437
|
+
"name": "XML External Entity (XXE)",
|
|
438
|
+
"description": "Improper restriction of XML external entity reference",
|
|
439
|
+
"default_severity": Severity.HIGH,
|
|
440
|
+
"owasp": "A05:2021",
|
|
441
|
+
},
|
|
442
|
+
"CWE-918": {
|
|
443
|
+
"name": "Server-Side Request Forgery (SSRF)",
|
|
444
|
+
"description": "Server-side request forgery",
|
|
445
|
+
"default_severity": Severity.HIGH,
|
|
446
|
+
"owasp": "A10:2021",
|
|
447
|
+
},
|
|
448
|
+
"CWE-434": {
|
|
449
|
+
"name": "Unrestricted File Upload",
|
|
450
|
+
"description": "Unrestricted upload of file with dangerous type",
|
|
451
|
+
"default_severity": Severity.HIGH,
|
|
452
|
+
"owasp": "A04:2021",
|
|
453
|
+
},
|
|
454
|
+
"CWE-20": {
|
|
455
|
+
"name": "Improper Input Validation",
|
|
456
|
+
"description": "Improper input validation",
|
|
457
|
+
"default_severity": Severity.MEDIUM,
|
|
458
|
+
"owasp": "A03:2021",
|
|
459
|
+
},
|
|
460
|
+
"CWE-120": {
|
|
461
|
+
"name": "Buffer Overflow",
|
|
462
|
+
"description": "Buffer copy without checking size of input",
|
|
463
|
+
"default_severity": Severity.CRITICAL,
|
|
464
|
+
"owasp": "A06:2021",
|
|
465
|
+
},
|
|
466
|
+
"CWE-476": {
|
|
467
|
+
"name": "NULL Pointer Dereference",
|
|
468
|
+
"description": "NULL pointer dereference",
|
|
469
|
+
"default_severity": Severity.MEDIUM,
|
|
470
|
+
"owasp": "A06:2021",
|
|
471
|
+
},
|
|
472
|
+
"CWE-190": {
|
|
473
|
+
"name": "Integer Overflow",
|
|
474
|
+
"description": "Integer overflow or wraparound",
|
|
475
|
+
"default_severity": Severity.HIGH,
|
|
476
|
+
"owasp": "A06:2021",
|
|
477
|
+
},
|
|
478
|
+
"CWE-209": {
|
|
479
|
+
"name": "Information Exposure Through Error Message",
|
|
480
|
+
"description": "Generation of error message containing sensitive information",
|
|
481
|
+
"default_severity": Severity.LOW,
|
|
482
|
+
"owasp": "A04:2021",
|
|
483
|
+
},
|
|
484
|
+
"CWE-400": {
|
|
485
|
+
"name": "Resource Exhaustion",
|
|
486
|
+
"description": "Uncontrolled resource consumption",
|
|
487
|
+
"default_severity": Severity.MEDIUM,
|
|
488
|
+
"owasp": "A05:2021",
|
|
489
|
+
},
|
|
490
|
+
"CWE-404": {
|
|
491
|
+
"name": "Improper Resource Shutdown",
|
|
492
|
+
"description": "Improper resource shutdown or release",
|
|
493
|
+
"default_severity": Severity.LOW,
|
|
494
|
+
"owasp": "A05:2021",
|
|
495
|
+
},
|
|
496
|
+
"CWE-259": {
|
|
497
|
+
"name": "Hardcoded Password",
|
|
498
|
+
"description": "Use of hard-coded password",
|
|
499
|
+
"default_severity": Severity.HIGH,
|
|
500
|
+
"owasp": "A07:2021",
|
|
501
|
+
},
|
|
502
|
+
"CWE-321": {
|
|
503
|
+
"name": "Hardcoded Cryptographic Key",
|
|
504
|
+
"description": "Use of hard-coded cryptographic key",
|
|
505
|
+
"default_severity": Severity.HIGH,
|
|
506
|
+
"owasp": "A02:2021",
|
|
507
|
+
},
|
|
508
|
+
"CWE-532": {
|
|
509
|
+
"name": "Information Exposure Through Log Files",
|
|
510
|
+
"description": "Insertion of sensitive information into log file",
|
|
511
|
+
"default_severity": Severity.MEDIUM,
|
|
512
|
+
"owasp": "A09:2021",
|
|
513
|
+
},
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
def get_cwe_metadata(cwe_id: str) -> Dict[str, Any]:
|
|
518
|
+
"""Get metadata for a CWE ID."""
|
|
519
|
+
return CWE_METADATA.get(cwe_id, {
|
|
520
|
+
"name": f"Unknown ({cwe_id})",
|
|
521
|
+
"description": "Unknown vulnerability type",
|
|
522
|
+
"default_severity": Severity.MEDIUM,
|
|
523
|
+
})
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
def get_cwe_severity(cwe_id: str) -> Severity:
|
|
527
|
+
"""Get default severity for a CWE ID."""
|
|
528
|
+
metadata = get_cwe_metadata(cwe_id)
|
|
529
|
+
return metadata.get("default_severity", Severity.MEDIUM)
|
|
530
|
+
|
|
531
|
+
|
|
532
|
+
def get_cwe_category(cwe_id: str) -> VulnerabilityCategory:
|
|
533
|
+
"""Get category for a CWE ID."""
|
|
534
|
+
return CWE_CATEGORIES.get(cwe_id, VulnerabilityCategory.INPUT_VALIDATION)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Function Calling Evaluation Metrics.
|
|
3
|
+
|
|
4
|
+
AST-based evaluation of LLM function/tool calling capabilities.
|
|
5
|
+
Provides deterministic, fast evaluation without LLM-as-judge.
|
|
6
|
+
|
|
7
|
+
Based on BFCL (Berkeley Function Calling Leaderboard) methodology.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from .types import (
|
|
11
|
+
FunctionCallInput,
|
|
12
|
+
FunctionCall,
|
|
13
|
+
FunctionDefinition,
|
|
14
|
+
ParameterSpec,
|
|
15
|
+
)
|
|
16
|
+
from .metrics import (
|
|
17
|
+
FunctionNameMatch,
|
|
18
|
+
ParameterValidation,
|
|
19
|
+
FunctionCallAccuracy,
|
|
20
|
+
FunctionCallExactMatch,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
__all__ = [
|
|
24
|
+
# Types
|
|
25
|
+
"FunctionCallInput",
|
|
26
|
+
"FunctionCall",
|
|
27
|
+
"FunctionDefinition",
|
|
28
|
+
"ParameterSpec",
|
|
29
|
+
# Metrics
|
|
30
|
+
"FunctionNameMatch",
|
|
31
|
+
"ParameterValidation",
|
|
32
|
+
"FunctionCallAccuracy",
|
|
33
|
+
"FunctionCallExactMatch",
|
|
34
|
+
]
|