Sunday, November 1, 2026

How CSA addresses MCP Security

 The Cloud Security Alliance (CSA) plays a foundational role in establishing the security infrastructure, threat intelligence, and governance frameworks for the Model Context Protocol (MCP). Recognizing MCP as a critical layer in the "agentic AI control plane," the CSA bridges the gap between rapid open-source adoption and enterprise risk management. [1, 2, 3]

The CSA actively addresses MCP security through several core pillars:
1. The MCP Security Resource Center
The CSA launched the dedicated Model Context Protocol Security Project as an industry-first hub designed specifically to secure AI-to-tool connectivity. This hub coordinates community efforts to research threats, establish standard toolkits, and build operational guardrails. [1, 2]
2. Threat Frameworks & Security Standards
The CSA maps out explicit risk mitigation strategies by developing frameworks that track specific vulnerabilities across the agentic landscape: [1]
  • Risk Frameworks: The project documents core architectural vulnerabilities, notably publishing the Top 10 MCP Server Security Risks and Top 10 MCP Client Security Risks. [1]
  • The MCP Security Baseline: The CSA produces standardized checklists (commencing with baseline drafts mapped to existing structures like the Cloud Controls Matrix (CCM), Consensus Assessments Initiative Questionnaire (CAIQ), and the AI Organizational Management framework). [1, 2, 3]
3. Community Intelligence & Ecosystem Auditing
To handle vulnerabilities transparently, the CSA manages public databases tracking the security state of the ecosystem: [1]
  • vulnerability-db: A centralized public repository tracking known vulnerabilities and security advisories specific to MCP integrations.
  • audit-db: A public record tracking compliance and independent evaluation results of observable MCP components. [1]
4. Zero Trust Advocacy and Governance
In response to structural concerns—such as optional authorization parameters in the native MCP specification—the CSA explicitly mandates that enterprise deployments treat authentication and authorization as strict baseline requirements, rather than operational enhancements. [1]
Furthermore, the CSA integrates these controls into the STAR (Security Trust Assurance and Risk) program. This allows organizations and cloud vendors offering MCP-enabled services to formally evaluate and demonstrate compliance regarding sandboxing, tool supply-chain integrity, and se

Databricks Unity data catalogue

 Databricks Unity Catalog is the unified governance layer for data and AI across the Databricks Lakehouse platform. It provides a centralized console to manage access permissions, track data lineage, discover assets, and audit activity across multiple Databricks workspaces and cloud environments. [1, 2, 3, 4, 5]

Unlike traditional workspace-level governance (like the legacy Hive metastore), Unity Catalog operates at the account level, meaning policies and metadata are defined once globally and enforced everywhere. [4, 5, 6]

1. The Hierarchical Object Model

Unity Catalog structures data and AI assets using a robust three-level namespace to organize permissions and simplify data discovery. [1, 6]
  • Metastore: The top-level container of metadata. It stores security principals (users/groups) and access permissions. It is deployed at the cloud region level and can be linked across multiple workspaces. [3, 5, 7]
  • Catalog (catalog): The first layer of the object hierarchy, typically used to separate environments (e.g., prod, dev) or business units (e.g., finance, marketing). [8]
  • Schema (schema): Also known as a database, this is the second layer. It groups related data objects. [8]
  • Objects (object): The leaf level containing the actual operational assets. This includes structural Tables and Views, unstructured Volumes (files), ML Models, and user-defined Functions. [1, 3, 9]

2. Core Capabilities & Features

CapabilityDescription
Centralized Identity & AccessManage users, groups, and service principals centrally at the account level. Permissions flow downward (inheriting from Catalog → Schema → Table).
ANSI SQL GovernanceGrant or revoke permissions using standard SQL queries (e.g., GRANT SELECT ON TABLE...) or visually via the Catalog Explorer UI.
Automated Data LineageCaptures column-level data transformations and flow in real time. Helpful for impact analysis before deleting tables and debugging broken dashboards.
Advanced Security ControlsNative row-level filtering (hiding rows depending on who is looking) and column-level masking (hiding sensitive PII data like credit card numbers).
Lakehouse FederationQuery and govern data sitting outside of Databricks (e.g., in Snowflake, MySQL, PostgreSQL, or SAP systems) without moving or duplicating the underlying data.
Delta SharingAn open protocol integrated natively to securely share live data assets and AI models with external organizations without data duplication.
Comprehensive AuditingImmutable, queryable log tables that record exactly who did what, when, and from where for security compliance.

3. Managed vs. External Storage

When working with tables and volumes inside Unity Catalog, assets are split into two storage types:
  • Managed Storage: Databricks fully manages both the lifecycle and the physical file placement in your cloud storage bucket. If you drop a managed table, the underlying files are deleted automatically. [1, 8]
  • External Storage: You control the directory path where the data is stored using External Locations and Storage Credentials managed by Unity Catalog. If you drop an external table, only the metadata definition is removed; your cloud files remain safe. [1, 7]

Next Steps

If you are planning to roll out or work with Unity Catalog, let me know if you want to explore:
  • How to configure admin roles (Account Admins vs. Metastore Admins)
  • Best practices for designing your catalog and schema layout
  • Writing SQL scripts for row-level security and column masking [4, 5, 6, 8, 10]

Saturday, October 31, 2026

What is LookML

 LookML (Looker Modeling Language) is Looker's data modeling language used to define dimensions, aggregates, calculations, and table relationships in a SQL database. [1]

It acts as a semantic layer between your raw database (such as BigQuery, Snowflake, or Redshift) and business users. When a user builds a query in Looker, LookML translates those interactions into optimized SQL queries automatically. [2, 3]

Core Concepts and Components

  • DRY Style (Don't Repeat Yourself): You write complex SQL logic and business rules once in LookML, and Looker reuses the code across multiple reports to prevent duplication and calculation errors.
  • Projects: A collection of LookML files version-controlled together via a Git repository.
  • Models (.model.lkml): Files that define which database tables are used and how they join together.
  • Explores: User-friendly analysis playgrounds built from pre-joined tables where business users can explore data without writing code.
  • Views (.view.lkml): Files that map to database tables and define the structure.
  • Dimensions: Raw data fields or attributes (e.g., customer name, product ID, date).
  • Measures: Calculated or aggregated values based on dimensions (e.g., total sales, average order value, count). [1, 2, 3, 4, 5]

Why LookML is Used

  • Single Source of Truth: Establishes consistent definitions for metrics (like "active user" or "revenue") so all teams pull the same numbers. [6]
  • Version Control: Integrates with Git so changes can be tracked, reviewed, tested, and rolled back safely. [3, 5]
  • Empowers Business Users: Allows non-technical users to query data via simple point-and-click interfaces while abstracting complex SQL scaffolding. [1, 3]
Learn more about building and structuring models in the official Google Cloud Looker Documentation. [1]
Would you like to see a basic code example of a LookML view file and model file, or do you want to learn how Git version control works inside Looker?

Friday, October 30, 2026

LiteLLM Gateway – Custom LLM Integration with JWT Authentication

 1. Objective

Configure a LiteLLM Gateway to access a custom corporate LLM that requires two sequential operations:

  1. Authentication: Call an authentication endpoint using credentials to retrieve a JWT access token.

  2. Inference: Use the retrieved token as a Bearer token when calling an OpenAI-compatible LLM endpoint.

The solution should support token caching, automatic refresh, concurrent requests, error handling and multiple models.

The calling application should continue using the standard LangChain ChatOpenAI class without implementing the JWT authentication logic.

2. Target architecture

Recommended implementation: Deploy a lightweight JWT-aware adapter behind LiteLLM. LiteLLM handles public model aliases and routing; the adapter handles corporate authentication and forwards OpenAI-compatible requests.

This avoids modifying LiteLLM internals and allows the adapter to be tested independently.

3. Project structure

Use the following files:

corporate-llm-gateway/
├── docker-compose.yml
├── .env
├── litellm/
│   └── config.yaml
└── adapter/
    ├── Dockerfile
    ├── requirements.txt
    └── app.py

4. Implement the JWT-aware adapter

The adapter exposes an OpenAI-compatible /v1/chat/completions endpoint. It authenticates with the corporate identity service, caches the access token and forwards inference requests.

This example assumes OAuth 2.0 Client Credentials and a corporate API that already accepts OpenAI-compatible request and response bodies.

adapter/requirements.txt

fastapi
uvicorn[standard]
httpx

adapter/app.py

import asyncio        return token@app.get("/healthz")async def healthz():    return {"status": "ok"}@app.post("/v1/chat/completions")async def chat_completions(request: Request):    if request.headers.get("authorization") != f"Bearer {ADAPTER_KEY}":        raise HTTPException(status_code=401, detail="Unauthorized")    payload = await request.body()    client = request.app.state.http    try:        access_token = await get_token(client)        headers = {            "Authorization": f"Bearer {access_token}",            "Content-Type": "application/json",        }        # A streaming HTTP request also works for normal JSON responses.        upstream_request = client.build_request(            "POST",            CORPORATE_LLM_URL,            content=payload,            headers=headers,        )        upstream = await client.send(            upstream_request,            stream=True,        )        if upstream.status_code == 401:            await upstream.aclose()            access_token = await get_token(                client, force_refresh=True            )            headers["Authorization"] = f"Bearer {access_token}"            upstream_request = client.build_request(                "POST",                CORPORATE_LLM_URL,                content=payload,                headers=headers,            )            upstream = await client.send(                upstream_request,                stream=True,            )        if upstream.status_code >= 400:            status = upstream.status_code            await upstream.aclose()            # Avoid exposing corporate error bodies containing            # sensitive information.            return Response(                content='{"error":"Upstream LLM request failed"}',                status_code=status,                media_type="application/json",            )        content_type = upstream.headers.get(            "content-type", "application/json"        )

This is a functional reference implementation for local integration testing, not a fully hardened production adapter.

It supports normal chat responses and streaming response bodies. It also refreshes the token before expiry and retries once when the upstream rejects an expired token.

For production, add per-request correlation IDs, safe structured logging, metrics, controlled retry policies and explicit cancellation handling. If the authentication endpoint returns a JWT without expires_in, adapt expiry handling to the identity provider's documented contract rather than assuming the default lifetime.

5. Configure LiteLLM

LiteLLM can route a model to an OpenAI-compatible endpoint using the openai/ provider prefix and api_base.

liteLLM
+1

litellm/config.yaml

model_list:
  - model_name: corporate-llm
    litellm_params:
      model: openai/corporate-model
      api_base: http://jwt-adapter:8000/v1
      api_key: os.environ/ADAPTER_KEY

general_settings:
  master_key: os.environ/LITELLM_MASTER_KEY

There are two distinct credentials:

  • LITELLM_MASTER_KEY: Used by your LangChain application to authenticate with LiteLLM.

  • ADAPTER_KEY: Used by LiteLLM to authenticate with the internal adapter.

The adapter obtains the corporate JWT using CLIENT_ID and CLIENT_SECRET. Neither the JWT nor the corporate credentials need to be exposed to your LangChain application.

6. Docker Compose deployment

adapter/Dockerfile

FROM python:3.12-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .

CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]

docker-compose.yml

services:
  jwt-adapter:
    build: ./adapter
    environment:
      TOKEN_URL: ${TOKEN_URL}
      CLIENT_ID: ${CLIENT_ID}
      CLIENT_SECRET: ${CLIENT_SECRET}
      OAUTH_SCOPE: ${OAUTH_SCOPE:-}
      CORPORATE_LLM_URL: ${CORPORATE_LLM_URL}
      ADAPTER_KEY: ${ADAPTER_KEY}
    expose:
      - "8000"
    restart: unless-stopped

  litellm:
    image: docker.litellm.ai/berriai/litellm:latest
    ports:
      - "127.0.0.1:4000:4000"
    volumes:
      - ./litellm/config.yaml:/app/config.yaml:ro
    environment:
      LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY}
      ADAPTER_KEY: ${ADAPTER_KEY}
    command:
      - "--config"
      - "/app/config.yaml"
      - "--port"
      - "4000"
    depends_on:
      - jwt-adapter
    restart: unless-stopped

.env

TOKEN_URL=https://auth.company.com/oauth2/token
CLIENT_ID=your-client-id
CLIENT_SECRET=your-client-secret
OAUTH_SCOPE=llm.invoke

CORPORATE_LLM_URL=https://llm.company.com/v1/chat/completions

ADAPTER_KEY=replace-with-generated-internal-secret
LITELLM_MASTER_KEY=sk-replace-with-generated-gateway-key

Use independently generated high-entropy secrets for both keys. Keep .env out of version control and restrict its file permissions. In production, pin dependency versions and the LiteLLM container image.

Start the services:

docker compose up -d --build

The gateway is bound to VM loopback for local testing. If the application runs on another VM, expose LiteLLM through a secured HTTPS reverse proxy rather than publishing port 4000 openly.

7. Test using LangChain ChatOpenAI

Your application does not need to know about the JWT authentication process.

import osfrom langchain_openai import ChatOpenAIllm = ChatOpenAI(    model="corporate-llm",    base_url="http://localhost:4000/v1",    api_key=os.environ["LITELLM_MASTER_KEY"],    temperature=0.2,    timeout=120,)response = llm.invoke(    "Explain why a BGP session can remain in Idle state.")print(response.content)

For streaming:

for chunk in llm.stream(    "Explain Kubernetes pod networking."):    print(chunk.content, end="", flush=True)

Request processing sequence

  1. LangChain sends a request to LiteLLM using its gateway key.

  2. LiteLLM resolves the corporate-llm model alias and forwards the request to the JWT adapter.

  3. The adapter checks its token cache. If necessary, it calls the corporate authentication endpoint.

  4. The adapter sends the OpenAI-compatible request with Authorization: Bearer <JWT>.

  5. The corporate LLM returns its response through the adapter and LiteLLM to LangChain.

Subsequent requests reuse the cached token until refresh is required.

8. Production considerations

Area

Recommended implementation

Token management

Cache and refresh before expiry

Concurrent requests

Prevent simultaneous refreshes

Authentication failures

Refresh once on upstream HTTP 401

Credentials

Kubernetes Secrets or external secret manager

Network security

HTTPS, internal-only adapter access

High availability

Token cache per replica or shared token manager

Streaming

Preserve SSE chunks and cancellation

Observability

Log latency, errors and token refresh events without exposing credentials

Model support

Verify tool calling, structured output and streaming

Model routing

Stable LiteLLM aliases mapped to corporate model IDs

Implementation detail: The example forwards the JSON request unchanged. Therefore, the corporate API must accept the model ID corporate-model and the standard OpenAI chat-completion payload. If the corporate API uses a different model ID or expects additional headers, implement that translation in the adapter.

Also, the example covers chat completions only. Embeddings, the Responses API and other endpoints require separate adapter routes.

9. Instructions for your coding agent

Task: Implement JWT-authenticated Corporate LLM Integration with LiteLLM

Implement a reusable integration that enables LiteLLM Gateway to route inference requests to a corporate OpenAI-compatible LLM endpoint requiring JWT authentication.

Architecture

LangChain / LangGraph → LiteLLM Proxy → JWT Authentication Adapter → Corporate LLM API.

Functional requirements

  1. Configure LiteLLM with a custom model alias and OpenAI-compatible upstream endpoint.

  2. Implement a Python FastAPI adapter that obtains JWT access tokens from a configurable authentication endpoint.

  3. Support OAuth 2.0 Client Credentials authentication, with configurable token URL, credentials and scope.

  4. Cache access tokens and refresh them before expiry.

  5. Prevent duplicate token refresh requests under concurrent workloads.

  6. Inject the access token into upstream requests using the Bearer authorization header.

  7. Support standard OpenAI chat-completion requests, including streaming.

  8. Retry authentication once when an upstream request receives HTTP 401.

  9. Propagate appropriate HTTP errors without exposing credentials or sensitive upstream responses.

  10. Support multiple model aliases and configurable upstream model mappings.

  11. Keep all URLs, model IDs, credentials and timeouts environment-driven.

  12. Provide Docker Compose deployment for local development and Helm/Kubernetes deployment for production.

  13. Add health checks, structured logging, timeout controls and metrics.

  14. Implement automated tests covering token caching, expiry, refresh, concurrent requests, upstream errors, normal inference and SSE streaming.

  15. Document the integration using LangChain ChatOpenAI, including synchronous and asynchronous calls.

Security requirements

  • Never expose JWTs, client secrets or gateway credentials in application logs.

  • Use TLS verification for corporate authentication and inference endpoints.

  • Restrict direct access to the internal adapter.

  • Store credentials using Kubernetes Secrets or a dedicated secrets manager.

  • Avoid forwarding incoming gateway authorization headers to the corporate endpoint.

Acceptance criteria

The existing LangChain/LangGraph application must be able to invoke the corporate LLM using only model, base_url and api_key, without requiring any application-level JWT handling.

Use version-pinned dependencies and provide an executable local integration test with mocked authentication and LLM endpoints.

Recommendation: For your architecture, this adapter-based approach provides a clean separation between model routing and corporate authentication. It also allows the same LiteLLM instance to serve Ollama, standard cloud models and JWT-protected corporate models.

Reference: LiteLLM official documentation.

LiteLLM accessing thorugh OpenAI langchain class

 

Accessing LiteLLM Gateway using LangChain ChatOpenAI

LiteLLM Gateway provides an OpenAI-compatible API, allowing applications to access different LLM providers through a single gateway endpoint.

If your Python application already uses langchain-openai, you can directly use the ChatOpenAI class to connect to LiteLLM without installing additional LiteLLM libraries.

1. Required configuration

Your customer typically provides:

Parameter

Description

Usage

Gateway URL

LiteLLM API endpoint

base_url

API Key (sk-...)

Authentication token

api_key

Model ID

Model configured in LiteLLM

model

Key Alias

Administrative name for the key

Not required

Key Hash

Hashed key identifier

Not required

Environment

DEV / TEST / PROD

Configuration selection

2. Install dependencies

pip install langchain-openai

Configure environment variables:

export LITELLM_BASE_URL="https://gateway.customer.com/v1"
export LITELLM_API_KEY="sk-your-api-key"
export LITELLM_MODEL="customer-model-id"

The URL must be the customer's OpenAI-compatible API base URL. Do not append /v1 if it is already included.

3. Basic LLM invocation

import osfrom langchain_openai import ChatOpenAIllm = ChatOpenAI(    model=os.environ["LITELLM_MODEL"],    base_url=os.environ["LITELLM_BASE_URL"],    api_key=os.environ["LITELLM_API_KEY"],    temperature=0.2,    timeout=60,    max_retries=2,)response = llm.invoke(    "Explain the difference between BGP and OSPF.")print(response.content)

The request is sent to the LiteLLM Gateway, which routes it to the configured underlying LLM.

4. Additional examples

Example A: System and user messages

from langchain_core.messages import SystemMessage, HumanMessageresponse = llm.invoke([    SystemMessage(        content="You are an expert network troubleshooting assistant."    ),    HumanMessage(        content="Why is my BGP neighbor stuck in Idle state?"    ),])print(response.content)

Example B: Streaming responses

for chunk in llm.stream(    "Explain Kubernetes networking."):    print(chunk.content, end="", flush=True)

This works when streaming is supported by the selected model and gateway.

Example C: Async invocation

import asyncioasync def main():    response = await llm.ainvoke(        "Explain how gRPC load balancing works."    )    print(response.content)asyncio.run(main())

Example D: Tool calling

from langchain_core.tools import tool@tooldef get_device_status(device_id: str) -> str:    """Retrieve the current status of a network device."""    return f"Device {device_id} is reachable"llm_with_tools = llm.bind_tools([get_device_status])response = llm_with_tools.invoke(    "Check the status of router R1.")print(response.tool_calls)

This example demonstrates how the model generates tool calls. The application or agent must execute the requested tools. The gateway and selected model must support tool calling.

5. Using multiple models through the same gateway

You can create different ChatOpenAI instances pointing to the same LiteLLM Gateway.

def get_llm(model_name: str):    return ChatOpenAI(        model=model_name,        base_url=os.environ["LITELLM_BASE_URL"],        api_key=os.environ["LITELLM_API_KEY"],    )planner_llm = get_llm("planner-model-id")supervisor_llm = get_llm("supervisor-model-id")summarizer_llm = get_llm("summarizer-model-id")

These IDs must correspond to models exposed by the customer's gateway and authorized for your API key.

6. Architecture

7. Important considerations

  • Model discovery: Use the OpenAI SDK's client.models.list() or the gateway's /models endpoint to identify permitted model IDs, if enabled.

  • Authentication: Use the actual sk-... API key, not the key alias or hash.

  • Compatibility: Validate tool calling, streaming, structured outputs and model-specific parameters.

  • Security: Store credentials in environment variables, secret managers or Kubernetes Secrets. Never hardcode them.

  • Production: Configure timeouts, retries, TLS verification and appropriate error handling.

Summary

Requirement

Recommendation

Python library

langchain-openai

LangChain class

ChatOpenAI

Gateway configuration

base_url

Authentication

api_key

Model selection

model

LangGraph compatibility

Yes, subject to model capabilities

Additional LiteLLM SDK

Not required

Existing AzureChatOpenAI

Replace with ChatOpenAI for LiteLLM connections

Final recommendation: For your existing LangChain/LangGraph application, introduce LiteLLM as a configurable provider using ChatOpenAI. This allows you to reuse the same agent orchestration, prompts, tools and streaming interfaces while routing inference requests through the customer's centralized LLM Gateway.

Wednesday, October 28, 2026

Differences between Helm and Kubernetes Yaml files

 Both approaches ultimately create the same Kubernetes resources (Deployments, Services, PVCs, ConfigMaps, etc.). The main difference is how those resources are configured, deployed, upgraded, and managed.

1. Helm vs traditional Kubernetes YAML

Feature

Traditional YAML (kubectl)

Helm Charts

Configuration

Hardcoded in YAML files

Parameterized using values.yaml

Deployment

kubectl apply -f

helm install / helm upgrade

Environment support

Separate YAMLs or Kustomize overlays

Separate values files

Reusability

Manual duplication

Templates and reusable charts

Versioning

Git-based

Git + Helm release revisions

Rollback

Manual or workload-specific

helm rollback

Dependencies

Managed separately

Helm chart dependencies

Complexity

Simple

Requires learning templating

Best suited for

Small, static deployments

Multi-environment applications

2. Example: Deployment using both approaches

Traditional Deployment YAML


apiVersion: apps/v1
kind: Deployment
metadata:
  name: ai-core
spec:
  replicas: 2
  template:
    spec:
      containers:
        - name: ai-core
          image: myapp/ai-core:1.0.0
Illustrative snippet; a complete Deployment also requires selectors and Pod labels.

Helm Deployment template


apiVersion: apps/v1
kind: Deployment
metadata:
  name: ai-core
spec:
  replicas: {{ .Values.aiCore.replicas }}
  template:
    spec:
      containers:
        - name: ai-core
          image: "{{ .Values.aiCore.image }}"

Helm values.yaml


aiCore:
  replicas: 2
  image: myapp/ai-core:1.0.0

Helm substitutes the values into the template and generates ordinary Kubernetes YAML, which Kubernetes then processes.

3. How deployment commands differ

Traditional Kubernetes

kubectl apply -f kubernetes/

Helm — Minikube

helm upgrade --install myapp ./helm/myapp \
  -f ./helm/myapp/values-minikube.yaml

Helm — Production

helm upgrade --install myapp ./helm/myapp \
  -f ./helm/myapp/values-production.yaml

The same Helm templates can be used in both environments, with different image tags, storage settings, resource limits, and network configurations.

4. Important: Helm doesn't replace Kubernetes YAML

Your Helm chart still contains Deployment, Service, StatefulSet, PVC, and other Kubernetes YAML definitions.

The structure typically looks like:

helm/myapp/
├── Chart.yaml
├── values.yaml
├── values-minikube.yaml
├── values-production.yaml
└── templates/
    ├── deployment.yaml
    ├── service.yaml
    ├── statefulset.yaml
    ├── pvc.yaml
    └── httproute.yaml

You can inspect the exact YAML Helm will generate:

helm template myapp ./helm/myapp \
  -f ./helm/myapp/values-production.yaml

This is particularly useful for debugging Helm charts.

5. Which should you use?

For your application, Helm is the better choice because you have Docker Compose for development, Minikube for testing, and a self-managed production Kubernetes cluster.

Helm also helps with your offline release bundles, upgrades, and rollback procedures.

One limitation: helm rollback restores Kubernetes resource configuration, but does not automatically roll back PostgreSQL schema changes or persistent data.

A useful way to think about it:

Traditional YAML = Define Kubernetes resources.

Helm = Package, configure, deploy, and manage those Kubernetes resources across environments.

Tuesday, October 27, 2026

What is Daytona and E2B Sandboxes?

 Both Daytona and E2B are cloud-based sandbox providers designed to let AI coding agents, large language models (LLMs), and developers safely execute code, run tools, and spin up isolated computer environments. [1, 2, 3, 4]


Core Differences

FeatureDaytonaE2B
Isolation TechnologyDocker containers by default (with Kata/Sysbox opt-in)Firecracker microVMs with dedicated kernels and hardware-level isolation
Cold Start Speed~742ms (create) / ~1254ms (resume)~717ms (create) / ~662ms (resume)
GPU SupportYesNo
Persistence / StatesFork, pause/resume, snapshot, and persistent workspacesMemory-preserving pause/resume and snapshots
Open Source StatusMoved core development to a private codebase (closed-source production)Open-source runtime (Apache-2.0) with managed cloud and self-host options
Primary FocusPersistent developer workspaces, multi-file environments, and GPU-backed AI executionEphemeral, stateless or memory-preserved microVMs for untrusted AI-generated code

What is Daytona?

Daytona is a sandbox and workspace platform built for fast, reproducible development environments and AI agent execution. [2, 5]
  • Under the Hood: Uses Docker containers by default for fast creation times, alongside options for heavier microVM or Kata isolation. [1, 6, 7]
  • Key Strengths: It supports GPUs, Windows and macOS/Linux environments, Git integration, and persistent workspaces that can be paused, snapshotted, or archived. [6, 8, 9, 10]
  • Best Used For: AI agents or workflows that require GPU acceleration, custom desktop/GUI environments, or stateful, long-running project codebases. [7, 9, 11]

What is E2B?

E2B (Engine to Build) is an open-source cloud infrastructure platform built specifically for safe AI agent code execution. [2, 12]
  • Under the Hood: Uses Firecracker microVMs to give every single sandbox its own isolated kernel and hardware-level security.
  • Key Strengths: Ultra-fast ephemeral sandbox creation, memory-preserving pause-and-resume states, and strict network/secret controls.
  • Best Used For: Running untrusted AI-generated code, code interpreters, and multi-step agentic workflows where strict security and isolation from the host system are top priorities. [1, 2, 5, 11, 13]

If you are deciding between the two, tell me:
  • Are you running GPU-heavy workloads or standard CPU code?
  • Do you need ephemeral (disposable) execution or persistent project workspaces?

What is Google Jules Coding Agent?

 Google Jules is an autonomous, asynchronous AI coding agent developed by Google Labs and powered by Gemini models (such as Gemini 2.5 Pro and Gemini 3 Pro). [1, 2, 3]

Unlike real-time AI coding assistants like GitHub Copilot or ChatGPT (which suggest code while you type or chat), Jules acts as an independent background teammate. [4, 5]

Core Functions & Workflow

  • Task Delegation: You assign high-level or scoped tasks (such as fixing bugs, writing tests, bumping dependencies, or building new features) via GitHub, the web app, the command-line interface (Jules Tools), or the Jules API. [2, 6, 7, 8]
  • Cloud Sandboxing: Jules clones your repository into a secure Google Cloud virtual machine (VM), analyzes project context, executes a plan, runs tests, and works independently in the background. [1, 2]
  • Pull Requests: Once finished, it presents its reasoning, plan, and a code diff for your approval before generating a standard GitHub pull request. [2, 9]
  • Privacy: It operates privately by default and does not train on your private code. [2]

How to Access It

You can try or manage tasks through the official Google Jules website, via GitHub integration, or by installing the CLI tool via npm (npm install -g @google/jules). [1, 2, 6]
Would you like to know more about Jules' pricing tiers, how to set it up with a GitHub repository, or how it compares to tools like Google Antigravity?