Commit ·
5e73079
1
Parent(s): 1d68a07
fix: handle async client and None reward values
Browse files- .env.example +15 -0
- data_analysis_env/.dockerignore +5 -0
- data_analysis_env/Dockerfile +17 -0
- data_analysis_env/__pycache__/__init__.cpython-311.pyc +0 -0
- data_analysis_env/__pycache__/client.cpython-311.pyc +0 -0
- data_analysis_env/__pycache__/models.cpython-311.pyc +0 -0
- data_analysis_env/client.py +1 -2
- data_analysis_env/server/Dockerfile +5 -5
- data_analysis_env/server/__pycache__/__init__.cpython-311.pyc +0 -0
- data_analysis_env/server/__pycache__/app.cpython-311.pyc +0 -0
- data_analysis_env/server/__pycache__/data_analysis_environment.cpython-311.pyc +0 -0
- data_analysis_env/server/app.py +8 -3
- data_analysis_env/server/data_analysis_environment.py +14 -6
- inference.py +7 -5
.env.example
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# OpenEnv Environment Variables
|
| 2 |
+
# Copy this to .env and fill in your values
|
| 3 |
+
|
| 4 |
+
# Required - Hugging Face API Key
|
| 5 |
+
HF_TOKEN=your_huggingface_token_here
|
| 6 |
+
|
| 7 |
+
# Required - LLM Configuration
|
| 8 |
+
API_BASE_URL=https://router.huggingface.co/v1
|
| 9 |
+
MODEL_NAME=Qwen/Qwen2.5-72B-Instruct
|
| 10 |
+
|
| 11 |
+
# Optional - Environment URL (defaults to localhost)
|
| 12 |
+
ENV_URL=http://localhost:8000
|
| 13 |
+
|
| 14 |
+
# Optional - For local testing without Docker
|
| 15 |
+
OPENAI_API_KEY=your_openai_key_if_using_openai
|
data_analysis_env/.dockerignore
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
__pycache__
|
| 2 |
+
*.pyc
|
| 3 |
+
.venv
|
| 4 |
+
.git
|
| 5 |
+
*.egg-info
|
data_analysis_env/Dockerfile
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM python:3.10-slim
|
| 2 |
+
|
| 3 |
+
WORKDIR /app
|
| 4 |
+
|
| 5 |
+
RUN pip install --no-cache-dir uv
|
| 6 |
+
|
| 7 |
+
COPY server/requirements.txt /tmp/requirements.txt
|
| 8 |
+
RUN pip install --no-cache-dir -r /tmp/requirements.txt
|
| 9 |
+
|
| 10 |
+
COPY . /app/
|
| 11 |
+
|
| 12 |
+
ENV PYTHONPATH=/app/server:/app
|
| 13 |
+
ENV DATA_DIR=/app/server/data
|
| 14 |
+
|
| 15 |
+
EXPOSE 8000
|
| 16 |
+
|
| 17 |
+
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
|
data_analysis_env/__pycache__/__init__.cpython-311.pyc
ADDED
|
Binary file (630 Bytes). View file
|
|
|
data_analysis_env/__pycache__/client.cpython-311.pyc
ADDED
|
Binary file (2.73 kB). View file
|
|
|
data_analysis_env/__pycache__/models.cpython-311.pyc
ADDED
|
Binary file (4.31 kB). View file
|
|
|
data_analysis_env/client.py
CHANGED
|
@@ -16,9 +16,8 @@ class DataAnalysisEnv(
|
|
| 16 |
def __init__(
|
| 17 |
self,
|
| 18 |
base_url: str = "http://localhost:8000",
|
| 19 |
-
timeout: float = 30.0,
|
| 20 |
):
|
| 21 |
-
super().__init__(base_url=base_url
|
| 22 |
|
| 23 |
def _step_payload(self, action: DataAnalysisAction) -> dict:
|
| 24 |
return {
|
|
|
|
| 16 |
def __init__(
|
| 17 |
self,
|
| 18 |
base_url: str = "http://localhost:8000",
|
|
|
|
| 19 |
):
|
| 20 |
+
super().__init__(base_url=base_url)
|
| 21 |
|
| 22 |
def _step_payload(self, action: DataAnalysisAction) -> dict:
|
| 23 |
return {
|
data_analysis_env/server/Dockerfile
CHANGED
|
@@ -4,14 +4,14 @@ WORKDIR /app
|
|
| 4 |
|
| 5 |
RUN pip install --no-cache-dir uv
|
| 6 |
|
| 7 |
-
COPY
|
| 8 |
RUN pip install --no-cache-dir -r /tmp/requirements.txt
|
| 9 |
|
| 10 |
-
COPY
|
| 11 |
|
| 12 |
-
ENV PYTHONPATH=/app
|
| 13 |
-
ENV DATA_DIR=/app/
|
| 14 |
|
| 15 |
EXPOSE 8000
|
| 16 |
|
| 17 |
-
CMD ["uvicorn", "server.app:app", "--host", "0.0.0.0", "--port", "8000"]
|
|
|
|
| 4 |
|
| 5 |
RUN pip install --no-cache-dir uv
|
| 6 |
|
| 7 |
+
COPY server/requirements.txt /tmp/requirements.txt
|
| 8 |
RUN pip install --no-cache-dir -r /tmp/requirements.txt
|
| 9 |
|
| 10 |
+
COPY . /app/data_analysis_env/
|
| 11 |
|
| 12 |
+
ENV PYTHONPATH=/app
|
| 13 |
+
ENV DATA_DIR=/app/data_analysis_env/data
|
| 14 |
|
| 15 |
EXPOSE 8000
|
| 16 |
|
| 17 |
+
CMD ["uvicorn", "data_analysis_env.server.app:app", "--host", "0.0.0.0", "--port", "8000"]
|
data_analysis_env/server/__pycache__/__init__.cpython-311.pyc
ADDED
|
Binary file (193 Bytes). View file
|
|
|
data_analysis_env/server/__pycache__/app.cpython-311.pyc
ADDED
|
Binary file (773 Bytes). View file
|
|
|
data_analysis_env/server/__pycache__/data_analysis_environment.cpython-311.pyc
ADDED
|
Binary file (25.4 kB). View file
|
|
|
data_analysis_env/server/app.py
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
|
|
| 1 |
from openenv.core.env_server import create_app
|
| 2 |
|
| 3 |
-
|
| 4 |
-
from .
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
|
| 6 |
|
| 7 |
def create_data_analysis_environment():
|
| 8 |
-
data_dir = "/app/data"
|
| 9 |
return DataAnalysisEnvironment(data_dir=data_dir)
|
| 10 |
|
| 11 |
|
|
|
|
| 1 |
+
import os
|
| 2 |
from openenv.core.env_server import create_app
|
| 3 |
|
| 4 |
+
try:
|
| 5 |
+
from server.data_analysis_environment import DataAnalysisEnvironment
|
| 6 |
+
from data_analysis_env.models import DataAnalysisAction, DataAnalysisObservation
|
| 7 |
+
except ModuleNotFoundError:
|
| 8 |
+
from data_analysis_environment import DataAnalysisEnvironment
|
| 9 |
+
from models import DataAnalysisAction, DataAnalysisObservation
|
| 10 |
|
| 11 |
|
| 12 |
def create_data_analysis_environment():
|
| 13 |
+
data_dir = os.getenv("DATA_DIR", "/app/server/data")
|
| 14 |
return DataAnalysisEnvironment(data_dir=data_dir)
|
| 15 |
|
| 16 |
|
data_analysis_env/server/data_analysis_environment.py
CHANGED
|
@@ -8,12 +8,20 @@ import uuid
|
|
| 8 |
|
| 9 |
from openenv.core.env_server import Environment
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
|
| 18 |
|
| 19 |
TASKS = {
|
|
|
|
| 8 |
|
| 9 |
from openenv.core.env_server import Environment
|
| 10 |
|
| 11 |
+
try:
|
| 12 |
+
from data_analysis_env.models import (
|
| 13 |
+
DataAnalysisAction,
|
| 14 |
+
DataAnalysisObservation,
|
| 15 |
+
DataAnalysisState,
|
| 16 |
+
AVAILABLE_TOOLS,
|
| 17 |
+
)
|
| 18 |
+
except ModuleNotFoundError:
|
| 19 |
+
from models import (
|
| 20 |
+
DataAnalysisAction,
|
| 21 |
+
DataAnalysisObservation,
|
| 22 |
+
DataAnalysisState,
|
| 23 |
+
AVAILABLE_TOOLS,
|
| 24 |
+
)
|
| 25 |
|
| 26 |
|
| 27 |
TASKS = {
|
inference.py
CHANGED
|
@@ -128,11 +128,12 @@ async def run_task(client: OpenAI, env: DataAnalysisEnv, task_name: str) -> dict
|
|
| 128 |
rewards = []
|
| 129 |
last_error = None
|
| 130 |
|
| 131 |
-
result = env.reset(task=task_name)
|
| 132 |
obs = result.observation
|
|
|
|
| 133 |
|
| 134 |
print(
|
| 135 |
-
f"[STEP] step={step} action=reset task={task_name} reward={
|
| 136 |
)
|
| 137 |
|
| 138 |
while not result.done and step < MAX_STEPS:
|
|
@@ -165,13 +166,14 @@ async def run_task(client: OpenAI, env: DataAnalysisEnv, task_name: str) -> dict
|
|
| 165 |
)
|
| 166 |
continue
|
| 167 |
|
| 168 |
-
result = env.step(action)
|
| 169 |
obs = result.observation
|
| 170 |
-
|
|
|
|
| 171 |
|
| 172 |
error_str = obs.error if obs.error else "null"
|
| 173 |
print(
|
| 174 |
-
f"[STEP] step={step} action={action.tool}({action.parameters}) reward={
|
| 175 |
)
|
| 176 |
|
| 177 |
if obs.error:
|
|
|
|
| 128 |
rewards = []
|
| 129 |
last_error = None
|
| 130 |
|
| 131 |
+
result = await env.reset(task=task_name)
|
| 132 |
obs = result.observation
|
| 133 |
+
reward_val = obs.reward if obs.reward is not None else 0.0
|
| 134 |
|
| 135 |
print(
|
| 136 |
+
f"[STEP] step={step} action=reset task={task_name} reward={reward_val:.2f} done={result.done} error=null"
|
| 137 |
)
|
| 138 |
|
| 139 |
while not result.done and step < MAX_STEPS:
|
|
|
|
| 166 |
)
|
| 167 |
continue
|
| 168 |
|
| 169 |
+
result = await env.step(action)
|
| 170 |
obs = result.observation
|
| 171 |
+
reward_val = obs.reward if obs.reward is not None else 0.0
|
| 172 |
+
rewards.append(reward_val)
|
| 173 |
|
| 174 |
error_str = obs.error if obs.error else "null"
|
| 175 |
print(
|
| 176 |
+
f"[STEP] step={step} action={action.tool}({action.parameters}) reward={reward_val:.2f} done={result.done} error={error_str}"
|
| 177 |
)
|
| 178 |
|
| 179 |
if obs.error:
|