Skip to content

Commit d1349b4

Browse files
committed
TutorTask696: Align code with coding guidelines
Pre-commit checks: All checks passed ✅
1 parent 6991063 commit d1349b4

7 files changed

Lines changed: 842 additions & 543 deletions

File tree

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# JupyterLab Extension Backend
2+
3+
Run the backend entrypoint from this directory:
4+
5+
```bash
6+
cd /Users/indro/src/tutorials1/agentic_eda/jupyterlab_extension_backend
7+
python -m src.main \
8+
--mode integrity \
9+
--path /Users/indro/src/tutorials1/agentic_eda/jupyterlab_extension_backend/datasets/T1_slice.csv
10+
```
11+
12+
If you run from a different directory, set `PYTHONPATH`:
13+
14+
```bash
15+
PYTHONPATH=/Users/indro/src/tutorials1/agentic_eda/jupyterlab_extension_backend \
16+
python -m src.main \
17+
--mode integrity \
18+
--path /Users/indro/src/tutorials1/agentic_eda/jupyterlab_extension_backend/datasets/T1_slice.csv
19+
```
Lines changed: 78 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,133 +1,128 @@
1-
import os
1+
"""
2+
Import as:
3+
4+
import config.config as cconf
5+
"""
6+
27
import dataclasses
38
import functools
4-
import pydantic
9+
import os
510

611
import dotenv
12+
import langchain_anthropic
13+
import langchain_google_genai
714
import langchain_openai
8-
import langchain_anthropic # ChatAnthropic
9-
import langchain_google_genai # ChatGoogleGenerativeAI
10-
# import langchain_groq # ChatGroq
11-
# import langchain_mistralai # ChatMistralAI
12-
# import langchain_ollama # ChatOllama
13-
15+
import pydantic
1416

1517
dataclass = dataclasses.dataclass
1618
lru_cache = functools.lru_cache
1719
ChatOpenAI = langchain_openai.ChatOpenAI
1820
ChatAnthropic = langchain_anthropic.ChatAnthropic
1921
ChatGoogleGenerativeAI = langchain_google_genai.ChatGoogleGenerativeAI
20-
# ChatGroq = langchain_groq.ChatGroq
21-
# ChatMistralAI = langchain_mistralai.ChatMistralAI
22-
# ChatOllama = langchain_ollama.ChatOllama
2322
SecretStr = pydantic.SecretStr
2423

25-
# Load Variables
2624
dotenv.load_dotenv()
2725

2826

29-
# Immutable data class
3027
@dataclass(frozen=True)
3128
class Settings:
29+
"""
30+
Store model provider settings.
31+
"""
32+
3233
provider: str
3334
model: str
3435
temperature: float
3536
timeout: float
3637
max_retries: int
3738

38-
def _need(name:str) -> str:
39-
v = os.getenv(name)
40-
if v is None or v == "":
39+
40+
def _need(name: str) -> str:
41+
"""
42+
Read a required environment variable.
43+
44+
:param name: environment variable name
45+
:return: environment variable value
46+
"""
47+
value = os.getenv(name)
48+
if value is None or value == "":
4149
raise RuntimeError(f"Missing required environment variable: {name}")
42-
return v
50+
return value
51+
4352

4453
@lru_cache(maxsize=1)
4554
def get_settings() -> Settings:
46-
return Settings(
55+
"""
56+
Build settings from environment variables.
57+
58+
:return: configured settings
59+
"""
60+
settings = Settings(
4761
provider=os.getenv("LLM_PROVIDER", "openai"),
4862
model=os.getenv("LLM_MODEL", "gpt-5-nano"),
4963
temperature=float(os.getenv("LLM_TEMP", 0.2)),
5064
timeout=float(os.getenv("LLM_TIMEOUT", 60)),
5165
max_retries=int(os.getenv("LLM_MAX_RETRIES", 2)),
52-
5366
)
67+
return settings
5468

55-
@lru_cache(maxsize=1)
56-
def get_chat_model(model=get_settings().model):
57-
s = get_settings()
58-
59-
# OpenAI-adjacent
6069

61-
if s.provider == "openai":
62-
63-
# READ API KEY.
70+
@lru_cache(maxsize=1)
71+
def get_chat_model(*, model: str | None = None) -> object:
72+
"""
73+
Build the configured chat model client.
74+
75+
:param model: optional model override
76+
:return: langchain chat model client
77+
"""
78+
settings = get_settings()
79+
model_name = settings.model if model is None else model
80+
provider = settings.provider
81+
if provider == "openai":
6482
_need("OPENAI_API_KEY")
65-
66-
# Return the chatmodel
67-
68-
return ChatOpenAI(
69-
model=s.model,
70-
temperature=s.temperature,
71-
timeout=s.timeout,
72-
max_retries=s.max_retries,
83+
chat_model = ChatOpenAI(
84+
model=model_name,
85+
temperature=settings.temperature,
86+
timeout=settings.timeout,
87+
max_retries=settings.max_retries,
7388
)
74-
75-
if s.provider == "openai_compatible":
76-
77-
# Secrets.
89+
elif provider == "openai_compatible":
7890
base_url = _need("OPENAI_COMPAT_BASE_URL")
7991
api_key = _need("OPENAI_COMPAT_API_KEY")
80-
return ChatOpenAI(
81-
model=model,
92+
chat_model = ChatOpenAI(
93+
model=model_name,
8294
base_url=base_url,
8395
api_key=SecretStr(api_key),
84-
temperature=s.temperature,
85-
timeout=s.timeout,
86-
max_retries=s.max_retries,
87-
96+
temperature=settings.temperature,
97+
timeout=settings.timeout,
98+
max_retries=settings.max_retries,
8899
)
89-
90-
if s.provider == "azure_openai_v1":
91-
92-
# Secrets.
100+
elif provider == "azure_openai_v1":
93101
azure_base = _need("AZURE_OPENAI_BASE_URL")
94102
azure_key = SecretStr(_need("AZURE_OPENAI_API_KEY"))
95-
96-
return ChatOpenAI(
97-
model=s.model,
103+
chat_model = ChatOpenAI(
104+
model=model_name,
98105
base_url=azure_base,
99106
api_key=azure_key,
100-
temperature=s.temperature,
101-
timeout=s.timeout,
102-
max_retries=s.max_retries,
103-
107+
temperature=settings.temperature,
108+
timeout=settings.timeout,
109+
max_retries=settings.max_retries,
104110
)
105-
106-
# Anthropic
107-
108-
if s.provider == "anthropic":
109-
110-
# Secrets.
111-
_need("ANTHROPIC_API_KEY")
112-
return ChatAnthropic(
113-
model_name=s.model,
114-
temperature=s.temperature,
115-
timeout=s.timeout,
116-
max_retries=s.max_retries,
117-
stop=None
118-
)
119-
120-
# Google
121-
if s.provider in ("google", "gemini", "google_genai"):
122-
# Secrets.
111+
elif provider == "anthropic":
112+
_need("ANTHROPIC_API_KEY")
113+
chat_model = ChatAnthropic(
114+
model_name=model_name,
115+
temperature=settings.temperature,
116+
timeout=settings.timeout,
117+
max_retries=settings.max_retries,
118+
stop=None,
119+
)
120+
elif provider in ("google", "gemini", "google_genai"):
123121
_need("GOOGLE_API_KEY")
124-
return ChatGoogleGenerativeAI(
125-
model=s.model,
126-
temperature=s.temperature,
122+
chat_model = ChatGoogleGenerativeAI(
123+
model=model_name,
124+
temperature=settings.temperature,
127125
)
128-
129-
130-
131-
132-
133-
raise ValueError("TODO(*): expand support!")
126+
else:
127+
raise ValueError(f"Unsupported provider='{provider}'")
128+
return chat_model

0 commit comments

Comments
 (0)