A Universal AI Command Router Built for Maximum Flexibility
NeuroGO is a lightweight, modular AI command router built in Go that routes natural language prompts to AI providers. Think HTTP router, but for AI - route conversational commands to any AI model with a simple, unified interface.
- Provider Agnostic: Works with OpenAI, Gemini, DeepSeek, HuggingFace, Ollama, and any future AI provider
- Zero Lock-in: Switch between providers without changing application logic
- Familiar Patterns: If you know HTTP routers, you already understand NeuroGO
- Flexible Deployment: Local models, cloud APIs, or hybrid setups
# Install Ollama for local AI
curl -fsSL https://ollama.ai/install.sh | sh
ollama serve && ollama pull llama3.1
# Run NeuroGO
git clone https://github.com/aldotobing/neurogo.git
cd neurogo && make setup && make dev
# Visit http://localhost:8080
git clone https://github.com/aldotobing/neurogo.git
cd neurogo && make setup
# Configure providers in .env
echo "OPENAI_API_KEY=sk-your-key" >> .env
echo "DEEPSEEK_API_KEY=your-key" >> .env
make dev
git clone https://github.com/aldotobing/neurogo.git
cd neurogo && cp .env.example .env
make docker-run
NeuroGO allows you to switch between AI providers dynamically or let the system auto-select the best provider for each task.
Provider | API Key Required | Best For | Status Check |
---|---|---|---|
OpenAI | ✅ OPENAI_API_KEY | General tasks, production | use openai |
DeepSeek | ✅ DEEPSEEK_API_KEY | Reasoning, analysis | use deepseek |
Gemini | ✅ GEMINI_API_KEY | Translation, multimodal | use gemini |
Ollama | ❌ Local setup | Development, privacy | use ollama |
HuggingFace | ✅ HUGGINGFACE_API_KEY | Specialized models | use huggingface |
# Switch to DeepSeek for all subsequent commands
POST /api/process
{"prompt": "use deepseek"}
# Switch to OpenAI
{"prompt": "use openai"}
# Switch to Gemini
{"prompt": "use gemini"}
# Switch to Ollama (local)
{"prompt": "use ollama"}
# Let the system choose the best provider for each task
{"prompt": "use auto"}
# Use DeepSeek for this command only
{"prompt": "with deepseek explain quantum computing"}
# Use OpenAI for this command only
{"prompt": "with openai write a poem about nature"}
# List all available providers
{"prompt": "list providers"}
# Check current provider
{"prompt": "current provider"}
# System status
{"prompt": "status"}
# 1. Check what providers you have
curl -X POST http://localhost:8080/api/process \
-H "Content-Type: application/json" \
-d '{"prompt": "list providers"}'
# 2. Switch to a specific provider
curl -X POST http://localhost:8080/api/process \
-H "Content-Type: application/json" \
-d '{"prompt": "use deepseek"}'
# 3. Now all commands use DeepSeek
curl -X POST http://localhost:8080/api/process \
-H "Content-Type: application/json" \
-d '{"prompt": "translate hello to Spanish"}'
# 4. Compare with another provider
curl -X POST http://localhost:8080/api/process \
-H "Content-Type: application/json" \
-d '{"prompt": "with openai translate hello to Spanish"}'
# 5. Switch back to auto mode
curl -X POST http://localhost:8080/api/process \
-H "Content-Type: application/json" \
-d '{"prompt": "use auto"}'
When in auto mode, NeuroGO automatically selects the best provider based on task type:
- Translation: Gemini → OpenAI → DeepSeek → Ollama
- Reasoning: DeepSeek → OpenAI → Gemini → Ollama
- Coding: Ollama → OpenAI → DeepSeek → Gemini
- Summarization: OpenAI → DeepSeek → Gemini → Ollama
- General: OpenAI → DeepSeek → Gemini → Ollama
Provider | API Key | Best For | Example Commands |
---|---|---|---|
OpenAI | Required | General tasks, production | summarize [text] |
DeepSeek | Required | Reasoning, analysis | think about [topic] , reason through [problem] |
Gemini | Required | Translation, multimodal | translate [text] to [language] |
HuggingFace | Required | Specialized models | analyze sentiment of [text] |
Ollama | None (local) | Development, privacy | chat [message] , generate code for [task] |
Start server and visit http://localhost:8080 for interactive testing.
package main
import (
"fmt"
"log"
"os"
"errors"
"github.com/joho/godotenv"
"github.com/aldotobing/neurogo/router"
"github.com/aldotobing/neurogo/providers"
"github.com/aldotobing/neurogo/config"
)
func main() {
// Load environment variables
godotenv.Load()
// Initialize the router
r := router.New()
// Configure a provider
openAIProvider := providers.NewOpenAI(os.Getenv("OPENAI_API_KEY"))
ollamaProvider := providers.NewOllama(os.Getenv("OLLAMA_HOST"))
// Register a route
r.Handle("summarize *", func(ctx *router.Context) error {
response, err := openAIProvider.Complete(ctx.Captures[0], config.CompletionOptions{
Model: "gpt-3.5-turbo",
SystemPrompt: "You are a summarization expert.",
})
if err != nil {
return err
}
ctx.Response = response
return nil
})
// Process a prompt
result, err := r.Process("summarize the latest AI research papers")
if err != nil {
log.Fatal(err)
}
fmt.Println(result)
}
\`\`\`
### REST API
\`\`\`bash
curl -X POST http://localhost:8080/api/process \
-H "Content-Type: application/json" \
-d '{"prompt": "summarize AI developments"}'
\`\`\`
### WebSocket
\`\`\`javascript
const ws = new WebSocket('ws://localhost:8080/ws');
ws.send(JSON.stringify({
type: 'process',
prompt: 'translate hello to Spanish'
}));
\`\`\`
## 🔧 **Configuration**
Create `.env` file (add only what you have):
\`\`\`env
# Local
OLLAMA_HOST=http://localhost:11434
# Cloud APIs
OPENAI_API_KEY=sk-your-key
DEEPSEEK_API_KEY=your-key
GEMINI_API_KEY=your-key
HUGGINGFACE_API_KEY=your-key
\`\`\`
## 🎯 **Routing Patterns**
\`\`\`go
// Exact match
r.Handle("help", handler)
// Single capture
r.Handle("summarize *", handler)
// Input: "summarize this article" → ctx.Captures[0] = "this article"
// Multiple captures
r.Handle("translate * to *", handler)
// Input: "translate hello to Spanish" → ctx.Captures[0] = "hello", ctx.Captures[1] = "Spanish"
\`\`\`
## ➕ **Adding New AI Providers**
### Step 1: Implement Provider Interface
Create `providers/newprovider.go`:
\`\`\`go
package providers
import (
"github.com/aldotobing/neurogo/config"
"net/http"
"errors"
"log"
"os"
)
type NewProvider struct {
apiKey string
client *http.Client
}
func NewNewProvider(apiKey string) *NewProvider {
return &NewProvider{
apiKey: apiKey,
client: &http.Client{},
}
}
func (p *NewProvider) Complete(prompt string, options config.CompletionOptions) (string, error) {
// 1. Build request to your AI service
request := buildRequest(prompt, options)
// 2. Make HTTP call
response, err := p.client.Do(request)
if err != nil {
return "", err
}
// 3. Parse and return response
return parseResponse(response)
}
func (p *NewProvider) Stream(prompt string, options config.CompletionOptions, callback func(chunk string)) error {
// Implement streaming if supported
return errors.New("streaming not implemented")
}
func (p *NewProvider) IsAvailable() bool {
return p.apiKey != ""
}
func (p *NewProvider) GetName() string {
return "NewProvider"
}
\`\`\`
### Step 2: Register Provider
Add to `cmd/server/main.go` in `setupProviders()` function:
\`\`\`go
func setupProviders(r *router.Router) {
// ... existing providers ...
// Add your new provider
if apiKey := os.Getenv("NEWPROVIDER_API_KEY"); apiKey != "" {
newProvider := providers.NewNewProvider(apiKey)
if newProvider.IsAvailable() {
log.Println("✅ NewProvider configured")
r.Handle("your command pattern *", func(ctx *router.Context) error {
response, err := newProvider.Complete(ctx.Captures[0], config.CompletionOptions{
Model: "your-model-name",
})
if err != nil {
return err
}
ctx.Response = response
return nil
})
}
}
}
\`\`\`
### Step 3: Update Environment
Add to `.env.example`:
\`\`\`env
# New Provider Configuration
NEWPROVIDER_API_KEY=your_new_provider_api_key_here
\`\`\`
### Step 4: Update Documentation
Add to the provider table in README and help command.
**That's it!** Your new provider is now integrated with automatic detection, health checks, and routing.
## 🛠️ **Development**
\`\`\`bash
make help # Show all commands
make setup # Setup environment
make dev # Run with hot reload
make test # Run tests
make build # Build binary
make docker-run # Run with Docker
\`\`\`
## 🏗️ **Project Structure**
\`\`\`
neurogo/
├── cmd/server/ # Server entry point
├── providers/ # AI provider implementations ← Add new providers here
. ├── router/ # Core routing logic ├── config/ # Configuration management ├── server/ # HTTP/WebSocket server ├── web/ # Playground UI └── Makefile # Build automation
\`\`\`
## 📚 **Examples**
### Multi-Provider Routing
\`\`\`go
// Use different providers for different tasks
r.Handle("summarize *", openAIHandler) // OpenAI for summaries
r.Handle("reason through *", deepSeekHandler) // DeepSeek for reasoning
r.Handle("translate * to *", geminiHandler) // Gemini for translation
r.Handle("chat *", ollamaHandler) // Ollama for general chat
\`\`\`
### Provider Fallbacks
\`\`\`go
r.Handle("ask *", func(ctx *router.Context) error {
// Try providers in order of preference
if openAI.IsAvailable() {
return openAI.Complete(ctx.Captures[0], options)
}
if ollama.IsAvailable() {
return ollama.Complete(ctx.Captures[0], options)
}
return errors.New("no providers available")
})
\`\`\`
## 🐳 **Docker Support**
\`\`\`yaml
# docker-compose.yml
version: '3.8'
services:
neurogo:
build: .
ports:
- "8080:8080"
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
- DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}
depends_on:
- ollama
ollama:
image: ollama/ollama:latest
ports:
- "11434:11434"
\`\`\`
## 🤝 **Contributing**
1. Fork the repository
2. Create feature branch (`git checkout -b feature/new-provider`)
3. Add provider implementation in `providers/`
4. Register in `cmd/server/main.go`
5. Add tests and documentation
6. Submit pull request
## 📄 **License**
MIT License - see LICENSE file for details.
## 🆘 **Support**
- 📖 **Documentation**: Check code examples and comments
- 🐛 **Issues**: Report bugs on GitHub Issues
- 💬 **Discussions**: Use GitHub Discussions for questions
---
**Built with ❤️ by [aldotobing](https://github.com/aldotobing)**
*NeuroGO: Where Natural Language Meets Intelligent Routing*