diff --git a/.envrc b/.envrc
index 3550a30f2..38cef425f 100644
--- a/.envrc
+++ b/.envrc
@@ -1 +1,8 @@
use flake
+
+# creates .venv if doesn't exist and loads its environment
+export VIRTUAL_ENV=".venv"
+if ! [ -d "./$VIRTUAL_ENV" ]; then
+ uv venv
+fi
+layout python
diff --git a/.idea/exo-v2.iml b/.idea/exo-v2.iml
deleted file mode 100644
index aa638174c..000000000
--- a/.idea/exo-v2.iml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/externalDependencies.xml b/.idea/externalDependencies.xml
index 60785b21c..e56fc329f 100644
--- a/.idea/externalDependencies.xml
+++ b/.idea/externalDependencies.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
deleted file mode 100644
index 12df2a84d..000000000
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 4c4cf56c1..124c79a18 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -4,7 +4,4 @@
-
-
-
\ No newline at end of file
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index 3dfc2a755..b2e0978e1 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -1,7 +1,8 @@
{
"recommendations": [
"detachhead.basedpyright",
- "ms-python.python"
+ "ms-python.python",
+ "jnoortheen.nix-ide"
],
"unwantedRecommendations": [
"ms-python.vscode-pylance",
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 31682d359..19dfab4d4 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,3 +1,32 @@
{
- "basedpyright.importStrategy": "fromEnvironment"
+ "files.associations": {
+ "*.nix": "nix",
+ },
+ "nix.enableLanguageServer": true,
+ "nix.serverPath": "nixd",
+ "nix.serverSettings": {
+ "nixd": {
+ "formatting": {
+ "command": ["nixpkgs-fmt"]
+ },
+ "nixpkgs": {
+ "expr": "(builtins.getFlake \"path:${workspaceFolder}\").currentSystem.config._module.args.pkgs"
+ },
+ "options": {
+ "flake-parts": {
+ "expr": "(builtins.getFlake \"path:${workspaceFolder}\").debug.options"
+ },
+ "flake-parts-perSystem": {
+ "expr": "(builtins.getFlake \"path:${workspaceFolder}\").currentSystem.options"
+ }
+ }
+ }
+ },
+ "[nix]": {
+ "editor.defaultFormatter": "jnoortheen.nix-ide"
+ },
+
+ "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
+ "basedpyright.analysis.configFilePath": "${workspaceFolder}/pyproject.toml",
+ "basedpyright.importStrategy": "fromEnvironment",
}
\ No newline at end of file
diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json
index 341dce918..cf8ef1dcd 100644
--- a/dashboard/package-lock.json
+++ b/dashboard/package-lock.json
@@ -1116,6 +1116,7 @@
"integrity": "sha512-oH8tXw7EZnie8FdOWYrF7Yn4IKrqTFHhXvl8YxXxbKwTMcD/5NNCryUSEXRk2ZR4ojnub0P8rNrsVGHXWqIDtA==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@standard-schema/spec": "^1.0.0",
"@sveltejs/acorn-typescript": "^1.0.5",
@@ -1155,6 +1156,7 @@
"integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@sveltejs/vite-plugin-svelte-inspector": "^4.0.1",
"debug": "^4.4.1",
@@ -1771,6 +1773,7 @@
"integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"undici-types": "~6.21.0"
}
@@ -1780,6 +1783,7 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"license": "MIT",
+ "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -2192,6 +2196,7 @@
"integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
"dev": true,
"license": "ISC",
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -2919,6 +2924,7 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=12"
},
@@ -2961,6 +2967,7 @@
"integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
"dev": true,
"license": "MIT",
+ "peer": true,
"bin": {
"prettier": "bin/prettier.cjs"
},
@@ -3133,6 +3140,7 @@
"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.45.3.tgz",
"integrity": "sha512-ngKXNhNvwPzF43QqEhDOue7TQTrG09em1sd4HBxVF0Wr2gopAmdEWan+rgbdgK4fhBtSOTJO8bYU4chUG7VXZQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@jridgewell/remapping": "^2.3.4",
"@jridgewell/sourcemap-codec": "^1.5.0",
@@ -3277,6 +3285,7 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
+ "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -3298,6 +3307,7 @@
"integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"esbuild": "^0.25.0",
"fdir": "^6.4.4",
diff --git a/flake.nix b/flake.nix
index 0220d44d0..75f3098e2 100644
--- a/flake.nix
+++ b/flake.nix
@@ -55,8 +55,7 @@
extra-substituters = "https://exo.cachix.org";
};
- outputs =
- inputs:
+ outputs = inputs:
inputs.flake-parts.lib.mkFlake { inherit inputs; } {
systems = [
"x86_64-linux"
@@ -71,8 +70,9 @@
./python/parts.nix
];
- perSystem =
- { config, self', pkgs, lib, system, ... }:
+ debug = true; # Enable options autocompletion
+
+ perSystem = { config, self', pkgs, lib, system, ... }:
let
# Use pinned nixpkgs for swift-format (swift is broken on x86_64-linux in newer nixpkgs)
pkgsSwift = import inputs.nixpkgs-swift { inherit system; };
@@ -149,7 +149,7 @@
config.treefmt.build.wrapper
# PYTHON
- python313
+ self'.packages.python
uv
ruff
basedpyright
@@ -159,6 +159,7 @@
maturin
# NIX
+ nixd
nixpkgs-fmt
# SVELTE
@@ -178,7 +179,7 @@
OPENSSL_NO_VENDOR = "1";
shellHook = ''
- export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${python313}/lib"
+ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${self'.packages.python}/lib"
${lib.optionalString stdenv.isLinux ''
export LD_LIBRARY_PATH="${openssl.out}/lib:$LD_LIBRARY_PATH"
''}
diff --git a/python/parts.nix b/python/parts.nix
index d1d1b6d6d..913d8ca37 100644
--- a/python/parts.nix
+++ b/python/parts.nix
@@ -181,6 +181,9 @@
# Test environment for running pytest outside of Nix sandbox (needs GPU access)
exo-test-env = testVenv;
} // {
+
+ inherit python;
+
exo-bench = mkBenchScript "exo-bench" (inputs.self + /bench/exo_bench.py);
exo-eval = mkBenchScript "exo-eval" (inputs.self + /bench/exo_eval.py);
exo-eval-tool-calls = mkBenchScript "exo-eval-tool-calls" (inputs.self + /bench/eval_tool_calls.py);