diff --git a/adapter/config/loader.py b/adapter/config/loader.py index d45148a..b3b47c3 100644 --- a/adapter/config/loader.py +++ b/adapter/config/loader.py @@ -324,9 +324,24 @@ def _load_sandbox_config( env, 'APP_SANDBOX_VOLUME_MOUNT_PATH', ), + extra_env=_load_sandbox_extra_env(section), ) +def _load_sandbox_extra_env(section: Mapping[str, object]) -> dict[str, str]: + raw = section.get('env') + if raw is None: + return {} + if not isinstance(raw, dict): + raise ConfigError('invalid sandbox.env') + result: dict[str, str] = {} + for key, value in raw.items(): + if not isinstance(key, str): + raise ConfigError('invalid sandbox.env key') + result[key] = str(value) + return result + + def _load_otel_config( data: Mapping[str, object], env: Mapping[str, str], diff --git a/adapter/config/model.py b/adapter/config/model.py index 8340e37..594a1ca 100644 --- a/adapter/config/model.py +++ b/adapter/config/model.py @@ -59,6 +59,7 @@ class SandboxConfig: dependencies_mount_path: str lambda_tools_mount_path: str volume_mount_path: str + extra_env: dict[str, str] @dataclass(frozen=True, slots=True) diff --git a/adapter/docker/runtime.py b/adapter/docker/runtime.py index d9a6ec9..5be188f 100644 --- a/adapter/docker/runtime.py +++ b/adapter/docker/runtime.py @@ -69,7 +69,7 @@ class DockerSandboxRuntime(SandboxRuntime): container = self._client.containers.run( self._config.image, detach=True, - environment={'AGENT_ID': agent_id}, + environment={**self._config.extra_env, 'AGENT_ID': agent_id}, labels=self._labels( session_id, chat_id, diff --git a/config/app.yaml b/config/app.yaml index 6211ec2..77058af 100644 --- a/config/app.yaml +++ b/config/app.yaml @@ -40,6 +40,7 @@ sandbox: dependencies_mount_path: /opt/dependencies lambda_tools_mount_path: /opt/lambda-tools volume_mount_path: /workspace/volume + env: {} security: token_header: X-API-Token diff --git a/config/docker-compose.yml b/config/docker-compose.yml index 69a4e98..8a76718 100644 --- a/config/docker-compose.yml +++ b/config/docker-compose.yml @@ -40,6 +40,14 @@ sandbox: dependencies_mount_path: /opt/dependencies lambda_tools_mount_path: /opt/lambda-tools volume_mount_path: /workspace/volume + env: + LANGFUSE_PUBLIC_KEY: pk-lf- + LANGFUSE_SECRET_KEY: sk-lf- + LANGFUSE_HOST: http://localhost:5000 + PROVIDER_URL: http://host.docker.internal:8000/v1 + PROVIDER_API_KEY: "1234" + PROVIDER_MODEL: supergemma4-26b-uncensored-mlx-4bit-v2 + COMPOSIO_API_KEY: ck_r-3c8ClArmcHuSzK5TYu security: token_header: X-API-Token diff --git a/test/test_create_http.py b/test/test_create_http.py index c812dd1..f9d6382 100644 --- a/test/test_create_http.py +++ b/test/test_create_http.py @@ -347,6 +347,7 @@ def build_config() -> AppConfig: dependencies_mount_path='/workspace/dependencies', lambda_tools_mount_path='/workspace/lambda-tools', volume_mount_path='/workspace/volume', + extra_env={}, ), security=SecurityConfig( token_header='Authorization', diff --git a/test/test_docker_runtime.py b/test/test_docker_runtime.py index 743ccb4..4eaff61 100644 --- a/test/test_docker_runtime.py +++ b/test/test_docker_runtime.py @@ -315,6 +315,7 @@ def build_config(tmp_path: Path) -> SandboxConfig: dependencies_mount_path='/workspace/dependencies', lambda_tools_mount_path='/workspace/lambda-tools', volume_mount_path='/workspace/volume', + extra_env={}, )