LangChain BlogActualizado el

Managed Deep Agents v0.9: programaciones, configuración por ejecución y reacciones en Slack

Conclusiones clave Programaciones creadas por el agente: los agentes pueden configurar recordatorios y tareas recurrentes desde una conversación. Configuración por ejecución: un despliegue puede elegi

Fuente de la imagen · LangChain Blog

Conclusiones clave

  • Programaciones creadas por el agente: los agentes pueden configurar recordatorios y tareas recurrentes desde una conversación.
  • Configuración por ejecución: un despliegue puede elegir su modelo, habilidades y herramientas para cada ejecución.
  • Reacciones en Slack: los agentes acusan recibo de los mensajes antes de responder.

Hoy lanzamos Managed Deep Agents v0.9, con nuevas capacidades que permiten a los agentes programar sus propios seguimientos, reconfigurarse en cada ejecución y reaccionar a los mensajes de Slack.

Estas actualizaciones facilitan la creación de agentes internos que viven en Slack o en tus propios canales y trabajan más como compañeros de equipo.

Permitir que los agentes programen su propio trabajo

El nuevo SDK de Schedules permite a los agentes crear recordatorios, seguimientos y tareas recurrentes en medio de una conversación, para que puedan atender solicitudes como "Recuérdamelo mañana".

El agente crea la programación por sí mismo durante una conversación, la programación se ejecuta como la persona que la solicitó usando su conjunto de permisos y conexiones, y los resultados vuelven al mismo canal.

Crear una programación desde dentro de una ejecución:

await schedules.create(owner={"type": "user"}, cron="0 9 * * 1-5", timezone="America/Los_Angeles", prompt="Write the daily digest.")

Es más útil detrás de una herramienta, de modo que los usuarios de tu agente puedan crear, listar, actualizar y eliminar programaciones simplemente conversando. Aquí tienes una herramienta de recordatorios:

from langchain.tools import tool
from managed_deepagents import schedules

@tool
async def remind_me(prompt: str, cron: str, timezone: str = "UTC") -> str:
    """Run a prompt for the current user on a cron schedule."""
    item = await schedules.create(
        owner={"type": "user"},
        cron=cron,
        timezone=timezone,
        prompt=prompt,
    )
    return f"Created schedule {item['id']}."

El agente pasa un prompt y una expresión cron, y cada vez que el cron se dispara, LangSmith inicia una nueva ejecución con ese prompt. Las programaciones heredan el canal en el que fueron creadas, por lo que los resultados se publican de donde vino la solicitud: un recordatorio entre semana solicitado en Slack publica un mensaje nuevo en esa conversación en cada ejecución. Las programaciones de una sola vez (at en lugar de cron) responden en el hilo original, lo que se adapta a seguimientos como "revisa este despliegue en una hora".

Configurar agentes por ejecución

Un agente ahora puede configurarse dinámicamente por ejecución. Configura el agente como una función invocable: recibe el runtime al inicio de cada ejecución y devuelve una define_deep_agent definition, eligiendo el modelo, las instrucciones, las habilidades, los servidores MCP y el sandbox para esa ejecución.

En lugar de mantener una copia casi idéntica del mismo agente para cada equipo o repositorio, ejecutas un solo despliegue. Esto permite que tu despliegue opere con mayor flexibilidad, de manera que un único despliegue de agente puede personalizarse para diferentes equipos o casos de uso según el contexto, como el canal o el usuario que origina la solicitud.

Supongamos que un agente interno de Slack sirve a varios equipos. Tu función de agente puede comprobar de qué canal proviene una ejecución y cargar habilidades de facturación para finanzas, o un servidor MCP de respuesta a incidentes para el equipo de plataforma. Eso es diferente de instrucciones que le dicen al modelo cuándo usar una habilidad: la configuración se establece antes de que el modelo se ejecute, por lo que el agente nunca ve habilidades ni herramientas MCP fuera de su configuración. Eso mantiene su contexto pequeño, funciona como control de acceso y te permite elegir el modelo en sí, algo que el modelo no puede hacer.

En general, evita salidas no deterministas en las que se encarga al modelo elegir el kit de herramientas en casos donde sabemos exactamente qué conjunto de herramientas debería estar disponible para el agente.

La misma idea funciona para un agente de programación que carga diferentes habilidades y un modelo más económico o más capaz para cada repositorio:

# agent.py: one coding agent, configured per repo at the start of each run
from dataclasses import dataclass

from managed_deepagents import ManagedServerRuntime, define_deep_agent

REPOS = {
    "payments-service": {
        "model": "openai:gpt-5",
        "instructions": "Python service. Run pytest before opening a PR.",
        "skills": ["./skills/python-service"],
    },
    "storefront": {
        "model": "openai:gpt-5-mini",
        "instructions": "Next.js app. Run web tests and an a11y check before opening a PR.",
        "skills": ["./skills/typescript-web"],
    },
}


@dataclass
class AppContext:
    repository: str = ""


def agent(runtime: ManagedServerRuntime[AppContext]):
    execution = runtime.execution_runtime
    context = execution.context if execution is not None else None
    repo = context.repository if context is not None else None
    config = REPOS.get(repo, REPOS["storefront"])
    return define_deep_agent(name="open-swe", context_schema=AppContext, **config)

‍‍

La función lee runtime.execution_runtime.context y vuelve a un valor predeterminado cuando no hay ninguno, como en ejecuciones de canal o cuando Agent Server carga el agente para leer su esquema. Quienes realizan la llamada eligen la configuración con la de la ejecución. context:

# Same deployment, different repo: just change the run context
await client.runs.create(
    thread_id,
    "open-swe",
    input={"messages": [{"role": "user", "content": "Fix the flaky refund test."}]},
    context={"repository": "payments-service"},
)

Reaccionar a los mensajes de Slack

Reacciones de Slack mostrar de inmediato al remitente que el agente recibió su mensaje, incluso mientras pasa un tiempo razonando y llamando a herramientas antes de responder. Las reacciones están activadas por defecto (👀), y el nuevo reactions opción en tu canal de Slack te permite desactivarlos, elegir otro emoji o escoger uno por mensaje. Este ejemplo usa 🐛 cuando un mensaje menciona algo que está dañado, y 👀 en caso contrario:

from managed_deepagents import channels

async def choose_emoji(context: dict) -> str:
    return "bug" if "broken" in context["text"].lower() else "eyes"

channel = channels.slack(name="Support Bot", reactions=choose_emoji)

Las reacciones pueden ser simples. Sin embargo, es posible configurar tu respuesta de reacción con una función que llama a un modelo para elegir un emoji más preciso. Un modelo de decisión como Jev mantiene eso rápido y económico; el Documentación del canal de Slack recorrer un ejemplo completo.

Primeros pasos

Managed Deep Agents v0.9 está disponible hoy en Beta Pública. Puede obtener más información en el Documentación de Managed Deep Agents, o para comenzar:

uvx --from managed-deepagents mda init my-agent
cd my-agent
uv run mda deploy

‍ICYMI: la v0.8 añadió memoria por usuario, canales HTTP personalizados para activar ejecuciones desde cualquier servicio, búsqueda web integrada con tecnología de Parallel y más. Lee la publicación de la v0.8.

‍

Fuente original

LangChain Blog

Notas sobre el contenido

La publicación original y los derechos pertenecen a la fuente.

Traducción automática · Consulte el original