@@ -648,6 +648,7 @@ def _get_opencode_models(self) -> List[Dict]:
648648 return [
649649 {"id": "glm-4.7-free", "name": "GLM-4.7 (Free)", "context": 8192},
650650 {"id": "grok-code", "name": "Grok Code", "context": 4096},
651+ {"id": "kimi-k2.5-free", "name": "Kimi K2.5 (Free)", "context": 8192},
651652 {"id": "gpt-5-nano", "name": "GPT-5 Nano", "context": 4096},
652653 {"id": "minimax-m2.1-free", "name": "MiniMax M2.1 (Free)", "context": 4096},
653654 {"id": "big-pickle", "name": "Big Pickle", "context": 2048},
@@ -823,6 +824,13 @@ def _get_openhands_models(self) -> List[Dict]:
823824 "recommended": True,
824825 "desc": "xAI - Fast coding model",
825826 },
827+ {
828+ "id": "opencode/kimi-k2.5-free",
829+ "name": "Kimi K2.5",
830+ "free": True,
831+ "recommended": True,
832+ "desc": "Moonshot AI - K2.5 free tier",
833+ },
826834 {
827835 "id": "opencode/minimax-m2.1-free",
828836 "name": "MiniMax M2.1",
@@ -3999,12 +4007,6 @@ def _handle_message(self, text: str, log: ConversationLog):
39994007 if self._handle_byok_model_selection(text, log):
40004008 return
40014009
4002- # Check if user is asking about the model - intercept and answer directly
4003- if self._is_model_query(text):
4004- log.add_user(text)
4005- self._answer_model_query(log)
4006- return
4007-
40084010 # Parse @file references and include file content
40094011 file_context = ""
40104012 if "@" in text:
@@ -5208,9 +5210,12 @@ async def run_prompt() -> tuple[str | None, dict]:
52085210 if getattr(client, "_process", None) is not None:
52095211 self._agent_process = client._process # type: ignore[attr-defined]
52105212
5211- # Set model for agents that support it
5212- if model and agent_type in ("codex", "openhands"):
5213- await client.set_model(model)
5213+ # Set model for agents that support ACP model selection
5214+ if model and agent_type in ("codex", "openhands", "opencode"):
5215+ model_id = model
5216+ if agent_type == "opencode" and not model_id.startswith("opencode/"):
5217+ model_id = f"opencode/{model_id}"
5218+ await client.set_model(model_id)
52145219
52155220 prompt_task = asyncio.create_task(client.send_prompt(message))
52165221
@@ -10075,6 +10080,8 @@ def _send_to_role(self, text: str, mode: str, role: str, log: ConversationLog):
1007510080 "glm-4.7": "glm-4.7-free",
1007610081 "glm-4.7-free": "glm-4.7-free",
1007710082 "grok-code": "grok-code",
10083+ "kimi-k2.5": "kimi-k2.5-free",
10084+ "kimi-k2.5-free": "kimi-k2.5-free",
1007810085 "minimax-m2.1": "minimax-m2.1-free",
1007910086 "minimax-m2.1-free": "minimax-m2.1-free",
1008010087 "gpt-5-nano": "gpt-5-nano",
0 commit comments