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.
Files changed (133) hide show
  1. {sandboxy-0.0.5 → sandboxy-0.0.7}/PKG-INFO +1 -1
  2. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/App.tsx +2 -0
  3. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/components/ResultDisplay.tsx +4 -2
  4. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/lib/api.ts +2 -0
  5. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/pages/DashboardPage.tsx +14 -7
  6. sandboxy-0.0.7/local-ui/src/pages/ScenarioDetailPage.tsx +664 -0
  7. {sandboxy-0.0.5 → sandboxy-0.0.7}/pyproject.toml +1 -1
  8. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/api/app.py +13 -0
  9. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/api/routes/local.py +12 -2
  10. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/cli/main.py +3 -1
  11. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/__init__.py +2 -0
  12. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/registry.py +26 -5
  13. sandboxy-0.0.7/sandboxy/ui/dist/assets/index-DfKu4uXt.js +377 -0
  14. sandboxy-0.0.7/sandboxy/ui/dist/assets/index-Qf7gGJk_.css +1 -0
  15. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/ui/dist/index.html +2 -2
  16. sandboxy-0.0.5/sandboxy/ui/dist/assets/index-CLxxjJuD.js +0 -367
  17. sandboxy-0.0.5/sandboxy/ui/dist/assets/index-DBB7ehs6.css +0 -1
  18. {sandboxy-0.0.5 → sandboxy-0.0.7}/.env.example +0 -0
  19. {sandboxy-0.0.5 → sandboxy-0.0.7}/.github/workflows/ci.yml +0 -0
  20. {sandboxy-0.0.5 → sandboxy-0.0.7}/.github/workflows/publish.yml +0 -0
  21. {sandboxy-0.0.5 → sandboxy-0.0.7}/.gitignore +0 -0
  22. {sandboxy-0.0.5 → sandboxy-0.0.7}/CONTRIBUTING.md +0 -0
  23. {sandboxy-0.0.5 → sandboxy-0.0.7}/LICENSE +0 -0
  24. {sandboxy-0.0.5 → sandboxy-0.0.7}/Makefile +0 -0
  25. {sandboxy-0.0.5 → sandboxy-0.0.7}/README.md +0 -0
  26. {sandboxy-0.0.5 → sandboxy-0.0.7}/docs/yaml-tools.md +0 -0
  27. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/index.html +0 -0
  28. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/package-lock.json +0 -0
  29. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/package.json +0 -0
  30. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/postcss.config.js +0 -0
  31. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/components/Layout.tsx +0 -0
  32. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/components/ModelSelector.tsx +0 -0
  33. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/hooks/useScenarioBuilder.ts +0 -0
  34. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/hooks/useScenarioRun.ts +0 -0
  35. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/hooks/useToolBuilder.ts +0 -0
  36. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/index.css +0 -0
  37. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/main.tsx +0 -0
  38. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/pages/BuilderPage.tsx +0 -0
  39. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/pages/DatasetPage.tsx +0 -0
  40. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/pages/ResultsPage.tsx +0 -0
  41. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/pages/RunPage.tsx +0 -0
  42. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/src/pages/ToolBuilderPage.tsx +0 -0
  43. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/tailwind.config.js +0 -0
  44. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/tsconfig.json +0 -0
  45. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/tsconfig.node.json +0 -0
  46. {sandboxy-0.0.5 → sandboxy-0.0.7}/local-ui/vite.config.ts +0 -0
  47. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/__init__.py +0 -0
  48. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/agents/__init__.py +0 -0
  49. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/agents/base.py +0 -0
  50. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/agents/llm_prompt.py +0 -0
  51. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/agents/loader.py +0 -0
  52. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/api/__init__.py +0 -0
  53. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/api/routes/__init__.py +0 -0
  54. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/api/routes/agents.py +0 -0
  55. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/api/routes/providers.py +0 -0
  56. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/api/routes/tools.py +0 -0
  57. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/cli/__init__.py +0 -0
  58. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/cli/type_detector.py +0 -0
  59. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/config.py +0 -0
  60. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/core/__init__.py +0 -0
  61. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/core/async_runner.py +0 -0
  62. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/core/mdl_parser.py +0 -0
  63. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/core/runner.py +0 -0
  64. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/core/safe_eval.py +0 -0
  65. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/core/state.py +0 -0
  66. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/datasets/__init__.py +0 -0
  67. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/datasets/loader.py +0 -0
  68. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/datasets/runner.py +0 -0
  69. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/errors.py +0 -0
  70. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/local/context.py +0 -0
  71. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/local/results.py +0 -0
  72. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/logging.py +0 -0
  73. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mcp/__init__.py +0 -0
  74. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mcp/client.py +0 -0
  75. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mcp/wrapper.py +0 -0
  76. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mlflow/__init__.py +0 -0
  77. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mlflow/artifacts.py +0 -0
  78. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mlflow/config.py +0 -0
  79. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mlflow/exporter.py +0 -0
  80. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mlflow/metrics.py +0 -0
  81. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mlflow/tags.py +0 -0
  82. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/mlflow/tracing.py +0 -0
  83. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/anthropic_provider.py +0 -0
  84. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/base.py +0 -0
  85. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/config.py +0 -0
  86. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/http_client.py +0 -0
  87. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/local.py +0 -0
  88. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/openai_provider.py +0 -0
  89. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/providers/openrouter.py +0 -0
  90. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/scenarios/__init__.py +0 -0
  91. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/scenarios/comparison.py +0 -0
  92. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/scenarios/loader.py +0 -0
  93. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/scenarios/runner.py +0 -0
  94. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/scenarios/unified.py +0 -0
  95. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/session/__init__.py +0 -0
  96. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/session/manager.py +0 -0
  97. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/tools/__init__.py +0 -0
  98. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/tools/base.py +0 -0
  99. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/tools/loader.py +0 -0
  100. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/tools/yaml_tools.py +0 -0
  101. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/ui/__init__.py +0 -0
  102. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/utils/__init__.py +0 -0
  103. {sandboxy-0.0.5 → sandboxy-0.0.7}/sandboxy/utils/time.py +0 -0
  104. {sandboxy-0.0.5 → sandboxy-0.0.7}/scenarios/customer_service.yml +0 -0
  105. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/__init__.py +0 -0
  106. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/conftest.py +0 -0
  107. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/factories.py +0 -0
  108. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/integration/__init__.py +0 -0
  109. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/integration/api/__init__.py +0 -0
  110. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/integration/test_mlflow_integration.py +0 -0
  111. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/mocks/__init__.py +0 -0
  112. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/mocks/providers.py +0 -0
  113. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/__init__.py +0 -0
  114. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/agents/__init__.py +0 -0
  115. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/agents/test_base.py +0 -0
  116. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/agents/test_llm_prompt.py +0 -0
  117. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/agents/test_loader.py +0 -0
  118. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/core/__init__.py +0 -0
  119. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/core/test_async_runner.py +0 -0
  120. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/core/test_mdl_parser.py +0 -0
  121. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/core/test_runner.py +0 -0
  122. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/core/test_safe_eval.py +0 -0
  123. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/core/test_state.py +0 -0
  124. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/mlflow/__init__.py +0 -0
  125. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/mlflow/test_artifacts.py +0 -0
  126. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/mlflow/test_config.py +0 -0
  127. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/mlflow/test_metrics.py +0 -0
  128. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/mlflow/test_tags.py +0 -0
  129. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/providers/test_openrouter.py +0 -0
  130. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/tools/__init__.py +0 -0
  131. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/tools/test_base.py +0 -0
  132. {sandboxy-0.0.5 → sandboxy-0.0.7}/tests/unit/tools/test_loader.py +0 -0
  133. {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.5
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
 
@@ -110,6 +110,8 @@ export interface RunScenarioResponse {
110
110
  output_tokens: number
111
111
  cost_usd: number | null
112
112
  error: string | null
113
+ is_local?: boolean
114
+ provider_name?: string
113
115
  }
114
116
 
115
117
  export interface CompareModelsRequest {
@@ -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
- <h3 className="font-medium text-slate-100 mb-1">{scenario.name}</h3>
189
- <p className="text-sm text-slate-400 mb-3 line-clamp-2">
190
- {scenario.description || 'No description'}
191
- </p>
192
- <div className="flex justify-between items-center">
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}`}