Skip to content

Commit 8492a9d

Browse files
Handle timeout properly without causing regressions until we remove accepting http_client parameter.
1 parent 0f83705 commit 8492a9d

File tree

2 files changed

+60
-40
lines changed

2 files changed

+60
-40
lines changed

singlestoredb/ai/chat.py

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -82,29 +82,30 @@ def obo_token_getter() -> Optional[str]:
8282
if hosting_platform is not None:
8383
info.hosting_platform = hosting_platform
8484

85+
# Extract timeouts from http_client if provided
86+
t = http_client.timeout if http_client is not None else None
87+
connect_timeout = None
88+
read_timeout = None
89+
if t is not None:
90+
if isinstance(t, httpx.Timeout):
91+
if t.connect is not None:
92+
connect_timeout = float(t.connect)
93+
if t.read is not None:
94+
read_timeout = float(t.read)
95+
if connect_timeout is None and read_timeout is not None:
96+
connect_timeout = read_timeout
97+
if read_timeout is None and connect_timeout is not None:
98+
read_timeout = connect_timeout
99+
elif isinstance(t, (int, float)):
100+
connect_timeout = float(t)
101+
read_timeout = float(t)
102+
85103
if info.hosting_platform == 'Amazon':
86104
# Instantiate Bedrock client
87105
cfg_kwargs = {
88106
'signature_version': UNSIGNED,
89107
'retries': {'max_attempts': 1, 'mode': 'standard'},
90108
}
91-
# Extract timeouts from http_client if provided
92-
t = http_client.timeout if http_client is not None else None
93-
connect_timeout = None
94-
read_timeout = None
95-
if t is not None:
96-
if isinstance(t, httpx.Timeout):
97-
if t.connect is not None:
98-
connect_timeout = float(t.connect)
99-
if t.read is not None:
100-
read_timeout = float(t.read)
101-
if connect_timeout is None and read_timeout is not None:
102-
connect_timeout = read_timeout
103-
if read_timeout is None and connect_timeout is not None:
104-
read_timeout = connect_timeout
105-
elif isinstance(t, (int, float)):
106-
connect_timeout = float(t)
107-
read_timeout = float(t)
108109
if read_timeout is not None:
109110
cfg_kwargs['read_timeout'] = read_timeout
110111
if connect_timeout is not None:
@@ -176,8 +177,18 @@ def auth_flow(
176177
request.headers['X-S2-OBO'] = obo_val
177178
yield request
178179

180+
# Build timeout configuration
181+
if connect_timeout is not None and read_timeout is not None:
182+
t = httpx.Timeout(connect=connect_timeout, read=read_timeout)
183+
elif connect_timeout is not None:
184+
t = httpx.Timeout(connect=connect_timeout)
185+
elif read_timeout is not None:
186+
t = httpx.Timeout(read=read_timeout)
187+
else:
188+
t = 60.0 # default OpenAI client timeout
189+
179190
http_client = httpx.Client(
180-
timeout=30,
191+
timeout=t,
181192
auth=OpenAIAuth(),
182193
)
183194

@@ -188,8 +199,7 @@ def auth_flow(
188199
model=model_name,
189200
streaming=streaming,
190201
)
191-
if http_client is not None:
192-
openai_kwargs['http_client'] = http_client
202+
openai_kwargs['http_client'] = http_client
193203
return ChatOpenAI(
194204
**openai_kwargs,
195205
**kwargs,

singlestoredb/ai/embeddings.py

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -81,29 +81,30 @@ def obo_token_getter() -> Optional[str]:
8181
if hosting_platform is not None:
8282
info.hosting_platform = hosting_platform
8383

84+
# Extract timeouts from http_client if provided
85+
t = http_client.timeout if http_client is not None else None
86+
connect_timeout = None
87+
read_timeout = None
88+
if t is not None:
89+
if isinstance(t, httpx.Timeout):
90+
if t.connect is not None:
91+
connect_timeout = float(t.connect)
92+
if t.read is not None:
93+
read_timeout = float(t.read)
94+
if connect_timeout is None and read_timeout is not None:
95+
connect_timeout = read_timeout
96+
if read_timeout is None and connect_timeout is not None:
97+
read_timeout = connect_timeout
98+
elif isinstance(t, (int, float)):
99+
connect_timeout = float(t)
100+
read_timeout = float(t)
101+
84102
if info.hosting_platform == 'Amazon':
85103
# Instantiate Bedrock client
86104
cfg_kwargs = {
87105
'signature_version': UNSIGNED,
88106
'retries': {'max_attempts': 1, 'mode': 'standard'},
89107
}
90-
# Extract timeouts from http_client if provided
91-
t = http_client.timeout if http_client is not None else None
92-
connect_timeout = None
93-
read_timeout = None
94-
if t is not None:
95-
if isinstance(t, httpx.Timeout):
96-
if t.connect is not None:
97-
connect_timeout = float(t.connect)
98-
if t.read is not None:
99-
read_timeout = float(t.read)
100-
if connect_timeout is None and read_timeout is not None:
101-
connect_timeout = read_timeout
102-
if read_timeout is None and connect_timeout is not None:
103-
read_timeout = connect_timeout
104-
elif isinstance(t, (int, float)):
105-
connect_timeout = float(t)
106-
read_timeout = float(t)
107108
if read_timeout is not None:
108109
cfg_kwargs['read_timeout'] = read_timeout
109110
if connect_timeout is not None:
@@ -166,8 +167,18 @@ def auth_flow(
166167
request.headers['X-S2-OBO'] = obo_val
167168
yield request
168169

170+
# Build timeout configuration
171+
if connect_timeout is not None and read_timeout is not None:
172+
t = httpx.Timeout(connect=connect_timeout, read=read_timeout)
173+
elif connect_timeout is not None:
174+
t = httpx.Timeout(connect=connect_timeout)
175+
elif read_timeout is not None:
176+
t = httpx.Timeout(read=read_timeout)
177+
else:
178+
t = 60.0 # default OpenAI client timeout
179+
169180
http_client = httpx.Client(
170-
timeout=30,
181+
timeout=t,
171182
auth=OpenAIAuth(),
172183
)
173184

@@ -177,8 +188,7 @@ def auth_flow(
177188
api_key='placeholder',
178189
model=model_name,
179190
)
180-
if http_client is not None:
181-
openai_kwargs['http_client'] = http_client
191+
openai_kwargs['http_client'] = http_client
182192
return OpenAIEmbeddings(
183193
**openai_kwargs,
184194
**kwargs,

0 commit comments

Comments
 (0)