zai coding provider (#63)

Kujtim Hoxha created

* zai coding provider

* chore: change to openai endpoint

Change summary

internal/providers/configs/zai-coding.json | 38 ++++++++++++++++++++++++
internal/providers/providers.go            |  8 +++++
pkg/catwalk/provider.go                    |  2 +
3 files changed, 48 insertions(+)

Detailed changes

internal/providers/configs/zai-coding.json 🔗

@@ -0,0 +1,38 @@
+{
+  "name": "Z.AI Coding",
+  "id": "zai-coding",
+  "api_key": "$ZAI_API_KEY",
+  "api_endpoint": "https://api.z.ai/api/coding/paas/v4",
+  "type": "openai",
+  "default_large_model_id": "glm-4.5",
+  "default_small_model_id": "glm-4.5-air",
+  "models": [
+    {
+      "id": "glm-4.5",
+      "name": "GLM-4.5",
+      "cost_per_1m_in": 0,
+      "cost_per_1m_out": 0,
+      "cost_per_1m_in_cached": 0,
+      "cost_per_1m_out_cached": 0,
+      "context_window": 131072,
+      "default_max_tokens": 98304,
+      "can_reason": true,
+      "has_reasoning_efforts": true,
+      "default_reasoning_effort": "medium",
+      "supports_attachments": false
+    },
+    {
+      "id": "glm-4.5-air",
+      "name": "GLM-4.5-Air",
+      "cost_per_1m_in": 0,
+      "cost_per_1m_out": 0,
+      "cost_per_1m_in_cached": 0,
+      "context_window": 131072,
+      "default_max_tokens": 98304,
+      "can_reason": true,
+      "has_reasoning_efforts": true,
+      "default_reasoning_effort": "medium",
+      "supports_attachments": false
+    }
+  ]
+}

internal/providers/providers.go 🔗

@@ -33,6 +33,9 @@ var xAIConfig []byte
 //go:embed configs/zai.json
 var zAIConfig []byte
 
+//go:embed configs/zai-coding.json
+var zAICodingConfig []byte
+
 //go:embed configs/bedrock.json
 var bedrockConfig []byte
 
@@ -73,6 +76,7 @@ var providerRegistry = []ProviderFunc{
 	veniceProvider,
 	chutesProvider,
 	deepSeekProvider,
+	zAICodingProvider,
 }
 
 // GetAll returns all registered providers.
@@ -125,6 +129,10 @@ func zAIProvider() catwalk.Provider {
 	return loadProviderFromConfig(zAIConfig)
 }
 
+func zAICodingProvider() catwalk.Provider {
+	return loadProviderFromConfig(zAICodingConfig)
+}
+
 func openRouterProvider() catwalk.Provider {
 	return loadProviderFromConfig(openRouterConfig)
 }

pkg/catwalk/provider.go 🔗

@@ -26,6 +26,7 @@ const (
 	InferenceProviderVertexAI   InferenceProvider = "vertexai"
 	InferenceProviderXAI        InferenceProvider = "xai"
 	InferenceProviderZAI        InferenceProvider = "zai"
+	InferenceProviderZAICoding  InferenceProvider = "zai-coding"
 	InferenceProviderGROQ       InferenceProvider = "groq"
 	InferenceProviderOpenRouter InferenceProvider = "openrouter"
 	InferenceProviderLambda     InferenceProvider = "lambda"
@@ -74,6 +75,7 @@ func KnownProviders() []InferenceProvider {
 		InferenceProviderVertexAI,
 		InferenceProviderXAI,
 		InferenceProviderZAI,
+		InferenceProviderZAICoding,
 		InferenceProviderGROQ,
 		InferenceProviderOpenRouter,
 		InferenceProviderLambda,