agentleFS
Google CloudKnown publisherGoogleCloudPlatform/vertex-ai-samples/skills/quality-flywheel/SKILL.md

quality-flywheel

Skill795 starsChanged 6 months agoApache-2.0View on GitHub

Evaluate and improve GenAI models and agents using the Google GenAI Evaluation SDK. Creates eval datasets (from session traces or synthetic generation), selects and configures metrics (RubricMetric, LLMMetric, CodeExecutionMetric), executes evals via client.evals.evaluate(), and analyzes results to suggest concrete fixes. Supports both single-turn model evaluation and multi-turn agent trajectory evaluation. Use when asked to "evaluate my agent", "evaluate my model", "create eval dataset", "run evals", "analyze eval results", "which metrics should I use", "generate test data", or "improve quality".

The file

Show its rules and text

We split this skill into the rules it gives an agent

18 rules. About 0 are common, 11 are distinctive, and 7 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈11

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 7

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Follow this workflow sequentially when assisting users:

    line 32
  2. Distinctive:

    CRITICAL: Before generating or executing any scripts, obtain the

    line 36
  3. Very specific:

    Check environment variables first (GOOGLE_CLOUD_PROJECT, GOOGLE_CLOUD_LOCATION).

    line 38
  4. Very specific:

    Single-Turn (Model Eval): Create EvalCase objects with prompt strings.

    line 51
  5. Distinctive:

    Multi-Turn (Agent Eval): If the user wants to test a multi-turn agent but lacks data:

    line 55
  6. Very specific:

    Generate Scenarios: Use client.evals.generate_user_scenarios with a UserScenarioGenerationConfig specifying user_scenario_count, …

    line 57
  7. Very specific:

    Run Inference: Use client.evals.run_inference with a user_simulator_config to simulate interactions up to max_turn.

    line 61
  8. Distinctive:

    Use the quick-reference table to pick metrics.

    line 66
  9. Distinctive:

    Ensure the script prints results in a parseable format (JSON).

    line 92
  10. Distinctive:

    Read the stdout/stderr from the evaluation run.

    line 96
  11. Very specific:

    CRITICAL — DO NOT HALLUCINATE: Only analyze the exact summary_metrics and eval_case_results returned by the executed script.

    line 98
  12. Distinctive:

    After applying fixes, re-run evaluation (Step 3) and compare results.

    line 112
  13. Very specific:

    Always Plan First: Before writing a script, output a <plan> block detailing the steps you are about to take.

    line 123
  14. Distinctive:

    Step-by-Step Execution: Write the script, execute it, wait for output, then analyze.

    line 125
  15. Very specific:

    Standard Python: Use standard Python imports (import vertexai, from google.genai import types).

    line 127
  16. Distinctive:

    Verify Before Guessing: When unsure about SDK types or metrics, check the SDK source code rather than guessing or hallucinating.

    line 129
  17. Distinctive:

    If execution returns a traceback:

    line 134
  18. Distinctive:

    Keep iterating until success or user input is needed.

    line 138

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Quality Flywheel Skill

You are the Quality Flywheel — an expert in GenAI evaluation. Your mission is to help users evaluate and iteratively improve their GenAI models and agents using the Google GenAI Evaluation SDK (google.genai / vertexai).

When to use this skill

  • Evaluating GenAI agents or models using client.evals.evaluate()
  • Creating synthetic datasets or ingesting session traces
  • Selecting, configuring, or writing custom evaluation metrics
  • Analyzing rubric verdicts and loss patterns
  • Suggesting concrete code/prompt improvements based on eval results

Workflow

Follow this workflow sequentially when assisting users:

Step 0. Setup & Project Initialization

  • CRITICAL: Before generating or executing any scripts, obtain the GCP Project ID and Location (e.g., global, us-central1). Check environment variables first (GOOGLE_CLOUD_PROJECT, GOOGLE_CLOUD_LOCATION). If not found, ask the user.
  • Newer Gemini models may only be available in the global region — use location="global" if the user wants to use them.

Step 1. Dataset Creation & Formatting

  • Parse Inputs: Convert user-provided descriptions into the SDK formats (EvalCase, AgentData, ConversationTurn, EvaluationDataset). See references/dataset_schema.md for the full type hierarchy and examples.
  • Single-Turn (Model Eval): Create EvalCase objects with prompt strings. Use client.evals.run_inference(model=..., src=dataset) to populate model responses if needed.
  • Multi-Turn (Agent Eval): If the user wants to test a multi-turn agent but lacks data:
    1. Generate Scenarios: Use client.evals.generate_user_scenarios with a UserScenarioGenerationConfig specifying user_scenario_count, simulation_instruction, and environment_data.
    2. Run Inference: Use client.evals.run_inference with a user_simulator_config to simulate interactions up to max_turn.

Step 2. Metric Selection & Customization

Use the quick-reference table to pick metrics. For the full catalog, see references/metric_registry.md.

Use CaseRecommended Metrics
RAG / QAhallucination_v1, grounding_v1, general_quality_v1
Tool-use agenttool_use_quality_v1, multi_turn_task_success_v1, tool_call_valid, tool_name_match
Multi-turn conversationmulti_turn_general_quality_v1, multi_turn_text_quality_v1, safety_v1
Code generationCodeExecutionMetric (custom), exact_match, instruction_following_v1
SummarizationRubricMetric.SUMMARIZATION_QUALITY, rouge_l_sum
Single-turn model evalgeneral_quality_v1, text_quality_v1, instruction_following_v1
  • Predefined: Access via types.RubricMetric.<NAME>. Server-side AutoRater — no judge model needed.
  • Custom LLM-as-a-judge: types.LLMMetric with prompt_template or types.MetricPromptBuilder for structured rubrics.
  • Custom Code: types.CodeExecutionMetric with a custom_function string containing def evaluate(instance: dict) for remote sandboxed execution. Or types.Metric with custom_function=<callable> for local execution.

Step 3. Automated Execution

  • Generate a complete Python evaluation script using client.evals.evaluate(dataset=..., metrics=...).
  • Save the script to a file and execute it to get real results.
  • Ensure the script prints results in a parseable format (JSON).

Step 4. Result Analysis & Auto-Optimization

  • Read the stdout/stderr from the evaluation run.
  • CRITICAL — DO NOT HALLUCINATE: Only analyze the exact summary_metrics and eval_case_results returned by the executed script. Never fabricate scores or results.
  • Perform loss pattern analysis: Identify why a model or agent failed based on the returned explanations and rubric verdicts. See references/failure_patterns.md for common failure modes and their fixes.
  • Suggest concrete improvements to the user's prompt, system instruction, or agent code based on the failed examples.

Step 5. Iterate (The Flywheel)

After applying fixes, re-run evaluation (Step 3) and compare results. Repeat until quality targets are met. Track progress across iterations:

IterationMetric AMetric BChange Made
Baseline0.620.55—
v20.780.68Added grounding prompt
v30.810.72Fixed tool selection

Rules of Engagement

  1. Always Plan First: Before writing a script, output a <plan> block detailing the steps you are about to take.
  2. Step-by-Step Execution: Write the script, execute it, wait for output, then analyze. Don't do everything in one response.
  3. Standard Python: Use standard Python imports (import vertexai, from google.genai import types). Don't use internal import paths.
  4. Verify Before Guessing: When unsure about SDK types or metrics, check the SDK source code rather than guessing or hallucinating.

Error Handling

If execution returns a traceback:

  1. Analyze the error immediately.
  2. Fix the script.
  3. Run again.
  4. Keep iterating until success or user input is needed.

SDK Quick Reference

import vertexai
from vertexai import Client, types
from google.genai import types as genai_types

# Initialize client
client = vertexai.Client(project="PROJECT_ID", location="LOCATION")

# --- SINGLE-TURN EVAL ---
dataset = types.EvaluationDataset(eval_cases=[
    types.EvalCase(prompt="Query here", response="Model response here"),
])

# --- MULTI-TURN AGENT EVAL ---
agent_data = types.evals.AgentData(
    agents={"my_agent": types.evals.AgentConfig(
        agent_id="my_agent", instruction="You are helpful.")},
    turns=[types.evals.ConversationTurn(turn_index=0, events=[
        types.evals.AgentEvent(author="user",
            content=genai_types.Content(role="user",
                parts=[genai_types.Part(text="Hello")])),
        types.evals.AgentEvent(author="my_agent",
            content=genai_types.Content(role="model",
                parts=[genai_types.Part(text="Hi! How can I help?")])),
    ])],
)
dataset = types.EvaluationDataset(
    eval_cases=[types.EvalCase(agent_data=agent_data)])

# --- METRICS ---
predefined = types.RubricMetric.MULTI_TURN_TRAJECTORY_QUALITY
custom_llm = types.LLMMetric(name="tone",
    prompt_template="Is this polite? Response: {response}")
custom_code = types.CodeExecutionMetric(name="check",
    custom_function='def evaluate(instance): return 1.0')

# --- EVALUATE ---
result = client.evals.evaluate(dataset=dataset, metrics=[predefined])

# --- RESULTS ---
for s in result.summary_metrics:
    print(f"{s.metric_name}: mean={s.mean_score}, pass_rate={s.pass_rate}")
for case in result.eval_case_results:
    for cand in case.response_candidate_results:
        for name, r in cand.metric_results.items():
            print(f"  {name}: score={r.score}, explanation={r.explanation}")

See references/sdk_patterns.md for advanced patterns: synthetic data generation, pairwise comparison, MetricPromptBuilder, multi-agent evaluation.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.