ant: improve encapsulation

- Replace string literals with package constants for message roles and content types.
- Create UserStringMessage helper function to simplify user message creation
- Replace manual Content creation with ant.StringContent()

Co-Authored-By: sketch <hello@sketch.dev>
diff --git a/ant/ant.go b/ant/ant.go
index 8759883..944abcc 100644
--- a/ant/ant.go
+++ b/ant/ant.go
@@ -504,7 +504,7 @@
 func (c *Convo) SendUserTextMessage(s string, otherContents ...Content) (*MessageResponse, error) {
 	contents := slices.Clone(otherContents)
 	if s != "" {
-		contents = append(contents, Content{Type: ContentTypeText, Text: s})
+		contents = append(contents, StringContent(s))
 	}
 	msg := Message{
 		Role:    MessageRoleUser,
@@ -517,7 +517,7 @@
 	system := []SystemContent{}
 	if c.SystemPrompt != "" {
 		var d SystemContent
-		d = SystemContent{Type: "text", Text: c.SystemPrompt}
+		d = SystemContent{Type: ContentTypeText, Text: c.SystemPrompt}
 		if c.PromptCaching {
 			d.CacheControl = json.RawMessage(`{"type":"ephemeral"}`)
 		}
@@ -1022,3 +1022,11 @@
 	}
 	return err
 }
+
+// UserStringMessage creates a user message with a single text content item.
+func UserStringMessage(text string) Message {
+	return Message{
+		Role:    MessageRoleUser,
+		Content: []Content{StringContent(text)},
+	}
+}