Skip to main content

Agentic framework with desk/worker/workforce primitives

Project description

Blackgeorge: Python Agent Framework for LLM Tool-Calling and Multi-Agent Orchestration

PyPI version License: MIT Python 3.12+ zread

A code-first Python framework for building AI agents, tool-calling workflows, and multi-agent systems with explicit APIs, structured outputs, safe tool execution, and pause/resume flows.

What you can build with this Python AI agent framework

  • tool-calling AI agents with validated inputs
  • multi-agent teams that coordinate work
  • agentic workflows with parallel and sequential steps
  • LLM services with durable run state, events, and resume

Core primitives for agent orchestration

  • Desk: orchestrates runs, events, and persistence
  • Worker: single-agent execution with tools and memory
  • Workforce: multi-worker coordination and management modes
  • Workflow: step-based flows with parallel execution

Feature highlights for tool-calling and multi-agent workflows

  • tool execution with confirmation, user input, timeouts, retries, and cancellation
  • structured output support with Pydantic models
  • event streaming and run store persistence
  • collaboration primitives: channel messaging and blackboard state
  • memory stores including vector memory with configurable chunking
  • LiteLLM adapter for OpenAI-compatible model providers
  • MCP tool integration for external tool providers

Why Blackgeorge

If you want a LangChain alternative that stays close to the metal, Blackgeorge emphasizes small, explicit primitives and clear execution flow. Compared to CrewAI or AutoGen, it keeps orchestration and tool calling predictable while still supporting multi-agent systems, workflows, and OpenAI-compatible function calling through LiteLLM.

Use cases and examples

  • coding agents that edit files with confirmation and audit trails
  • research and summarization agents with structured outputs
  • support triage and routing across multiple workers
  • operational workflows that pause for approvals and resume safely

See examples/coding_agent for a full end-to-end example.

Install

uv add blackgeorge

For development setup, see docs/development.md.

Quick Start: build your first AI agent

from blackgeorge import Desk, Worker, Job

desk = Desk(model="openai/gpt-5-nano")
worker = Worker(name="Researcher")
job = Job(input="Summarize this topic", expected_output="A short summary")

report = desk.run(worker, job)
print(report.content)

Documentation

See docs/README.md for the full documentation set. Preview locally with uv run mkdocs serve.

Job input

Job.input is the payload sent to the worker as the user message. If it is not a string, it is serialized to JSON. Use a string for simple requests, or a structured dict when you want explicit fields.

job = Job(
    input={
        "task": "Fix calculator behavior and update tests.",
        "context": "Use tools to inspect the project files.",
        "requirements": [
            "Confirm divide-by-zero behavior with the user.",
            "Confirm empty-average behavior with the user.",
            "Apply changes using tools.",
        ],
    },
    expected_output="Updated project files with consistent behavior.",
)

Workforce

from blackgeorge import Desk, Worker, Workforce, Job

desk = Desk(model="openai/gpt-5-nano")
w1 = Worker(name="Researcher")
w2 = Worker(name="Writer")
workforce = Workforce([w1, w2], mode="managed")

job = Job(input="Create a market report")
report = desk.run(workforce, job)

Workflow

from blackgeorge import Desk, Worker, Job
from blackgeorge.workflow import Step, Parallel

desk = Desk(model="openai/gpt-5-nano")
analyst = Worker(name="Analyst")
writer = Worker(name="Writer")

flow = desk.flow([
    Step(analyst),
    Parallel(Step(writer), Step(analyst)),
])

job = Job(input="Analyze product feedback")
report = flow.run(job)

Streaming

report = desk.run(worker, job, stream=True)

Pause and resume

from blackgeorge import Desk, Worker, Job
from blackgeorge.tools import tool

@tool(requires_confirmation=True)
def risky_action(action: str) -> str:
    return f"ran:{action}"

desk = Desk(model="openai/gpt-5-nano")
worker = Worker(name="Ops", tools=[risky_action])
job = Job(input="run risky")

report = desk.run(worker, job)
if report.status == "paused":
    report = desk.resume(report, True)

Session: multi-turn conversations

from blackgeorge import Desk, Worker

desk = Desk(model="openai/gpt-5-nano")
worker = Worker(name="ChatBot")

session = desk.session(worker)

session.run("My name is Alice")
session.run("What's my name?")

session_id = session.session_id

later_session = desk.session(worker, session_id=session_id)
later_session.run("Where do I live?")

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

blackgeorge-1.1.1.tar.gz (40.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

blackgeorge-1.1.1-py3-none-any.whl (61.2 kB view details)

Uploaded Python 3

File details

Details for the file blackgeorge-1.1.1.tar.gz.

File metadata

  • Download URL: blackgeorge-1.1.1.tar.gz
  • Upload date:
  • Size: 40.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for blackgeorge-1.1.1.tar.gz
Algorithm Hash digest
SHA256 5ff51c484623f809fbe88aac37f23fab5e474cd6874a433a7876ace0b92eae6a
MD5 7ea2e44e6e0769ac80fa57f73326021e
BLAKE2b-256 33de9a63234625d4094d2b408a52a979fcdde47683c11f9d8281c9233e0dfa5d

See more details on using hashes here.

File details

Details for the file blackgeorge-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: blackgeorge-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 61.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for blackgeorge-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 78b2936a78ee870fa5f538210f2ac2c16d5bac1e6c3507bb7a686a7b3750ef5d
MD5 dd3eec789a9e1ffa3c3dfe32e0c30f24
BLAKE2b-256 40972a64b7d4f37e3217c717df38b38e05aa5e953ddbe12a85298d142fe48582

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page