llm: add service.ModelName
diff --git a/llm/ant/ant.go b/llm/ant/ant.go
index d1c366a..efebf26 100644
--- a/llm/ant/ant.go
+++ b/llm/ant/ant.go
@@ -41,6 +41,10 @@
 	MaxTokens int          // defaults to DefaultMaxTokens if zero
 }
 
+func (s *Service) ModelName() string {
+	return cmp.Or(s.Model, DefaultModel)
+}
+
 var _ llm.Service = (*Service)(nil)
 
 type content struct {
diff --git a/llm/gem/gem.go b/llm/gem/gem.go
index 6686058..5f01db7 100644
--- a/llm/gem/gem.go
+++ b/llm/gem/gem.go
@@ -31,6 +31,10 @@
 
 var _ llm.Service = (*Service)(nil)
 
+func (s *Service) ModelName() string {
+	return cmp.Or(s.Model, DefaultModel)
+}
+
 // These maps convert between Sketch's llm package and Gemini API formats
 var fromLLMRole = map[llm.MessageRole]string{
 	llm.MessageRoleAssistant: "model",
diff --git a/llm/llm.go b/llm/llm.go
index 1e53ea3..ba6bd03 100644
--- a/llm/llm.go
+++ b/llm/llm.go
@@ -13,6 +13,8 @@
 type Service interface {
 	// Do sends a request to an LLM.
 	Do(context.Context, *Request) (*Response, error)
+
+	ModelName() string
 }
 
 // MustSchema validates that schema is a valid JSON schema and returns it as a json.RawMessage.
diff --git a/llm/oai/oai.go b/llm/oai/oai.go
index 8b64157..4b046b0 100644
--- a/llm/oai/oai.go
+++ b/llm/oai/oai.go
@@ -225,6 +225,10 @@
 
 var _ llm.Service = (*Service)(nil)
 
+func (s *Service) ModelName() string {
+	return s.Model.UserName
+}
+
 // ModelsRegistry is a registry of all known models with their user-friendly names.
 var ModelsRegistry = []Model{
 	GPT41,