Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ cliproxyapi++
# Hot-reload artifacts
.air/


# Configuration
config.yaml
.env
Expand Down Expand Up @@ -56,22 +55,23 @@ _bmad-output/*
.DS_Store
._*
*.bak
server
<<<<<<< HEAD
=======
server
cli-proxy-api-plus-integration-test
# Local worktree shelves (canonical checkout must stay clean)
PROJECT-wtrees/

boardsync
releasebatch
.cache
>>>>>>> a4e4c2b8 (chore: add build artifacts to .gitignore)

# Build artifacts (cherry-picked from fix/test-cleanups)
cliproxyapi++
.air/
boardsync
releasebatch
.cache
logs/
!.gemini/config.yaml

# AI tool artifacts
.claude/
.codex/
.cursor/
.gemini/
.kittify/
.kilocode/
.github/prompts/
.github/copilot-instructions.md
.claudeignore
.llmignore
228 changes: 59 additions & 169 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,70 +1,68 @@
# CLIProxyAPI++ (KooshaPari Fork)
# CLIProxyAPI++

This repository works with Claude and other AI agents as autonomous software engineers.
Agent-native, multi-provider OpenAI-compatible proxy for production and local model routing.

## Quick Start
## Table of Contents

```bash
# Docker
docker run -p 8317:8317 eceasy/cli-proxy-api-plus:latest
- [Key Features](#key-features)
- [Architecture](#architecture)
- [Getting Started](#getting-started)
- [Operations and Security](#operations-and-security)
- [Testing and Quality](#testing-and-quality)
- [Documentation](#documentation)
- [Contributing](#contributing)
- [License](#license)

# Or build from source
go build -o cliproxy ./cmd/cliproxy
./cliproxy --config config.yaml
## Key Features

# Health check
curl http://localhost:8317/health
```
- OpenAI-compatible request surface across heterogeneous providers.
- Unified auth and token handling for OpenAI, Anthropic, Gemini, Kiro, Copilot, and more.
- Provider-aware routing and model conversion.
- Built-in operational tooling for management APIs and diagnostics.

## Architecture

- `cmd/server`: primary API server entrypoint.
- `cmd/cliproxyctl`: operational CLI.
- `internal/`: runtime/auth/translator internals.
- `pkg/llmproxy/`: reusable proxy modules.
- `sdk/`: SDK-facing interfaces.

## Getting Started

### Prerequisites

## Multi-Provider Routing
- Go 1.24+
- Docker (optional)
- Provider credentials for target upstreams

Route OpenAI-compatible requests to any provider:
### Quick Start

```bash
# List models
curl http://localhost:8317/v1/models

# Chat completion (OpenAI)
curl -X POST http://localhost:8317/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "gpt-4o", "messages": [{"role": "user", "content": "Hello"}]}'

# Chat completion (Anthropic)
curl -X POST http://localhost:8317/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "claude-3-5-sonnet", "messages": [{"role": "user", "content": "Hello"}]}'
go build -o cliproxy ./cmd/server
./cliproxy --config config.yaml
```

### Provider Configuration

```yaml
providers:
openai:
api_key: ${OPENAI_API_KEY}
anthropic:
api_key: ${ANTHROPIC_API_KEY}
kiro:
enabled: true
github_copilot:
enabled: true
ollama:
enabled: true
base_url: http://localhost:11434
### Docker Quick Start

```bash
docker run -p 8317:8317 eceasy/cli-proxy-api-plus:latest
```

## Supported Providers
## Operations and Security

- Rate limiting and quota/cooldown controls.
- Auth flows for provider-specific OAuth/API keys.
- CI policy checks and path guards.
- Governance and security docs under `docs/operations/` and `docs/reference/`.

## Testing and Quality

```bash
go test ./...
```

| Provider | Auth | Status |
|----------|------|--------|
| OpenAI | API Key | ✅ |
| Anthropic | API Key | ✅ |
| Azure OpenAI | API Key/OAuth | ✅ |
| Google Gemini | API Key | ✅ |
| AWS Bedrock | IAM | ✅ |
| Kiro (CodeWhisperer) | OAuth | ✅ |
| GitHub Copilot | OAuth | ✅ |
| Ollama | Local | ✅ |
| LM Studio | Local | ✅ |
Quality gates are enforced via repo CI workflows (build/lint/path guards).

## Documentation

Expand All @@ -77,126 +75,18 @@ providers:
## Environment

```bash
export OPENAI_API_KEY="sk-..."
export ANTHROPIC_API_KEY="sk-..."
export CLIPROXY_PORT=8317
cd docs
npm install
npm run docs:dev
npm run docs:build
```

---

## Development Philosophy

### Extend, Never Duplicate

- NEVER create a v2 file. Refactor the original.
- NEVER create a new class if an existing one can be made generic.
- NEVER create custom implementations when an OSS library exists.
- Before writing ANY new code: search the codebase for existing patterns.

### Primitives First

- Build generic building blocks before application logic.
- A provider interface + registry is better than N isolated classes.
- Template strings > hardcoded messages. Config-driven > code-driven.

### Research Before Implementing

- Check pkg.go.dev for existing libraries.
- Search GitHub for 80%+ implementations to fork/adapt.

---

## Library Preferences (DO NOT REINVENT)

| Need | Use | NOT |
|------|-----|-----|
| HTTP router | chi | custom router |
| Logging | zerolog | fmt.Print |
| Config | viper | manual env parsing |
| Validation | go-playground/validator | manual if/else |
| Rate limiting | golang.org/x/time/rate | custom limiter |

---

## Code Quality Non-Negotiables

- Zero new lint suppressions without inline justification
- All new code must pass: go fmt, go vet, golint
- Max function: 40 lines
- No placeholder TODOs in committed code

### Go-Specific Rules

- Use `go fmt` for formatting
- Use `go vet` for linting
- Use `golangci-lint` for comprehensive linting
- All public APIs must have godoc comments

---

## Verifiable Constraints

| Metric | Threshold | Enforcement |
|--------|-----------|-------------|
| Tests | 80% coverage | CI gate |
| Lint | 0 errors | golangci-lint |
| Security | 0 critical | trivy scan |

---

## Domain-Specific Patterns

### What CLIProxyAPI++ Is

CLIProxyAPI++ is an **OpenAI-compatible API gateway** that translates client requests to multiple upstream LLM providers. The core domain is: provide a single API surface that routes to heterogeneous providers with auth, rate limiting, and metrics.

### Key Interfaces

| Interface | Responsibility | Location |
|-----------|---------------|----------|
| **Router** | Request routing to providers | `pkg/llmproxy/router/` |
| **Provider** | Provider abstraction | `pkg/llmproxy/providers/` |
| **Auth** | Credential management | `pkg/llmproxy/auth/` |
| **Rate Limiter** | Throttling | `pkg/llmproxy/ratelimit/` |

### Request Flow

```
1. Client Request → Router
2. Router → Auth Validation
3. Auth → Provider Selection
4. Provider → Upstream API
5. Response ← Provider
6. Metrics → Response
```

### Common Anti-Patterns to Avoid

- **Hardcoded provider URLs** -- Use configuration
- **Blocking on upstream** -- Use timeouts and circuit breakers
- **No fallbacks** -- Implement provider failover
- **Missing metrics** -- Always track latency/cost

---

## Kush Ecosystem

This project is part of the Kush multi-repo system:

```
kush/
├── thegent/ # Agent orchestration
├── agentapi++/ # HTTP API for coding agents
├── cliproxy++/ # LLM proxy (this repo)
├── tokenledger/ # Token and cost tracking
├── 4sgm/ # Python tooling workspace
├── civ/ # Deterministic simulation
├── parpour/ # Spec-first planning
└── pheno-sdk/ # Python SDK
```

---
1. Create a worktree branch.
2. Implement and validate changes.
3. Open a PR with clear scope and migration notes.

## License

MIT License - see LICENSE file
MIT License. See `LICENSE`.
2 changes: 1 addition & 1 deletion cliproxyctl/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (
"time"

cliproxycmd "github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/cmd"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/config"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/config"
)

const responseSchemaVersion = "cliproxyctl.response.v1"
Expand Down
2 changes: 1 addition & 1 deletion cliproxyctl/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"time"

cliproxycmd "github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/cmd"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/config"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/config"
)

func TestRunSetupJSONResponseShape(t *testing.T) {
Expand Down
1 change: 0 additions & 1 deletion cmd/cliproxyctl/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import (

cliproxycmd "github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/cmd"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/config"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/util"
)

const responseSchemaVersion = "cliproxyctl.response.v1"
Expand Down
3 changes: 1 addition & 2 deletions cmd/cliproxyctl/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ import (
"time"

cliproxycmd "github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/cmd"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/config"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/util"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/config"
)

func TestRunSetupJSONResponseShape(t *testing.T) {
Expand Down
4 changes: 2 additions & 2 deletions cmd/codegen/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ const synthTemplate = `// Code generated by github.com/kooshapari/cliproxyapi-pl
package synthesizer

import (
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/config"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/config"
)

// getDedicatedProviderEntries returns the config entries for a dedicated provider.
Expand Down Expand Up @@ -123,7 +123,7 @@ package diff

import (
"fmt"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/config"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/config"
)

// BuildConfigChangeDetailsGeneratedProviders computes changes for generated dedicated providers.
Expand Down
2 changes: 1 addition & 1 deletion cmd/server/config_validate.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"io"
"os"

"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/config"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/config"
"gopkg.in/yaml.v3"
)

Expand Down
26 changes: 13 additions & 13 deletions cmd/server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,19 @@ import (
"time"

"github.com/joho/godotenv"
configaccess "github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/access/config_access"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/auth/kiro"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/buildinfo"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/cmd"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/config"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/logging"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/managementasset"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/misc"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/store"
_ "github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/translator"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/tui"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/usage"
"github.com/kooshapari/cliproxyapi-plusplus/v6/pkg/llmproxy/util"
configaccess "github.com/kooshapari/cliproxyapi-plusplus/v6/internal/access/config_access"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/auth/kiro"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/buildinfo"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/cmd"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/config"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/logging"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/managementasset"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/misc"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/store"
_ "github.com/kooshapari/cliproxyapi-plusplus/v6/internal/translator"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/tui"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/usage"
"github.com/kooshapari/cliproxyapi-plusplus/v6/internal/util"
sdkAuth "github.com/kooshapari/cliproxyapi-plusplus/v6/sdk/auth"
coreauth "github.com/kooshapari/cliproxyapi-plusplus/v6/sdk/cliproxy/auth"
log "github.com/sirupsen/logrus"
Expand Down
Loading
Loading