tf-rewardkit 1.6.3__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.
- rewardkit/__init__.py +66 -0
- rewardkit/__main__.py +154 -0
- rewardkit/agents.py +1747 -0
- rewardkit/compare.py +91 -0
- rewardkit/criteria/__init__.py +65 -0
- rewardkit/criteria/_command.py +30 -0
- rewardkit/criteria/_trajectory.py +32 -0
- rewardkit/criteria/command_output_contains.py +18 -0
- rewardkit/criteria/command_output_matches.py +18 -0
- rewardkit/criteria/command_output_matches_regex.py +19 -0
- rewardkit/criteria/command_succeeds.py +17 -0
- rewardkit/criteria/csv_cell_equals.py +41 -0
- rewardkit/criteria/diff_ratio.py +20 -0
- rewardkit/criteria/file_contains.py +18 -0
- rewardkit/criteria/file_contains_regex.py +19 -0
- rewardkit/criteria/file_exists.py +10 -0
- rewardkit/criteria/file_matches.py +20 -0
- rewardkit/criteria/file_not_exists.py +10 -0
- rewardkit/criteria/files_equal.py +20 -0
- rewardkit/criteria/http_response_contains.py +24 -0
- rewardkit/criteria/http_status_equals.py +26 -0
- rewardkit/criteria/image_similarity.py +45 -0
- rewardkit/criteria/image_size_equals.py +26 -0
- rewardkit/criteria/json_key_equals.py +24 -0
- rewardkit/criteria/json_path_equals.py +34 -0
- rewardkit/criteria/sqlite_query_equals.py +26 -0
- rewardkit/criteria/trajectory_tool_not_used.py +19 -0
- rewardkit/criteria/trajectory_tool_used.py +21 -0
- rewardkit/criteria/trajectory_turn_count.py +24 -0
- rewardkit/criteria/xlsx_cell_equals.py +38 -0
- rewardkit/isolation.py +126 -0
- rewardkit/judges.py +834 -0
- rewardkit/models.py +409 -0
- rewardkit/prompts/agent.md +3 -0
- rewardkit/prompts/llm.md +3 -0
- rewardkit/prompts/llm_trajectory.md +3 -0
- rewardkit/reward.py +382 -0
- rewardkit/runner.py +837 -0
- rewardkit/session.py +175 -0
- rewardkit/trajectory.py +390 -0
- rewardkit/workflow/__init__.py +21 -0
- rewardkit/workflow/attribution.py +212 -0
- rewardkit/workflow/cli.py +259 -0
- rewardkit/workflow/component/README.md +21 -0
- rewardkit/workflow/component/__init__.py +58 -0
- rewardkit/workflow/component/_internal/__init__.py +1 -0
- rewardkit/workflow/component/_internal/budget.py +129 -0
- rewardkit/workflow/component/_internal/rubric.py +157 -0
- rewardkit/workflow/component/_internal/salvage.py +235 -0
- rewardkit/workflow/component/_internal/scoring.py +177 -0
- rewardkit/workflow/component/_source.py +188 -0
- rewardkit/workflow/component/agentic.py +184 -0
- rewardkit/workflow/component/code.py +134 -0
- rewardkit/workflow/component/consume_upstream.py +23 -0
- rewardkit/workflow/component/contracts.py +582 -0
- rewardkit/workflow/component/criterion.py +161 -0
- rewardkit/workflow/component/do_nothing.py +16 -0
- rewardkit/workflow/component/fail.py +25 -0
- rewardkit/workflow/component/llm_judge.py +233 -0
- rewardkit/workflow/component/llm_stub.py +34 -0
- rewardkit/workflow/component/ppt_judge/__init__.py +1 -0
- rewardkit/workflow/component/ppt_judge/_code_methods.py +367 -0
- rewardkit/workflow/component/ppt_judge/_compute.py +194 -0
- rewardkit/workflow/component/ppt_judge/_content.py +423 -0
- rewardkit/workflow/component/ppt_judge/_contract.py +256 -0
- rewardkit/workflow/component/ppt_judge/_ctx.py +102 -0
- rewardkit/workflow/component/ppt_judge/_faults.py +28 -0
- rewardkit/workflow/component/ppt_judge/_html_render.py +547 -0
- rewardkit/workflow/component/ppt_judge/_pptx_render.py +154 -0
- rewardkit/workflow/component/ppt_judge/_render_common.py +97 -0
- rewardkit/workflow/component/ppt_judge/_tagging.py +163 -0
- rewardkit/workflow/component/ppt_judge/_visual.py +263 -0
- rewardkit/workflow/component/ppt_judge/_vlm.py +229 -0
- rewardkit/workflow/component/ppt_judge/aggregate.py +177 -0
- rewardkit/workflow/component/ppt_judge/content.py +188 -0
- rewardkit/workflow/component/ppt_judge/gate.py +138 -0
- rewardkit/workflow/component/ppt_judge/render.py +75 -0
- rewardkit/workflow/component/ppt_judge/tag.py +52 -0
- rewardkit/workflow/component/ppt_judge/visual.py +165 -0
- rewardkit/workflow/component/produce_value.py +14 -0
- rewardkit/workflow/component/registry.py +459 -0
- rewardkit/workflow/context.py +180 -0
- rewardkit/workflow/converter/__init__.py +19 -0
- rewardkit/workflow/converter/_convert.py +467 -0
- rewardkit/workflow/diagram.py +250 -0
- rewardkit/workflow/errors.py +48 -0
- rewardkit/workflow/executor.py +543 -0
- rewardkit/workflow/loader.py +703 -0
- rewardkit/workflow/model_service.py +179 -0
- rewardkit/workflow/plan.py +345 -0
- rewardkit/workflow/scoring.py +108 -0
- tf_rewardkit-1.6.3.dist-info/METADATA +144 -0
- tf_rewardkit-1.6.3.dist-info/RECORD +96 -0
- tf_rewardkit-1.6.3.dist-info/WHEEL +4 -0
- tf_rewardkit-1.6.3.dist-info/entry_points.txt +4 -0
- tf_rewardkit-1.6.3.dist-info/licenses/LICENSE +201 -0
rewardkit/__init__.py
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
from rewardkit.agents import AgentAttempt, AgentBackend, register_agent
|
|
2
|
+
from rewardkit.compare import ComparisonResult, compare, format_comparison
|
|
3
|
+
from rewardkit.models import (
|
|
4
|
+
Aggregation,
|
|
5
|
+
AgentJudge,
|
|
6
|
+
Binary,
|
|
7
|
+
Criterion,
|
|
8
|
+
JevJudge,
|
|
9
|
+
LLMJudge,
|
|
10
|
+
Likert,
|
|
11
|
+
MCPServerConfig,
|
|
12
|
+
Numeric,
|
|
13
|
+
OutputFormat,
|
|
14
|
+
Rubric,
|
|
15
|
+
Score,
|
|
16
|
+
)
|
|
17
|
+
from rewardkit.reward import Reward
|
|
18
|
+
from rewardkit.runner import discover, run, run_multi
|
|
19
|
+
from rewardkit.session import criterion
|
|
20
|
+
from rewardkit.trajectory import format_trajectory
|
|
21
|
+
|
|
22
|
+
__all__ = [
|
|
23
|
+
"AgentAttempt",
|
|
24
|
+
"AgentBackend",
|
|
25
|
+
"Aggregation",
|
|
26
|
+
"AgentJudge",
|
|
27
|
+
"Binary",
|
|
28
|
+
"ComparisonResult",
|
|
29
|
+
"Criterion",
|
|
30
|
+
"JevJudge",
|
|
31
|
+
"LLMJudge",
|
|
32
|
+
"Likert",
|
|
33
|
+
"MCPServerConfig",
|
|
34
|
+
"Numeric",
|
|
35
|
+
"OutputFormat",
|
|
36
|
+
"Reward",
|
|
37
|
+
"Rubric",
|
|
38
|
+
"Score",
|
|
39
|
+
"compare",
|
|
40
|
+
"criterion",
|
|
41
|
+
"discover",
|
|
42
|
+
"format_comparison",
|
|
43
|
+
"format_trajectory",
|
|
44
|
+
"register_agent",
|
|
45
|
+
"run",
|
|
46
|
+
"run_multi",
|
|
47
|
+
]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def __getattr__(name: str): # noqa: ANN204
|
|
51
|
+
"""Allow criteria to be accessed directly, e.g. ``rk.file_exists(...)``."""
|
|
52
|
+
import rewardkit.criteria # noqa: F401 — ensures built-in criteria are registered
|
|
53
|
+
|
|
54
|
+
from rewardkit.session import _factory_registry
|
|
55
|
+
|
|
56
|
+
if name in _factory_registry:
|
|
57
|
+
return _factory_registry[name]
|
|
58
|
+
raise AttributeError(f"module 'rewardkit' has no attribute {name!r}")
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def __dir__() -> list[str]:
|
|
62
|
+
import rewardkit.criteria # noqa: F401
|
|
63
|
+
|
|
64
|
+
from rewardkit.session import _factory_registry
|
|
65
|
+
|
|
66
|
+
return list(set(__all__) | set(_factory_registry))
|
rewardkit/__main__.py
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""CLI entry point: ``python -m rewardkit``."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
import logging
|
|
7
|
+
import os
|
|
8
|
+
import sys
|
|
9
|
+
|
|
10
|
+
from rewardkit.runner import run, run_multi
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _enable_cli_logging() -> None:
|
|
14
|
+
"""让 rewardkit 自己的 INFO 日志落到 stderr。
|
|
15
|
+
|
|
16
|
+
包内一律用 ``logging.getLogger(__name__)`` 且从不挂 handler,缺省只有 WARNING
|
|
17
|
+
及以上经 lastResort 输出,于是 agent CLI 的复用/安装来源这类 INFO 记录在判分
|
|
18
|
+
日志里完全看不到,无法区分"没装"与"装了但没记录"。只挂 rewardkit 这一个命名
|
|
19
|
+
空间而不动 root:root 上加 handler 会把 litellm、prefect 的 INFO 一起放出来。
|
|
20
|
+
"""
|
|
21
|
+
logger = logging.getLogger("rewardkit")
|
|
22
|
+
if logger.handlers:
|
|
23
|
+
return
|
|
24
|
+
handler = logging.StreamHandler(sys.stderr)
|
|
25
|
+
handler.setFormatter(logging.Formatter("%(levelname)s %(name)s: %(message)s"))
|
|
26
|
+
logger.addHandler(handler)
|
|
27
|
+
logger.setLevel(logging.INFO)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def main() -> None:
|
|
31
|
+
_enable_cli_logging()
|
|
32
|
+
parser = argparse.ArgumentParser(
|
|
33
|
+
prog="rewardkit",
|
|
34
|
+
description="Discover and run folder-based rewards.",
|
|
35
|
+
)
|
|
36
|
+
parser.add_argument(
|
|
37
|
+
"tests_dirs",
|
|
38
|
+
nargs="+",
|
|
39
|
+
help="Path(s) to tests directory. Multiple dirs run independently and are compared.",
|
|
40
|
+
)
|
|
41
|
+
parser.add_argument(
|
|
42
|
+
"--workspace", default="/app", help="Workspace path (default: /app)"
|
|
43
|
+
)
|
|
44
|
+
parser.add_argument(
|
|
45
|
+
"--output",
|
|
46
|
+
default="/logs/verifier/reward.json",
|
|
47
|
+
help="Output JSON path (default: /logs/verifier/reward.json)",
|
|
48
|
+
)
|
|
49
|
+
parser.add_argument(
|
|
50
|
+
"--max-concurrent-programmatic",
|
|
51
|
+
"--mcprog",
|
|
52
|
+
"--mcp",
|
|
53
|
+
type=int,
|
|
54
|
+
default=8,
|
|
55
|
+
help="Max programmatic rewards to run in parallel (0 = unlimited, default: 8)",
|
|
56
|
+
)
|
|
57
|
+
parser.add_argument(
|
|
58
|
+
"--max-concurrent-llm",
|
|
59
|
+
"--mcllm",
|
|
60
|
+
"--mcl",
|
|
61
|
+
type=int,
|
|
62
|
+
default=8,
|
|
63
|
+
help="Max LLM judge calls to run in parallel (0 = unlimited, default: 8)",
|
|
64
|
+
)
|
|
65
|
+
parser.add_argument(
|
|
66
|
+
"--max-concurrent-agent",
|
|
67
|
+
"--mcagent",
|
|
68
|
+
"--mca",
|
|
69
|
+
type=int,
|
|
70
|
+
default=2,
|
|
71
|
+
help="Max agent judge calls to run in parallel (0 = unlimited, default: 2)",
|
|
72
|
+
)
|
|
73
|
+
parser.add_argument(
|
|
74
|
+
"--max-concurrent-workflow-judge",
|
|
75
|
+
"--mcwf",
|
|
76
|
+
type=int,
|
|
77
|
+
default=1,
|
|
78
|
+
help="Max workflow-judge graphs to run in parallel "
|
|
79
|
+
"(0 = unlimited, default: 1)",
|
|
80
|
+
)
|
|
81
|
+
parser.add_argument(
|
|
82
|
+
"--judge-env",
|
|
83
|
+
"--je",
|
|
84
|
+
action="append",
|
|
85
|
+
default=[],
|
|
86
|
+
metavar="KEY=VALUE",
|
|
87
|
+
help="Set an env var for the judge run (repeatable). Overrides parent env.",
|
|
88
|
+
)
|
|
89
|
+
parser.add_argument(
|
|
90
|
+
"--judge",
|
|
91
|
+
"-j",
|
|
92
|
+
default=None,
|
|
93
|
+
metavar="MODEL_OR_AGENT",
|
|
94
|
+
help="Override the rubric's [judge].judge field. "
|
|
95
|
+
"Equivalent to setting REWARDKIT_JUDGE.",
|
|
96
|
+
)
|
|
97
|
+
parser.add_argument(
|
|
98
|
+
"--model",
|
|
99
|
+
"-m",
|
|
100
|
+
default=None,
|
|
101
|
+
metavar="MODEL",
|
|
102
|
+
help="Override the rubric's [judge].model field (used when the judge is an agent). "
|
|
103
|
+
"Equivalent to setting REWARDKIT_MODEL.",
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
args = parser.parse_args()
|
|
107
|
+
|
|
108
|
+
for entry in args.judge_env:
|
|
109
|
+
key, sep, value = entry.partition("=")
|
|
110
|
+
if not sep or not key:
|
|
111
|
+
parser.error(f"--judge-env expects KEY=VALUE, got: {entry!r}")
|
|
112
|
+
os.environ[key] = value
|
|
113
|
+
if args.judge:
|
|
114
|
+
os.environ["REWARDKIT_JUDGE"] = args.judge
|
|
115
|
+
if args.model:
|
|
116
|
+
os.environ["REWARDKIT_MODEL"] = args.model
|
|
117
|
+
concurrency_kwargs = dict(
|
|
118
|
+
max_concurrent_programmatic=args.max_concurrent_programmatic,
|
|
119
|
+
max_concurrent_llm=args.max_concurrent_llm,
|
|
120
|
+
max_concurrent_agent=args.max_concurrent_agent,
|
|
121
|
+
max_concurrent_workflow_judge=args.max_concurrent_workflow_judge,
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
if len(args.tests_dirs) == 1:
|
|
125
|
+
result = run(
|
|
126
|
+
args.tests_dirs[0],
|
|
127
|
+
workspace=args.workspace,
|
|
128
|
+
output=args.output,
|
|
129
|
+
**concurrency_kwargs,
|
|
130
|
+
)
|
|
131
|
+
for name, score in result.items():
|
|
132
|
+
print(f"{name}: {score}")
|
|
133
|
+
else:
|
|
134
|
+
# Multiple test suites: run independently, compare
|
|
135
|
+
per_dir = run_multi(
|
|
136
|
+
args.tests_dirs,
|
|
137
|
+
workspace=args.workspace,
|
|
138
|
+
output=args.output,
|
|
139
|
+
**concurrency_kwargs,
|
|
140
|
+
)
|
|
141
|
+
for label, scores in per_dir.items():
|
|
142
|
+
for name, score in scores.items():
|
|
143
|
+
print(f"{label}/{name}: {score}")
|
|
144
|
+
|
|
145
|
+
from rewardkit.compare import format_comparison
|
|
146
|
+
|
|
147
|
+
table = format_comparison(per_dir)
|
|
148
|
+
if table:
|
|
149
|
+
print()
|
|
150
|
+
print(table)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
if __name__ == "__main__":
|
|
154
|
+
main()
|