OpenJudge: A Unified Framework for Holistic Evaluation and Quality Rewards
$ npx -y skills add agentscope-ai/OpenJudge --agent claude-code
Run the curl in your terminal, the rest in Claude Code.
What's inside
π Website | π Try Online | π Documentation | π€ Contributing | πΎ PawBench | δΈζ
OpenJudge is an open-source evaluation framework for AI applications (e.g., AI agents or chatbots) designed to evaluate quality and drive continuous application optimization.
In practice, application excellence depends on a trustworthy evaluation workflow: Collect test data β Define graders β Run evaluation at scale β Analyze weaknesses β Iterate quickly.
OpenJudge provides ready-to-use graders and supports generating scenario-specific rubrics (as graders), making this workflow simpler, more professional, and easy to integrate into your workflow. It can also convert grading results into reward signals to help you fine-tune and optimize your application.
π Try it now! Visit openjudge.me/app to use graders online β no installation required. Test built-in graders, build custom rubrics, and explore evaluation results directly in your browser.
2026-06-17 - πΎ PawBench v1.0 - A Model Γ Harness co-evaluation benchmark for agentic AI: 150 tasks Β· 9 models Β· 3 harnesses, with public prompts, graders, task labels, submissions, and leaderboard slices. π GitHub | Leaderboard
2026-04-07 - π Skill Graders - 5 new LLM-based graders for evaluating AI Agent Skill packages: threat analysis (AITech taxonomy), declaration alignment, completeness, relevance, and design quality. π Documentation | Cookbook
2026-03-10 - π οΈ New Skills - Claude authenticity verification, find skills combo, and more. π Browse Skills
2026-02-12 - π Reference Hallucination Arena - Benchmark for evaluating LLM academic reference hallucination. π Documentation | π Leaderboard
2026-01-27 - π Paper Review - Automatically review academic papers using LLM-powered evaluation. π Documentation
2026-01-27 - π₯οΈ OpenJudge UI - A Streamlit-based visual interface for grader testing and Auto Arena. π Try Online | Run locally: streamlit run ui/app.py
Access 50+ production-ready graders featuring a comprehensive taxonomy, rigorously validated for reliable performance.
Focus: Semantic quality, functional correctness, structural compliance
Key Graders:
Relevance - Semantic relevance scoringSimilarity - Text similarity measurementSyntax Check - Code syntax validationJSON Match - Structure complianceFocus: Agent lifecycle, tool calling, memory, plan feasibility, trajectory quality
Key Graders:
Tool Selection - Tool choice accuracyMemory - Context preservationPlan - Strategy feasibilityTrajectory - Path optimizationFocus: Image-text coherence, visual generation quality, image helpfulness
Key Graders:
Image Coherence - Visual-text alignmentText-to-Image - Generation qualityImage Helpfulness - Image contributionChoose the build method that fits your requirements:
Using mainstream observability platforms like LangSmith or Langfuse? We offer seamless integration to enhance their evaluators and automated evaluation capabilities. We also provide integrations with training frameworks like VERL for RL training. π See Integrations for details
Explore OpenJudge without writing a single line of code. Our online platform at openjudge.me/app lets you:
π‘ Don't want to install anything? Try OpenJudge online β use graders directly in your browser, no setup needed.
pip install py-openjudge
π‘ More installation methods can be found in the Quickstart Guide.
π Complete Quickstart can be found in the Quickstart Guide.
A simple example to evaluate a single response:
import asyncio
from openjudge.models import OpenAIChatModel
from openjudge.graders.common.relevance import RelevanceGrader
async def main():
# 1οΈβ£ Create model client
model = OpenAIChatModel(model="qwen3-32b")
# 2οΈβ£ Initialize grader
grader = RelevanceGrader(model=model)
# 3οΈβ£ Prepare data
data = {
"query": "What is machine learning?",
"response": "Machine learning is a subset of AI that enables computers to learn from data.",
}
# 4οΈβ£ Evaluate
result = await grader.aevaluate(**data)
print(f"Score: {result.score}") # Score: 4
print(f"Reason: {result.reason}")
if __name__ == "__main__":
asyncio.run(main())
Use multiple built-in graders to comprehensively evaluate your LLM application: π Explore All built-in graders
Business Scenario: Evaluating an e-commerce customer service agent that handles order inquiries. We assess the agent's performance across three dimensions: relevance, hallucination, and tool selection.
import asyncio
from openjudge.models import OpenAIChatModel
from openjudge.graders.common import RelevanceGrader, HallucinationGrader
from openjudge.graders.agent.tool.tool_selection import ToolSelectionGrader
from openjudge.runner import GradingRunner
from openjudge.runner.aggregator import WeightedSumAggregator
from openjudge.analyzer.statistical import DistributionAnalyzer
TOOL_DEFINITIONS = [
{"name": "query_order", "description": "Query order status and logistics information", "parameters": {"order_id": "str"}},
{"name": "query_logistics", "description": "Query detailed logistics tracking", "parameters": {"order_id": "str"}},
{"name": "estimate_delivery", "description": "Estimate delivery time", "parameters": {"order_id": "str"}},
]
# Prepare your dataset
dataset = [{
"query": "Where is my order ORD123456?",
"response": "Your order ORD123456 has arrived at the Beijing distribution center and is expected to arrive tomorrow.",
"context": "Order ORD123456: Arrived at Beijing distribution center, expected to arrive tomorrow.",
"tool_definitions": TOOL_DEFINITIONS,
"tool_calls": [{"name": "query_order", "arguments": {"order_id": "ORD123456"}}],
# ... more test cases
}]
async def main():
# 1οΈβ£ Initialize judge model
model = OpenAIChatModel(model="qwen3-max")
# 2οΈβ£ Configure multiple graders
grader_configs = {
"relevance": {"grader": RelevanceGrader(model=model), "mapper": {"query": "query", "response": "response"}},
"hallucination": {"grader": HallucinationGrader(model=model), "mapper": {"query": "query", "response": "response", "context": "context"}},
"tool_selection": {"grader": ToolSelectionGrader(model=model), "mapper": {"query": "query", "tool_definitions": "tool_definitions", "tool_calls": "tool_calls"}},
}
# 3οΈβ£ Set up aggregator for overall score
aggregator = WeightedSumAggregator(name="overall_score", weights={"relevance": 0.3, "hallucination": 0.4, "tool_selection": 0.3})
# 4οΈβ£ Run evaluation
results = await GradingRunner(grader_configs=grader_configs, aggregators=[aggregator], max_concurrency=5).arun(dataset)
# 5οΈβ£ Generate evaluation report
overall_stats = DistributionAnalyzer().analyze(dataset, results["overall_score"])
print(f"{'Overall Score':<20} | {overall_stats.mean:>15.2f}")
if __name__ == "__main__":
asyncio.run(main())
Generate a custom grader from task description without labeled data: π Zero-shot Rubrics Generation Guide
When to use: Quick prototyping when you have no labeled data but can clearly describe your task.
import asyncio
from openjudge.generator.simple_rubric import SimpleRubricsGenerator, SimpleRubricsGeneratorConfig
from openjudge.models import OpenAIChatModel
async def main():
# 1οΈβ£ Configure generator
config = SimpleRubricsGeneratorConfig(
grader_name="customer_service_grader",
model=OpenAIChatModel(model="qwen3-max"),
task_description="E-commerce AI customer service primarily handles order inquiry tasks (such as logistics status and ETA) while focusing on managing customer emotions.",
min_score=1,
max_score=3,
)
# 2οΈβ£ Generate grader
generator = SimpleRubricsGenerator(config)
grader = await generator.generate(dataset=[], sample_queries=[])
# 3οΈβ£ View generated rubrics
print("Generated Rubrics:", grader.kwargs.get("rubrics"))
# 4οΈβ£ Use the grader
result = await grader.aevaluate(
query="My order is delayed, what should I do?",
response="I understand your concern. Let me check your order status..."
)
print(f"\nScore: {result.score}/3\nReason: {result.reason}")
if __name__ == "__main__":
asyncio.run(main())
Learn evaluation criteria from labeled examples: π Data-driven Rubrics Generation Guide
When to use: You have labeled data and need high-accuracy graders for production use, especially when evaluation criteria are implicit.
import asyncio
from openjudge.generator.iterative_rubric.generator import IterativeRubricsGenerator, IterativePointwiseRubricsGeneratorConfig
from openjudge.models import OpenAIChatModel
from openjudge.models.schema.prompt_template import LanguageEnum
# Prepare labeled dataset (simplified example, recommend 10+ samples in practice)
labeled_dataset = [
{"query": "My order hasn't arrived after 10 days, I want to complain!", "response": "I sincerely apologize for the delay. I completely understand your frustration! Your order was delayed due to weather conditions, but it has now resumed shipping and is expected to arrive tomorrow. I've marked it for priority delivery.", "label_score": 5},
{"query": "Where is my package? I need it urgently!", "response": "I understand your urgency! Your package is currently out for delivery and is expected to arrive before 2 PM today. The delivery driver's contact number is 138xxxx.", "label_score": 5},
{"query": "Why hasn't my order arrived yet? I've been waiting for days!", "response": "Your order is expected to arrive the day after tomorrow.", "label_score": 2},
{"query": "The logistics hasn't updated in 3 days, is it lost?", "response": "Hello, your package is not lost. It's still in transit, please wait patiently.", "label_score": 3},
# ... more labeled examples
]
async def main():
# 1οΈβ£ Configure generator
config = IterativePointwiseRubricsGeneratorConfig(
grader_name="customer_service_grader_v2", model=OpenAIChatModel(model="qwen3-max"),
min_score=1, max_score=5,
enable_categorization=True, categories_number=5, # Enable categorization, Aggregate into 5 themes
)
# 2οΈβ£ Generate grader from labeled data
generator = IterativeRubricsGenerator(config)
grader = await generator.generate(labeled_dataset)
# 3οΈβ£ View learned rubrics
print("\nLearned Rubrics from Labeled Data:\n",grader.kwargs.get("rubrics", "No rubrics generated"))
# 4οΈβ£ Evaluate new samples
test_cases = [
{"query": "My order hasn't moved in 5 days, can you check? I'm a bit worried", "response": "I understand your concern! Let me check immediately: Your package is currently at XX distribution center. Due to recent high order volume, there's a slight delay, but it's expected to arrive the day after tomorrow. I'll proactively contact you if there are any issues."},
{"query": "Why is this delivery so slow? I'm waiting to use it!", "response": "Checking, please wait."},
]
print("\n" + "=" * 70, "\nEvaluation Results:\n", "=" * 70)
for i, case in enumerate(test_cases):
result = await grader.aevaluate(query=case["query"], response=case["response"])
print(f"\n[Test {i+1}]\n Query: {case['query']}\n Response: {case['response']}\n Score: {result.score}/5\n Reason: {result.reason[:200]}...")
if __name__ == "__main__":
asyncio.run(main())
Seamlessly connect OpenJudge with mainstream observability and training platforms:
| Category | Platform | Status | Documentation |
|---|---|---|---|
| Observability | LangSmith | β Available | π LangSmith Integration Guide |
| Langfuse | β Available | π Langfuse Integration Guide | |
| Other frameworks | π΅ Planned | β | |
| Training | verl | β Available | π VERL Integration Guide |
| Trinity-RFT | π΅ Planned | β |
π¬ Have a framework you'd like us to prioritize? Open an Issue!
OpenJudge is the foundation of a growing evaluation ecosystem. These projects share OpenJudge's philosophy of evaluation-driven optimization while targeting specific verticals.
The same model can behave very differently depending on which agent runtime (harness) it runs inside. PawBench evaluates the model and the harness together, keeping enough metadata to analyze both dimensions independently:
$$\text{Agent Performance} = f(\text{Model}, \text{Harness})$$
| Dimension | Coverage |
|---|---|
| Tasks | 150 tasks from 6 sources (ClawEval, QwenClawBench, PinchBench, SkillsBench, WildClawBench, self-built) |
| Models | 9 models (Qwen, Claude, GLM, etc.) |
| Harnesses | 3 harnesses (QwenPaw, OpenClaw, Hermes) |
| Task labels | 5 dimensions: scenario, capability, complexity, modality, environment |
Key findings from v1.0: harness design alone can shift a model's score by 10+ points β a gap comparable to many model upgrades. PawBench provides slice diagnostics to pinpoint whether regressions come from the model, the harness, or the grader. π GitHub | Leaderboard | Documentation
We love your input! We want to make contributing to OpenJudge as easy and transparent as possible.
π¨ Adding New Graders β Have domain-specific evaluation logic? Share it with the community! π Reporting Bugs β Found a glitch? Help us fix it by opening an issue π Improving Docs β Clearer explanations or better examples are always welcome π‘ Proposing Features β Have ideas for new integrations? Let's discuss!
π See full Contributing Guidelines for coding standards and PR process.
Join our DingTalk group to connect with the community:
OpenJudge was previously distributed as the legacy package
rm-gallery(v0.1.x). Starting from v0.2.0, it is published aspy-openjudgeand the Python import namespace isopenjudge.
OpenJudge v0.2.0 is NOT backward compatible with v0.1.x. If you are currently using v0.1.x, choose one of the following paths:
pip install rm-gallery
We preserved the source code of v0.1.7 (the latest v0.1.x release) in the v0.1.7-legacy branch.
If you run into migration issues, please open an issue with your minimal repro and current version.
If you use OpenJudge in your research, please cite:
@software{
title = {OpenJudge: A Unified Framework for Holistic Evaluation and Quality Rewards},
author = {The OpenJudge Team},
url = {https://github.com/agentscope-ai/OpenJudge},
month = {07},
year = {2025}
}
Made with β€οΈ by the OpenJudge Team
π Website Β· π Try Online Β· β Star Us Β· π Report Bug Β· π‘ Request Feature
.flake8
.github/
ISSUE_TEMPLATE/
bug_report.md
custom.md
feature_request.md
PULL_REQUEST_TEMPLATE.md
workflows/
deploy-mkdocs.yml
pre-commit.yml
python-publish.yml
.gitignore
.gitleaks.toml
.pre-commit-config.yaml
cookbooks/
agentic_grader/
01_native_react_native_tool.py
02_native_react_langchain_tool.py
03_langchain_agent.py
04_agentscope_agent.py
adapters/
agentscope.py
langchain.py
README.md
auto_arena/
__main__.py
auto_arena_pipeline.py
chart_generator.py
examples/
config.yaml
minimal_config.yaml
query_generator.py
report_generator.py
response_collector.py
schema.py
claude_authenticity/
__main__.py
core.py
data_refinement/
refinement.py
finance_grader/
event_interpretation/
event_analysis.py
event_identification.py
industry_research/
characteristics_analysis.py
risk_analysis.py
underlying_comparison.py
macro_analysis/
concept_explanation.py
macro_analysis.py
stock_analysis/
fundamental_analysis.py
overall_logic.py
stock_risk_analysis.py
valuation_analysis.py
stock_search/
search_integrity.py
search_relevance.py
search_timeliness.py
grader_validation/
accuracy.py
grader_validator.py
rewardbench2.py
integrations/
langsmith.py
multi_turn_dialogue/
multi_turn_evaluation.py
pairwise_evaluation/
pairwise_evaluation.py
paper_review/
__init__.py
__main__.py
disciplines/
__init__.py
base.py
biology.py
chemistry.py
cs.py
economics.py
environmental_science.py
mathematics.py
medicine.py
physics.py
psychology.py
social_sciences.py
examples/
__init__.py
bib_verification.py
correctness_check.py
rebuttal_workflow.py
single_paper_review.py
tex_package_review.py
graders/
__init__.py
correctness.py
criticality.py
format.py
jailbreaking.py
rebuttal_assessment.py
rebuttal_generation.py
review.py
models.py
pipeline.py
processors/
__init__.py
bib_checker.py
tex_processor.py
prompts/
__init__.py
correctness.py
criticality.py
format.py
jailbreaking.py
rebuttal_assessment.py
rebuttal_generation.py
review.py
report.py
schema.py
utils.py
ref_hallucination_arena/
__main__.py
collectors/
__init__.py
bib_extractor.py
response_collector.py
examples/
config.yaml
minimal_config.yaml
loaders/
__init__.py
dataset_loader.py
pipeline.py
reporting/
__init__.py
chart_generator.py
report_generator.py
schema.py
scoring/
__init__.py
objective_scorer.py
ranking.py
verifiers/
__init__.py
arxiv_verifier.py
base_verifier.py
composite_verifier.py
crossref_verifier.py
dblp_verifier.py
pubmed_verifier.py
skills_evaluation/
evaluate_skills.py
README.md
results/
grading_report.md
runner.py
skill_models.py
training_judge_model/
bradley-terry/
bt_train.png
dataset.py
README.md
run_bt_rm.sh
trainer.py
trainer.yaml
grpo/
chat_rl_dataset.py
grader_rl_dataset.py
pairwise/
pairwise_train.png
reward_fn.py
run_pairwise.sh
pointwise/
grader_reward_fn.py
pointwise_train.png
reward_fn.py
run_pointwise_grader.sh
run_pointwise.sh
run.sh
utils/
preprocess_grader_data.py
README.md
runtime_env.yaml
sft/
README.md
run_sft_rm.sh
sft_train.png
docker/
Dockerfile.base
Dockerfile.train
Dockerfile.ui
README.md
docs/
applications/
auto_arena.md
data_refinement.md
paper_review.md
sample_reports/
oncology_translation_report.md
select_rank.md
assets/
auto_rubric_overview.pdf
building_graders/
create_custom_graders.md
generate_rubrics_as_graders.md
overview.md
training_judge_models.md
built_in_graders/
agent_graders.md
code_math.md
format.md
general.md
multi_turn.md
multimodal.md
overview.md
skills.md
text.md
community/
animations-demo.md
contributing.md
style-guide.md
get_started/
build_reward.md
core_concepts.md
evaluate_ai_agents.md
quickstart.md
guideline.md
images/
auto_rubric_overview.png
dingtalk_qr_code.png
langfuse_score_result.png
logo.svg
win_rate_chart_example.png
index.md
integrations/
agentscope.md
langfuse.md
langsmith.md
verl.md
javascripts/
animations.js
code-copy.js
code-zoom.js
nav-scroll-fix.js
responsive.js
search-fix.js
tabbed-code.js
requirements.txt
running_graders/
grader_analysis.md
run_tasks.md
stylesheets/
animations.css
code-enhancements.css
feature-cards.css
flowchart.css
jupyter-simple.css
mermaid.css
mkdocstrings.css
nav-scroll-fix.css
readability-enhancements.css
responsive.css
syntax-highlight.css
tabbed-code.css
table-enhancements.css
workflow.css
validating_graders/
overview.md
ref_hallucination_arena.md
rewardbench2.md
experiments/
README.md
run_grader_evals.sh
run_grader_evaluations.py
LICENSE
mkdocs.yml
openjudge/
__init__.py
agentic/
__init__.py
adapters/
__init__.py
function.py
agents.py
tools.py
analyzer/
__init__.py
base_analyzer.py
pairwise_analyzer.py
statistical/
__init__.py
consistency_analyzer.py
distribution_analyzer.py
validation/
__init__.py
accuracy_analyzer.py
base_validation_analyzer.py
correlation_analyzer.py
f1_score_analyzer.py
false_negative_analyzer.py
false_positive_analyzer.py
precision_analyzer.py
recall_analyzer.py
evaluation_strategy/
__init__.py
average_evaluation_strategy.py
base_evaluation_strategy.py
direct_evaluation_strategy.py
grpo_tournament_evaluation_strategy.py
voting_evaluation_strategy.py
generator/
__init__.py
base_generator.py
iterative_rubric/
__init__.py
categorizer.py
generator.py
mcr_selector.py
query_rubric_generator.py
llm_grader_generator.py
simple_rubric/
__init__.py
generator.py
rubric_generator.py
grader_benchmark/
__init__.py
agent_grader_registry.py
benchmark.py
graders/
__init__.py
agent/
__init__.py
action/
__init__.py
action_alignment.py
action_loop.py
memory/
__init__.py
memory_accuracy.py
memory_detail_preservation.py
memory_retrieval_effectiveness.py
observation/
__init__.py
observation_information_gain.py
plan/
__init__.py
plan_decomposition.py
plan_feasibility.py
reasoning/
__init__.py
reasoning_coherence.py
reasoning_groundedness.py
reflection/
__init__.py
reflection_accuracy.py
reflection_outcome_understanding.py
reflection_progress_awareness.py
response/
__init__.py
response_completeness.py
response_helpfulness.py
tool/
__init__.py
tool_call_accuracy.py
tool_call_precision_recall_match.py
tool_call_step_sequence_match.py
tool_call_success.py
tool_parameter_check.py
tool_selection.py
tool_usage_efficiency.py
trajectory/
__init__.py
trajectory_accuracy.py
trajectory_comprehensive.py
trajectory_error_recovery.py
trajectory_step_efficiency.py
utils.py
agentic_grader.py
base_grader.py
code/
__init__.py
_utils/
__init__.py
testing_util.py
utils.py
code_bug_detection.py
code_complexity.py
code_execution.py
code_security.py
code_style.py
patch_similarity.py
syntax_checker.py
common/
__init__.py
correctness.py
hallucination.py
harmfulness.py
instruction_following.py
relevance.py
search_correctness.py
... 439 moreFAQ
openjudge is a Claude Code plugin with 18 hand-picked skills for testing work, indexed on Flowy. Install it with the command on its page. It includes auto-arena, bib-verify, claude-authenticity. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.