ragops 1.0.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.
- ragops-1.0.0/.dockerignore +9 -0
- ragops-1.0.0/.github/ISSUE_TEMPLATE/bug.yml +41 -0
- ragops-1.0.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
- ragops-1.0.0/.github/ISSUE_TEMPLATE/design-partner.yml +48 -0
- ragops-1.0.0/.github/ISSUE_TEMPLATE/evaluator.yml +40 -0
- ragops-1.0.0/.github/ISSUE_TEMPLATE/feature.yml +38 -0
- ragops-1.0.0/.github/pull_request_template.md +27 -0
- ragops-1.0.0/.github/workflows/ci.yml +73 -0
- ragops-1.0.0/.github/workflows/nightly.yml +39 -0
- ragops-1.0.0/.github/workflows/pages.yml +31 -0
- ragops-1.0.0/.github/workflows/publish-pypi.yml +65 -0
- ragops-1.0.0/.github/workflows/ragops-gate-smoke.yml +24 -0
- ragops-1.0.0/.github/workflows/ragops-gate.yml +133 -0
- ragops-1.0.0/.github/workflows/ragops-pr-comment.yml +27 -0
- ragops-1.0.0/.github/workflows/ragops-statistical-gate-smoke.yml +28 -0
- ragops-1.0.0/.github/workflows/ragops-statistical-gate.yml +184 -0
- ragops-1.0.0/.github/workflows/release.yml +54 -0
- ragops-1.0.0/.gitignore +13 -0
- ragops-1.0.0/AGENTS.md +40 -0
- ragops-1.0.0/CHANGELOG.md +41 -0
- ragops-1.0.0/CODE_OF_CONDUCT.md +24 -0
- ragops-1.0.0/CONTRIBUTING.md +54 -0
- ragops-1.0.0/Dockerfile +10 -0
- ragops-1.0.0/LICENSE +21 -0
- ragops-1.0.0/PKG-INFO +265 -0
- ragops-1.0.0/README.md +233 -0
- ragops-1.0.0/SECURITY.md +28 -0
- ragops-1.0.0/SUPPORT.md +15 -0
- ragops-1.0.0/apps/__init__.py +2 -0
- ragops-1.0.0/apps/api/__init__.py +2 -0
- ragops-1.0.0/apps/api/main.py +378 -0
- ragops-1.0.0/apps/github_pr_comment.py +335 -0
- ragops-1.0.0/apps/web/index.html +27 -0
- ragops-1.0.0/compose.yaml +11 -0
- ragops-1.0.0/docs/README.md +32 -0
- ragops-1.0.0/docs/architecture/decisions.md +102 -0
- ragops-1.0.0/docs/architecture/security.md +49 -0
- ragops-1.0.0/docs/architecture/system-overview.md +74 -0
- ragops-1.0.0/docs/demo/demo-kit.md +54 -0
- ragops-1.0.0/docs/demo/infographics/evidence-stack.svg +70 -0
- ragops-1.0.0/docs/demo/infographics/release-gate-flow.svg +72 -0
- ragops-1.0.0/docs/demo/social-preview.png +0 -0
- ragops-1.0.0/docs/engineering/ci-gates.md +90 -0
- ragops-1.0.0/docs/engineering/integrations.md +115 -0
- ragops-1.0.0/docs/engineering/testing-and-release.md +65 -0
- ragops-1.0.0/docs/evaluation/benchmark.md +51 -0
- ragops-1.0.0/docs/evaluation/strategy.md +137 -0
- ragops-1.0.0/docs/examples/github-pr-comment.yml +30 -0
- ragops-1.0.0/docs/examples/gitlab-ci-ragops.yml +51 -0
- ragops-1.0.0/docs/getting-started.md +114 -0
- ragops-1.0.0/docs/gtm/pilot-fixtures/synthetic-economics.json +10 -0
- ragops-1.0.0/docs/gtm/pilot-fixtures/synthetic-manifest.json +15 -0
- ragops-1.0.0/docs/gtm/pilot-fixtures/synthetic-observations.jsonl +10 -0
- ragops-1.0.0/docs/gtm/pilot.md +37 -0
- ragops-1.0.0/docs/product/overview.md +68 -0
- ragops-1.0.0/docs/product/requirements.md +59 -0
- ragops-1.0.0/docs/product/roadmap.md +26 -0
- ragops-1.0.0/docs/project/status.md +76 -0
- ragops-1.0.0/examples/__init__.py +1 -0
- ragops-1.0.0/examples/japanese_troubleshooting_agent/README.md +76 -0
- ragops-1.0.0/examples/japanese_troubleshooting_agent/__init__.py +5 -0
- ragops-1.0.0/examples/japanese_troubleshooting_agent/agent.py +200 -0
- ragops-1.0.0/examples/japanese_troubleshooting_agent/cli.py +39 -0
- ragops-1.0.0/examples/japanese_troubleshooting_agent/data/documents.json +10 -0
- ragops-1.0.0/examples/japanese_troubleshooting_agent/data/graph.json +11 -0
- ragops-1.0.0/examples/japanese_troubleshooting_agent/results/comparison.md +22 -0
- ragops-1.0.0/examples/japanese_troubleshooting_agent/results/graph-traces.jsonl +4 -0
- ragops-1.0.0/examples/japanese_troubleshooting_agent/results/lexical-traces.jsonl +4 -0
- ragops-1.0.0/examples/japanese_troubleshooting_agent/scenario.json +13 -0
- ragops-1.0.0/examples/japanese_troubleshooting_agent/suite.json +6 -0
- ragops-1.0.0/examples/opentelemetry_trace_adapter/README.md +59 -0
- ragops-1.0.0/examples/opentelemetry_trace_adapter/__init__.py +1 -0
- ragops-1.0.0/examples/opentelemetry_trace_adapter/adapter.py +153 -0
- ragops-1.0.0/examples/opentelemetry_trace_adapter/spans.jsonl +2 -0
- ragops-1.0.0/pyproject.toml +50 -0
- ragops-1.0.0/ragops.toml +6 -0
- ragops-1.0.0/scenarios/japanese_troubleshooting/attack-pack.json +13 -0
- ragops-1.0.0/scenarios/japanese_troubleshooting/benchmark-adversarial.json +13 -0
- ragops-1.0.0/scenarios/japanese_troubleshooting/benchmark-baseline.json +32 -0
- ragops-1.0.0/scenarios/japanese_troubleshooting/benchmark-regressed.json +11 -0
- ragops-1.0.0/scenarios/japanese_troubleshooting/benchmark-v0.2.json +39 -0
- ragops-1.0.0/scenarios/japanese_troubleshooting/evaluation-policy.toml +8 -0
- ragops-1.0.0/scenarios/japanese_troubleshooting/external-metric-policy.toml +5 -0
- ragops-1.0.0/scenarios/japanese_troubleshooting/external-metrics-baseline.json +8 -0
- ragops-1.0.0/scenarios/japanese_troubleshooting/external-metrics-candidate.json +8 -0
- ragops-1.0.0/scenarios/japanese_troubleshooting/regressed_responses.json +16 -0
- ragops-1.0.0/scenarios/japanese_troubleshooting/sample_responses.json +17 -0
- ragops-1.0.0/scenarios/japanese_troubleshooting/sample_traces.jsonl +2 -0
- ragops-1.0.0/scenarios/japanese_troubleshooting/scenario.json +43 -0
- ragops-1.0.0/scenarios/statistical_gate/baseline.json +22 -0
- ragops-1.0.0/scenarios/statistical_gate/candidate-block.json +22 -0
- ragops-1.0.0/scenarios/statistical_gate/candidate-pass.json +22 -0
- ragops-1.0.0/scenarios/statistical_gate/drift-policy.toml +8 -0
- ragops-1.0.0/scenarios/statistical_gate/policy.toml +10 -0
- ragops-1.0.0/scenarios/statistical_gate/run-plan.json +16 -0
- ragops-1.0.0/scenarios/statistical_gate/sequential-policy.toml +13 -0
- ragops-1.0.0/schemas/attack-pack-0.1.schema.json +30 -0
- ragops-1.0.0/schemas/baseline-manifest-0.1.schema.json +56 -0
- ragops-1.0.0/schemas/evaluator-drift-report-0.1.schema.json +65 -0
- ragops-1.0.0/schemas/external-metrics-0.1.schema.json +30 -0
- ragops-1.0.0/schemas/pilot-economics-0.1.schema.json +17 -0
- ragops-1.0.0/schemas/pilot-manifest-0.1.schema.json +34 -0
- ragops-1.0.0/schemas/pilot-observation-0.1.schema.json +26 -0
- ragops-1.0.0/schemas/provenance-diagnosis-0.1.schema.json +26 -0
- ragops-1.0.0/schemas/repeated-run-plan-0.1.schema.json +39 -0
- ragops-1.0.0/schemas/replay-bundle-0.1.schema.json +48 -0
- ragops-1.0.0/schemas/report-0.2.schema.json +19 -0
- ragops-1.0.0/schemas/response-fixture-0.2.schema.json +30 -0
- ragops-1.0.0/schemas/responses-0.1.schema.json +21 -0
- ragops-1.0.0/schemas/scenario-0.1.schema.json +48 -0
- ragops-1.0.0/schemas/scenario-0.2.schema.json +54 -0
- ragops-1.0.0/schemas/sequential-report-0.1.schema.json +72 -0
- ragops-1.0.0/schemas/statistical-report-0.1.schema.json +79 -0
- ragops-1.0.0/schemas/trace-0.3.schema.json +31 -0
- ragops-1.0.0/schemas/trace-0.4.schema.json +50 -0
- ragops-1.0.0/scripts/local_release.py +200 -0
- ragops-1.0.0/site/apple-touch-icon.png +0 -0
- ragops-1.0.0/site/assets/THIRD_PARTY_NOTICES.txt +10 -0
- ragops-1.0.0/site/assets/circle-stack.svg +3 -0
- ragops-1.0.0/site/assets/clipboard-document.svg +3 -0
- ragops-1.0.0/site/assets/document-text.svg +3 -0
- ragops-1.0.0/site/assets/github.svg +1 -0
- ragops-1.0.0/site/favicon.png +0 -0
- ragops-1.0.0/site/index.html +176 -0
- ragops-1.0.0/site/styles.css +688 -0
- ragops-1.0.0/skills/ragops-feature/SKILL.md +17 -0
- ragops-1.0.0/skills/ragops-presentation/SKILL.md +17 -0
- ragops-1.0.0/skills/ragops-release/SKILL.md +16 -0
- ragops-1.0.0/src/ragops/__init__.py +30 -0
- ragops-1.0.0/src/ragops/adapters/__init__.py +16 -0
- ragops-1.0.0/src/ragops/adapters/external_metrics.py +134 -0
- ragops-1.0.0/src/ragops/adapters/http.py +34 -0
- ragops-1.0.0/src/ragops/adapters/provider_metrics.py +150 -0
- ragops-1.0.0/src/ragops/adapters/repeated_runs.py +284 -0
- ragops-1.0.0/src/ragops/adapters/signing.py +124 -0
- ragops-1.0.0/src/ragops/baseline.py +250 -0
- ragops-1.0.0/src/ragops/benchmarks.py +25 -0
- ragops-1.0.0/src/ragops/cli.py +658 -0
- ragops-1.0.0/src/ragops/config.py +290 -0
- ragops-1.0.0/src/ragops/control_plane.py +125 -0
- ragops-1.0.0/src/ragops/demo.py +327 -0
- ragops-1.0.0/src/ragops/drift.py +158 -0
- ragops-1.0.0/src/ragops/engine.py +225 -0
- ragops-1.0.0/src/ragops/evaluators.py +70 -0
- ragops-1.0.0/src/ragops/loader.py +243 -0
- ragops-1.0.0/src/ragops/models.py +366 -0
- ragops-1.0.0/src/ragops/pilot.py +425 -0
- ragops-1.0.0/src/ragops/plugins.py +153 -0
- ragops-1.0.0/src/ragops/provenance.py +65 -0
- ragops-1.0.0/src/ragops/providers/__init__.py +5 -0
- ragops-1.0.0/src/ragops/providers/openai_responses.py +84 -0
- ragops-1.0.0/src/ragops/reporters.py +263 -0
- ragops-1.0.0/src/ragops/sequential.py +287 -0
- ragops-1.0.0/src/ragops/statistical.py +436 -0
- ragops-1.0.0/src/ragops/store.py +170 -0
- ragops-1.0.0/src/ragops/traces.py +60 -0
- ragops-1.0.0/tests/test_adoption_recipes.py +49 -0
- ragops-1.0.0/tests/test_answer_length_cli.py +36 -0
- ragops-1.0.0/tests/test_api_contract.py +165 -0
- ragops-1.0.0/tests/test_baseline_manifest.py +128 -0
- ragops-1.0.0/tests/test_benchmarks.py +33 -0
- ragops-1.0.0/tests/test_comparison.py +61 -0
- ragops-1.0.0/tests/test_config.py +51 -0
- ragops-1.0.0/tests/test_control_plane.py +43 -0
- ragops-1.0.0/tests/test_demo.py +129 -0
- ragops-1.0.0/tests/test_engine.py +40 -0
- ragops-1.0.0/tests/test_evaluator_depth.py +158 -0
- ragops-1.0.0/tests/test_evaluator_drift.py +119 -0
- ragops-1.0.0/tests/test_external_metrics.py +192 -0
- ragops-1.0.0/tests/test_github_workflows.py +132 -0
- ragops-1.0.0/tests/test_http_adapter.py +35 -0
- ragops-1.0.0/tests/test_loader.py +77 -0
- ragops-1.0.0/tests/test_local_release.py +56 -0
- ragops-1.0.0/tests/test_openai_provider.py +62 -0
- ragops-1.0.0/tests/test_opentelemetry_adapter.py +78 -0
- ragops-1.0.0/tests/test_pilot.py +105 -0
- ragops-1.0.0/tests/test_plugins_and_traces.py +36 -0
- ragops-1.0.0/tests/test_pr_comment_publisher.py +286 -0
- ragops-1.0.0/tests/test_provenance_diagnosis.py +59 -0
- ragops-1.0.0/tests/test_provider_metric_adapters.py +106 -0
- ragops-1.0.0/tests/test_public_api.py +41 -0
- ragops-1.0.0/tests/test_readme_visuals.py +54 -0
- ragops-1.0.0/tests/test_reference_agent.py +77 -0
- ragops-1.0.0/tests/test_reference_benchmark.py +25 -0
- ragops-1.0.0/tests/test_release_version.py +14 -0
- ragops-1.0.0/tests/test_repeated_runs.py +206 -0
- ragops-1.0.0/tests/test_response_fixtures.py +73 -0
- ragops-1.0.0/tests/test_scenario_v02_and_attacks.py +92 -0
- ragops-1.0.0/tests/test_schema_files.py +12 -0
- ragops-1.0.0/tests/test_sequential_gate.py +146 -0
- ragops-1.0.0/tests/test_showcase_site.py +109 -0
- ragops-1.0.0/tests/test_statistical_gate.py +277 -0
- ragops-1.0.0/tests/test_statistical_schema_instances.py +72 -0
- ragops-1.0.0/tests/test_store_and_html.py +39 -0
- ragops-1.0.0/tests/test_team_workflow.py +74 -0
- ragops-1.0.0/tests/test_workbench.py +18 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Report a reproducible defect without private data
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: [bug]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: Never include secrets, customer-confidential data, or private traces.
|
|
9
|
+
- type: input
|
|
10
|
+
id: version
|
|
11
|
+
attributes:
|
|
12
|
+
label: RAGOps version or commit
|
|
13
|
+
placeholder: v1.0 or commit SHA
|
|
14
|
+
validations:
|
|
15
|
+
required: true
|
|
16
|
+
- type: textarea
|
|
17
|
+
id: reproduction
|
|
18
|
+
attributes:
|
|
19
|
+
label: Minimal reproduction
|
|
20
|
+
description: Include the command and a synthetic or redacted fixture.
|
|
21
|
+
validations:
|
|
22
|
+
required: true
|
|
23
|
+
- type: textarea
|
|
24
|
+
id: expected
|
|
25
|
+
attributes:
|
|
26
|
+
label: Expected behavior
|
|
27
|
+
validations:
|
|
28
|
+
required: true
|
|
29
|
+
- type: textarea
|
|
30
|
+
id: actual
|
|
31
|
+
attributes:
|
|
32
|
+
label: Actual behavior
|
|
33
|
+
validations:
|
|
34
|
+
required: true
|
|
35
|
+
- type: input
|
|
36
|
+
id: environment
|
|
37
|
+
attributes:
|
|
38
|
+
label: Environment
|
|
39
|
+
placeholder: Python 3.12, macOS 15
|
|
40
|
+
validations:
|
|
41
|
+
required: true
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Security vulnerability
|
|
4
|
+
url: https://github.com/thangldw/ragops/security/policy
|
|
5
|
+
about: Report vulnerabilities privately through the security policy.
|
|
6
|
+
- name: Support guidance
|
|
7
|
+
url: https://github.com/thangldw/ragops/blob/main/SUPPORT.md
|
|
8
|
+
about: Read what to include before opening an issue.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
name: Design-partner interest
|
|
2
|
+
description: Explore an offline RAGOps evaluation pilot using synthetic or redacted data.
|
|
3
|
+
title: "[Design partner]: "
|
|
4
|
+
labels: [design-partner]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Do not include production secrets, personal data, customer-confidential
|
|
10
|
+
content, API keys, or proprietary traces in this public issue.
|
|
11
|
+
- type: textarea
|
|
12
|
+
id: workflow
|
|
13
|
+
attributes:
|
|
14
|
+
label: AI workflow
|
|
15
|
+
description: What RAG or agent workflow are you evaluating?
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: decision
|
|
20
|
+
attributes:
|
|
21
|
+
label: Release decision today
|
|
22
|
+
description: How do you currently decide whether a candidate is safe and useful enough to release?
|
|
23
|
+
validations:
|
|
24
|
+
required: true
|
|
25
|
+
- type: textarea
|
|
26
|
+
id: failure
|
|
27
|
+
attributes:
|
|
28
|
+
label: Representative synthetic failure
|
|
29
|
+
description: Describe a redacted or synthetic regression without sharing sensitive data.
|
|
30
|
+
validations:
|
|
31
|
+
required: true
|
|
32
|
+
- type: dropdown
|
|
33
|
+
id: data
|
|
34
|
+
attributes:
|
|
35
|
+
label: Safe fixture availability
|
|
36
|
+
options:
|
|
37
|
+
- Synthetic fixtures available
|
|
38
|
+
- Redacted fixtures available
|
|
39
|
+
- Need help creating safe fixtures
|
|
40
|
+
validations:
|
|
41
|
+
required: true
|
|
42
|
+
- type: checkboxes
|
|
43
|
+
id: consent
|
|
44
|
+
attributes:
|
|
45
|
+
label: Public issue safety
|
|
46
|
+
options:
|
|
47
|
+
- label: I confirm this issue contains no secrets, personal data, or customer-confidential content.
|
|
48
|
+
required: true
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: Evaluator proposal
|
|
2
|
+
description: Propose a measurable evaluator with calibration and failure modes.
|
|
3
|
+
title: "[Evaluator]: "
|
|
4
|
+
labels: [evaluation]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: construct
|
|
8
|
+
attributes:
|
|
9
|
+
label: Construct being measured
|
|
10
|
+
description: Define precisely what the score means and does not mean.
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: method
|
|
15
|
+
attributes:
|
|
16
|
+
label: Method and inputs
|
|
17
|
+
description: Explain deterministic/provider behavior, required evidence, and output range.
|
|
18
|
+
validations:
|
|
19
|
+
required: true
|
|
20
|
+
- type: textarea
|
|
21
|
+
id: calibration
|
|
22
|
+
attributes:
|
|
23
|
+
label: Calibration plan
|
|
24
|
+
description: Labeled cases, human rubric, agreement analysis, and thresholds.
|
|
25
|
+
validations:
|
|
26
|
+
required: true
|
|
27
|
+
- type: textarea
|
|
28
|
+
id: failures
|
|
29
|
+
attributes:
|
|
30
|
+
label: Known failure modes
|
|
31
|
+
validations:
|
|
32
|
+
required: true
|
|
33
|
+
- type: checkboxes
|
|
34
|
+
id: boundary
|
|
35
|
+
attributes:
|
|
36
|
+
label: Product boundary
|
|
37
|
+
options:
|
|
38
|
+
- label: The core remains useful offline or this is an explicitly optional plugin.
|
|
39
|
+
required: true
|
|
40
|
+
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
name: Product feature
|
|
2
|
+
description: Propose a capability tied to a user outcome and release contract.
|
|
3
|
+
title: "[Feature]: "
|
|
4
|
+
labels: [enhancement]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: problem
|
|
8
|
+
attributes:
|
|
9
|
+
label: User problem
|
|
10
|
+
description: Who has the problem, in what workflow, and why does it matter?
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: outcome
|
|
15
|
+
attributes:
|
|
16
|
+
label: Desired outcome
|
|
17
|
+
description: Describe observable success without prescribing implementation.
|
|
18
|
+
validations:
|
|
19
|
+
required: true
|
|
20
|
+
- type: textarea
|
|
21
|
+
id: contract
|
|
22
|
+
attributes:
|
|
23
|
+
label: Contract and acceptance criteria
|
|
24
|
+
description: Include input, output, release behavior, compatibility, and tests.
|
|
25
|
+
validations:
|
|
26
|
+
required: true
|
|
27
|
+
- type: textarea
|
|
28
|
+
id: non_goals
|
|
29
|
+
attributes:
|
|
30
|
+
label: Non-goals and boundaries
|
|
31
|
+
validations:
|
|
32
|
+
required: true
|
|
33
|
+
- type: textarea
|
|
34
|
+
id: evidence
|
|
35
|
+
attributes:
|
|
36
|
+
label: Supporting evidence
|
|
37
|
+
description: Customer observation, benchmark case, incident, or design-partner request.
|
|
38
|
+
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
## Outcome
|
|
2
|
+
|
|
3
|
+
- User problem:
|
|
4
|
+
- Decision enabled:
|
|
5
|
+
- Requirement or issue:
|
|
6
|
+
|
|
7
|
+
## Contract
|
|
8
|
+
|
|
9
|
+
- Public schema/API impact:
|
|
10
|
+
- Metric or PASS/BLOCK impact:
|
|
11
|
+
- Architecture/open-core impact:
|
|
12
|
+
- Explicit non-goals:
|
|
13
|
+
|
|
14
|
+
## Evidence
|
|
15
|
+
|
|
16
|
+
- [ ] Expected and failure tests
|
|
17
|
+
- [ ] `ruff check .`
|
|
18
|
+
- [ ] `PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 pytest -q`
|
|
19
|
+
- [ ] Affected CLI/API path exercised
|
|
20
|
+
- [ ] Canonical documentation and changelog updated
|
|
21
|
+
- [ ] Superseded content removed
|
|
22
|
+
|
|
23
|
+
## Owner review
|
|
24
|
+
|
|
25
|
+
- Known limitations:
|
|
26
|
+
- Compatibility recommendation:
|
|
27
|
+
- Publication requested: no / yes (specify)
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
pull_request:
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
test:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
strategy:
|
|
11
|
+
matrix:
|
|
12
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
15
|
+
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
|
|
16
|
+
with:
|
|
17
|
+
python-version: ${{ matrix.python-version }}
|
|
18
|
+
- run: pip install -e '.[dev]'
|
|
19
|
+
- run: ruff check .
|
|
20
|
+
- run: pytest
|
|
21
|
+
- run: ragops evaluate --scenario scenarios/japanese_troubleshooting/scenario.json --responses scenarios/japanese_troubleshooting/sample_responses.json
|
|
22
|
+
- name: Validate reference benchmark coverage
|
|
23
|
+
run: ragops inspect --scenario scenarios/japanese_troubleshooting/benchmark-v0.2.json
|
|
24
|
+
- name: Evaluate reference benchmark baseline
|
|
25
|
+
run: >-
|
|
26
|
+
ragops evaluate
|
|
27
|
+
--scenario scenarios/japanese_troubleshooting/benchmark-v0.2.json
|
|
28
|
+
--responses scenarios/japanese_troubleshooting/benchmark-baseline.json
|
|
29
|
+
--evaluator citation_correctness
|
|
30
|
+
--evaluator claim_support
|
|
31
|
+
- name: Confirm regressed benchmark is blocked
|
|
32
|
+
shell: bash
|
|
33
|
+
run: |
|
|
34
|
+
set +e
|
|
35
|
+
ragops compare \
|
|
36
|
+
--scenario scenarios/japanese_troubleshooting/benchmark-v0.2.json \
|
|
37
|
+
--baseline scenarios/japanese_troubleshooting/benchmark-baseline.json \
|
|
38
|
+
--candidate scenarios/japanese_troubleshooting/benchmark-regressed.json \
|
|
39
|
+
--format markdown
|
|
40
|
+
code=$?
|
|
41
|
+
set -e
|
|
42
|
+
test "$code" -eq 2
|
|
43
|
+
- name: Confirm adversarial benchmark is blocked
|
|
44
|
+
shell: bash
|
|
45
|
+
run: |
|
|
46
|
+
set +e
|
|
47
|
+
ragops evaluate \
|
|
48
|
+
--scenario scenarios/japanese_troubleshooting/benchmark-v0.2.json \
|
|
49
|
+
--responses scenarios/japanese_troubleshooting/benchmark-adversarial.json
|
|
50
|
+
code=$?
|
|
51
|
+
set -e
|
|
52
|
+
test "$code" -eq 2
|
|
53
|
+
- name: Render regression report
|
|
54
|
+
run: >-
|
|
55
|
+
ragops compare
|
|
56
|
+
--scenario scenarios/japanese_troubleshooting/scenario.json
|
|
57
|
+
--baseline scenarios/japanese_troubleshooting/sample_responses.json
|
|
58
|
+
--candidate scenarios/japanese_troubleshooting/sample_responses.json
|
|
59
|
+
--format markdown
|
|
60
|
+
--output reports/regression.md
|
|
61
|
+
- name: Run reference GraphRAG agent
|
|
62
|
+
run: >-
|
|
63
|
+
python -m examples.japanese_troubleshooting_agent.cli
|
|
64
|
+
--suite examples/japanese_troubleshooting_agent/suite.json
|
|
65
|
+
--retriever graph
|
|
66
|
+
--output /tmp/reference-traces.jsonl
|
|
67
|
+
- name: Evaluate reference deployment traces
|
|
68
|
+
run: >-
|
|
69
|
+
ragops evaluate
|
|
70
|
+
--scenario examples/japanese_troubleshooting_agent/scenario.json
|
|
71
|
+
--traces /tmp/reference-traces.jsonl
|
|
72
|
+
--evaluator citation_correctness
|
|
73
|
+
--evaluator claim_support
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
name: Nightly benchmark
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
- cron: "17 18 * * *"
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
benchmark:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: actions/setup-python@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: "3.12"
|
|
19
|
+
- run: pip install -e '.[dev]'
|
|
20
|
+
- name: Evaluate 30-case benchmark
|
|
21
|
+
run: >-
|
|
22
|
+
ragops evaluate
|
|
23
|
+
--scenario scenarios/japanese_troubleshooting/benchmark-v0.2.json
|
|
24
|
+
--responses scenarios/japanese_troubleshooting/benchmark-baseline.json
|
|
25
|
+
--evaluator citation_correctness
|
|
26
|
+
--evaluator claim_support
|
|
27
|
+
- name: Run reference deployment
|
|
28
|
+
run: >-
|
|
29
|
+
python -m examples.japanese_troubleshooting_agent.cli
|
|
30
|
+
--suite examples/japanese_troubleshooting_agent/suite.json
|
|
31
|
+
--retriever graph
|
|
32
|
+
--output /tmp/reference-traces.jsonl
|
|
33
|
+
- name: Gate reference traces
|
|
34
|
+
run: >-
|
|
35
|
+
ragops evaluate
|
|
36
|
+
--scenario examples/japanese_troubleshooting_agent/scenario.json
|
|
37
|
+
--traces /tmp/reference-traces.jsonl
|
|
38
|
+
--evaluator citation_correctness
|
|
39
|
+
--evaluator claim_support
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name: Pages
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
paths: ["site/**", ".github/workflows/pages.yml"]
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
pages: write
|
|
12
|
+
id-token: write
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
group: pages
|
|
16
|
+
cancel-in-progress: true
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
deploy:
|
|
20
|
+
environment:
|
|
21
|
+
name: github-pages
|
|
22
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
26
|
+
- uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5
|
|
27
|
+
- uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3
|
|
28
|
+
with:
|
|
29
|
+
path: site
|
|
30
|
+
- id: deployment
|
|
31
|
+
uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
name: Publish package to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
tag:
|
|
7
|
+
description: Existing RAGOps release tag to publish
|
|
8
|
+
required: true
|
|
9
|
+
type: string
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
publish:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
environment: pypi
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
id-token: write
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
20
|
+
with:
|
|
21
|
+
ref: ${{ inputs.tag }}
|
|
22
|
+
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
|
|
23
|
+
with:
|
|
24
|
+
python-version: "3.12"
|
|
25
|
+
- name: Verify tag and package version
|
|
26
|
+
env:
|
|
27
|
+
RELEASE_TAG: ${{ inputs.tag }}
|
|
28
|
+
run: |
|
|
29
|
+
python - "$RELEASE_TAG" <<'PY'
|
|
30
|
+
import sys
|
|
31
|
+
import tomllib
|
|
32
|
+
from pathlib import Path
|
|
33
|
+
|
|
34
|
+
tag = sys.argv[1]
|
|
35
|
+
version = tomllib.loads(Path("pyproject.toml").read_text())["project"]["version"]
|
|
36
|
+
parts = version.split(".")
|
|
37
|
+
if len(parts) != 3 or not all(part.isdigit() for part in parts):
|
|
38
|
+
raise SystemExit("package version must use numeric MAJOR.MINOR.PATCH")
|
|
39
|
+
major, minor, patch = parts
|
|
40
|
+
expected_tag = f"v{major}.{minor}"
|
|
41
|
+
if patch != "0" or tag != expected_tag:
|
|
42
|
+
raise SystemExit(
|
|
43
|
+
f"tag {tag!r} does not match milestone {expected_tag!r} "
|
|
44
|
+
f"for package version {version!r}"
|
|
45
|
+
)
|
|
46
|
+
print(f"publishing ragops {version}")
|
|
47
|
+
PY
|
|
48
|
+
- name: Download promoted GitHub Release artifacts
|
|
49
|
+
env:
|
|
50
|
+
GH_TOKEN: ${{ github.token }}
|
|
51
|
+
RELEASE_TAG: ${{ inputs.tag }}
|
|
52
|
+
run: |
|
|
53
|
+
mkdir release-assets dist
|
|
54
|
+
gh release download "$RELEASE_TAG" \
|
|
55
|
+
--pattern 'ragops-*.whl' \
|
|
56
|
+
--pattern 'ragops-*.tar.gz' \
|
|
57
|
+
--pattern 'ragops-*.cdx.json' \
|
|
58
|
+
--pattern 'SHA256SUMS' \
|
|
59
|
+
--dir release-assets
|
|
60
|
+
(cd release-assets && sha256sum --check SHA256SUMS)
|
|
61
|
+
test "$(find release-assets -maxdepth 1 -name 'ragops-*.whl' | wc -l)" -eq 1
|
|
62
|
+
test "$(find release-assets -maxdepth 1 -name 'ragops-*.tar.gz' | wc -l)" -eq 1
|
|
63
|
+
cp release-assets/ragops-*.whl release-assets/ragops-*.tar.gz dist/
|
|
64
|
+
- name: Publish distributions with Trusted Publishing
|
|
65
|
+
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name: RAGOps reusable gate smoke
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
paths:
|
|
7
|
+
- ".github/workflows/ragops-gate.yml"
|
|
8
|
+
- ".github/workflows/ragops-gate-smoke.yml"
|
|
9
|
+
- "tests/test_github_workflows.py"
|
|
10
|
+
pull_request:
|
|
11
|
+
paths:
|
|
12
|
+
- ".github/workflows/ragops-gate.yml"
|
|
13
|
+
- ".github/workflows/ragops-gate-smoke.yml"
|
|
14
|
+
- "tests/test_github_workflows.py"
|
|
15
|
+
workflow_dispatch:
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
passing-reference:
|
|
19
|
+
uses: ./.github/workflows/ragops-gate.yml
|
|
20
|
+
with:
|
|
21
|
+
ragops-version: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
22
|
+
scenario: scenarios/japanese_troubleshooting/benchmark-v0.2.json
|
|
23
|
+
baseline: scenarios/japanese_troubleshooting/benchmark-baseline.json
|
|
24
|
+
candidate: scenarios/japanese_troubleshooting/benchmark-baseline.json
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
name: RAGOps reusable release gate
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_call:
|
|
5
|
+
inputs:
|
|
6
|
+
python-version:
|
|
7
|
+
description: Python version used to run RAGOps
|
|
8
|
+
required: false
|
|
9
|
+
type: string
|
|
10
|
+
default: "3.12"
|
|
11
|
+
ragops-version:
|
|
12
|
+
description: RAGOps Git revision or tag to install
|
|
13
|
+
required: false
|
|
14
|
+
type: string
|
|
15
|
+
default: "v1.0"
|
|
16
|
+
scenario:
|
|
17
|
+
description: Caller-relative scenario JSON path
|
|
18
|
+
required: true
|
|
19
|
+
type: string
|
|
20
|
+
baseline:
|
|
21
|
+
description: Caller-relative accepted baseline response path
|
|
22
|
+
required: true
|
|
23
|
+
type: string
|
|
24
|
+
candidate:
|
|
25
|
+
description: Caller-relative candidate response path
|
|
26
|
+
required: true
|
|
27
|
+
type: string
|
|
28
|
+
policy:
|
|
29
|
+
description: Optional caller-relative regression policy path
|
|
30
|
+
required: false
|
|
31
|
+
type: string
|
|
32
|
+
default: ""
|
|
33
|
+
|
|
34
|
+
jobs:
|
|
35
|
+
release-gate:
|
|
36
|
+
runs-on: ubuntu-latest
|
|
37
|
+
permissions:
|
|
38
|
+
contents: read
|
|
39
|
+
steps:
|
|
40
|
+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
41
|
+
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
|
|
42
|
+
with:
|
|
43
|
+
python-version: ${{ inputs.python-version }}
|
|
44
|
+
- name: Install RAGOps
|
|
45
|
+
env:
|
|
46
|
+
RAGOPS_VERSION: ${{ inputs.ragops-version }}
|
|
47
|
+
run: >-
|
|
48
|
+
python -m pip install
|
|
49
|
+
"ragops @ git+https://github.com/thangldw/ragops.git@${RAGOPS_VERSION}"
|
|
50
|
+
- id: gate
|
|
51
|
+
name: Compare candidate with accepted baseline
|
|
52
|
+
shell: bash
|
|
53
|
+
env:
|
|
54
|
+
RAGOPS_SCENARIO: ${{ inputs.scenario }}
|
|
55
|
+
RAGOPS_BASELINE: ${{ inputs.baseline }}
|
|
56
|
+
RAGOPS_CANDIDATE: ${{ inputs.candidate }}
|
|
57
|
+
RAGOPS_POLICY: ${{ inputs.policy }}
|
|
58
|
+
run: |
|
|
59
|
+
set +e
|
|
60
|
+
command=(
|
|
61
|
+
ragops compare
|
|
62
|
+
--scenario "$RAGOPS_SCENARIO"
|
|
63
|
+
--baseline "$RAGOPS_BASELINE"
|
|
64
|
+
--candidate "$RAGOPS_CANDIDATE"
|
|
65
|
+
--format markdown
|
|
66
|
+
--output ragops-report.md
|
|
67
|
+
)
|
|
68
|
+
if [[ -n "$RAGOPS_POLICY" ]]; then
|
|
69
|
+
command+=(--policy "$RAGOPS_POLICY")
|
|
70
|
+
fi
|
|
71
|
+
"${command[@]}" >ragops-command.log 2>&1
|
|
72
|
+
gate_exit=$?
|
|
73
|
+
set -e
|
|
74
|
+
if [[ ! -f ragops-report.md ]]; then
|
|
75
|
+
{
|
|
76
|
+
echo "# RAGOps release gate error"
|
|
77
|
+
echo
|
|
78
|
+
echo '```text'
|
|
79
|
+
cat ragops-command.log
|
|
80
|
+
echo '```'
|
|
81
|
+
} >ragops-report.md
|
|
82
|
+
fi
|
|
83
|
+
echo "exit_code=$gate_exit" >>"$GITHUB_OUTPUT"
|
|
84
|
+
- name: Write bounded evidence manifest
|
|
85
|
+
if: always()
|
|
86
|
+
env:
|
|
87
|
+
RAGOPS_EVENT_NAME: ${{ github.event_name }}
|
|
88
|
+
RAGOPS_GATE_EXIT: ${{ steps.gate.outputs.exit_code }}
|
|
89
|
+
RAGOPS_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
90
|
+
RAGOPS_PR_NUMBER: ${{ github.event.pull_request.number }}
|
|
91
|
+
RAGOPS_WORKFLOW: ${{ github.workflow }}
|
|
92
|
+
run: |
|
|
93
|
+
python - <<'PY'
|
|
94
|
+
import json
|
|
95
|
+
import os
|
|
96
|
+
|
|
97
|
+
gate_exit = os.environ.get("RAGOPS_GATE_EXIT", "")
|
|
98
|
+
manifest = {
|
|
99
|
+
"schema_version": "ragops-github-evidence-0.1",
|
|
100
|
+
"repository": os.environ["GITHUB_REPOSITORY"],
|
|
101
|
+
"event_name": os.environ["RAGOPS_EVENT_NAME"],
|
|
102
|
+
"workflow": os.environ["RAGOPS_WORKFLOW"],
|
|
103
|
+
"run_id": int(os.environ["GITHUB_RUN_ID"]),
|
|
104
|
+
"head_sha": os.environ["RAGOPS_HEAD_SHA"],
|
|
105
|
+
"pull_request_number": int(os.environ["RAGOPS_PR_NUMBER"] or 0),
|
|
106
|
+
"gate_exit_code": int(gate_exit) if gate_exit else -1,
|
|
107
|
+
}
|
|
108
|
+
with open("ragops-evidence.json", "w", encoding="utf-8") as output:
|
|
109
|
+
json.dump(manifest, output, ensure_ascii=False, indent=2)
|
|
110
|
+
output.write("\n")
|
|
111
|
+
PY
|
|
112
|
+
- name: Publish evidence to job summary
|
|
113
|
+
if: always()
|
|
114
|
+
run: cat ragops-report.md >>"$GITHUB_STEP_SUMMARY"
|
|
115
|
+
- name: Upload release evidence
|
|
116
|
+
if: always()
|
|
117
|
+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
|
118
|
+
with:
|
|
119
|
+
name: ragops-release-evidence
|
|
120
|
+
path: |
|
|
121
|
+
ragops-report.md
|
|
122
|
+
ragops-command.log
|
|
123
|
+
ragops-evidence.json
|
|
124
|
+
- name: Enforce release decision
|
|
125
|
+
if: always()
|
|
126
|
+
env:
|
|
127
|
+
RAGOPS_GATE_EXIT: ${{ steps.gate.outputs.exit_code }}
|
|
128
|
+
run: |
|
|
129
|
+
if [[ -z "$RAGOPS_GATE_EXIT" ]]; then
|
|
130
|
+
echo "RAGOps gate did not produce an exit code." >&2
|
|
131
|
+
exit 1
|
|
132
|
+
fi
|
|
133
|
+
exit "$RAGOPS_GATE_EXIT"
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
name: RAGOps PR comment publisher
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_run:
|
|
5
|
+
workflows: ["RAGOps reusable gate smoke", "RAGOps statistical gate smoke"]
|
|
6
|
+
types: [completed]
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
actions: read
|
|
10
|
+
contents: read
|
|
11
|
+
pull-requests: write
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
publish:
|
|
15
|
+
if: github.event.workflow_run.event == 'pull_request'
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- name: Checkout trusted default-branch publisher
|
|
19
|
+
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
20
|
+
with:
|
|
21
|
+
ref: ${{ github.event.repository.default_branch }}
|
|
22
|
+
persist-credentials: false
|
|
23
|
+
- name: Validate evidence and publish one idempotent comment
|
|
24
|
+
env:
|
|
25
|
+
GITHUB_TOKEN: ${{ github.token }}
|
|
26
|
+
RAGOPS_SOURCE_WORKFLOW: ${{ github.event.workflow_run.name }}
|
|
27
|
+
run: python apps/github_pr_comment.py
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name: RAGOps statistical gate smoke
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
paths:
|
|
7
|
+
- ".github/workflows/ragops-statistical-gate.yml"
|
|
8
|
+
- ".github/workflows/ragops-statistical-gate-smoke.yml"
|
|
9
|
+
- "src/ragops/**"
|
|
10
|
+
- "scenarios/statistical_gate/**"
|
|
11
|
+
- "tests/test_github_workflows.py"
|
|
12
|
+
pull_request:
|
|
13
|
+
paths:
|
|
14
|
+
- ".github/workflows/ragops-statistical-gate.yml"
|
|
15
|
+
- ".github/workflows/ragops-statistical-gate-smoke.yml"
|
|
16
|
+
- "src/ragops/**"
|
|
17
|
+
- "scenarios/statistical_gate/**"
|
|
18
|
+
- "tests/test_github_workflows.py"
|
|
19
|
+
workflow_dispatch:
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
passing-statistical-reference:
|
|
23
|
+
uses: ./.github/workflows/ragops-statistical-gate.yml
|
|
24
|
+
with:
|
|
25
|
+
ragops-version: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
26
|
+
baseline-bundle: scenarios/statistical_gate/baseline.json
|
|
27
|
+
candidate-bundle: scenarios/statistical_gate/candidate-pass.json
|
|
28
|
+
policy: scenarios/statistical_gate/policy.toml
|