sandboxy 0.0.5__tar.gz → 0.0.7__tar.gz
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.
- {sandboxy-0.0.5 → sandboxy-0.0.7}/PKG-INFO +1 -1
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/App.tsx +2 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/components/ResultDisplay.tsx +4 -2
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/lib/api.ts +2 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/pages/DashboardPage.tsx +14 -7
- sandboxy-0.0.7/local-ui/src/pages/ScenarioDetailPage.tsx +664 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/pyproject.toml +1 -1
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/api/app.py +13 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/api/routes/local.py +12 -2
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/cli/main.py +3 -1
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/__init__.py +2 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/registry.py +26 -5
- sandboxy-0.0.7/sandboxy/ui/dist/assets/index-DfKu4uXt.js +377 -0
- sandboxy-0.0.7/sandboxy/ui/dist/assets/index-Qf7gGJk_.css +1 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/ui/dist/index.html +2 -2
- sandboxy-0.0.5/sandboxy/ui/dist/assets/index-CLxxjJuD.js +0 -367
- sandboxy-0.0.5/sandboxy/ui/dist/assets/index-DBB7ehs6.css +0 -1
- {sandboxy-0.0.5 → sandboxy-0.0.7}/.env.example +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/.github/workflows/ci.yml +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/.github/workflows/publish.yml +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/.gitignore +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/CONTRIBUTING.md +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/LICENSE +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/Makefile +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/README.md +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/docs/yaml-tools.md +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/index.html +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/package-lock.json +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/package.json +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/postcss.config.js +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/components/Layout.tsx +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/components/ModelSelector.tsx +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/hooks/useScenarioBuilder.ts +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/hooks/useScenarioRun.ts +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/hooks/useToolBuilder.ts +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/index.css +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/main.tsx +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/pages/BuilderPage.tsx +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/pages/DatasetPage.tsx +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/pages/ResultsPage.tsx +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/pages/RunPage.tsx +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/pages/ToolBuilderPage.tsx +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/tailwind.config.js +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/tsconfig.json +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/tsconfig.node.json +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/vite.config.ts +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/agents/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/agents/base.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/agents/llm_prompt.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/agents/loader.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/api/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/api/routes/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/api/routes/agents.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/api/routes/providers.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/api/routes/tools.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/cli/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/cli/type_detector.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/config.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/core/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/core/async_runner.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/core/mdl_parser.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/core/runner.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/core/safe_eval.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/core/state.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/datasets/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/datasets/loader.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/datasets/runner.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/errors.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/local/context.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/local/results.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/logging.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mcp/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mcp/client.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mcp/wrapper.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mlflow/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mlflow/artifacts.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mlflow/config.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mlflow/exporter.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mlflow/metrics.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mlflow/tags.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mlflow/tracing.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/anthropic_provider.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/base.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/config.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/http_client.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/local.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/openai_provider.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/openrouter.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/scenarios/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/scenarios/comparison.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/scenarios/loader.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/scenarios/runner.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/scenarios/unified.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/session/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/session/manager.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/tools/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/tools/base.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/tools/loader.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/tools/yaml_tools.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/ui/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/utils/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/utils/time.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/scenarios/customer_service.yml +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/conftest.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/factories.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/integration/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/integration/api/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/integration/test_mlflow_integration.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/mocks/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/mocks/providers.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/agents/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/agents/test_base.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/agents/test_llm_prompt.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/agents/test_loader.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/core/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/core/test_async_runner.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/core/test_mdl_parser.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/core/test_runner.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/core/test_safe_eval.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/core/test_state.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/mlflow/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/mlflow/test_artifacts.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/mlflow/test_config.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/mlflow/test_metrics.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/mlflow/test_tags.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/providers/test_openrouter.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/tools/__init__.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/tools/test_base.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/tools/test_loader.py +0 -0
- {sandboxy-0.0.5 → sandboxy-0.0.7}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sandboxy
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.7
|
|
4
4
|
Summary: Open-source agent simulation and benchmarking platform
|
|
5
5
|
Project-URL: Homepage, https://github.com/sandboxy-ai/sandboxy
|
|
6
6
|
Project-URL: Repository, https://github.com/sandboxy-ai/sandboxy
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Routes, Route } from 'react-router-dom'
|
|
2
2
|
import Layout from './components/Layout'
|
|
3
3
|
import DashboardPage from './pages/DashboardPage'
|
|
4
|
+
import ScenarioDetailPage from './pages/ScenarioDetailPage'
|
|
4
5
|
import RunPage from './pages/RunPage'
|
|
5
6
|
import ResultsPage from './pages/ResultsPage'
|
|
6
7
|
import BuilderPage from './pages/BuilderPage'
|
|
@@ -12,6 +13,7 @@ function App() {
|
|
|
12
13
|
<Routes>
|
|
13
14
|
<Route path="/" element={<Layout />}>
|
|
14
15
|
<Route index element={<DashboardPage />} />
|
|
16
|
+
<Route path="scenario/:scenarioId" element={<ScenarioDetailPage />} />
|
|
15
17
|
<Route path="run/:scenarioId" element={<RunPage />} />
|
|
16
18
|
<Route path="run" element={<RunPage />} />
|
|
17
19
|
<Route path="results" element={<ResultsPage />} />
|
|
@@ -2,8 +2,10 @@ import { useState } from 'react'
|
|
|
2
2
|
import { CheckCircle, XCircle, Trophy, Clock, Zap, DollarSign, Hash, MessageSquare, ChevronDown, ChevronRight, Eye, X, AlertCircle } from 'lucide-react'
|
|
3
3
|
import { RunScenarioResponse, CompareModelsResponse } from '../lib/api'
|
|
4
4
|
|
|
5
|
-
export function formatCost(cost: number | null | undefined): string {
|
|
5
|
+
export function formatCost(cost: number | null | undefined, isLocal?: boolean): string {
|
|
6
6
|
if (cost === null || cost === undefined) return '-'
|
|
7
|
+
// Local models have cost = 0 or is_local flag
|
|
8
|
+
if (isLocal === true || cost === 0) return 'Local'
|
|
7
9
|
if (cost < 0.0001) return '<$0.0001'
|
|
8
10
|
if (cost < 0.01) return `$${cost.toFixed(4)}`
|
|
9
11
|
return `$${cost.toFixed(3)}`
|
|
@@ -73,7 +75,7 @@ export function SingleRunResult({ result }: { result: RunScenarioResponse }) {
|
|
|
73
75
|
<DollarSign className="w-4 h-4" />
|
|
74
76
|
Cost
|
|
75
77
|
</div>
|
|
76
|
-
<div className="text-2xl font-bold text-emerald-300">{formatCost(result.cost_usd)}</div>
|
|
78
|
+
<div className="text-2xl font-bold text-emerald-300">{formatCost(result.cost_usd, result.is_local)}</div>
|
|
77
79
|
</div>
|
|
78
80
|
</div>
|
|
79
81
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useEffect, useState } from 'react'
|
|
2
2
|
import { Link } from 'react-router-dom'
|
|
3
|
-
import { Play, FileCode, Wrench, Server, Plus, RefreshCw, Trash2, CheckCircle, XCircle, AlertCircle } from 'lucide-react'
|
|
3
|
+
import { Play, FileCode, Wrench, Server, Plus, RefreshCw, Trash2, CheckCircle, XCircle, AlertCircle, ChevronRight } from 'lucide-react'
|
|
4
4
|
import { api, ProviderSummary, AddProviderRequest } from '../lib/api'
|
|
5
5
|
|
|
6
6
|
interface LocalFile {
|
|
@@ -183,13 +183,20 @@ export default function DashboardPage() {
|
|
|
183
183
|
{status.scenarios.map((scenario) => (
|
|
184
184
|
<div
|
|
185
185
|
key={scenario.id}
|
|
186
|
-
className="panel-card p-4"
|
|
186
|
+
className="panel-card p-4 hover:border-slate-600 transition-colors"
|
|
187
187
|
>
|
|
188
|
-
<
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
188
|
+
<Link to={`/scenario/${scenario.id}`} className="block mb-3">
|
|
189
|
+
<div className="flex items-start justify-between">
|
|
190
|
+
<h3 className="font-medium text-slate-100 mb-1 hover:text-orange-400 transition-colors">
|
|
191
|
+
{scenario.name}
|
|
192
|
+
</h3>
|
|
193
|
+
<ChevronRight size={16} className="text-slate-600 mt-1 flex-shrink-0" />
|
|
194
|
+
</div>
|
|
195
|
+
<p className="text-sm text-slate-400 line-clamp-2">
|
|
196
|
+
{scenario.description || 'No description'}
|
|
197
|
+
</p>
|
|
198
|
+
</Link>
|
|
199
|
+
<div className="flex justify-between items-center pt-2 border-t border-slate-700/40">
|
|
193
200
|
<span className="text-xs text-slate-500">{scenario.relative_path}</span>
|
|
194
201
|
<Link
|
|
195
202
|
to={`/run/${scenario.id}`}
|