@@ -42,6 +42,19 @@ def expand_service(name, service, replicas):
4242 return services
4343
4444
45+ def expand_ollama_service (name , service , replicas ):
46+ services = expand_service (name , service , replicas )
47+
48+ if replicas == 1 :
49+ return services
50+
51+ for i in range (1 , replicas + 1 ):
52+ replica_name = f"{ name } -{ i } "
53+ services [replica_name ]["devices" ] = [f"nvidia.com/gpu={ i - 1 } " ]
54+
55+ return services
56+
57+
4558def expand_depends_on (depends_on , replica_counts ):
4659 if isinstance (depends_on , dict ):
4760 expanded = {}
@@ -91,6 +104,7 @@ def haproxy_dependencies(
91104 services ,
92105 backend_n ,
93106 litellm_n ,
107+ ollama_n ,
94108 available_mcp_servers ,
95109 mcp_replica_n ,
96110):
@@ -103,7 +117,8 @@ def haproxy_dependencies(
103117 )
104118
105119 dependencies .extend (service_instance_names ("litellm" , litellm_n , services ))
106- dependencies .extend (["mongodb" , "ollama" ])
120+ dependencies .append ("mongodb" )
121+ dependencies .extend (service_instance_names ("ollama" , ollama_n , services ))
107122
108123 return [dependency for dependency in dependencies if dependency in services ]
109124
@@ -122,7 +137,14 @@ def haproxy_backend(name, port, service_names, sticky_mode=None):
122137
123138
124139def generate_haproxy (
125- services , backend_n , backend_port , litellm_n , server_list , replica_dict , port_dict
140+ services ,
141+ backend_n ,
142+ backend_port ,
143+ litellm_n ,
144+ ollama_n ,
145+ server_list ,
146+ replica_dict ,
147+ port_dict ,
126148):
127149 conf = []
128150
@@ -151,6 +173,10 @@ def generate_haproxy(
151173 "frontend fe_litellm\n bind *:4000\n default_backend be_litellm\n \n "
152174 )
153175
176+ conf .append (
177+ "frontend fe_ollama\n bind *:11434\n default_backend be_ollama\n \n "
178+ )
179+
154180 for s in server_list :
155181 conf .append (
156182 f"frontend fe_{ s } \n "
@@ -176,6 +202,15 @@ def generate_haproxy(
176202 )
177203 )
178204
205+ conf .append (
206+ haproxy_backend (
207+ "ollama" ,
208+ 11434 ,
209+ service_instance_names ("ollama" , ollama_n , services ),
210+ "leastconn" ,
211+ )
212+ )
213+
179214 for s in server_list :
180215 conf .append (
181216 haproxy_backend (
@@ -201,6 +236,7 @@ def main():
201236 backend_target_port = os .environ .get ("CLIMATECLAW_TARGET_PORT" , "8502" )
202237 backend_n = int (os .environ .get ("CLIMATECLAW_BACKEND_REPLICAS" , "1" ))
203238 litellm_n = int (os .environ .get ("CLIMATECLAW_LITELLM_REPLICAS" , "1" ))
239+ ollama_n = int (os .environ .get ("CLIMATECLAW_OLLAMA_REPLICAS" , "1" ))
204240
205241 available_mcp_servers = [
206242 s
@@ -226,6 +262,7 @@ def main():
226262 replica_counts = {
227263 "climateclaw" : backend_n ,
228264 "litellm" : litellm_n ,
265+ "ollama" : ollama_n ,
229266 ** mcp_replica_n ,
230267 }
231268
@@ -234,6 +271,8 @@ def main():
234271 new_services .update (expand_service (name , svc , backend_n ))
235272 elif name == "litellm" :
236273 new_services .update (expand_service (name , svc , litellm_n ))
274+ elif name == "ollama" :
275+ new_services .update (expand_ollama_service (name , svc , ollama_n ))
237276 elif name in MCP_SERVICES :
238277 if name in available_mcp_servers :
239278 new_services .update (expand_service (name , svc , mcp_replica_n [name ]))
@@ -257,16 +296,27 @@ def main():
257296
258297 network_name = list (base ["networks" ].keys ())[0 ]
259298
299+ haproxy_network = (
300+ {
301+ network_name : {
302+ "aliases" : ["ollama" ],
303+ }
304+ }
305+ if ollama_n > 1
306+ else [network_name ]
307+ )
308+
260309 new_services ["haproxy" ] = {
261310 "image" : "haproxy:3.0-alpine" ,
262311 "user" : "0:0" ,
263312 "ports" : dev_ports if "dev" in compose_path else prod_ports ,
264313 "volumes" : ["./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro" ],
265- "networks" : [ network_name ] ,
314+ "networks" : haproxy_network ,
266315 "depends_on" : haproxy_dependencies (
267316 new_services ,
268317 backend_n ,
269318 litellm_n ,
319+ ollama_n ,
270320 available_mcp_servers ,
271321 mcp_replica_n ,
272322 ),
@@ -285,6 +335,7 @@ def main():
285335 backend_n ,
286336 backend_port ,
287337 litellm_n ,
338+ ollama_n ,
288339 available_mcp_servers ,
289340 mcp_replica_n ,
290341 port_dict ,
0 commit comments