Skip to content

Commit 34b4733

Browse files
authored
refactor: instructor_llm_factory merge with llm_factory (#2382)
Consolidates dual LLM factories into a single, explicit `llm_factory()` API. Removes `instructor_llm_factory()` entirely. ## Changes ### Core Changes - Unified `llm_factory()`: Single factory supporting multiple LLM providers (OpenAI, Anthropic, Cohere, Google, LiteLLM) - Requires explicit parameters: `model`, `provider`, `client` - Returns: `InstructorBaseRagasLLM` (structured outputs only) - Clear error messages for missing parameters - Removed `instructor_llm_factory()`: Deleted entirely (~97 lines) - Functionality merged into unified `llm_factory()` - Removed from public exports ### API Change **Before:** ```py from ragas.llms import instructor_llm_factory llm = instructor_llm_factory("openai", model="gpt-4o", client=client) ``` **After:** ```py from ragas.llms import llm_factory llm = llm_factory("gpt-4o", client=client) # provider defaults to "openai" ``` ## Migration for Users ```py # Old code llm = llm_factory("gpt-4o-mini") # Error message: # ValueError: llm_factory() requires a client instance. # Text-only mode has been removed. # To migrate: from openai import OpenAI client = OpenAI(api_key='...') llm = llm_factory('gpt-4o-mini', client=client) ``` ## Notes This is a **breaking change** for the public API, but justified because: 1. Old text-only factory was already deprecated 2. All new metrics require structured outputs (InstructorLLM) 3. Unified API is simpler and more maintainable 4. Clear error messages guide easy migration
1 parent f0bff88 commit 34b4733

34 files changed

+336
-317
lines changed

docs/howtos/customizations/metrics/_metrics_language_adaptation.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@ As you can see, the instruction and demonstration are both in English. Setting u
3030

3131

3232
```python
33+
from openai import OpenAI
3334
from ragas.llms import llm_factory
3435

35-
llm = llm_factory()
36+
openai_client = OpenAI(api_key="sk-...")
37+
llm = llm_factory("gpt-4o-mini", client=openai_client)
3638
```
3739

3840
Now let's adapt it to 'hindi' as the target language using `adapt` method.

docs/howtos/customizations/metrics/_write_your_own_metric.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@ choose_evaluator_llm.md
3232

3333

3434
```python
35+
from openai import OpenAI
3536
from ragas.llms import llm_factory
3637

37-
evaluator_llm = llm_factory("gpt-4o")
38+
openai_client = OpenAI(api_key="sk-...")
39+
evaluator_llm = llm_factory("gpt-4o", client=openai_client)
3840
```
3941

4042
## Aspect Critic - Simple Criteria Scoring

docs/howtos/customizations/testgenerator/_persona_generator.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,16 @@ And then you can use these personas in the testset generation process by passing
4444

4545

4646
```python
47+
from openai import OpenAI
4748
from ragas.testset import TestsetGenerator
4849
from ragas.testset.graph import KnowledgeGraph
4950
from ragas.llms import llm_factory
5051

5152
# Load the knowledge graph
5253
kg = KnowledgeGraph.load("../../../../experiments/gitlab_kg.json")
5354
# Initialize the Generator LLM
54-
llm = llm_factory("gpt-4o-mini")
55+
openai_client = OpenAI()
56+
llm = llm_factory("gpt-4o-mini", client=openai_client)
5557

5658
# Initialize the Testset Generator
5759
testset_generator = TestsetGenerator(knowledge_graph=kg, persona_list=personas, llm=llm)

docs/howtos/customizations/testgenerator/_testgen-custom-single-hop.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,12 @@ for doc in docs:
4444
You may use any of [your choice](./../../customizations/customize_models.md), here I am using models from open-ai.
4545

4646
```python
47-
from ragas.llms.base import llm_factory
47+
from openai import OpenAI
48+
from ragas.llms import llm_factory
4849
from ragas.embeddings import OpenAIEmbeddings
49-
import openai
5050

51-
llm = llm_factory()
52-
openai_client = openai.OpenAI()
51+
openai_client = OpenAI()
52+
llm = llm_factory("gpt-4o-mini", client=openai_client)
5353
embedding = OpenAIEmbeddings(client=openai_client)
5454
```
5555

docs/howtos/customizations/testgenerator/_testgen-customisation.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ You may use any of [your choice](./../../customizations/customize_models.md), he
4747

4848

4949
```python
50-
from ragas.llms.base import llm_factory
50+
from openai import OpenAI
51+
from ragas.llms import llm_factory
5152
from ragas.embeddings import OpenAIEmbeddings
52-
import openai
5353

54-
llm = llm_factory()
55-
openai_client = openai.OpenAI()
54+
openai_client = OpenAI()
55+
llm = llm_factory("gpt-4o-mini", client=openai_client)
5656
embedding = OpenAIEmbeddings(client=openai_client)
5757
```
5858

examples/ragas_examples/improve_rag/evals.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from openai import AsyncOpenAI
1717

1818
from ragas import Dataset, experiment
19-
from ragas.llms import instructor_llm_factory
19+
from ragas.llms import llm_factory
2020
from ragas.metrics import DiscreteMetric
2121

2222
from .rag import RAG, BM25Retriever
@@ -206,7 +206,7 @@ async def run_experiment(mode: str = "naive", model: str = "gpt-5-mini", name: O
206206
dataset,
207207
name=name or f"{datetime.now().strftime('%Y%m%d-%H%M%S')}_{'agenticrag' if mode == 'agentic' else 'naiverag'}",
208208
rag=rag,
209-
llm=instructor_llm_factory("openai", model="gpt-5-mini", client=openai_client)
209+
llm=llm_factory("gpt-5-mini", client=openai_client)
210210
)
211211

212212
# Print basic results

examples/ragas_examples/judge_alignment/evals.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from openai import AsyncOpenAI
1818

1919
from ragas import Dataset, experiment
20-
from ragas.llms import instructor_llm_factory
20+
from ragas.llms import llm_factory
2121
from ragas.metrics import DiscreteMetric
2222
from ragas.metrics.discrete import discrete_metric
2323
from ragas.metrics.result import MetricResult
@@ -173,8 +173,8 @@ async def main():
173173
# Initialize LLM client
174174
logger.info("Initializing LLM client with model: gpt-4o-mini")
175175
openai_client = AsyncOpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
176-
llm = instructor_llm_factory("openai", model="gpt-4o-mini", client=openai_client)
177-
176+
llm = llm_factory("gpt-4o-mini", client=openai_client)
177+
178178
# Run baseline evaluation
179179
logger.info("Running baseline evaluation...")
180180
results = await judge_experiment.arun(
@@ -200,8 +200,8 @@ async def main_v2():
200200
# Initialize LLM client
201201
logger.info("Initializing LLM client with model: gpt-4o-mini")
202202
openai_client = AsyncOpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
203-
llm = instructor_llm_factory("openai", model="gpt-4o-mini", client=openai_client)
204-
203+
llm = llm_factory("gpt-4o-mini", client=openai_client)
204+
205205
# Run v2 evaluation with improved prompt
206206
logger.info("Running v2 evaluation with improved prompt...")
207207
results = await judge_experiment.arun(

examples/ragas_examples/rag_eval/evals.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
from openai import OpenAI
44

55
from ragas import Dataset, experiment
6-
from ragas.llms import instructor_llm_factory
6+
from ragas.llms import llm_factory
77
from ragas.metrics import DiscreteMetric
88

99
from .rag import default_rag_client
1010

1111
openai_client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
1212
rag_client = default_rag_client(llm_client=openai_client)
13-
llm = instructor_llm_factory("openai", model="gpt-4o", client=openai_client)
13+
llm = llm_factory("gpt-4o", client=openai_client)
1414

1515

1616
def load_dataset():

examples/ragas_examples/workflow_eval/evals.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
from openai import OpenAI
44

55
from ragas import Dataset, experiment
6-
from ragas.llms import instructor_llm_factory
6+
from ragas.llms import llm_factory
77
from ragas.metrics import DiscreteMetric
88

99
from .workflow import default_workflow_client
1010

1111
openai_client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
1212
workflow_client = default_workflow_client()
13-
llm = instructor_llm_factory("openai", model="gpt-4o", client=openai_client)
13+
llm = llm_factory("gpt-4o", client=openai_client)
1414

1515

1616
def load_dataset():

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ preview = false
117117

118118
[tool.pyright]
119119
include = ["src/ragas"]
120-
excludeTypeshedPaths = ["@types/*"]
120+
exclude = ["@types/*"]
121121
pythonVersion = "3.9"
122122
pythonPlatform = "All"
123123
typeCheckingMode = "basic"

0 commit comments

Comments
 (0)