Skip to main content

Axora 🌌

A local-first LLM orchestration library with native support for Hugging Face, PEFT/LoRA, QLoRA — without hiding the model and giving advanced users the full control.

Axora is a thin orchestration layer — not an abstraction barrier.

Why Axora?

Use Axora if you:

  • Want full control over your model (no hidden layers)
  • Prefer explicit agent logic over auto-magic chains
  • Are working locally with Hugging Face / quantized models

Avoid Axora if you:

  • Want plug-and-play integrations (use LangChain)
  • Need production-ready pipelines out of the box

Note:

⚠️ Status

  • Early development — APIs may change
  • Currently focusing on agentic systems (v0.1.5)

⚠️ LM Studio Support

  • Inference only
  • Agent integration coming soon

🤝 Contributing

  • Contributions welcome
  • Please avoid low-quality / spam PRs

Features

  • Local-First: Built for running LLMs on your own hardware efficiently.
  • Native PEFT/QLoRA: Seamless integration with Hugging Face's PEFT for efficient model loading.
  • Persistent Memory: Vector-based memory using FAISS with automatic text embedding (SLM).
  • Strict ReAct Agents: Deterministic agent loops using JSON-based tool calls.
  • Model Transparency: Easy access to the underlying Hugging Face model and tokenizer.

Installation

Using python

pip install Axora

Using Anaconda/Miniforge

conda activate < ENV NAME >
pip install Axora

(Note: Requires Python 3.12+)

Quick Start

#setup imports and optional vector DB
from Axora import Agent, AxoraHFModel, VectorDB, Tool

#Optional
db = VectorDB()
db.add("Information to be added into the vector db to be checked, it will automatically searched up by the model when generating responses")
model = AxoraHFModel(
    model_name ="unsloth/Llama-3.2-3B-Instruct",
    quantization="4bit",
    vector_db=db #optional
)

model.generate("What is an apple?")

# OR

model = AxoraLMSModel()
model.generate("What is an apple")
#define functions for the agent
def add(a,b):
    "Adds 2 numbers together"
    print(f"Adding {a} and {b} via tool call")
    return a + b

def subtract(a,b):
    "Subtracts b from a"
    print(f"Subtracting {b} from {a} via tool call")
    return a - b

tools = [
    Tool(name="add", func=add, description="Adds two numbers together. Input should be in the format: 'a,b' where a and b are numbers."),
    Tool(name="subtract", func=subtract, description="Subtracts b from a. Input should be in the format: 'a,b' where a and b are numbers.")
] 
#Setup and run the agent
agent = Agent(
    "AddSubtract_Agent",
    model, 
    tools=tools,
    description = "An agent for only addition and subtraction tasks."
)

agent.run("what is 1+1?")
# MULTI AGENT setup
# The coordinator model routes tasks between agents based on their descriptions.
def add(a,b):
    "Adds 2 numbers together"
    print(f"Adding {a} and {b} via tool call")
    return a + b

def subtract(a,b):
    "Subtracts b from a"
    print(f"Subtracting {b} from {a} via tool call")
    return a - b

def multiply(a,b):
    "Multiplies 2 numbers together"
    print(f"Multiplying {a} and {b} via tool call")
    return a * b

def divide(a,b):
    "Divides a by b"
    print(f"Dividing {a} by {b} via tool call")
    if b == 0:
        return "Error: Division by zero"
    return a / b

tools1 = [
    Tool(name="add", func=add, description="Adds two numbers together. Input should be in the format: 'a,b' where a and b are numbers."),
    Tool(name="subtract", func=subtract, description="Subtracts b from a. Input should be in the format: 'a,b' where a and b are numbers.")
] 

tools2 = [
    Tool(name="multiply", func=multiply, description="Multiplies two numbers together. Input should be in the format: 'a,b' where a and b are numbers."),
    Tool(name="divide", func=divide, description="Divides a by b. Input should be in the format: 'a,b' where a and b are numbers."),
]

agent1 = Agent(
    "AddSubtract_Agent",
    model, 
    tools=tools1,
    description = "An agent for only addition and subtraction tasks."
)

agent2 = Agent(
    "MultiplyDivide_Agent",
    model, 
    tools=tools2,
    description = "An agent only for multiplication and division tasks."
)

#create a multi agent system

MOA = MultiAgent(agents=[agent1,agent2],coordinator_model=model)
response = MOA.run("What is the result of (15 + 5) * (10 - 2)?")
print("Final Response from MultiAgent System: ",response)

Project Structure

  • Axora/chains/: Agentic workflows and ReAct implementations.
  • Axora/model/: Hugging Face model loading and generation wrappers.
  • Axora/memory/: FAISS-backed persistent vector storage.
  • Axora/tools/: Tool registry and definition system.
  • Axora/experimental/: Experimental features do not use these in production , these will be changed / deleted later on.

Non-goals

This library does not aim to be a full ML framework or replace existing tools like LangChain. It focuses on providing a clean, minimal interface for local-first LLM orchestration.

Notes for devlopers

in order to compile Axora into a python package , please run:

python -m build

Download files

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

Source Distribution

axora-0.1.4.1.tar.gz (22.5 kB view details)

Uploaded Source

Built Distribution

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

axora-0.1.4.1-py3-none-any.whl (28.3 kB view details)

Uploaded Python 3

File details

Details for the file axora-0.1.4.1.tar.gz.

File metadata

  • Download URL: axora-0.1.4.1.tar.gz
  • Upload date:
  • Size: 22.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for axora-0.1.4.1.tar.gz
Algorithm Hash digest
SHA256 9167bdcbd6d703fa1c0e3fc60aa8e86a572067462a9134a9463470f4afe56db4
MD5 7dbf43379db1c4ae5e3a4694175ce8e9
BLAKE2b-256 6b1104ff991923189a5112cd091d7aa60688ea137000c433ddd4589c284b0398

See more details on using hashes here.

File details

Details for the file axora-0.1.4.1-py3-none-any.whl.

File metadata

  • Download URL: axora-0.1.4.1-py3-none-any.whl
  • Upload date:
  • Size: 28.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for axora-0.1.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 05e24d76a9e9951ae6726acafca2794733f94c4e2c598e2b9d8866f87124e750
MD5 7e74b0710432f1951a4834ba398c35e7
BLAKE2b-256 f5dbcae7c5e71c913bc3ef450142c3705c8a5bbd9942e1d9a4bef5460e91fbc2

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 Sentry Error logging StatusPage Status page