Getting Started¶
This guide takes you from a fresh Python environment to a running JarvisCore agent in under ten minutes. It covers installation, initial configuration, and your first working agent.
Requirements¶
JarvisCore requires Python 3.10 or later. No infrastructure is required to run a minimal agent. The first working example in this guide uses only an LLM API key.
Docker is optional. It is used by the local infrastructure commands:
jarviscore nexus upstarts the local Nexus broker and gateway for OAuth2 credential managementjarviscore memory initstarts the local Athena memory stack- remote sandbox deployments may run the execution service in a container
Local browser automation uses Playwright directly and does not require Docker. If you are not starting local infrastructure or a containerized sandbox, Docker is not needed.
Installation¶
To install optional extras for specific capabilities:
P2P_ENABLED=true.
REDIS_URL is set.
BrowserSubAgent and Playwright-based web interaction tools. Required when BROWSER_ENABLED=true.
browser + rag + BeautifulSoup4. Everything ResearcherSubAgent needs for deep web research.
ATHENA_URL=http://localhost:8080.
azure_storage atoms.
/metrics endpoint for operational dashboards and alerting.
Scaffold Your Project¶
Run jarviscore init to create the initial project structure and a pre-populated .env.example:
This creates:
Copy the example to create your working configuration:
Configure an LLM Provider¶
Configure exactly one provider by adding the appropriate variables to your .env file.
If Prescott Data has already issued your organization a promotional entitlement, set it directly:
This is limited hosted inference access, not an upstream provider API key. There is currently no public self-service enrollment page.
Verify Your Installation¶
This command validates your Python version, package installation, and LLM configuration. To also test live inference against the configured provider:
The exact Python version and configured provider vary. A successful check includes output like:
======================================================================
JarvisCore Health Check
======================================================================
[System Requirements]
Python Version: 3.12.2
JarvisCore Package: v1.13.0
[Dependencies]
pydantic: Core validation
pydantic_settings: Configuration management
[LLM Configuration]
Claude: CLAUDE_API_KEY=sk-a...key
[LLM Connectivity Test]
Claude API: Connected
All checks passed. Ready to use JarvisCore.
Choose Your Agent Profile¶
JarvisCore ships exactly two agent profiles. This is the first decision in every project:
AutoAgent |
CustomAgent |
|
|---|---|---|
| Who brings the logic | The framework: LLM reasoning, sandboxed code generation, self-repair | You: plain Python in execute_task |
| You write | role, capabilities, system_prompt |
The implementation |
| Use for | Tasks you can describe: research, analysis, content, data extraction | Logic you can code: API workers, wrapping existing services, deterministic pipelines |
| Guide | AutoAgent guide | CustomAgent guide |
Both run on the same mesh and mix freely in one system. Not sure? Start with AutoAgent below; switch any agent to CustomAgent later without touching the rest.
Your First Agent¶
Create a file named main.py:
import asyncio
from jarviscore import Mesh, AutoAgent
class ResearcherAgent(AutoAgent):
role = "researcher"
capabilities = ["research", "analysis"]
description = "Researches topics and produces concise summaries."
system_prompt = """
You are a systematic research analyst. When given a topic,
you identify the most relevant facts, verify them against
multiple angles, and summarise your findings clearly.
"""
async def main():
mesh = Mesh()
mesh.add(ResearcherAgent)
await mesh.start()
try:
result = await mesh.run_task(
agent="researcher",
task="What are the main architectural differences between the SWIM and Raft consensus protocols?",
)
print(result["output"])
finally:
await mesh.stop()
if __name__ == "__main__":
asyncio.run(main())
Run it:
The agent will reason through the task using the OODA loop and return a structured response. Because no infrastructure is configured beyond the LLM key, all state is held in process memory and discarded when the script exits.
The same identity contract applies to CustomAgent, but you own the execution
logic:
from jarviscore.profiles import CustomAgent
class WordCountAgent(CustomAgent):
role = "word_counter"
capabilities = ["text_analysis"]
async def execute_task(self, task):
text = task["task"]
return {
"status": "success",
"output": {"words": len(text.split())},
}
Everything else on this page works identically for both profiles.
Your First Multi-Agent Workflow¶
The following example demonstrates a two-agent pipeline where a Scout gathers raw data and an Analyst processes it.
import asyncio
from jarviscore import Mesh, AutoAgent
class ScoutAgent(AutoAgent):
role = "scout"
capabilities = ["web_research"]
description = "Gathers raw data on a given subject."
system_prompt = "You gather raw, factual data on the subject provided. Be thorough and cite your sources."
class AnalystAgent(AutoAgent):
role = "analyst"
capabilities = ["analysis", "reporting"]
description = "Analyses data and produces structured intelligence reports."
system_prompt = "You receive raw research data and produce a structured intelligence report with clear conclusions."
async def main():
mesh = Mesh()
mesh.add(ScoutAgent)
mesh.add(AnalystAgent)
await mesh.start()
try:
results = await mesh.workflow("vector-database-report", [
{
"agent": "scout",
"task": "Gather sourced evidence on the current state of vector database technology.",
},
{
"agent": "analyst",
"task": "Analyse the upstream evidence and produce a structured report.",
"depends_on": [0],
},
])
print(results[-1]["output"])
finally:
await mesh.stop()
if __name__ == "__main__":
asyncio.run(main())
Choose How Work Runs¶
| API | Use it when | Planning owner | Redis required |
|---|---|---|---|
mesh.run_task() |
One known agent should handle one bounded task | Your application | No |
agent.execute_goal() |
One AutoAgent should plan and execute a multi-step goal internally |
That AutoAgent | No |
mesh.workflow() |
Your application knows the agents, steps, and dependencies | Your application | No |
mesh.execute_goal() |
A source goal should become durable, capability-addressed work claimed by peers | Temporary planning lease | Yes |
Rule of thumb: if your code manually passes one agent's output into another
agent's prompt, use mesh.workflow(). If the steps are not
known in advance and several peers should own the work, use
mesh.execute_goal().
Next Steps¶
Once you have a working agent, add infrastructure incrementally based on your requirements.
Add persistent memory so agents retain context across runs:
Add cross-session semantic memory with Athena:
Add third-party service credentials for agents that call external APIs:
jarviscore nexus init
jarviscore nexus register github --client-id=YOUR_ID --client-secret=YOUR_SECRET
Enable multi-node distributed execution with P2P:
P2P_ENABLED=true
REDIS_URL=redis://localhost:6379/0
JARVISCORE_BIND_HOST=0.0.0.0
JARVISCORE_BIND_PORT=7946
# Set on nodes joining an existing seed node:
JARVISCORE_SEED_NODES=192.168.1.10:7946
Each process needs its own bind port. Redis is the shared work/state plane; SWIM and ZMQ provide cross-node discovery and communication.
Continue in this order:
- Read Concepts for the runtime mental model.
- Follow Guides to choose an agent profile and execution API.
- Use Workflow DAGs when your application knows the steps.
- Use Durable Goal Execution when peers should derive and claim work from a source goal.
- Apply the Production Deployment checklist before running unattended workloads.
See the Configuration Reference for every environment variable and default.