Skip to content

Commit fbfff3c

Browse files
feat(core): add multi-provider support for prompt optimization
Expand the framework to support OpenAI, Anthropic, Google AI Studio, and Z.ai as optimizer providers alongside OpenRouter. This change introduces specific client implementations, provider-aware environment variable handling, and updated CLI flags to select the active backend. Key changes: - Add Anthropic, OpenAI, Google, and Z.ai client implementations - Implement shared OpenAICompatibleClient for standard endpoints - Update PAGANSOptimizer to handle provider-specific configurations - Enhance CLI with --provider and corresponding environment variables - Add provider-specific Jupyter notebooks and updated documentation
1 parent ed09ac7 commit fbfff3c

27 files changed

Lines changed: 1187 additions & 200 deletions

.env.example

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
11
OPENROUTER_API_KEY=
2-
DEFAULT_PAGANS_OPTIMIZER_MODEL=
3-
OPENROUTER_BASE_URL=
2+
OPENROUTER_BASE_URL=https://openrouter.ai/api/v1
3+
4+
OPENAI_API_KEY=
5+
OPENAI_BASE_URL=https://api.openai.com/v1
6+
7+
GOOGLE_API_KEY=
8+
GOOGLE_BASE_URL=https://generativelanguage.googleapis.com/v1beta/openai
9+
10+
ANTHROPIC_API_KEY=
11+
ANTHROPIC_BASE_URL=https://api.anthropic.com/v1
12+
13+
ZAI_API_KEY=
14+
ZAI_BASE_URL=https://api.z.ai/api/paas/v4
15+
16+
PAGANS_OPTIMIZER_MODEL=

README.md

Lines changed: 70 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@
1414
PAGANS (Prompts Aligned to Guidelines and Normalization System) is a prompt
1515
optimization framework for LLM applications. It adapts prompts to the target
1616
model family automatically so the same prompt can perform better across
17-
OpenAI, Anthropic, Google, and xAI model series through OpenRouter.
17+
OpenAI, Anthropic, Google, and xAI model series.
1818

19-
## Features
19+
## Features
2020

21-
- 🚀 Fast prompt optimization for production workflows
22-
- 🎯 Family-aware optimization for OpenAI, Anthropic, Google, and xAI models
23-
- 🔍 Automatic model-family detection from short and provider-prefixed names
24-
- Async-first API for single, compare, and batch operations
25-
- 🧠 Built-in caching to reduce repeated optimization cost
26-
- 🛠️ CLI support for optimize, compare, and batch workflows
27-
- 🔗 Unified OpenRouter integration path
21+
- Fast prompt optimization for production workflows
22+
- Family-aware optimization for OpenAI, Anthropic, Google, and xAI models
23+
- Automatic model-family detection from short and provider-prefixed names
24+
- Async-first API for single, compare, and batch operations
25+
- Built-in caching to reduce repeated optimization cost
26+
- CLI support for optimize, compare, and batch workflows
27+
- Optimizer provider support for OpenRouter, OpenAI, Google AI Studio, Anthropic, and Z.ai
2828

2929
## Installation
3030

@@ -36,11 +36,12 @@ pip install pagans
3636

3737
```python
3838
import asyncio
39-
from pagans import PAGANSOptimizer
39+
40+
from pagans import PAGANSOptimizer, Provider
4041

4142

4243
async def main() -> None:
43-
async with PAGANSOptimizer() as optimizer:
44+
async with PAGANSOptimizer(provider=Provider.OPENROUTER) as optimizer:
4445
result = await optimizer.optimize(
4546
prompt="Write a robust retry policy for external API calls.",
4647
target_model="openai/gpt-4o",
@@ -51,38 +52,76 @@ async def main() -> None:
5152
asyncio.run(main())
5253
```
5354

54-
Required environment variable:
55+
## Provider Configuration
56+
57+
Set one provider key (or pass `api_key` and `base_url` explicitly).
5558

5659
```bash
60+
# OpenRouter
5761
export OPENROUTER_API_KEY="your-openrouter-api-key"
58-
```
62+
export OPENROUTER_BASE_URL="https://openrouter.ai/api/v1"
5963

60-
Optional environment variables:
64+
# OpenAI
65+
export OPENAI_API_KEY="your-openai-api-key"
66+
export OPENAI_BASE_URL="https://api.openai.com/v1"
6167

62-
```bash
63-
export OPENROUTER_BASE_URL="https://openrouter.ai/api/v1"
68+
# Google AI Studio (Gemini OpenAI-compatible endpoint)
69+
export GOOGLE_API_KEY="your-gemini-api-key"
70+
export GOOGLE_BASE_URL="https://generativelanguage.googleapis.com/v1beta/openai"
71+
72+
# Anthropic
73+
export ANTHROPIC_API_KEY="your-anthropic-api-key"
74+
export ANTHROPIC_BASE_URL="https://api.anthropic.com/v1"
75+
76+
# Z.ai
77+
export ZAI_API_KEY="your-zai-api-key"
78+
export ZAI_BASE_URL="https://api.z.ai/api/paas/v4"
79+
80+
# Optional global override for optimizer model
6481
export PAGANS_OPTIMIZER_MODEL="openai/gpt-4o-mini"
6582
```
6683

84+
### Python Provider Examples
85+
86+
```python
87+
from pagans import PAGANSOptimizer, Provider
88+
89+
# OpenAI as optimizer provider
90+
optimizer = PAGANSOptimizer(provider=Provider.OPENAI)
91+
92+
# Google AI Studio as optimizer provider
93+
optimizer = PAGANSOptimizer(provider=Provider.GOOGLE)
94+
95+
# Anthropic as optimizer provider
96+
optimizer = PAGANSOptimizer(provider=Provider.ANTHROPIC)
97+
98+
# Z.ai as optimizer provider
99+
optimizer = PAGANSOptimizer(provider=Provider.ZAI)
100+
```
101+
67102
## CLI
68103

69104
PAGANS installs a CLI as `pagans`.
70105

71106
```bash
72-
pagans optimize --prompt "Explain quantum computing for beginners" --target-model gpt-4o
107+
pagans --provider openrouter optimize \
108+
--prompt "Explain quantum computing for beginners" \
109+
--target-model gpt-4o
73110
```
74111

75112
```bash
76-
pagans compare \
113+
pagans --provider openai compare \
77114
--prompt "Design an event-driven order system" \
78115
--models "gpt-4o,claude-sonnet-4,gemini-2.5-pro"
79116
```
80117

81118
```bash
82-
pagans batch --prompts-file ./prompts.txt --target-model gemini-2.5-pro
119+
pagans --provider anthropic batch \
120+
--prompts-file ./prompts.txt \
121+
--target-model gemini-2.5-pro
83122
```
84123

85-
## 🎯 Model Family Series
124+
## Model Family Series
86125

87126
PAGANS optimizes prompts for these model families and series:
88127

@@ -93,6 +132,17 @@ PAGANS optimizes prompts for these model families and series:
93132

94133
PAGANS detects the target model family and applies the matching optimization strategy automatically.
95134

135+
## Notebooks
136+
137+
Provider notebook examples are available in [`notebooks/`](./notebooks):
138+
139+
- `pagans_quickstart.ipynb`
140+
- `pagans_openrouter_optimizer.ipynb`
141+
- `pagans_openai_optimizer.ipynb`
142+
- `pagans_google_optimizer.ipynb`
143+
- `pagans_anthropic_optimizer.ipynb`
144+
- `pagans_zai_optimizer.ipynb`
145+
96146
## Links
97147

98148
- Source: https://github.com/abubakarsiddik31/pagans

docs/CLI.md

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,46 @@
11
# PAGANS CLI
22

3-
The `pagans` command provides a terminal interface for prompt optimization through OpenRouter.
3+
The `pagans` command provides a terminal interface for prompt optimization across providers.
44

55
## Global Flags
66

7-
- `--api-key`: OpenRouter API key (optional if `OPENROUTER_API_KEY` is set)
8-
- `--base-url`: OpenRouter base URL (optional if `OPENROUTER_BASE_URL` is set)
7+
- `--provider`: optimizer provider (`openrouter`, `openai`, `google`, `anthropic`, `zai`)
8+
- `--api-key`: provider API key (optional if provider env key is set)
9+
- `--base-url`: provider base URL (optional if provider env base URL is set)
910
- `--optimizer-model`: model used to perform optimization (optional if `PAGANS_OPTIMIZER_MODEL` is set)
1011

12+
Provider env vars:
13+
14+
- OpenRouter: `OPENROUTER_API_KEY`, `OPENROUTER_BASE_URL`
15+
- OpenAI: `OPENAI_API_KEY`, `OPENAI_BASE_URL`
16+
- Google AI Studio: `GOOGLE_API_KEY`, `GOOGLE_BASE_URL`
17+
- Anthropic: `ANTHROPIC_API_KEY`, `ANTHROPIC_BASE_URL`
18+
- Z.ai: `ZAI_API_KEY`, `ZAI_BASE_URL`
19+
1120
## Commands
1221

1322
## `optimize`
1423

1524
Optimize a single prompt for one target model.
1625

1726
```bash
18-
pagans optimize \
27+
pagans --provider openrouter optimize \
1928
--prompt "Write a production-ready retry strategy for HTTP calls" \
2029
--target-model gpt-5.4
2130
```
2231

2332
Use a prompt file:
2433

2534
```bash
26-
pagans optimize \
35+
pagans --provider anthropic optimize \
2736
--prompt-file ./prompt.txt \
2837
--target-model claude-sonnet-4-20250514
2938
```
3039

3140
JSON output:
3241

3342
```bash
34-
pagans optimize \
43+
pagans --provider openai optimize \
3544
--prompt "Summarize this architecture decision" \
3645
--target-model gemini-3.1-pro-preview \
3746
--json
@@ -42,7 +51,7 @@ pagans optimize \
4251
Optimize one prompt across multiple models.
4352

4453
```bash
45-
pagans compare \
54+
pagans --provider google compare \
4655
--prompt "Design a scalable queue processing architecture" \
4756
--models "gpt-5.4,claude-sonnet-4-20250514,gemini-3.1-pro-preview,grok-4-1-fast-reasoning"
4857
```
@@ -52,7 +61,7 @@ pagans compare \
5261
Optimize multiple prompts from a text file (`one prompt per line`).
5362

5463
```bash
55-
pagans batch \
64+
pagans --provider zai batch \
5665
--prompts-file ./prompts.txt \
5766
--target-model grok-4-1-fast-reasoning \
5867
--max-concurrent 5

docs/TEXT_MODEL_GUIDANCE.md

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,27 @@
11
# Text Model Guidance Matrix
22

3-
Last reviewed: **2026-03-18**
3+
Last reviewed: **2026-03-19**
44

5-
This file tracks official prompt-guidance sources and the text-model aliases currently maintained in PAGANS.
5+
This file tracks official prompt-guidance sources, provider API references, and the text-model aliases currently maintained in PAGANS.
6+
7+
## Optimizer Provider APIs
8+
9+
Official API docs used for provider client configuration:
10+
11+
- OpenAI Chat Completions: https://platform.openai.com/docs/api-reference/chat/create-chat-completion
12+
- OpenAI Models API: https://platform.openai.com/docs/api-reference/models
13+
- Google AI Studio OpenAI compatibility: https://ai.google.dev/gemini-api/docs/openai
14+
- Anthropic Messages API: https://docs.anthropic.com/en/api/messages
15+
- Anthropic Models API: https://docs.anthropic.com/en/api/models
16+
- Z.ai developer quick start: https://docs.z.ai/guides
17+
18+
Configured default base URLs:
19+
20+
- OpenRouter: `https://openrouter.ai/api/v1`
21+
- OpenAI: `https://api.openai.com/v1`
22+
- Google AI Studio: `https://generativelanguage.googleapis.com/v1beta/openai`
23+
- Anthropic: `https://api.anthropic.com/v1`
24+
- Z.ai: `https://api.z.ai/api/paas/v4`
625

726
## OpenAI
827

@@ -36,8 +55,8 @@ Compatibility aliases kept for routing:
3655
## Google Gemini
3756

3857
Official docs used:
39-
- https://ai.google.dev/gemini-api/docs/models/gemini-v2
40-
- https://ai.google.dev/gemini-api/docs/models/generative-models
58+
- https://ai.google.dev/gemini-api/docs/models
59+
- https://ai.google.dev/gemini-api/docs/openai
4160

4261
Primary optimization targets (latest text focus):
4362
- `gemini-3.1-pro-preview`, `gemini-3-flash-preview`, `gemini-3.1-flash-lite-preview`
@@ -66,10 +85,10 @@ Compatibility aliases kept for routing:
6685

6786
When updating model aliases:
6887
1. Confirm canonical model IDs in each provider's official docs.
69-
2. Confirm OpenRouter provider prefixes/IDs for routed usage.
70-
3. Update `src/pagans/models.py`:
88+
2. Confirm provider prefix/ID conventions for routed usage.
89+
3. Update `src/pagans/models.py` and `src/pagans/models/__init__.py`:
7190
- `SHORT_MODEL_NAMES`
72-
- `OPENROUTER_MODEL_MAPPINGS`
91+
- provider-specific model mappings
7392
- `MODEL_MAPPINGS`
7493
4. Add/update tests in `tests/test_models.py` and `tests/test_optimizer_prompts.py`.
7594
5. Update this file's "Last reviewed" date.

notebooks/README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@
33
This folder contains runnable Jupyter notebooks for PAGANS.
44

55
- `pagans_quickstart.ipynb`: end-to-end quickstart for single prompt optimization,
6-
cross-family comparison (OpenAI, Anthropic, xAI, Gemini), and batch optimization.
6+
cross-family comparison, and batch optimization.
7+
- `pagans_openrouter_optimizer.ipynb`: OpenRouter optimizer provider setup and run.
8+
- `pagans_openai_optimizer.ipynb`: OpenAI optimizer provider setup and run.
9+
- `pagans_google_optimizer.ipynb`: Google AI Studio optimizer provider setup and run.
10+
- `pagans_anthropic_optimizer.ipynb`: Anthropic optimizer provider setup and run.
11+
- `pagans_zai_optimizer.ipynb`: Z.ai optimizer provider setup and run.
712

813
## Run locally
914

@@ -12,4 +17,4 @@ uv sync --dev
1217
uv run jupyter lab
1318
```
1419

15-
Then open `notebooks/pagans_quickstart.ipynb`.
20+
Then open any notebook in `notebooks/`.
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"metadata": {},
6+
"source": [
7+
"# Anthropic Optimizer Notebook\n",
8+
"\n",
9+
"Set `ANTHROPIC_API_KEY` before running.\n"
10+
]
11+
},
12+
{
13+
"cell_type": "code",
14+
"execution_count": null,
15+
"id": "74da00de",
16+
"metadata": {},
17+
"outputs": [],
18+
"source": [
19+
"from pagans import PAGANSOptimizer, Provider\n"
20+
]
21+
},
22+
{
23+
"cell_type": "code",
24+
"execution_count": null,
25+
"metadata": {},
26+
"outputs": [],
27+
"source": [
28+
"async def main():\n",
29+
" async with PAGANSOptimizer(\n",
30+
" provider=Provider.ANTHROPIC,\n",
31+
" optimizer_model='claude-sonnet-4-20250514',\n",
32+
" ) as optimizer:\n",
33+
" result = await optimizer.optimize(\n",
34+
" prompt='Turn this feature request into a precise technical specification.',\n",
35+
" target_model='claude-sonnet-4',\n",
36+
" )\n",
37+
" print(result.optimized)\n",
38+
"\n",
39+
"await main()\n"
40+
]
41+
}
42+
],
43+
"metadata": {
44+
"kernelspec": {
45+
"display_name": "Python 3",
46+
"language": "python",
47+
"name": "python3"
48+
},
49+
"language_info": {
50+
"name": "python",
51+
"version": "3.12"
52+
}
53+
},
54+
"nbformat": 4,
55+
"nbformat_minor": 5
56+
}

0 commit comments

Comments
 (0)