Skip to main content

Multimodal Assistant. Human Interface for computers.

Project description

License Commit Activity Last Commit Downloads Stars

https://github.com/user-attachments/assets/9360dfeb-a471-49c3-bbdc-72b32cc8eaeb

Project is in its early stage of development. Optimisations & safety not guaranteed until first version release.

openmacro is a multimodal personal agent that allows LLMs to run code locally. openmacro aims to act as a personal agent capable of completing and automating simple to complex tasks autonomously via self prompting.

This provides a cli natural-language interface for you to:

  • Complete and automate simple to complex tasks.
  • Analyse and plot data.
  • Browse the web for the latest information.
  • Manipulate files including photos, videos, PDFs, etc.

At the moment, openmacro only supports API keys for models powered by SambaNova. Why? Because it’s free, fast, and reliable, which makes it ideal for testing as the project grows! Support for other hosts such as OpenAI and Anthropic is planned to be added in future versions.

This project is heavily inspired by Open Interpreter ❤️

Quick Start

To get started with openmacro, get a free API key by creating an account at https://cloud.sambanova.ai/.

Next, install and start openmacro by running:

pip install openmacro
macro --api_key "YOUR_API_KEY"

Not working? Raise an issue here or try this out instead:

py -m pip install openmacro
py -m openmacro --api_key "YOUR_API_KEY"

Note: You only need to pass --api_key once! Next time simply call macro or py -m openmacro.

Profiles

openmacro supports cli args and customised settings! You can view arg options by running:

macro --help

To add your own personalised settings and save it for the future, run:

macro --profile "path\to\profile" --save

Openmacro supports custom profiles in JSON, TOML, YAML and Python:

Python Profiles in `python` allow direct customisation and type safety!

What your profile.py might look like:

# imports
from openmacro.profile import Profile
from openmacro.extensions import BrowserKwargs, EmailKwargs

# profile setup
profile: Profile = Profile(
    user = { 
        "name": "Amor", 
        "version": "1.0.0"
    },
    assistant = {
        "name": "Basil",
        "personality": "You have a kind, deterministic and professional attitude towards your work and respond in a formal, yet casual manner.",
        "messages": [],
        "breakers": ["the task is done.", 
                     "the conversation is done."]
    },
    safeguards = { 
        "timeout": 16, 
        "auto_run": True, 
        "auto_install": True 
    },
    paths = { 
        "prompts": "core/prompts",
    },
    extensions = {
    # type safe kwargs
        "Browser": BrowserKwargs(headless=False, engine="google"),
        "Email": EmailKwargs(email="amor.budiyanto@gmail.com", password="password")
    },
    config = {
        "verbose": True,
        "conversational": True,
        "dev": False
    },
    languages = {
    # specify custom paths to languages or add custom languages for openmacro
      "python": ["C:\Windows\py.EXE", "-c"],
      "rust": ["cargo", "script", "-e"] # not supported by default, but can be added!
    },
    tts = {
    # powered by KoljaB/RealtimeSTT
    # options ["SystemEngine", "GTTSEngine", "OpenAIEngine"]
      "enabled": True,
      "engine": "OpenAIEngine",
      "api_key": "sk-example"
    }
)

And can be extended if you want to build your own app with openmacro:

...

async def main():
    from openmacro.core import Openmacro

    macro = Openmacro(profile)
    macro.llm.messages = []

    async for chunk in macro.chat("Plot an exponential graph for me!", stream=True):
        print(chunk, end="")

import asyncio
asyncio.run(main)
JSON

What your profile.json might look like:

{
    "user": {
        "name": "Amor",
        "version": "1.0.0"
    },
    "assistant": {
        "name": "Basil",
        "personality": "You have a kind, deterministic and professional attitude towards your work and respond in a formal, yet casual manner.",
        "messages": [],
        "breakers": ["the task is done.", "the conversation is done."]
    },
    "safeguards": {
        "timeout": 16,
        "auto_run": true,
        "auto_install": true
    },
    "paths": {
        "prompts": "core/prompts"
    },
    "extensions": {
        "Browser": {
            "headless": false,
            "engine": "google"
        },
        "Email": {
            "email": "amor.budiyanto@gmail.com",
            "password": "password"
        }
    },
    "config": {
        "verbose": true,
        "conversational": true,
        "dev": false
    },
    "languages": {
        "python": ["C:\\Windows\\py.EXE", "-c"],
        "rust": ["cargo", "script", "-e"]
    },
    "tts": {
        "enabled": true,
        "engine": "OpenAIEngine",
        "api_key": "sk-example"
        
    }
}
TOML

What your profile.toml might look like:

[user]
name = "Amor"
version = "1.0.0"

[assistant]
name = "Basil"
personality = "You have a kind, deterministic and professional attitude towards your work and respond in a formal, yet casual manner."
messages = []
breakers = ["the task is done.", "the conversation is done."]

[safeguards]
timeout = 16
auto_run = true
auto_install = true

[paths]
prompts = "core/prompts"

[extensions.Browser]
headless = false
engine = "google"

[extensions.Email]
email = "amor.budiyanto@gmail.com"
password = "password"

[config]
verbose = true
conversational = true
dev = false

[languages.python]
0 = "C:\\Windows\\py.EXE"
1 = "-c"

[languages.rust]
0 = "cargo"
1 = "script"
2 = "-e"

[tts]
enabled = true
engine = "SystemEngine"
YAML

What your profile.yaml might look like:

user:
  name: "Amor"
  version: "1.0.0"

assistant:
  name: "Basil"
  personality: "You have a kind, deterministic and professional attitude towards your work and respond in a formal, yet casual manner."
  messages: []
  breakers:
    - "the task is done."
    - "the conversation is done."

safeguards:
  timeout: 16
  auto_run: true
  auto_install: true

paths:
  prompts: "core/prompts"

extensions:
  Browser:
    headless: false
    engine: "google"
  Email:
    email: "amor.budiyanto@gmail.com"
    password: "password"

config:
  verbose: true
  conversational: true
  dev: false

languages:
  python: 
    - "C:\\Windows\\py.EXE"
    - "-c"
  rust: 
    - "cargo"
    - "script"
    - "-e"

tts:
  enabled: true
  engine: "SystemEngine"

You can also switch between profiles by running:

macro --switch "amor"

Profiles also support versions for modularity (uses the latest version by default).

macro --switch "amor:1.0.0"

Note: All profiles are isolated. LTM from different profiles and versions are not shared.

To view all available profiles run:

macro --profiles

Extensions

openmacro supports custom RAG extensions for modularity and theoretically infinite capabilities! By default, the browser and email extensions are installed.

Writing Extensions

Write extensions using the template:

from typing import TypedDict
class ExtensionKwargs(TypedDict):
    ...

class Extensionname:
    def __init__(self):
        ...
      
    @staticmethod
    def load_instructions() -> str:
        return "<instructions>"
        

You can find examples here.

Note, classname should not be camelcase, but titlecase instead.

Note, creating a type-safe kwargs typeddict is optional but recommended. If extesions does not contain a kwarg class, use:

from openmacro.utils import Kwargs

Upload your code to pypi for public redistribution using twine and poetry. To add it to openmacro.extensions for profiles and openmacro.apps for the AI to use, run:

omi install <module_name>

or

pip install <module_name>
omi add <module_name> 

You can test your extensions by installing it locally:

omi install .

Todo's

  • AI Interpreter
  • Web Search Capability
  • Async Chunk Streaming
  • API Keys Support
  • Profiles Support
  • Extensions API
  • WIP TTS & STT
  • WIP Cost Efficient Long Term Memory & Context Manager
  • Semantic File Search
  • Optional Telemetry
  • Desktop, Android & IOS App Interface

Currently Working On

  • Cost efficient long term memory and conversational context managers through vector databases. Most likely powered by ChromaDB.

  • Hooks API and Live Code Output Streaming

Contact

You can contact me at amor.budiyanto@gmail.com

Contributions

This is my first major open-source project, so things might go wrong, and there is always room for improvement. You can contribute by raising issues, helping with documentation, adding comments, suggesting features or ideas, etc. Your help is greatly appreciated!

Support

You can support this project by writing custom extensions for openmacro! openmacro aims to be community-powered, as its limitations are based on its capabilities. More extensions mean better chances of completing complex tasks. I will create an official verified list of openmacro extensions sometime in the future!

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

openmacro-0.2.9.tar.gz (29.3 kB view details)

Uploaded Source

File details

Details for the file openmacro-0.2.9.tar.gz.

File metadata

  • Download URL: openmacro-0.2.9.tar.gz
  • Upload date:
  • Size: 29.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for openmacro-0.2.9.tar.gz
Algorithm Hash digest
SHA256 addbc097f5f92243409af1378bbb5ac8caf0ba6a839346f86cad713960c326da
MD5 17641eae79a96a79e495417ef9ed9324
BLAKE2b-256 4849d45af1cc2bd28ceeba5eea9cbfeb1009bcd78b5581712569fa1ef8b9211e

See more details on using hashes here.

Supported by

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