File size: 2,959 Bytes
1cfcb8c
 
 
 
 
 
 
7769df9
1cfcb8c
7769df9
 
1cfcb8c
 
7769df9
1cfcb8c
7769df9
1cfcb8c
7769df9
 
 
 
 
 
1cfcb8c
 
7769df9
 
 
 
 
1cfcb8c
 
7769df9
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.

"""
Data models for the Orchid Env RL Evaluation Environment.

OrchidAction  — code-fix submission from a child agent.
OrchidObservation — result of evaluating that submission.
"""

from typing import List
from openenv.core.env_server.types import Action, Observation
from pydantic import BaseModel, Field

class SubAgentConfig(BaseModel):
    """Configuration for a single spawned sub-agent sandbox."""
    role_prompt: str = Field(..., description="The persona or instructions defining this agent's purpose.")
    start_line: int = Field(..., description="The starting line of the dataset this agent will process.")
    end_line: int = Field(..., description="The ending line of the dataset this agent will process.")
    python_code: str = Field(..., description="The Python script this agent will execute inside its sandbox to extract data.")

class OrchidAction(Action):
    """Orchestrator submission for task breakdown and mapping."""
    agent_id: str = Field(default="", description="Identifier for the orchestrator.")
    chunking_strategy: str = Field(..., description="Explanation of why the data was chunked this way.")
    sub_agents: List[SubAgentConfig] = Field(..., description="The list of sub-agents to spawn.")
    synthesis_code: str = Field(..., description="The Python script to run on the synthesized JSON outputs of the sub-agents.")

class OrchidObservation(Observation):
    """Result of the multi-agent orchestration execution."""
    task_id: str = Field(default="", description="ID of the next task to be attempted")
    task_description: str = Field(default="", description="Human-readable description of the next task")
    dataset_path: str = Field(default="", description="Path to the large context file for the next task")
    dataset_lines: int = Field(default=0, description="Total number of lines in the dataset")
    
    execution_output: str = Field(default="", description="Synthesized output from the PREVIOUS task's map-reduce execution")
    correctness_score: float = Field(default=0.0, description="Score based on the accuracy of the final synthesis (0.0 to 1.0)")
    decomposition_score: float = Field(default=0.0, description="Score based on efficiency of chunking (punishes overlap, huge chunks, or too many agents)")
    prompt_score: float = Field(default=0.0, description="Score evaluating the quality of the sub-agent role prompts")
    score: float = Field(default=0.0, description="Overall weighted score of the orchestration")
    reward: float = Field(default=0.0, description="The RL reward signal")
    feedback: str = Field(default="", description="Detailed feedback on the orchestration strategy")
    done: bool = Field(default=False, description="Whether the episode is complete")