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
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Removed

- **OpenAI provider** (`attune_rag.providers.openai.OpenAIProvider`) and
the `[openai]` install extra. Use `[claude]` or `[gemini]` instead.
No external consumer of attune-rag was importing `OpenAIProvider`;
the provider is fully removable without callsite migrations.

## [0.1.12] - 2026-05-05

### Added
Expand Down
15 changes: 1 addition & 14 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# attune-rag

Lightweight, LLM-agnostic RAG pipeline with pluggable
corpora. Works with Claude, OpenAI, Gemini, or any LLM.
corpora. Works with Claude, Gemini, or any LLM.

- **No LLM SDK at install time.** All provider deps are
optional extras.
Expand All @@ -21,7 +21,6 @@ corpora. Works with Claude, OpenAI, Gemini, or any LLM.
pip install attune-rag # core only
pip install 'attune-rag[attune-help]' # + bundled help corpus
pip install 'attune-rag[claude]' # + Claude adapter
pip install 'attune-rag[openai]' # + OpenAI adapter
pip install 'attune-rag[gemini]' # + Gemini adapter
pip install 'attune-rag[all]' # everything
```
Expand All @@ -48,18 +47,6 @@ async def main():
asyncio.run(main())
```

## Quick start — OpenAI

```bash
pip install 'attune-rag[attune-help,openai]'
```

```python
response, result = await pipeline.run_and_generate(
"...", provider="openai", model="gpt-4o",
)
```

## Quick start — Gemini

```bash
Expand Down
6 changes: 1 addition & 5 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "attune-rag"
version = "0.1.12"
description = "Lightweight, LLM-agnostic RAG pipeline with pluggable corpora. Works with Claude, OpenAI, Gemini, or any LLM."
description = "Lightweight, LLM-agnostic RAG pipeline with pluggable corpora. Works with Claude, Gemini, or any LLM."
readme = {file = "README.md", content-type = "text/markdown"}
requires-python = ">=3.10"
license = {file = "LICENSE"}
Expand All @@ -17,7 +17,6 @@ keywords = [
"retrieval-augmented-generation",
"llm",
"claude",
"openai",
"gemini",
"grounding",
"provenance",
Expand Down Expand Up @@ -46,12 +45,10 @@ dependencies = [
[project.optional-dependencies]
attune-help = ["attune-help>=0.10.0,<0.11"]
claude = ["anthropic>=0.40.0,<1.0"]
openai = ["openai>=1.40.0,<2.0"]
gemini = ["google-genai>=1.0,<2.0"]
all = [
"attune-help>=0.10.0,<0.11",
"anthropic>=0.40.0,<1.0",
"openai>=1.40.0,<2.0",
"google-genai>=1.0,<2.0",
]
dev = [
Expand All @@ -64,7 +61,6 @@ dev = [
"twine>=5.0",
"attune-help>=0.10.0,<0.11",
"anthropic>=0.40.0,<1.0",
"openai>=1.40.0,<2.0",
"google-genai>=1.0,<2.0",
]

Expand Down
13 changes: 9 additions & 4 deletions src/attune_rag/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ def _cmd_providers(args: argparse.Namespace) -> int:
available = list_available()
if not available:
print("No provider extras installed.")
print("Install one: pip install 'attune-rag[claude]' (or openai, gemini).")
print("Install one: pip install 'attune-rag[claude]' (or gemini).")
return 0
print("Available providers:")
for name in available:
Expand All @@ -114,6 +114,7 @@ def _cmd_dashboard_render(args: argparse.Namespace) -> int:
print(f"Dashboard written to {out}")
if args.open:
import webbrowser

webbrowser.open(out.as_uri())
return 0

Expand Down Expand Up @@ -148,7 +149,7 @@ def build_parser() -> argparse.ArgumentParser:
query.add_argument("-k", type=int, default=3, help="Max hits to return (default 3).")
query.add_argument(
"--provider",
choices=["claude", "openai", "gemini"],
choices=["claude", "gemini"],
help="If set, call the named LLM and print its response.",
)
query.add_argument(
Expand All @@ -172,7 +173,9 @@ def build_parser() -> argparse.ArgumentParser:
dash = subs.add_parser("dashboard", help="Render or refresh the attune-rag Cowork dashboard.")
dash_subs = dash.add_subparsers(dest="dashboard_cmd", required=True)

show_p = dash_subs.add_parser("show", help="Run benchmark and display dashboard in the terminal.")
show_p = dash_subs.add_parser(
"show", help="Run benchmark and display dashboard in the terminal."
)
show_p.add_argument(
"--corpus-package",
default="attune_help",
Expand All @@ -181,7 +184,9 @@ def build_parser() -> argparse.ArgumentParser:
)
show_p.set_defaults(func=_cmd_dashboard_show)

render_p = dash_subs.add_parser("render", help="Run benchmark, embed snapshot, write dashboard HTML.")
render_p = dash_subs.add_parser(
"render", help="Run benchmark, embed snapshot, write dashboard HTML."
)
render_p.add_argument("--out", required=True, metavar="PATH", help="Destination file path.")
render_p.add_argument(
"--corpus-package",
Expand Down
6 changes: 3 additions & 3 deletions src/attune_rag/pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,9 +209,9 @@ async def run_and_generate(
"""Retrieve, build the augmented prompt, and call an LLM.

``provider`` may be an ``LLMProvider`` instance or a name
string (``"claude"``, ``"openai"``, ``"gemini"``). In the
string case, the matching provider is constructed with
default credentials (from env vars).
string (``"claude"``, ``"gemini"``). In the string case,
the matching provider is constructed with default
credentials (from env vars).

``prompt_variant`` selects the prompt template. See
:mod:`attune_rag.prompts`.
Expand Down
6 changes: 0 additions & 6 deletions src/attune_rag/providers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
Each adapter is behind a pip extra:

- attune-rag[claude] -> ClaudeProvider
- attune-rag[openai] -> OpenAIProvider
- attune-rag[gemini] -> GeminiProvider

Adapters lazy-import their SDKs so attune-rag installs
Expand All @@ -18,7 +17,6 @@

_SDK_PROBES = {
"claude": "anthropic",
"openai": "openai",
"gemini": "google.genai",
}

Expand Down Expand Up @@ -51,10 +49,6 @@ def get_provider(name: str, **kwargs) -> LLMProvider:
from .claude import ClaudeProvider

return ClaudeProvider(**kwargs)
if name == "openai":
from .openai import OpenAIProvider

return OpenAIProvider(**kwargs)
if name == "gemini":
from .gemini import GeminiProvider

Expand Down
2 changes: 1 addition & 1 deletion src/attune_rag/providers/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
class LLMProvider(Protocol):
"""An async LLM provider that consumes a prompt and returns text.

Implementations live in ``attune_rag.providers.{claude,openai,gemini}``
Implementations live in ``attune_rag.providers.{claude,gemini}``
behind optional extras. Each lazy-imports its SDK so core
attune-rag installs cleanly without any provider deps.
"""
Expand Down
53 changes: 0 additions & 53 deletions src/attune_rag/providers/openai.py

This file was deleted.

2 changes: 1 addition & 1 deletion tests/unit/providers/test_dispatch.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def test_list_available_returns_installed_providers() -> None:
# rather than a specific list.
assert isinstance(available, list)
for name in available:
assert name in {"claude", "openai", "gemini"}
assert name in {"claude", "gemini"}


def test_get_provider_rejects_unknown_name() -> None:
Expand Down
65 changes: 0 additions & 65 deletions tests/unit/providers/test_openai.py

This file was deleted.

Loading