inspect-ai 0.3.90__py3-none-any.whl → 0.3.91__py3-none-any.whl
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.
- inspect_ai/_cli/common.py +13 -0
- inspect_ai/_cli/eval.py +40 -0
- inspect_ai/_display/textual/widgets/samples.py +49 -4
- inspect_ai/_display/textual/widgets/vscode.py +4 -2
- inspect_ai/_eval/eval.py +41 -28
- inspect_ai/_eval/evalset.py +4 -0
- inspect_ai/_eval/loader.py +4 -5
- inspect_ai/_eval/registry.py +1 -1
- inspect_ai/_eval/run.py +6 -3
- inspect_ai/_eval/task/log.py +6 -0
- inspect_ai/_eval/task/run.py +108 -41
- inspect_ai/_eval/task/sandbox.py +19 -5
- inspect_ai/_util/_async.py +1 -1
- inspect_ai/_util/constants.py +1 -0
- inspect_ai/_util/environ.py +32 -0
- inspect_ai/_util/file.py +8 -1
- inspect_ai/_util/httpx.py +105 -22
- inspect_ai/_util/registry.py +83 -9
- inspect_ai/_util/text.py +81 -17
- inspect_ai/_util/transcript.py +9 -6
- inspect_ai/_util/vscode.py +7 -2
- inspect_ai/_view/schema.py +1 -1
- inspect_ai/_view/www/babel.config.js +11 -0
- inspect_ai/_view/www/dist/assets/index.css +3640 -3563
- inspect_ai/_view/www/dist/assets/index.js +59204 -52519
- inspect_ai/_view/www/eslint.config.mjs +10 -1
- inspect_ai/_view/www/jest.config.mjs +21 -0
- inspect_ai/_view/www/log-schema.json +111 -2
- inspect_ai/_view/www/package.json +19 -5
- inspect_ai/_view/www/src/{types → @types}/log.d.ts +95 -32
- inspect_ai/_view/www/{App.css → src/app/App.css} +22 -14
- inspect_ai/_view/www/src/app/App.tsx +168 -0
- inspect_ai/_view/www/src/{AppErrorBoundary.tsx → app/AppErrorBoundary.tsx} +1 -1
- inspect_ai/_view/www/src/{appearance → app/appearance}/icons.ts +1 -0
- inspect_ai/_view/www/src/{metadata → app/content}/RenderedContent.tsx +5 -5
- inspect_ai/_view/www/src/{workspace/WorkSpaceView.tsx → app/log-view/LogView.tsx} +59 -40
- inspect_ai/_view/www/src/app/log-view/LogViewContainer.tsx +159 -0
- inspect_ai/_view/www/src/app/log-view/LogViewLayout.tsx +109 -0
- inspect_ai/_view/www/src/{workspace → app/log-view}/error/TaskErrorPanel.tsx +3 -3
- inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ModelRolesView.tsx +1 -1
- inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/Navbar.tsx +4 -4
- inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/PrimaryBar.tsx +8 -8
- inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ResultsPanel.tsx +6 -6
- inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/RunningStatusPanel.tsx +1 -1
- inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ScoreGrid.tsx +1 -1
- inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/SecondaryBar.tsx +8 -8
- inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/InfoTab.tsx +35 -6
- inspect_ai/_view/www/src/app/log-view/tabs/JsonTab.tsx +136 -0
- inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/SamplesTab.tsx +82 -73
- inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/grouping.ts +3 -3
- inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/types.ts +1 -1
- inspect_ai/_view/www/src/{plan → app/plan}/DatasetDetailView.tsx +2 -2
- inspect_ai/_view/www/src/{plan → app/plan}/DetailStep.tsx +1 -1
- inspect_ai/_view/www/src/{plan → app/plan}/ModelCard.tsx +4 -4
- inspect_ai/_view/www/src/{plan → app/plan}/PlanCard.tsx +2 -2
- inspect_ai/_view/www/src/{plan → app/plan}/PlanDetailView.tsx +5 -5
- inspect_ai/_view/www/src/{plan → app/plan}/SolverDetailView.tsx +1 -1
- inspect_ai/_view/www/src/app/routing/AppRouter.tsx +58 -0
- inspect_ai/_view/www/src/app/routing/navigationHooks.ts +182 -0
- inspect_ai/_view/www/src/app/routing/url.ts +43 -0
- inspect_ai/_view/www/src/{samples → app/samples}/InlineSampleDisplay.tsx +11 -27
- inspect_ai/_view/www/src/{samples → app/samples}/SampleDialog.tsx +36 -40
- inspect_ai/_view/www/src/{samples → app/samples}/SampleDisplay.module.css +4 -0
- inspect_ai/_view/www/src/{samples → app/samples}/SampleDisplay.tsx +116 -49
- inspect_ai/_view/www/src/{samples → app/samples}/SampleSummaryView.module.css +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/SampleSummaryView.tsx +29 -26
- inspect_ai/_view/www/src/{samples → app/samples}/SamplesTools.tsx +3 -3
- inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessage.module.css +5 -2
- inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessage.tsx +12 -4
- inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessageRenderer.tsx +3 -3
- inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessageRow.tsx +6 -1
- inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatView.tsx +4 -2
- inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatViewVirtualList.tsx +5 -3
- inspect_ai/_view/www/src/app/samples/chat/MessageContent.module.css +12 -0
- inspect_ai/_view/www/src/{samples → app/samples}/chat/MessageContent.tsx +11 -10
- inspect_ai/_view/www/src/app/samples/chat/MessageContents.module.css +7 -0
- inspect_ai/_view/www/src/{samples → app/samples}/chat/MessageContents.tsx +14 -8
- inspect_ai/_view/www/src/{samples → app/samples}/chat/messages.ts +2 -2
- inspect_ai/_view/www/src/app/samples/chat/tools/ToolCallView.module.css +7 -0
- inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolCallView.tsx +26 -27
- inspect_ai/_view/www/src/app/samples/chat/tools/ToolInput.module.css +19 -0
- inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolInput.tsx +3 -3
- inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolOutput.module.css +1 -0
- inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolOutput.tsx +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolTitle.module.css +4 -0
- inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolTitle.tsx +2 -2
- inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/tool.ts +1 -1
- inspect_ai/_view/www/src/app/samples/chat/types.ts +1 -0
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/samplesDescriptor.tsx +38 -15
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/BooleanScoreDescriptor.tsx +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/CategoricalScoreDescriptor.tsx +2 -2
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/NumericScoreDescriptor.tsx +3 -3
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/ObjectScoreDescriptor.tsx +4 -4
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/OtherScoreDescriptor.tsx +2 -2
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/PassFailScoreDescriptor.tsx +2 -2
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/ScoreDescriptor.tsx +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/types.ts +4 -3
- inspect_ai/_view/www/src/{samples → app/samples}/error/SampleErrorView.module.css +2 -1
- inspect_ai/_view/www/src/{samples → app/samples}/list/SampleHeader.tsx +3 -0
- inspect_ai/_view/www/src/{samples → app/samples}/list/SampleList.tsx +47 -33
- inspect_ai/_view/www/src/{samples → app/samples}/list/SampleRow.module.css +16 -0
- inspect_ai/_view/www/src/{samples → app/samples}/list/SampleRow.tsx +47 -20
- inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SelectScorer.tsx +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SortFilter.tsx +4 -4
- inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/filters.ts +8 -6
- inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/SampleFilter.tsx +4 -3
- inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/completions.ts +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/language.ts +1 -0
- inspect_ai/_view/www/src/{samples → app/samples}/sampleDataAdapter.ts +3 -3
- inspect_ai/_view/www/src/{samples → app/samples}/sampleLimit.ts +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScores.tsx +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresGrid.tsx +12 -11
- inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresView.tsx +6 -6
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/ApprovalEventView.tsx +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/ErrorEventView.tsx +3 -3
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/InfoEventView.tsx +4 -4
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/InputEventView.tsx +3 -3
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/LoggerEventView.tsx +3 -3
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/ModelEventView.module.css +13 -7
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/ModelEventView.tsx +49 -21
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/SampleInitEventView.tsx +11 -9
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/SampleLimitEventView.tsx +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/SandboxEventView.tsx +8 -6
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/ScoreEventView.tsx +4 -4
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/StepEventView.tsx +11 -3
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/SubtaskEventView.tsx +2 -2
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/ToolEventView.tsx +2 -2
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptView.module.css +8 -7
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptView.tsx +32 -114
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptVirtualListComponent.module.css +6 -5
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptVirtualListComponent.tsx +14 -2
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventPanel.tsx +2 -2
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventTimingPanel.tsx +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/utils.ts +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventRenderers.tsx +23 -21
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventRenders.module.css +7 -0
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventView.tsx +2 -2
- inspect_ai/_view/www/src/app/samples/transcript/transform/fixups.ts +142 -0
- inspect_ai/_view/www/src/app/samples/transcript/transform/treeify.ts +39 -0
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/types.ts +1 -1
- inspect_ai/_view/www/src/{workspace → app}/sidebar/EvalStatus.tsx +1 -1
- inspect_ai/_view/www/src/app/sidebar/LogDirectoryTitleView.module.css +16 -0
- inspect_ai/_view/www/src/app/sidebar/LogDirectoryTitleView.tsx +70 -0
- inspect_ai/_view/www/src/{workspace → app}/sidebar/Sidebar.module.css +8 -0
- inspect_ai/_view/www/src/{workspace → app}/sidebar/Sidebar.tsx +35 -17
- inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarLogEntry.tsx +1 -1
- inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoreView.tsx +2 -2
- inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoresView.tsx +2 -2
- inspect_ai/_view/www/src/{types.ts → app/types.ts} +18 -11
- inspect_ai/_view/www/src/{usage → app/usage}/ModelTokenTable.tsx +1 -1
- inspect_ai/_view/www/src/{usage → app/usage}/ModelUsagePanel.tsx +2 -2
- inspect_ai/_view/www/src/{usage → app/usage}/TokenTable.tsx +1 -1
- inspect_ai/_view/www/src/{usage → app/usage}/UsageCard.tsx +6 -6
- inspect_ai/_view/www/src/{api → client/api}/api-browser.ts +2 -2
- inspect_ai/_view/www/src/{api → client/api}/api-http.ts +3 -3
- inspect_ai/_view/www/src/{api → client/api}/api-vscode.ts +2 -2
- inspect_ai/_view/www/src/{api → client/api}/client-api.ts +6 -5
- inspect_ai/_view/www/src/{api → client/api}/index.ts +2 -2
- inspect_ai/_view/www/src/{api → client/api}/types.ts +4 -1
- inspect_ai/_view/www/src/{logfile → client/remote}/remoteLogFile.ts +3 -3
- inspect_ai/_view/www/src/{storage → client/storage}/index.ts +11 -5
- inspect_ai/_view/www/src/components/Card.tsx +1 -1
- inspect_ai/_view/www/src/components/CopyButton.tsx +1 -1
- inspect_ai/_view/www/src/components/DownloadButton.tsx +1 -1
- inspect_ai/_view/www/src/components/ErrorPanel.tsx +1 -1
- inspect_ai/_view/www/src/components/{ExpandablePanel.css → ExpandablePanel.module.css} +14 -11
- inspect_ai/_view/www/src/components/ExpandablePanel.tsx +16 -10
- inspect_ai/_view/www/src/components/FindBand.tsx +1 -1
- inspect_ai/_view/www/src/components/JsonPanel.css +2 -2
- inspect_ai/_view/www/src/components/LargeModal.tsx +12 -1
- inspect_ai/_view/www/src/components/LightboxCarousel.tsx +1 -1
- inspect_ai/_view/www/src/components/MarkdownDiv.tsx +3 -1
- inspect_ai/_view/www/src/components/MessageBand.tsx +1 -1
- inspect_ai/_view/www/src/components/NoContentsPanel.tsx +1 -1
- inspect_ai/_view/www/src/constants.ts +10 -9
- inspect_ai/_view/www/src/index.tsx +27 -11
- inspect_ai/_view/www/src/state/appSlice.ts +44 -5
- inspect_ai/_view/www/src/state/hooks.ts +30 -7
- inspect_ai/_view/www/src/state/logSlice.ts +7 -5
- inspect_ai/_view/www/src/state/logsPolling.ts +1 -1
- inspect_ai/_view/www/src/state/logsSlice.ts +18 -13
- inspect_ai/_view/www/src/state/samplePolling.ts +12 -12
- inspect_ai/_view/www/src/state/sampleSlice.ts +3 -5
- inspect_ai/_view/www/src/state/sampleUtils.ts +1 -1
- inspect_ai/_view/www/src/{scoring/utils.ts → state/scoring.ts} +2 -2
- inspect_ai/_view/www/src/state/store.ts +9 -7
- inspect_ai/_view/www/src/state/utils.ts +1 -1
- inspect_ai/_view/www/src/tests/README.md +49 -0
- inspect_ai/_view/www/src/tests/__mocks__/fileMock.js +1 -0
- inspect_ai/_view/www/src/tests/__mocks__/styleMock.js +1 -0
- inspect_ai/_view/www/src/tests/setupTests.mjs +1 -0
- inspect_ai/_view/www/src/tests/utils/base64.test.ts +23 -0
- inspect_ai/_view/www/src/tests/utils/format.test.ts +127 -0
- inspect_ai/_view/www/src/tests/utils/path.test.ts +54 -0
- inspect_ai/_view/www/src/utils/format.ts +8 -2
- inspect_ai/_view/www/src/utils/path.ts +14 -2
- inspect_ai/_view/www/src/utils/polling.ts +1 -2
- inspect_ai/_view/www/src/utils/uri.ts +32 -0
- inspect_ai/_view/www/yarn.lock +3310 -382
- inspect_ai/agent/_handoff.py +6 -3
- inspect_ai/agent/_human/agent.py +5 -3
- inspect_ai/agent/_human/install.py +16 -7
- inspect_ai/agent/_human/panel.py +14 -1
- inspect_ai/agent/_human/service.py +5 -1
- inspect_ai/agent/_react.py +161 -128
- inspect_ai/agent/_types.py +15 -4
- inspect_ai/approval/_policy.py +2 -2
- inspect_ai/log/_file.py +30 -11
- inspect_ai/log/_log.py +7 -1
- inspect_ai/log/_recorders/eval.py +3 -0
- inspect_ai/log/_recorders/types.py +1 -0
- inspect_ai/log/_samples.py +4 -0
- inspect_ai/model/_call_tools.py +33 -17
- inspect_ai/model/_generate_config.py +10 -2
- inspect_ai/model/_model.py +41 -21
- inspect_ai/model/_model_output.py +2 -1
- inspect_ai/model/_openai.py +10 -8
- inspect_ai/model/_openai_responses.py +83 -42
- inspect_ai/model/_providers/anthropic.py +14 -12
- inspect_ai/model/_providers/google.py +191 -95
- inspect_ai/model/_providers/hf.py +1 -1
- inspect_ai/model/_providers/mistral.py +2 -3
- inspect_ai/model/_providers/openai.py +54 -17
- inspect_ai/model/_providers/openai_o1.py +1 -1
- inspect_ai/model/_providers/openai_responses.py +28 -16
- inspect_ai/model/_providers/openrouter.py +14 -0
- inspect_ai/model/_providers/providers.py +2 -2
- inspect_ai/model/_providers/util/chatapi.py +17 -7
- inspect_ai/model/_providers/vllm.py +1 -1
- inspect_ai/scorer/_metric.py +17 -1
- inspect_ai/scorer/_model.py +51 -6
- inspect_ai/scorer/_scorer.py +1 -1
- inspect_ai/solver/_human_agent.py +3 -0
- inspect_ai/solver/_plan.py +1 -1
- inspect_ai/solver/_solver.py +1 -1
- inspect_ai/solver/_use_tools.py +14 -8
- inspect_ai/tool/__init__.py +16 -1
- inspect_ai/tool/_json_rpc_helpers.py +285 -0
- inspect_ai/tool/_mcp/__init__.py +13 -0
- inspect_ai/tool/_mcp/_context.py +14 -0
- inspect_ai/tool/_mcp/_mcp.py +293 -0
- inspect_ai/tool/_mcp/_sandbox.py +104 -0
- inspect_ai/tool/_mcp/_types.py +31 -0
- inspect_ai/tool/_mcp/connection.py +60 -0
- inspect_ai/tool/_mcp/sampling.py +118 -0
- inspect_ai/tool/_mcp/server.py +112 -0
- inspect_ai/tool/_mcp/tools.py +34 -0
- inspect_ai/tool/_tool.py +13 -0
- inspect_ai/tool/_tool_def.py +24 -7
- inspect_ai/tool/_tool_support_helpers.py +129 -153
- inspect_ai/tool/_tools/_bash_session.py +11 -11
- inspect_ai/tool/_tools/_text_editor.py +6 -6
- inspect_ai/tool/_tools/_web_browser/_web_browser.py +8 -8
- inspect_ai/util/_anyio.py +31 -20
- inspect_ai/util/_json.py +20 -2
- inspect_ai/util/_sandbox/context.py +18 -7
- inspect_ai/util/_sandbox/docker/compose.py +1 -1
- inspect_ai/util/_sandbox/docker/docker.py +92 -21
- inspect_ai/util/_sandbox/environment.py +33 -2
- inspect_ai/util/_sandbox/events.py +2 -2
- inspect_ai/util/_sandbox/service.py +13 -3
- {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.91.dist-info}/METADATA +6 -2
- inspect_ai-0.3.91.dist-info/RECORD +732 -0
- {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.91.dist-info}/WHEEL +1 -1
- inspect_ai/_view/www/src/App.tsx +0 -316
- inspect_ai/_view/www/src/samples/chat/MessageContent.module.css +0 -4
- inspect_ai/_view/www/src/samples/chat/MessageContents.module.css +0 -3
- inspect_ai/_view/www/src/samples/chat/tools/ToolCallView.module.css +0 -3
- inspect_ai/_view/www/src/samples/chat/tools/ToolInput.module.css +0 -14
- inspect_ai/_view/www/src/workspace/WorkSpace.tsx +0 -292
- inspect_ai/_view/www/src/workspace/sidebar/LogDirectoryTitleView.module.css +0 -5
- inspect_ai/_view/www/src/workspace/sidebar/LogDirectoryTitleView.tsx +0 -57
- inspect_ai/_view/www/src/workspace/tabs/JsonTab.tsx +0 -43
- inspect_ai-0.3.90.dist-info/RECORD +0 -705
- /inspect_ai/_view/www/src/{types → @types}/asciicinema-player.d.ts +0 -0
- /inspect_ai/_view/www/src/{types → @types}/jsondiffpatch.d.ts +0 -0
- /inspect_ai/_view/www/src/{types → @types}/markdown-it-katex.d.ts +0 -0
- /inspect_ai/_view/www/src/{types → @types}/prism.d.ts +0 -0
- /inspect_ai/_view/www/src/{appearance → app/appearance}/colors.ts +0 -0
- /inspect_ai/_view/www/src/{appearance → app/appearance}/fonts.ts +0 -0
- /inspect_ai/_view/www/src/{appearance → app/appearance}/styles.ts +0 -0
- /inspect_ai/_view/www/src/{metadata → app/content}/MetaDataGrid.tsx +0 -0
- /inspect_ai/_view/www/src/{metadata → app/content}/MetaDataView.module.css +0 -0
- /inspect_ai/_view/www/src/{metadata → app/content}/MetaDataView.tsx +0 -0
- /inspect_ai/_view/www/src/{metadata → app/content}/MetadataGrid.module.css +0 -0
- /inspect_ai/_view/www/src/{metadata → app/content}/RenderedContent.module.css +0 -0
- /inspect_ai/_view/www/src/{metadata → app/content}/types.ts +0 -0
- /inspect_ai/_view/www/src/{workspace/WorkSpaceView.module.css → app/log-view/LogView.module.css} +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/error/TaskErrorPanel.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ModelRolesView.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/Navbar.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/PrimaryBar.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ResultsPanel.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/RunningStatusPanel.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ScoreGrid.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/SecondaryBar.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/StatusPanel.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/StatusPanel.tsx +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/InfoTab.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/JsonTab.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/RunningNoSamples.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/RunningNoSamples.tsx +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/types.ts +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/utils.ts +0 -0
- /inspect_ai/_view/www/src/{plan → app/plan}/DatasetDetailView.module.css +0 -0
- /inspect_ai/_view/www/src/{plan → app/plan}/DetailStep.module.css +0 -0
- /inspect_ai/_view/www/src/{plan → app/plan}/ModelCard.module.css +0 -0
- /inspect_ai/_view/www/src/{plan → app/plan}/PlanDetailView.module.css +0 -0
- /inspect_ai/_view/www/src/{plan → app/plan}/ScorerDetailView.module.css +0 -0
- /inspect_ai/_view/www/src/{plan → app/plan}/ScorerDetailView.tsx +0 -0
- /inspect_ai/_view/www/src/{plan → app/plan}/SolverDetailView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/InlineSampleDisplay.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessageRow.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatViewVirtualList.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/BooleanScoreDescriptor.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/ObjectScoreDescriptor.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/PassFailScoreDescriptor.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/error/FlatSampleErrorView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/error/FlatSampleErrorView.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/error/SampleErrorView.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/error/error.ts +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleFooter.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleFooter.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleHeader.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleList.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleSeparator.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleSeparator.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/EpochFilter.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/EpochFilter.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SelectScorer.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SortFilter.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/SampleFilter.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/tokenize.ts +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScores.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresGrid.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/InfoEventView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/LoggerEventView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/SampleInitEventView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/SandboxEventView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/ScoreEventView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/SubtaskEventView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/ToolEventView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNav.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNav.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNavs.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNavs.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventPanel.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventProgressPanel.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventProgressPanel.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventRow.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventRow.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventSection.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventSection.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventTimingPanel.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateDiffView.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventView.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app}/sidebar/EvalStatus.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarLogEntry.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoreView.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoresView.module.css +0 -0
- /inspect_ai/_view/www/src/{usage → app/usage}/ModelUsagePanel.module.css +0 -0
- /inspect_ai/_view/www/src/{usage → app/usage}/TokenTable.module.css +0 -0
- /inspect_ai/_view/www/src/{usage → app/usage}/UsageCard.module.css +0 -0
- /inspect_ai/_view/www/src/{api → client/api}/api-shared.ts +0 -0
- /inspect_ai/_view/www/src/{api → client/api}/jsonrpc.ts +0 -0
- /inspect_ai/_view/www/src/{logfile → client/remote}/remoteZipFile.ts +0 -0
- {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.91.dist-info}/entry_points.txt +0 -0
- {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.91.dist-info}/licenses/LICENSE +0 -0
- {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.91.dist-info}/top_level.txt +0 -0
@@ -2,10 +2,11 @@ import base64
|
|
2
2
|
import errno
|
3
3
|
import json
|
4
4
|
import os
|
5
|
+
import shlex
|
5
6
|
import tempfile
|
6
7
|
from logging import getLogger
|
7
8
|
from pathlib import Path, PurePosixPath
|
8
|
-
from typing import Literal, Union, overload
|
9
|
+
from typing import Literal, NamedTuple, Union, overload
|
9
10
|
|
10
11
|
from typing_extensions import override
|
11
12
|
|
@@ -121,6 +122,37 @@ class DockerSandboxEnvironment(SandboxEnvironment):
|
|
121
122
|
await project_cleanup_shutdown(True)
|
122
123
|
raise ex
|
123
124
|
|
125
|
+
@override
|
126
|
+
@classmethod
|
127
|
+
async def task_init_environment(
|
128
|
+
cls, config: SandboxEnvironmentConfigType | None, metadata: dict[str, str]
|
129
|
+
) -> dict[str, str]:
|
130
|
+
# get interpolated environment variables and underlying config path and text
|
131
|
+
resolved = resolve_config_environment(config, metadata)
|
132
|
+
|
133
|
+
# don't even consider sample-specific environment if there are no sample metadata refs
|
134
|
+
if resolved and len(resolved.env) > 0:
|
135
|
+
# resolve images using our env vars
|
136
|
+
result = await subprocess(
|
137
|
+
["docker", "compose", "-f", resolved.config_file, "config", "--images"],
|
138
|
+
env=resolved.env,
|
139
|
+
)
|
140
|
+
if result.success:
|
141
|
+
# look through the images, if one of them doesn't apper in the the
|
142
|
+
# config text then this compose file requires its own sample specific
|
143
|
+
# environment for resolution
|
144
|
+
images = result.stdout.strip().splitlines()
|
145
|
+
for image in images:
|
146
|
+
if image not in resolved.config_text:
|
147
|
+
return resolved.env
|
148
|
+
else:
|
149
|
+
logger.warning(
|
150
|
+
f"Unexpected error reading compose file '{resolved.config_file}': {result.stderr}"
|
151
|
+
)
|
152
|
+
|
153
|
+
# no per-sample environment required
|
154
|
+
return {}
|
155
|
+
|
124
156
|
@override
|
125
157
|
@classmethod
|
126
158
|
async def sample_init(
|
@@ -130,17 +162,8 @@ class DockerSandboxEnvironment(SandboxEnvironment):
|
|
130
162
|
metadata: dict[str, str],
|
131
163
|
) -> dict[str, SandboxEnvironment]:
|
132
164
|
# create environment variables for sample metadata
|
133
|
-
|
134
|
-
if
|
135
|
-
# read the config file
|
136
|
-
with open(config, "r") as f:
|
137
|
-
config_text = f.read()
|
138
|
-
|
139
|
-
# only add metadata files if the key is in the file
|
140
|
-
for key, value in metadata.items():
|
141
|
-
key = f"SAMPLE_METADATA_{key.replace(' ', '_').upper()}"
|
142
|
-
if key in config_text:
|
143
|
-
env[key] = str(value)
|
165
|
+
resolved = resolve_config_environment(config, metadata)
|
166
|
+
env = resolved.env if resolved is not None else {}
|
144
167
|
|
145
168
|
# create project
|
146
169
|
from inspect_ai.log._samples import sample_active
|
@@ -154,6 +177,9 @@ class DockerSandboxEnvironment(SandboxEnvironment):
|
|
154
177
|
env=env,
|
155
178
|
)
|
156
179
|
|
180
|
+
# note that the project is running
|
181
|
+
project_startup(project)
|
182
|
+
|
157
183
|
try:
|
158
184
|
# enumerate the services that will be created
|
159
185
|
services = await compose_services(project)
|
@@ -171,9 +197,6 @@ class DockerSandboxEnvironment(SandboxEnvironment):
|
|
171
197
|
f"No services started.\nCompose up stderr: {result.stderr}"
|
172
198
|
)
|
173
199
|
|
174
|
-
# note that the project is running
|
175
|
-
project_startup(project)
|
176
|
-
|
177
200
|
# create sandbox environments for all running services
|
178
201
|
default_service: str | None = None
|
179
202
|
environments: dict[str, SandboxEnvironment] = {}
|
@@ -407,7 +430,7 @@ class DockerSandboxEnvironment(SandboxEnvironment):
|
|
407
430
|
return f.read()
|
408
431
|
|
409
432
|
@override
|
410
|
-
async def connection(self) -> SandboxConnection:
|
433
|
+
async def connection(self, *, user: str | None = None) -> SandboxConnection:
|
411
434
|
# find container for service
|
412
435
|
services = await compose_ps(project=self._project)
|
413
436
|
container = next(
|
@@ -419,15 +442,33 @@ class DockerSandboxEnvironment(SandboxEnvironment):
|
|
419
442
|
None,
|
420
443
|
)
|
421
444
|
|
445
|
+
# vscode doesn't support attaching to a container as a specific user,
|
446
|
+
# so don't include the vscode command if a user is specified
|
447
|
+
vscode_command = (
|
448
|
+
[
|
449
|
+
"remote-containers.attachToRunningContainer",
|
450
|
+
container,
|
451
|
+
]
|
452
|
+
if user is None
|
453
|
+
else None
|
454
|
+
)
|
455
|
+
|
422
456
|
# return container connection
|
423
457
|
if container:
|
424
458
|
return SandboxConnection(
|
425
459
|
type="docker",
|
426
|
-
command=
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
460
|
+
command=shlex.join(
|
461
|
+
[
|
462
|
+
"docker",
|
463
|
+
"exec",
|
464
|
+
"-it",
|
465
|
+
*(["--user", user] if user else []),
|
466
|
+
container,
|
467
|
+
"bash",
|
468
|
+
"-l",
|
469
|
+
]
|
470
|
+
),
|
471
|
+
vscode_command=vscode_command,
|
431
472
|
ports=await get_ports_info(container),
|
432
473
|
container=container,
|
433
474
|
)
|
@@ -517,3 +558,33 @@ def parse_docker_inspect_ports(json_str: str) -> list[PortMapping] | None:
|
|
517
558
|
)
|
518
559
|
port_mappings.append(port_mapping)
|
519
560
|
return port_mappings if port_mappings else None
|
561
|
+
|
562
|
+
|
563
|
+
class ConfigEnvironment(NamedTuple):
|
564
|
+
config_file: str
|
565
|
+
config_text: str
|
566
|
+
env: dict[str, str]
|
567
|
+
|
568
|
+
|
569
|
+
def resolve_config_environment(
|
570
|
+
config: SandboxEnvironmentConfigType | None,
|
571
|
+
metadata: dict[str, str],
|
572
|
+
) -> ConfigEnvironment | None:
|
573
|
+
# create environment variables for sample metadata
|
574
|
+
if isinstance(config, str) and Path(config).exists():
|
575
|
+
# read the config file
|
576
|
+
config_file = config
|
577
|
+
with open(config, "r") as f:
|
578
|
+
config_text = f.read()
|
579
|
+
|
580
|
+
# only add metadata files if the key is in the file
|
581
|
+
env: dict[str, str] = {}
|
582
|
+
for key, value in metadata.items():
|
583
|
+
key = f"SAMPLE_METADATA_{key.replace(' ', '_').upper()}"
|
584
|
+
if key in config_text:
|
585
|
+
env[key] = str(value)
|
586
|
+
|
587
|
+
# return resolved
|
588
|
+
return ConfigEnvironment(config_file, config_text, env)
|
589
|
+
else:
|
590
|
+
return None
|
@@ -27,6 +27,10 @@ logger = logging.getLogger(__name__)
|
|
27
27
|
ST = TypeVar("ST", bound="SandboxEnvironment")
|
28
28
|
|
29
29
|
TaskInit = Callable[[str, Union["SandboxEnvironmentConfigType", None]], Awaitable[None]]
|
30
|
+
TaskInitEnvironment = Callable[
|
31
|
+
[Union["SandboxEnvironmentConfigType", None], dict[str, str]],
|
32
|
+
Awaitable[dict[str, str]],
|
33
|
+
]
|
30
34
|
TaskCleanup = Callable[
|
31
35
|
[str, Union["SandboxEnvironmentConfigType", None], bool], Awaitable[None]
|
32
36
|
]
|
@@ -187,11 +191,14 @@ class SandboxEnvironment(abc.ABC):
|
|
187
191
|
"""
|
188
192
|
...
|
189
193
|
|
190
|
-
async def connection(self) -> SandboxConnection:
|
194
|
+
async def connection(self, *, user: str | None = None) -> SandboxConnection:
|
191
195
|
"""Information required to connect to sandbox environment.
|
192
196
|
|
197
|
+
Args:
|
198
|
+
user: User to login as.
|
199
|
+
|
193
200
|
Returns:
|
194
|
-
SandboxConnection: connection information
|
201
|
+
SandboxConnection: connection information.
|
195
202
|
|
196
203
|
Raises:
|
197
204
|
NotImplementedError: For sandboxes that don't provide connections
|
@@ -235,6 +242,30 @@ class SandboxEnvironment(abc.ABC):
|
|
235
242
|
"""
|
236
243
|
pass
|
237
244
|
|
245
|
+
@classmethod
|
246
|
+
async def task_init_environment(
|
247
|
+
cls, config: SandboxEnvironmentConfigType | None, metadata: dict[str, str]
|
248
|
+
) -> dict[str, str]:
|
249
|
+
"""Called at task startup to identify environment variables required by task_init for a sample.
|
250
|
+
|
251
|
+
Return 1 or more environment variables to request a dedicated call to task_init
|
252
|
+
for samples that have exactly these environment variables (by default there is
|
253
|
+
only one call to task_init for all of the samples in a task if they share a
|
254
|
+
sandbox configuration).
|
255
|
+
|
256
|
+
This is useful for situations where config files are dynamic (e.g. through
|
257
|
+
sample metadata variable interpolation) and end up yielding different images
|
258
|
+
that need their own init (e.g. 'docker pull').
|
259
|
+
|
260
|
+
Args:
|
261
|
+
config: Implementation defined configuration (optional).
|
262
|
+
metadata: metadata: Sample `metadata` field
|
263
|
+
|
264
|
+
Returns:
|
265
|
+
Environment variables to set for call to task_init.
|
266
|
+
"""
|
267
|
+
return {}
|
268
|
+
|
238
269
|
@classmethod
|
239
270
|
async def sample_init(
|
240
271
|
cls,
|
@@ -133,8 +133,8 @@ class SandboxEnvironmentProxy(SandboxEnvironment):
|
|
133
133
|
return output
|
134
134
|
|
135
135
|
@override
|
136
|
-
async def connection(self) -> SandboxConnection:
|
137
|
-
return await self._sandbox.connection()
|
136
|
+
async def connection(self, *, user: str | None = None) -> SandboxConnection:
|
137
|
+
return await self._sandbox.connection(user=user)
|
138
138
|
|
139
139
|
@override
|
140
140
|
def as_type(self, sandbox_cls: Type[ST]) -> ST:
|
@@ -40,6 +40,7 @@ async def sandbox_service(
|
|
40
40
|
methods: list[SandboxServiceMethod] | dict[str, SandboxServiceMethod],
|
41
41
|
until: Callable[[], bool],
|
42
42
|
sandbox: SandboxEnvironment,
|
43
|
+
user: str | None = None,
|
43
44
|
) -> None:
|
44
45
|
"""Run a service that is callable from within a sandbox.
|
45
46
|
|
@@ -49,9 +50,11 @@ async def sandbox_service(
|
|
49
50
|
until (Callable[[], bool]): Function used to check whether
|
50
51
|
the service should stop.
|
51
52
|
sandbox (SandboxEnvironment): Sandbox to publish service to.
|
53
|
+
user (str | None): User to login as. Defaults to the sandbox environment's
|
54
|
+
default user.
|
52
55
|
"""
|
53
56
|
# setup and start service
|
54
|
-
service = SandboxService(name, sandbox)
|
57
|
+
service = SandboxService(name, sandbox, user)
|
55
58
|
if isinstance(methods, list):
|
56
59
|
methods = {v.__name__: v for v in methods}
|
57
60
|
for name, method in methods.items():
|
@@ -91,15 +94,20 @@ class SandboxService:
|
|
91
94
|
```
|
92
95
|
"""
|
93
96
|
|
94
|
-
def __init__(
|
97
|
+
def __init__(
|
98
|
+
self, name: str, sandbox: SandboxEnvironment, user: str | None = None
|
99
|
+
) -> None:
|
95
100
|
"""Create a SandboxService.
|
96
101
|
|
97
102
|
Args:
|
98
103
|
name (str): Service name
|
99
104
|
sandbox (SandboxEnvironment): Sandbox to publish service to.
|
105
|
+
user (str | None): User to login as. Defaults to the sandbox environment's
|
106
|
+
default user.
|
100
107
|
"""
|
101
108
|
self._name = name
|
102
109
|
self._sandbox = sandbox
|
110
|
+
self._user = user
|
103
111
|
self._service_dir = PurePosixPath(SERVICES_DIR, self._name)
|
104
112
|
self._methods: dict[str, SandboxServiceMethod] = {}
|
105
113
|
self._requests_dir: str = ""
|
@@ -250,7 +258,9 @@ class SandboxService:
|
|
250
258
|
|
251
259
|
async def _exec(self, cmd: list[str], input: str | None = None) -> ExecResult[str]:
|
252
260
|
try:
|
253
|
-
return await self._sandbox.exec(
|
261
|
+
return await self._sandbox.exec(
|
262
|
+
cmd, user=self._user, input=input, timeout=30
|
263
|
+
)
|
254
264
|
except TimeoutError:
|
255
265
|
raise RuntimeError(
|
256
266
|
f"Timed out executing command {' '.join(cmd)} in sandbox"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: inspect_ai
|
3
|
-
Version: 0.3.
|
3
|
+
Version: 0.3.91
|
4
4
|
Summary: Framework for large language model evaluations
|
5
5
|
Author: UK AI Security Institute
|
6
6
|
License: MIT License
|
@@ -27,7 +27,7 @@ Requires-Dist: click>=8.1.3
|
|
27
27
|
Requires-Dist: debugpy
|
28
28
|
Requires-Dist: docstring-parser>=0.16
|
29
29
|
Requires-Dist: exceptiongroup>=1.0.2; python_version < "3.11"
|
30
|
-
Requires-Dist: fsspec<=
|
30
|
+
Requires-Dist: fsspec<=2025.3.0,>=2023.1.0
|
31
31
|
Requires-Dist: httpx
|
32
32
|
Requires-Dist: ijson>=3.2.0
|
33
33
|
Requires-Dist: jsonlines>=3.0.0
|
@@ -60,6 +60,7 @@ Requires-Dist: griffe; extra == "dev"
|
|
60
60
|
Requires-Dist: groq; extra == "dev"
|
61
61
|
Requires-Dist: ipython; extra == "dev"
|
62
62
|
Requires-Dist: markdown; extra == "dev"
|
63
|
+
Requires-Dist: mcp; extra == "dev"
|
63
64
|
Requires-Dist: mistralai; extra == "dev"
|
64
65
|
Requires-Dist: moto[server]; extra == "dev"
|
65
66
|
Requires-Dist: mypy; extra == "dev"
|
@@ -88,6 +89,9 @@ Requires-Dist: types-jsonschema; extra == "dev"
|
|
88
89
|
Requires-Dist: types-protobuf; extra == "dev"
|
89
90
|
Requires-Dist: types-psutil; extra == "dev"
|
90
91
|
Requires-Dist: types-python-dateutil; extra == "dev"
|
92
|
+
Provides-Extra: dev-mcp-tests
|
93
|
+
Requires-Dist: mcp-server-fetch; extra == "dev-mcp-tests"
|
94
|
+
Requires-Dist: mcp_server_git; extra == "dev-mcp-tests"
|
91
95
|
Provides-Extra: doc
|
92
96
|
Requires-Dist: quarto-cli==1.5.57; extra == "doc"
|
93
97
|
Requires-Dist: jupyter; extra == "doc"
|