Natural Language Agreements
Go to file
ngoc 2efc63651b
fix: update build
2026-02-02 15:50:05 +07:00
.vscode Update to new version ts sdk, update readme 2026-01-02 16:30:17 +07:00
cli fix: update build 2026-02-02 15:50:05 +07:00
tests Update ts package to newest version 2026-01-18 13:46:52 +07:00
.env.example Refactor nla cli and add websearch 2026-01-18 13:26:38 +07:00
.gitignore feat: switch network 2026-01-26 11:37:58 +07:00
.npmignore npm cli app 2026-01-26 04:15:56 +07:00
INSTALL.md npm cli app 2026-01-26 04:15:56 +07:00
README.md feat: switch network 2026-01-26 11:37:58 +07:00
bun.lock feat: add base-sepolia 2026-02-01 13:22:22 +07:00
index.ts Move nla to root dir and export from index.ts 2026-01-02 11:31:17 +07:00
nla.ts Refactor nla cli and add websearch 2026-01-18 13:26:38 +07:00
package.json fix: update build 2026-02-02 15:50:05 +07:00
tsconfig.build.json npm cli app 2026-01-26 04:15:56 +07:00
tsconfig.json npm cli app 2026-01-26 04:15:56 +07:00

README.md

natural-language-agreements

Prerequisites

  • Bun - Fast all-in-one JavaScript runtime
  • Foundry - Ethereum development toolkit (for Anvil)

Setup Instructions

  1. Clone the repository:
# Navigate to your projects directory
cd ~/Desktop  # or your preferred location

# Clone this repository
git clone https://github.com/arkhai-io/natural-language-agreements.git
cd natural-language-agreements
  1. Install dependencies:
bun install
  1. Install the nla CLI globally (optional but recommended):
# Link the CLI to make it available globally
bun link

# Now you can use 'nla' from anywhere!
nla help

Note: If you don't install globally, you can still use the CLI with bun run cli/index.ts instead of nla.

Quick Start

Option 1: Automated Setup (Easiest - 1 command!)

Set your OpenAI API key and run everything:

export OPENAI_API_KEY=sk-your-key-here
nla dev

This will:

  • Check all prerequisites
  • Start Anvil (local blockchain)
  • Deploy all contracts
  • Deploy and distribute mock ERC20 tokens
  • Start the oracle
  • Ready to test!

To stop everything:

nla stop

Note: If you haven't installed the CLI globally yet, run bun link first, or use bun run cli/index.ts dev instead.

Option 2: Manual Setup (Step by Step)

1. Start Local Blockchain

# Terminal 1: Start Anvil
anvil

2. Deploy Contracts

# Terminal 2: Deploy to localhost
export OPENAI_API_KEY=sk-your-key-here
nla deploy

This creates cli/deployments/devnet.json with all contract addresses.

3. Start Oracle

# Terminal 2 (or 3): Start oracle
nla start-oracle

Watch the oracle terminal - you'll see it process arbitration requests in real-time!

CLI Tools

The nla CLI provides a unified interface for all Natural Language Agreement operations with support for multiple LLM providers.

Supported LLM Providers

The oracle supports multiple AI providers for arbitration:

  1. OpenAI (default)

    • Models: gpt-4o, gpt-4o-mini, gpt-4-turbo, gpt-3.5-turbo
    • API Key: Get from OpenAI Platform
    • Environment Variable: OPENAI_API_KEY
  2. Anthropic (Claude)

    • Models: claude-3-5-sonnet-20241022, claude-3-opus-20240229, claude-3-sonnet-20240229
    • API Key: Get from Anthropic Console
    • Environment Variable: ANTHROPIC_API_KEY
  3. OpenRouter

    • Models: Any model available on OpenRouter (e.g., openai/gpt-4, anthropic/claude-3-opus)
    • API Key: Get from OpenRouter
    • Environment Variable: OPENROUTER_API_KEY

Installation

To use the nla command globally:

# From the natural-language-agreements directory
bun link

# Verify installation
nla help

Alternative (without global install):

# Use the CLI directly
bun run cli/index.ts help

# Or use npm scripts
bun run setup    # Same as: nla dev
bun run deploy   # Same as: nla deploy

For a complete guide to all CLI commands and options, see CLI Documentation.

Quick CLI Examples

# Create an escrow with OpenAI (default)
nla escrow:create \
  --demand "The sky is blue" \
  --amount 10 \
  --token 0xa513e6e4b8f2a923d98304ec87f64353c4d5c853 \
  --oracle 0x70997970C51812dc3A010C7d01b50e0d17dc79C8

# Create an escrow with custom arbitration settings
nla escrow:create \
  --demand "Deliver package by Friday" \
  --amount 100 \
  --token 0xa513e6e4b8f2a923d98304ec87f64353c4d5c853 \
  --oracle 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 \
  --arbitration-provider "Anthropic" \
  --arbitration-model "claude-3-5-sonnet-20241022"

# Fulfill an escrow
nla escrow:fulfill \
  --escrow-uid 0x... \
  --fulfillment "The sky appears blue today" \
  --oracle 0x70997970C51812dc3A010C7d01b50e0d17dc79C8

# Check escrow status
nla escrow:status --escrow-uid 0x...

# Collect approved escrow
nla escrow:collect \
  --escrow-uid 0x... \
  --fulfillment-uid 0x...

Deployment to Other Networks

Sepolia Testnet

# 1. Get Sepolia ETH from faucet
# 2. Set your keys
export DEPLOYER_PRIVATE_KEY=0x...
export ORACLE_PRIVATE_KEY=0x...
export OPENAI_API_KEY=sk-...

# 3. Deploy
nla deploy sepolia https://sepolia.infura.io/v3/YOUR-KEY

# 4. Start oracle
nla start-oracle sepolia

Mainnet

# ⚠️ PRODUCTION - Be careful!
export DEPLOYER_PRIVATE_KEY=0x...
export ORACLE_PRIVATE_KEY=0x...
export OPENAI_API_KEY=sk-...

# Deploy
nla deploy mainnet https://mainnet.infura.io/v3/YOUR-KEY

# Start oracle (consider running as a service)
nla start-oracle mainnet

Available Commands

The nla CLI provides unified access to all functionality:

nla dev                       # Complete local setup (all-in-one)
nla deploy [network] [rpc]    # Deploy contracts to network
nla start-oracle [network]    # Start oracle for network
nla stop                      # Stop all services

nla escrow:create [options]   # Create a new escrow
nla escrow:fulfill [options]  # Fulfill an existing escrow
nla escrow:collect [options]  # Collect an approved escrow
nla escrow:status [options]   # Check escrow status

nla help                      # Show help

Escrow Creation Options

When creating an escrow, you can customize the arbitration settings:

nla escrow:create \
  --demand "Your natural language demand" \
  --amount <token-amount> \
  --token <erc20-token-address> \
  --oracle <oracle-address> \
  --arbitration-provider "OpenAI|Anthropic|OpenRouter" \  # Optional, default: OpenAI
  --arbitration-model "model-name" \                       # Optional, default: gpt-4o-mini
  --arbitration-prompt "Custom prompt template"            # Optional

Default Arbitration Settings:

  • Provider: OpenAI
  • Model: gpt-4o-mini
  • Prompt: Standard evaluation template

NPM Scripts (alternative):

bun run setup                 # Same as: nla dev
bun run deploy                # Same as: nla deploy
bun run oracle                # Same as: nla start-oracle
bun run stop                  # Same as: nla stop

Monitoring

View Oracle Logs

# If using systemd
sudo journalctl -u nla-oracle -f

# If using nohup
tail -f oracle.log

# If using Anvil
tail -f anvil.log

Check Oracle Status

# Check if oracle is running
ps aux | grep "bun run oracle"

# Check if Anvil is running
lsof -i :8545

Usage

Running Tests

bun test

Development Mode

To run:

bun run index.ts

Development

This project was created using bun init in bun v1.2.20. Bun is a fast all-in-one JavaScript runtime.

Project Structure

natural-language-agreements/
├── cli/                          # CLI tools and server components
│   ├── index.ts                  # Main CLI entry point (nla command)
│   ├── README.md                 # CLI documentation
│   ├── client/                   # User-facing escrow tools
│   │   ├── create-escrow.ts      # Create escrow CLI with arbitration config
│   │   ├── fulfill-escrow.ts     # Fulfill escrow CLI
│   │   └── collect-escrow.ts     # Collect escrow CLI
│   ├── server/                   # Server-side components
│   │   ├── deploy.ts             # Contract deployment script
│   │   └── oracle.ts             # Multi-provider oracle service
│   ├── scripts/                  # Shell scripts for orchestration
│   │   ├── dev.sh                # Development environment setup
│   │   ├── deploy.sh             # Deployment wrapper
│   │   ├── start-oracle.sh       # Oracle starter
│   │   └── stop.sh               # Cleanup script
│   └── deployments/              # Deployment addresses (generated)
│       ├── devnet.json
│       ├── sepolia.json
│       └── mainnet.json
├── nla.ts                        # Natural Language Agreement client library
│                                 # - Multi-provider LLM support
│                                 # - Arbitration encoding/decoding
│                                 # - OpenAI, Anthropic, OpenRouter integration
├── tests/
│   ├── nla.test.ts               # Basic tests
│   └── nlaOracle.test.ts         # Oracle arbitration tests
├── index.ts                      # Main exports
├── package.json
└── README.md

Troubleshooting

"Cannot find module 'alkahest-ts'"

  • Run bun install to ensure all dependencies are installed
  • Clear the cache: rm -rf node_modules && bun install
  • Check that package.json includes alkahest-ts dependency

"Deployer has no ETH"

  • Fund your deployer account before running deployment
  • For testnets, use a faucet

"Oracle not detecting arbitration requests"

  • Verify RPC URL is correct and accessible
  • Check that EAS contract address matches deployment
  • Ensure oracle has ETH for gas
  • Check polling interval (try lowering it)

"OpenAI API errors"

  • Verify API key is valid and active
  • Check OpenAI usage limits and billing
  • Ensure model name is correct (e.g., "gpt-4o-mini", "gpt-4o")

"Anthropic API errors"

  • Verify ANTHROPIC_API_KEY is set correctly
  • Check Anthropic usage limits and billing
  • Ensure model name is correct (e.g., "claude-3-5-sonnet-20241022")

"Arbitration provider not found"

  • The oracle was configured with a different provider than the escrow
  • Make sure the oracle has the correct API keys for the provider specified in the escrow
  • Supported providers: OpenAI, Anthropic, OpenRouter

"Module resolution errors"

  • Run bun install to ensure alkahest-ts is properly installed
  • Check that you're using the correct version of Bun: bun --version
  • Clear Bun's cache: rm -rf node_modules && bun install

Security Notes

⚠️ Important Security Considerations:

  • Never commit your real private keys to version control
  • Use environment variables or secure secret management for production
  • The .env file is gitignored by default
  • The example private key in .env.example is from Anvil and should NEVER be used in production
  • Keep all API keys secure (OpenAI, Anthropic, OpenRouter):
    • Don't expose them in logs or error messages
    • Use environment variables or secure secret management
    • Rotate keys regularly
    • Monitor usage for unauthorized access
  • Run the oracle in a secure environment with proper access controls
  • For production deployments:
    • Use hardware wallets or secure key management services
    • Implement rate limiting on the oracle
    • Monitor arbitration decisions for anomalies
    • Consider using a multi-signature setup for critical operations

Features

Multi-Provider LLM Support

  • OpenAI (GPT-4, GPT-4o, GPT-3.5-turbo)
  • Anthropic (Claude 3 family)
  • OpenRouter (Access to any model)
  • Configurable per-escrow arbitration settings

🔧 Flexible Configuration

  • Custom arbitration prompts
  • Provider and model selection
  • Default settings with override capability

🚀 Easy Deployment

  • One-command development setup (nla dev)
  • Automated contract deployment
  • Built-in test token distribution

Developer Friendly

  • TypeScript support
  • Comprehensive CLI tools
  • Unified interface for all operations
  • Detailed error messages and logging