Status: Architecture blueprint and working studio. The walkthrough and the mission simulator run as simulations with synthetic data. No live model calls, no live data feeds, no live vector database, no SMS actually sent. DESIGNED is not DEPLOYED is not LIVE.
The source blueprint was written for the 2024 to 2025 stack. The architecture is sound. The parts are not. Every component below has a 2027 replacement that is either already running inside Neuruh or is a direct swap. The tools on this page run the 2027 versions by default and keep the 2024 versions as options so the change is visible.
| Blueprint component (2024) | 2027 replacement | What changes |
|---|---|---|
| LangChain + AutoGen, GPT-4 as the agent brain | 2026 frontier models (Claude, GPT, Grok), MCP as the tool interface standard, A2A as the agent-to-agent protocol | Tools become MCP servers any agent can call. Agents talk to each other over A2A instead of framework-specific conversation loops. The model is a config choice, not a lock-in. |
| Pinecone (managed) or Weaviate (self-hosted) | Qdrant as the primary vector store, Supabase as the structured store | Qdrant already runs locally in Colima on the founder machine. Supabase holds the structured tables, receipts, and indexes. Pinecone and Weaviate stay as options, not the default. |
| APScheduler, Celery+Beat, or OS cron | The organism armed scheduler, with the JGI Ops Console as the scheduling and monitoring surface | Scheduling is a governed act with receipts, not an in-memory timer. The Ops Console shows the queue, dead work, drift, and bottlenecks. |
| Temporal.io workflow engine | Mother/Axon as the conductor layer | Workflows are missions carried by a conductor (BOB) across organs, with AXON events as the trace, instead of a separate Temporal server. |
| Zapier / Make for integration | CRUCIBLE hash-chained receipts plus N-Cell governance | Every integration step leaves a signed, hash-chained receipt and passes the N-Cell governance reduction (proposed, allowed, available). Audit is built in, not bolted on. |
| Twilio for SMS and email alerts | Twilio kept, gated by the Liability Layer Insured Action Protocol | Notifications still go out over Twilio. Any action that moves money, or that could, must pass the Insured Action Protocol first (token issues at exactly 0.0001 USDC). |
| Docker-only deployment | Cloudflare Workers/Pages plus Vercel as the primary targets, Docker kept for the local runtime | Public surfaces deploy to Pages and Vercel. Docker stays for the local runtime: Qdrant, Postgres, and the agent workers. |
| Blueprint component | Neuruh organism equivalent |
|---|---|
| Vertical-specific agents | Organs: each organ is a bounded specialist with its own tools and memory |
| Shared vector memory | Vault: the organism memory layer, with Qdrant underneath |
| Task scheduler | Armed scheduler, monitored from the JGI Ops Console |
| Orchestrator | Mother/Axon with BOB as conductor |
| Receipts and audit logs | CRUCIBLE hash-chained receipts, checked by Sentinel |
| Router and agent selection | N-Cell headers and the JGI Organization Compiler |
| Confidence calibration | JGI Calibration Lab (Brier score, calibration curves) |
| Shadow and canary rollout | JGI Autonomy Lab (shadow and canary simulator, autonomy credit) |
The 2027 update does not change the blueprint's shape. It changes the parts, the governance, and the deployment target. A system built exactly as the 2024 blueprint describes would work, and would also be ungoverned, unreceipted, and undeployable on the current stack.
This framework enables lightweight research automation using a network of modular AI agents. It is designed to be container-friendly (Docker) without undue complexity. The architecture centers on multiple vertical-specific LLM agents (specialized by domain or task) that can be composed into a broader autonomous system.
LLM Agents (LangChain + AutoGen). Each agent is built around a Large Language Model given a specific role and equipped with tools and memory. LangChain provides a modular, extensible architecture with a unified interface to various LLMs, pre-built agent toolkits, data connectors, and integration with vector stores. AutoGen contributes a multi-agent conversation framework with customizable agents, code execution support, optional human-in-the-loop, and advanced dialogue management. Together, these allow defining specialized "expert" agents for different domains.
Shared Vector Memory (Pinecone/Weaviate). A semantic vector database stores research outputs and learned knowledge for long-term memory. This enables agents to retrieve past information via semantic similarity, augmenting their context beyond short prompts. For example, Pinecone is a cloud-based vector DB offering fast storage and retrieval with a simple API, making it easy to provide long-term memory for AI applications. Alternatively, an open-source vector DB like Weaviate can be used similarly.
Task Scheduler. A background scheduling mechanism triggers research tasks periodically or on-demand. Simpler in-app schedulers (for example APScheduler) or task queues (Celery) can be used, as well as OS cron jobs. For lightweight needs, a pure Python scheduler is often preferred over a heavy queue system.
Orchestration and Integration Layer. Orchestrates multi-step workflows and connects to external services. This can range from custom Python logic to workflow engines (Temporal) or integration platforms (Zapier). It manages the sequence of agent invocations and triggers side effects (for example sending alerts via Twilio).
Containerized Deployment. All components are designed for Docker deployment. Development is Python-first (for example CLI tools for running agents) and workflow logic is terminal-friendly, facilitating iterative testing and DevOps integration.
All of this runs within Docker containers or a Docker Compose setup for easy deployment. In the 2027 update, step 1 runs on the armed scheduler, step 3 writes to Qdrant with a CRUCIBLE receipt, step 4 passes N-Cell governance, and step 5 routes by N-Cell header.
To build a universal autonomous agent, compose multiple specialized sub-agents, each responsible for a specific domain or task type. This follows a divide-and-conquer principle: "create a specialized agent for each task or domain and route tasks to the correct expert". For example, one agent might focus on market research, another on scientific literature, and another on technical coding tasks. Each vertical agent shares common traits but has domain-specific customizations.
All agents use a common Base Agent framework (for example extending LangChain's Agent class or AutoGen's Agent definitions). This base provides capabilities like tool use (web browsing, API calls), reasoning prompts, and memory integration. Shared tools and skills (for example a "WebSearchTool", a "DatabaseQueryTool", or a "Summarizer") can be developed as modular functions or LangChain Tools and mixed into any agent that needs them. Each agent also has a memory interface to the vector store for long-term knowledge. By encapsulating these as mixins or utility classes, agents can reuse them across domains.
On top of the base, each agent has a specialized prompt template or persona defining its role (for example "You are a financial analyst AI, expert in market data"), and it may load domain-specific context or use domain-specific tools. For instance, a finance agent might have a stock price API tool, while a medical research agent might interface with PubMed. The agent's reasoning chain is tuned to its vertical. This specialization ensures higher quality and more factual results in that domain.
The agents can operate independently for their tasks, but to build a more powerful system, they can collaborate. AutoGen enables multi-agent conversations, for example a Manager agent that delegates subtasks to various Worker agents and synthesizes the results. In this setup, a coordinator agent can dynamically decide which specialist agent to consult for each query or sub-problem. LangChain's routing can also be applied: an incoming task is first classified by topic, then dispatched to the corresponding domain agent. Agents might also call each other's capabilities via an agreed interface (for example, a coding agent can ask a research agent for information).
This modular design is stackable: you can start with a few key vertical agents and gradually add more, or compose them hierarchically (for example a general agent that first tries basic reasoning and only invokes specialized agents if needed). Over time, these building blocks form a universal agent that covers many domains by intelligent routing rather than one monolithic model. Importantly, since all agents share the core framework, improvements to the base (better memory handling, new tool integrations, and so on) propagate to all specialized agents.
2027 note: the base agent framework is now an N-Cell organ contract. The coordinator is Mother/Axon with BOB. Inter-agent calls go over A2A, and shared tools are MCP servers. The stackable property is unchanged.
To automate research, we need a scheduling system to launch agent tasks in the background. There are three main approaches in a containerized Python setup.
For simplicity, use the APScheduler library within the agent application container. APScheduler can run jobs on intervals, cron expressions, or specific times. For example, you might schedule a weekly_research() task every Monday at 9am. The scheduler will run as part of the Python process (for instance, using BackgroundScheduler). This avoids external dependencies. As one developer noted, "If you wanted just scheduled tasks but simpler, use something like APScheduler." In practice, you initialize the scheduler at app startup, add jobs (with their intervals or cron strings), and start it. The scheduled job function would invoke the appropriate agent (for example call the LangChain agent's run() or AutoGen's agent.run(task=...) asynchronously). Containerization: ensure the container keeps running (for example do not exit after agent initialization, keep an event loop or scheduler running). One caveat: since the scheduler state is in-memory, if the container restarts, jobs may need to be re-added; however, APScheduler supports persistent job stores (SQL or Redis) if needed for durability.
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
scheduler.add_job(func=run_finance_research, trigger='cron', day_of_week='mon', hour=9)
scheduler.add_job(func=run_news_monitor, trigger='interval', hours=6)
scheduler.start()
Here, run_finance_research() and run_news_monitor() are functions that invoke the respective agents. This will automatically kick off research tasks on schedule. As needs grow, you can later swap out the scheduler for Celery+Beat without major changes to the agent code (just call the Celery tasks instead). Ensure to log scheduling events and job outcomes for monitoring.
For more complex scenarios or heavy workloads, a distributed task queue like Celery can be employed. Celery runs a worker process (or multiple) that executes tasks, and a broker (like Redis or RabbitMQ) to queue tasks. You can use Celery's Beat scheduler to send periodic tasks to the queue. The benefit is robustness and scalability: tasks can be retried, run in parallel, or on separate machines. In this architecture, you would create Celery tasks for things like perform_research(domain, query) which internally call the agent logic. The container setup would involve at least two containers: one for the Celery worker (running the agent code), and one for the broker (for example Redis). While Celery adds complexity, it is well-documented and can handle periodic tasks reliably. This route is recommended if you foresee many concurrent research jobs or integration with a larger web app. Otherwise, it might be overkill for "light" research automation.
Another simple approach is to use cron inside the Docker container or at the host level. For instance, you could run a cron daemon in the container that executes a Python script at set times (perhaps by calling python run_research.py topicX). However, running a cron service inside a container breaks the one-process-per-container best practice unless you use a supervisor, and coordinating data between the cron job and the running app can get tricky. A better pattern if using cron is to have a stateless script in a container (that executes the research and exits), and schedule that container via an external cron (for example using Docker host's cron or Kubernetes CronJob). For most use cases, approach 1 (APScheduler) is easier to maintain within the app itself.
Recommended setup: start with APScheduler in the main agent container for simplicity. Define jobs in code. As needs grow, swap in Celery+Beat. In the 2027 update, the recommended setup is the armed scheduler: jobs are armed with receipts, governed by N-Cell, and monitored from the JGI Ops Console. Use the Scheduler Comparison tool below to pick for a given workload.
All research findings and important data should be captured in a semantic vector store so the agents can recall information later. This acts as the system's long-term memory. We have two primary choices: Pinecone (managed cloud) or Weaviate (self-hosted open-source). Both serve as a vector database for embeddings.
A fully managed vector DB service. It offers a simple API to upsert and query vectors, and auto-scales the index. "Pinecone is a cloud-based vector database that provides easy and fast storage and retrieval of data using a simple API. It makes it easy to provide long-term memory for high-performance AI applications." Using Pinecone in this architecture means we do not have to manage the database server, just send API calls. LangChain has built-in integration with Pinecone; for example, you can use Pinecone.from_texts([...], embedding_model) to store data or use Pinecone as a vectorstore in a RetrievalQA chain. You will need a Pinecone API key and to create an index (choose dimensionality matching your embeddings, for example 1536 for OpenAI's). Each research artifact (for example a chunk of text from an article or a summary note) gets embedded into a vector and stored with metadata (such as the agent/domain, timestamp, and source URL if applicable).
An open-source vector DB you can run via Docker. "Weaviate is an open-source vector database. It enables you to store data objects and vector embeddings and query them based on similarity measures." Using Weaviate can be as simple as adding a Weaviate container to your Docker Compose; it provides a RESTful API for CRUD on vectors. Weaviate allows schema definitions (classes and properties). You could define classes for each research domain. It also supports filtering and hybrid search (vector + keyword). LangChain likewise supports Weaviate integration out of the box. If you prefer to keep everything self-contained and avoid external cloud services, Weaviate is a strong choice. Just allocate enough memory and CPU for it in the deployment.
Embedding: the agent (or a utility function) generates an embedding for each piece of information to store. This typically uses an embedding model (for example OpenAI's text-embedding-ADA for text, or a local model via HuggingFace). LangChain's OpenAIEmbeddings class or similar can produce the vector from text.
Upsert: store the vector in the database with an ID and metadata. For Pinecone, you might call index.upsert([(id, vector, metadata)]). For Weaviate, you would use a client or HTTP POST to create an object with a vector. Metadata can include fields like domain="finance", agent="MarketAnalystBot", date="2025-04-24", and so on, which will help with filtering or debugging.
Semantic retrieval: when an agent is handling a new query or brainstorming, it can query the vector store for relevant information. This is usually done by embedding the query and performing a similarity search (kNN) in the vector DB. The top results are then fed into the prompt as context. In LangChain, you could wrap this in a RetrievalQA chain or use a VectorStoreRetrieverMemory to have the agent automatically incorporate knowledge. The vector database essentially functions as the "knowledge base" for all the agents. Vector stores are commonly used to give LLM agents long-term memory, beyond what the prompt token limit allows.
If using a single vector index for all agents, use metadata tags to distinguish domains or agents. Alternatively, create separate indexes (or Weaviate classes) per domain (finance_index, health_index, and so on) to partition the knowledge. LangChain's retriever can then target the appropriate index. A router agent could even decide which index to query based on the question. This segmentation prevents, say, the medical agent from accidentally pulling in irrelevant finance data.
Over time, the vector store will grow as more research is done. Incorporate periodic cleanup or summarization: for example schedule an offline task to summarize older entries and re-embed them (to save space), or use Pinecone's filtering to limit by recency. Both Pinecone and Weaviate can handle millions of vectors, but you will want to monitor index size for cost and performance. Ensure you have backups or exports if the data is important.
2027 note: the primary store is Qdrant, already running locally in Colima. Supabase holds structured tables and indexes. Pinecone and Weaviate remain as options. The Memory Explorer tool below runs this exact workflow on a seeded store.
To orchestrate which agent handles which query and to maintain coherent context, we rely on LangChain's routing logic and memory utilities. This ensures that the right information is available to the right agent at the right time.
In a multi-agent system, an incoming task or user query should be routed to the appropriate specialist or workflow. LangChain provides patterns for this, such as router chains or simply using an LLM to classify the query. For example, a RouterChain can use a small LLM prompt: "Is this question about finance, science, or coding?" and then direct to the corresponding agent or tool chain. Another approach is a master agent that has access to other agents as tools: using LangChain's AgentExecutor, you can register a specialized agent's run method as a tool. The master agent will decide when to invoke it. This effectively allows one agent to use another agent as a sub-task (for instance, the general agent can call the "WebResearchAgent" tool, which internally spins up the web research agent to fetch info). The design should avoid infinite loops (agents calling each other back and forth); typically one is the coordinator and others are workers.
We implement both. Short-term memory is the conversational or session memory that keeps track of recent dialogue turns or steps within the current task. LangChain's standard ConversationBufferMemory or ConversationSummaryMemory can be attached to an agent so it remembers what it has just done or what the user has asked in the last few turns. Long-term memory is powered by our vector store. As described, each agent can have a VectorStoreRetrieverMemory that fetches older relevant info from Pinecone/Weaviate and injects it into the context. This combination allows an agent to not only recall the immediate conversation, but also any pertinent fact it learned weeks ago. In general, short-term memory holds immediate information like conversation history, and long-term memory retains knowledge over time to improve the agent's performance. We achieve this by configuring the agent's chain to use both: for example first retrieve top 5 relevant vectors (long-term), and also append the recent chat history (short-term) when building the prompt for the LLM.
To prevent unbounded growth of the prompt (which has a token limit), use strategies like summarizing old conversations (LangChain can automatically summarize and store the summary in vector DB) or windowing (keeping only last N interactions in prompt). The vector DB acts as a backup where nothing is truly lost, but we only pull what is relevant. LangChain's callbacks can be used to monitor what the agent is retrieving or to dynamically adjust prompts. For example, after each agent action, you could store a trace or outcome in the vector DB (like "Agent A solved subtask X with result Y"). These traces then become searchable if a similar task is encountered again, creating a learning loop.
Sometimes the agent's output or an external event should trigger a follow-up. For instance, if a research agent finds a critically important piece of info (maybe a stock crash alert), we want to notify the user immediately. We can implement event triggers by examining agent outputs. If using LangChain's agent executor, we can attach a custom callback on completion that checks the result for certain keywords or conditions and then calls another function (for example send_alert() via Twilio). Another method is to treat it as part of the workflow orchestration: the agent could be one step in a Temporal workflow, and the next step is conditional on the content of the result. For flexibility, consider designing the agent's output in a structured way (JSON or a fixed format) so that parsing for triggers is reliable. For example, the agent could always return a JSON with keys "action_items" or "alert": true/false. A lightweight alternative is using Zapier: have the agent (or your code) send an HTTP POST with the result to a Zapier webhook, which is configured to filter the content and perform some action (like send email if condition met, and so on). This can offload integration logic from your codebase.
LangChain makes it straightforward to integrate various tools the agents might need, which is crucial for research tasks (browsing, calculations, and so on). You can use the built-in tools (search, Python REPL, requests, and so on) or define custom ones. For web research, you might use an OpenAI Tool or the Playwright browser via AutoGen (AutoGen's web-surfer agent) to let the agent fetch web content. For data lookup, you can use LangChain's SQL Database tool if you have an internal database of knowledge. These tools are all pluggable into the agent's config. The vertical agents will each have a subset of tools relevant to their job. LangChain's Tool abstraction and AutoGen's extensions allow adding these easily, and each tool usage can be seen in the agent's chain-of-thought (useful for debugging).
By combining smart routing with layered memory, the system ensures that each query or task is handled by the best-suited agent with all relevant knowledge at its disposal. This design scales: new agents can be added with new tools and memory segments, and the router logic can be updated (or learned via an LLM prompt) to include the new specialties.
2027 note: routing is by N-Cell header (routeMask, organMask, authorityMask). Tool integration is MCP. Memory is Vault with Qdrant underneath, and the Memory Workbench is the surface for inspecting what was retrieved and why.
Beyond the core agent reasoning, workflow orchestration manages multi-step processes and integration with external systems. Depending on complexity, different solutions are available.
For many cases, writing straightforward procedural code in Python will suffice. For example, a scheduled job can do: "call Agent A, get result, call Agent B with that result, send notification." This can be done with plain function calls or using async await if using asyncio (as AutoGen often does). You can implement a small Task Dispatcher class that receives events (like "research_complete") and invokes handlers (like "summarize finding" or "notify user"). This custom code approach is easy to keep within the same codebase and container. Use Python's asyncio or threading if you need concurrency (for example kick off two agents in parallel and then join results). Logging and error handling are crucial here: wrap calls in try/except and maybe retry if an agent fails due to an API error.
If the research tasks involve numerous steps, long-running processes, or require high reliability (guaranteed execution even if services restart), a workflow orchestration engine like Temporal can be considered. Temporal lets you write workflows as code (in Python, using their SDK) and it will ensure each step completes, with state persistence and retrying on failure. In this architecture, we could define a Temporal Workflow for a research project: steps might include DecomposeTask (if using a chain-of-thought planner), then parallel PerformResearch tasks by different agents, then a SynthesizeReport step, then a NotifyUser. Temporal would handle scheduling these, even across different worker processes. However, using Temporal means running a Temporal server (or using their cloud service) and adding that dependency; it is powerful but might be overkill for light usage. If you already have a microservice infrastructure, Temporal could slot in to orchestrate the AI agents alongside other services. Otherwise, start simple and only introduce Temporal if you need its guarantees (for example critical business workflows).
To quickly connect the system to third-party services without writing custom API calls, Zapier is an effective option. You can set up a Zap that triggers on an HTTP webhook or email. Your agent can, for instance, send an HTTP request (using LangChain's Requests tool or requests in Python) to a Zapier webhook when a certain event happens. The Zap can then perform actions like updating a Google Sheet, sending a Slack message, or creating a Trello card. Zapier essentially acts as an if-this-then-that for anything your agent outputs. This is "low-code" orchestration useful for prototyping notifications or data pipelines. One could imagine a Zap triggers every day to call your agent's API as well, but since we have internal scheduling, we mostly use Zapier on the output side.
A common requirement is sending alerts via SMS or email when research is done or if something urgent is found. Twilio provides APIs for both (SMS/WhatsApp via Twilio, or email via Twilio SendGrid). In this system, integrating Twilio is straightforward: use Twilio's Python SDK (twilio library) with your account SID and auth token (store these as environment variables). After an agent finishes its task, call the Twilio client to send a message. For example:
from twilio.rest import Client
client = Client(account_sid, auth_token)
client.messages.create(to="+1234567890", from_="YOUR_TWILIO_NUMBER", body=summary_text)
This could be invoked directly in the scheduler job after the agent returns a result. For email, you might use SendGrid's Python library similarly. Make sure to handle failures (for example if SMS fails, log it and perhaps retry or send email as backup). Because this is so directly actionable, we might not need a full Zapier flow for notifications: sending from Python gives more control over content (you can include detailed results or attach files if using email).
Suppose we want a fully automated weekly research report. The APScheduler triggers weekly_report_task(). This function orchestrates as follows: it uses LangChain (or AutoGen's multi-agent) to break the task into parts, then calls the appropriate agents (maybe in sequence: a web data collector agent, then a summarizer agent). Once the final report text is ready, the function calls send_email(report) and send_sms("Your report is ready"). If using a workflow engine, these would be separate activities in the workflow, but in simple form it is just sequential code. Throughout this process, intermediate data is stored in the vector DB (so if next week's run wants to compare with last week, it can retrieve those results).
Orchestration should include logging and possibly alerts on failure. Use Python's logging to record each major step and outcome. If an agent fails to produce an answer (maybe the LLM had an error or no info found), decide how to handle it: maybe notify the user of incomplete results or trigger a different approach. Tools like Temporal have built-in visibility (workflow history), but even without it, you can log to a file or external logging service. You might also integrate a simple health check: for example, after each scheduled run, have a monitor check that the vector store got new entries or that the output was sent, and alert if something seems off.
In summary, start with code-driven orchestration (functions calling functions), and incorporate external services as needed for integration points. The architecture is flexible: you can plug in a new orchestrator later (since the core agent functions are just Python-callable, a workflow engine or cloud function can invoke them). Keep the orchestrator logic decoupled from agent internals: for example, the orchestration should not depend on how the agent does research, just that calling agent.run(query) yields a result. This separation ensures you can improve agent prompts or tools without breaking the surrounding workflow.
2027 note: the conductor is Mother/Axon with BOB. Integration steps leave CRUCIBLE hash-chained receipts and pass N-Cell governance. Twilio stays for notifications; the Liability Layer Insured Action Protocol gates any money-moving action.
Developing this system in a Python-first, CLI-friendly manner and deploying with Docker requires some careful practices.
Organize the codebase into clear modules: for example agents/ (with sub-modules for each vertical agent and a base agent class), tools/ (for custom tool implementations), memory/ (for vector DB interfacing code), and scheduling/ (for scheduler or task definitions). This modular approach makes it easy to test components in isolation. For a CLI workflow, consider using Python's argparse or a library like Typer or Click to create a command-line interface. For instance, you might have a main.py that uses Typer to define commands like run-agent --domain finance --question "XYZ" or schedule-tasks to start the scheduler. This allows you to invoke different parts of the system from the terminal for debugging or manual triggering. A simple example using Typer:
import typer
app = typer.Typer()
@app.command()
def run_agent(domain: str, question: str):
# choose agent based on domain, run it
result = agents.run(domain, question)
print(result)
if __name__ == "__main__":
app()
This gives a convenient CLI entry point (and can be extended with more commands). It is also helpful to have a docker-compose.yml and maybe a Makefile to streamline common actions (for example make dev to run locally, make test, make build-docker).
Use a virtual environment and pin your dependencies in requirements.txt. Key dependencies will include langchain, autogen, pinecone-client (if Pinecone), weaviate-client (if Weaviate), openai (for LLM API), apscheduler or celery, and possibly twilio. Keep these updated, but also be mindful that LangChain moves fast: test after upgrades. Given that this agent system may run long-term, ensure the versions are stable. You might also include python-dotenv to load environment variables (for dev convenience).
Write a Dockerfile that uses a lightweight base (for example python:3.10-slim). Copy the code and install deps. For example:
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . /app
# If using Playwright for web browsing, you may need to install browsers:
# RUN pip install playwright && playwright install --with-deps
CMD ["python", "main.py", "schedule-tasks"]
This Dockerfile installs dependencies and by default runs the scheduler (you can override CMD for different uses). If using Celery, you might have separate Dockerfiles or entrypoints for the worker vs beat. For Weaviate, you would add a service in docker-compose using the official Weaviate image. For Redis (Celery broker), use the official Redis image. Ensure all service names and ports align (and .env is shared if needed).
In Docker, environment variables should be used for secrets and config: for example OPENAI_API_KEY, PINECONE_API_KEY, TWILIO_SID, and so on. Do not bake secrets into the image. For local dev, you can use a .env file that Docker Compose reads to populate container env vars. This way, switching between Pinecone and Weaviate is a matter of config (for example an ENV flag VECTOR_DB=pinecone and corresponding keys).
Ideally, follow the one-process rule. That means if you use APScheduler inside the app, you are fine (it is within the one Python process). If you use Celery + scheduler, you might run one container for the Celery worker (which also can spawn the beat scheduler if configured) and possibly another for a separate scheduler process. For simplicity, you might combine them, but in production it is cleaner to separate. The docker-compose could have: agent-worker (Celery worker), agent-scheduler (Celery beat service, or just a cron container hitting an API), redis (broker), and weaviate (if used). Keep the images lean and use healthchecks (Docker HEALTHCHECK) to ensure each service is up.
Since this is an evolving system, maintain a terminal-based debugging workflow. For example, use the CLI to run agents with test queries and observe output. Leverage logging: set LOGLEVEL=DEBUG in env to get verbose logs from LangChain or your code. LangChain provides detailed logs of each step the agent takes (chain-of-thought, tool calls) which are invaluable for debugging agent behavior. You can also use LangSmith (LangChain's tracing and evaluation tool) in development to trace agent runs. This does not affect the architecture, but it is a good practice for improvement. Write unit tests for utility functions (like your tool wrappers or vector store interface), and perhaps integration tests that spin up a dummy vector store and test an agent end-to-end (you can run a local Weaviate for tests or use Pinecone's test index).
Keep prompts and instructions for your agents under version control (they are as much code as the Python code). If an agent's prompt changes, note it in commit messages. Also, be mindful of API usage (for example OpenAI API costs): during development, use a smaller model or a stub LLM for testing flows, then switch to GPT-4 or other powerful models for real runs. This can be toggled via config (like MODEL_NAME). Use feature flags or config files to turn on or off certain capabilities (for example, a flag to enable the Twilio notification actually sending vs just logging, so you do not spam yourself during tests).
Since the agents can execute code (especially if you allow a Python REPL tool or web access), containerization provides a layer of isolation. Still, be cautious: limit the permissions of the container (do not mount sensitive volumes), and if using something like Playwright, ensure the browser runs in sandbox mode. Also restrict any credentials: for example if the agent can run code, avoid letting it have direct access to keys in memory (store them in environment that only certain parts of code use, not the agent's LLM context). These measures prevent a buggy or compromised agent from causing damage.
When moving to production or a persistent environment, use Docker Compose or Kubernetes to manage the multi-container setup. For example, a docker-compose.yml might define services for research_agent (the main app with scheduler), weaviate, and redis. On a server, you would docker-compose up -d to launch them. Ensure you have a strategy for logging (Docker logs can be fine, or send logs to CloudWatch/ELK). If using Pinecone, no DB container is needed, making deployment simpler (just the app and maybe a broker).
As you deploy, gather feedback. Perhaps add a CLI command to fetch recent vector DB entries or agent outputs for review (python main.py review-mem --domain finance --last 5). This helps to inspect what the agent is storing and adjust if necessary. You might also incorporate a feedback loop: if the agent made a mistake, you (the developer or user) correct it and feed that back in (maybe store the correction in memory or adjust the prompt next time). Because the architecture is modular, you can improve one agent without affecting others: for example swap out the LLM for the coding agent to a more suitable one.
2027 note: deployment targets are Cloudflare Workers/Pages and Vercel for public surfaces. Docker stays for the local runtime (Qdrant, Postgres, agent workers). Secrets live in the secure credential flow, never in the image or the prompt context. The JGI Calibration Lab replaces LangSmith as the first check on confidence quality.
Use case: weekly market trend analysis report, compiled by an autonomous agent, with an SMS alert upon completion. Tech stack recap: LangChain with OpenAI GPT-4 for the agent's brain, AutoGen to enable a multi-agent conversation (one agent will be a "DataCollector", another a "ReportWriter"), Pinecone for storing findings, APScheduler for weekly scheduling, and Twilio for SMS. The app runs in Docker, Python 3.10.
By following this blueprint, you ensure each piece of the system is well-defined and interchangeable. The use of LangChain and AutoGen provides the flexibility to experiment with prompts and multi-agent strategies without rewriting the infrastructure. The containerized, Python-first approach means you can develop and debug locally in a console, then deploy the same code to production with confidence that it will behave consistently. With scheduling, memory, and orchestration in place, your AI agents will not only perform research tasks autonomously but also continuously learn and improve, moving you closer to a robust universal autonomous agent framework.
Pick the parts. The tool draws the system, writes the config, and estimates cost and latency. Assumptions are shown under the numbers, so you can argue with them.
Run a research mission end to end as a simulation. Six steps: trigger, route, research, store, synthesize, notify. Every step leaves a hash-chained receipt, and the chain verifier checks the whole chain.
Simulated data only. Retrieval scores come from the seeded store in the Memory Explorer. The receipt hash uses SHA-256 in a real browser and the FNV-1a 64-bit fallback where Web Crypto is unavailable.
Four schedulers, five dimensions, one recommendation per workload.
| Scheduler | Setup complexity | Durability | Scale | Failure handling | Cost |
|---|---|---|---|---|---|
| APScheduler | Low: in-app, no services | Low: in-memory unless a job store is added | Single process | Manual: log and retry in code | Free |
| Celery + Beat | High: worker, broker, beat | High: broker persists tasks | Multi-worker, multi-machine | Built-in retries, dead-letter handling | Broker hosting |
| OS cron | Low: system cron | Medium: survives restarts, no state | One host | None: exit code only | Free |
| Armed scheduler (2027) | Medium: organism wiring | High: receipts in CRUCIBLE | Organism-wide | Sentinel verdicts, Ops Console drift and dead-work detection | Existing organism |
A seeded semantic store with 12 research findings. Type a query. The tool derives a query vector from keyword matches, scores every entry by cosine similarity, returns the top 5, and shows which entries would be injected as long-term memory and which stay as short-term conversation history.
Keyword dimensions, in order: finance/market, science/research, real-estate/land, code/software, health, logistics, legal, weather. Each seeded entry has a fixed 8-number vector on those dimensions. Cosine similarity is computed against a query vector built from keyword matches in your query text.
Each 2024-era blueprint component mapped to its 2027 replacement, with a readiness verdict. Check the rows that are true for your system today and the score updates.
| 2024 component | 2027 replacement | Verdict | In place? |
|---|
Each link is a live, working demo or paper on this same series. The blueprint maps onto systems that already exist, not systems still to be designed.
The blueprint text quotes Medium and Hacker News as sources for several claims (LangChain and AutoGen capabilities, vector store descriptions, the APScheduler preference, router patterns, and long-term memory practice). Those citations are quoted from the source text as written. They were not re-verified live for this build, and no new external sources were added. The only outbound links on this page are the thirteen live Neuruh systems listed above.