@@ -136,6 +136,19 @@ def expand_service(name, service, replicas, preview_paths=None):
136136 return services
137137
138138
139+ def expand_ollama_service (name , service , replicas ):
140+ services = expand_service (name , service , replicas )
141+
142+ if replicas == 1 :
143+ return services
144+
145+ for i in range (1 , replicas + 1 ):
146+ replica_name = f"{ name } -{ i } "
147+ services [replica_name ]["devices" ] = [f"nvidia.com/gpu={ i - 1 } " ]
148+
149+ return services
150+
151+
139152def expand_depends_on (depends_on , replica_counts ):
140153 if isinstance (depends_on , dict ):
141154 expanded = {}
@@ -185,6 +198,7 @@ def haproxy_dependencies(
185198 services ,
186199 backend_n ,
187200 litellm_n ,
201+ ollama_n ,
188202 available_mcp_servers ,
189203 mcp_replica_n ,
190204):
@@ -197,7 +211,8 @@ def haproxy_dependencies(
197211 )
198212
199213 dependencies .extend (service_instance_names ("litellm" , litellm_n , services ))
200- dependencies .extend (["mongodb" , "ollama" ])
214+ dependencies .append ("mongodb" )
215+ dependencies .extend (service_instance_names ("ollama" , ollama_n , services ))
201216
202217 return [dependency for dependency in dependencies if dependency in services ]
203218
@@ -217,7 +232,14 @@ def haproxy_backend(name, port, service_names, sticky_mode=None):
217232
218233
219234def generate_haproxy (
220- services , backend_n , backend_port , litellm_n , server_list , replica_dict , port_dict
235+ services ,
236+ backend_n ,
237+ backend_port ,
238+ litellm_n ,
239+ ollama_n ,
240+ server_list ,
241+ replica_dict ,
242+ port_dict ,
221243):
222244 conf = []
223245
@@ -246,6 +268,10 @@ def generate_haproxy(
246268 "frontend fe_litellm\n bind *:4000\n default_backend be_litellm\n \n "
247269 )
248270
271+ conf .append (
272+ "frontend fe_ollama\n bind *:11434\n default_backend be_ollama\n \n "
273+ )
274+
249275 for s in server_list :
250276 conf .append (
251277 f"frontend fe_{ s } \n "
@@ -271,6 +297,15 @@ def generate_haproxy(
271297 )
272298 )
273299
300+ conf .append (
301+ haproxy_backend (
302+ "ollama" ,
303+ 11434 ,
304+ service_instance_names ("ollama" , ollama_n , services ),
305+ "leastconn" ,
306+ )
307+ )
308+
274309 for s in server_list :
275310 conf .append (
276311 haproxy_backend (
@@ -377,6 +412,7 @@ def main():
377412 backend_target_port = os .environ .get ("CLIMATECLAW_TARGET_PORT" , "8502" )
378413 backend_n = int (os .environ .get ("CLIMATECLAW_BACKEND_REPLICAS" , "1" ))
379414 litellm_n = int (os .environ .get ("CLIMATECLAW_LITELLM_REPLICAS" , "1" ))
415+ ollama_n = int (os .environ .get ("CLIMATECLAW_OLLAMA_REPLICAS" , "1" ))
380416
381417 available_mcp_servers = [
382418 s
@@ -415,6 +451,7 @@ def main():
415451 replica_counts = {
416452 "climateclaw" : backend_n ,
417453 "litellm" : litellm_n ,
454+ "ollama" : ollama_n ,
418455 ** mcp_replica_n ,
419456 }
420457
@@ -424,6 +461,8 @@ def main():
424461 new_services .update (expand_service (name , svc , backend_n ))
425462 elif name == "litellm" :
426463 new_services .update (expand_service (name , svc , litellm_n ))
464+ elif name == "ollama" :
465+ new_services .update (expand_ollama_service (name , svc , ollama_n ))
427466 elif name in MCP_SERVICES :
428467 if name == "code-server" :
429468 new_services .update (expand_service (name , svc , backend_n , preview_paths ))
@@ -459,16 +498,27 @@ def main():
459498
460499 network_name = list (base ["networks" ].keys ())[0 ]
461500
501+ haproxy_network = (
502+ {
503+ network_name : {
504+ "aliases" : ["ollama" ],
505+ }
506+ }
507+ if ollama_n > 1
508+ else [network_name ]
509+ )
510+
462511 new_services ["haproxy" ] = {
463512 "image" : "haproxy:3.0-alpine" ,
464513 "user" : "0:0" ,
465514 "ports" : dev_ports if "dev" in compose_path else prod_ports ,
466515 "volumes" : ["./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro" ],
467- "networks" : [ network_name ] ,
516+ "networks" : haproxy_network ,
468517 "depends_on" : haproxy_dependencies (
469518 new_services ,
470519 backend_n ,
471520 litellm_n ,
521+ ollama_n ,
472522 available_mcp_servers ,
473523 mcp_replica_n ,
474524 ),
@@ -509,6 +559,7 @@ def main():
509559 backend_n ,
510560 backend_port ,
511561 litellm_n ,
562+ ollama_n ,
512563 available_mcp_servers ,
513564 mcp_replica_n ,
514565 port_dict ,
0 commit comments