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.
Files changed (96) hide show
  1. rewardkit/__init__.py +66 -0
  2. rewardkit/__main__.py +154 -0
  3. rewardkit/agents.py +1747 -0
  4. rewardkit/compare.py +91 -0
  5. rewardkit/criteria/__init__.py +65 -0
  6. rewardkit/criteria/_command.py +30 -0
  7. rewardkit/criteria/_trajectory.py +32 -0
  8. rewardkit/criteria/command_output_contains.py +18 -0
  9. rewardkit/criteria/command_output_matches.py +18 -0
  10. rewardkit/criteria/command_output_matches_regex.py +19 -0
  11. rewardkit/criteria/command_succeeds.py +17 -0
  12. rewardkit/criteria/csv_cell_equals.py +41 -0
  13. rewardkit/criteria/diff_ratio.py +20 -0
  14. rewardkit/criteria/file_contains.py +18 -0
  15. rewardkit/criteria/file_contains_regex.py +19 -0
  16. rewardkit/criteria/file_exists.py +10 -0
  17. rewardkit/criteria/file_matches.py +20 -0
  18. rewardkit/criteria/file_not_exists.py +10 -0
  19. rewardkit/criteria/files_equal.py +20 -0
  20. rewardkit/criteria/http_response_contains.py +24 -0
  21. rewardkit/criteria/http_status_equals.py +26 -0
  22. rewardkit/criteria/image_similarity.py +45 -0
  23. rewardkit/criteria/image_size_equals.py +26 -0
  24. rewardkit/criteria/json_key_equals.py +24 -0
  25. rewardkit/criteria/json_path_equals.py +34 -0
  26. rewardkit/criteria/sqlite_query_equals.py +26 -0
  27. rewardkit/criteria/trajectory_tool_not_used.py +19 -0
  28. rewardkit/criteria/trajectory_tool_used.py +21 -0
  29. rewardkit/criteria/trajectory_turn_count.py +24 -0
  30. rewardkit/criteria/xlsx_cell_equals.py +38 -0
  31. rewardkit/isolation.py +126 -0
  32. rewardkit/judges.py +834 -0
  33. rewardkit/models.py +409 -0
  34. rewardkit/prompts/agent.md +3 -0
  35. rewardkit/prompts/llm.md +3 -0
  36. rewardkit/prompts/llm_trajectory.md +3 -0
  37. rewardkit/reward.py +382 -0
  38. rewardkit/runner.py +837 -0
  39. rewardkit/session.py +175 -0
  40. rewardkit/trajectory.py +390 -0
  41. rewardkit/workflow/__init__.py +21 -0
  42. rewardkit/workflow/attribution.py +212 -0
  43. rewardkit/workflow/cli.py +259 -0
  44. rewardkit/workflow/component/README.md +21 -0
  45. rewardkit/workflow/component/__init__.py +58 -0
  46. rewardkit/workflow/component/_internal/__init__.py +1 -0
  47. rewardkit/workflow/component/_internal/budget.py +129 -0
  48. rewardkit/workflow/component/_internal/rubric.py +157 -0
  49. rewardkit/workflow/component/_internal/salvage.py +235 -0
  50. rewardkit/workflow/component/_internal/scoring.py +177 -0
  51. rewardkit/workflow/component/_source.py +188 -0
  52. rewardkit/workflow/component/agentic.py +184 -0
  53. rewardkit/workflow/component/code.py +134 -0
  54. rewardkit/workflow/component/consume_upstream.py +23 -0
  55. rewardkit/workflow/component/contracts.py +582 -0
  56. rewardkit/workflow/component/criterion.py +161 -0
  57. rewardkit/workflow/component/do_nothing.py +16 -0
  58. rewardkit/workflow/component/fail.py +25 -0
  59. rewardkit/workflow/component/llm_judge.py +233 -0
  60. rewardkit/workflow/component/llm_stub.py +34 -0
  61. rewardkit/workflow/component/ppt_judge/__init__.py +1 -0
  62. rewardkit/workflow/component/ppt_judge/_code_methods.py +367 -0
  63. rewardkit/workflow/component/ppt_judge/_compute.py +194 -0
  64. rewardkit/workflow/component/ppt_judge/_content.py +423 -0
  65. rewardkit/workflow/component/ppt_judge/_contract.py +256 -0
  66. rewardkit/workflow/component/ppt_judge/_ctx.py +102 -0
  67. rewardkit/workflow/component/ppt_judge/_faults.py +28 -0
  68. rewardkit/workflow/component/ppt_judge/_html_render.py +547 -0
  69. rewardkit/workflow/component/ppt_judge/_pptx_render.py +154 -0
  70. rewardkit/workflow/component/ppt_judge/_render_common.py +97 -0
  71. rewardkit/workflow/component/ppt_judge/_tagging.py +163 -0
  72. rewardkit/workflow/component/ppt_judge/_visual.py +263 -0
  73. rewardkit/workflow/component/ppt_judge/_vlm.py +229 -0
  74. rewardkit/workflow/component/ppt_judge/aggregate.py +177 -0
  75. rewardkit/workflow/component/ppt_judge/content.py +188 -0
  76. rewardkit/workflow/component/ppt_judge/gate.py +138 -0
  77. rewardkit/workflow/component/ppt_judge/render.py +75 -0
  78. rewardkit/workflow/component/ppt_judge/tag.py +52 -0
  79. rewardkit/workflow/component/ppt_judge/visual.py +165 -0
  80. rewardkit/workflow/component/produce_value.py +14 -0
  81. rewardkit/workflow/component/registry.py +459 -0
  82. rewardkit/workflow/context.py +180 -0
  83. rewardkit/workflow/converter/__init__.py +19 -0
  84. rewardkit/workflow/converter/_convert.py +467 -0
  85. rewardkit/workflow/diagram.py +250 -0
  86. rewardkit/workflow/errors.py +48 -0
  87. rewardkit/workflow/executor.py +543 -0
  88. rewardkit/workflow/loader.py +703 -0
  89. rewardkit/workflow/model_service.py +179 -0
  90. rewardkit/workflow/plan.py +345 -0
  91. rewardkit/workflow/scoring.py +108 -0
  92. tf_rewardkit-1.6.3.dist-info/METADATA +144 -0
  93. tf_rewardkit-1.6.3.dist-info/RECORD +96 -0
  94. tf_rewardkit-1.6.3.dist-info/WHEEL +4 -0
  95. tf_rewardkit-1.6.3.dist-info/entry_points.txt +4 -0
  96. 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()