diff --git a/CHANGELOG.md b/CHANGELOG.md index 208fdc5..ceffa63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ + +## Version 0.2.0 - 2025-12-20 + +Adds self-mention filtering to prevent reply loops in the MentionBot. Updates the README with the new default model and revised examples. + +**Changes:** 2 files, 30 lines +**Languages:** Markdown (9 lines), Other (21 lines) + ## Version 0.1.0 - 2025-12-20 Adds persistent state management for mention processing, ensuring continuity across application restarts. diff --git a/README.md b/README.md index 0d276b7..8839c6c 100644 --- a/README.md +++ b/README.md @@ -170,7 +170,7 @@ grokii spam -u USERNAME -p PASSWORD -c --debug -l spam.log | Option | Description | Default | |--------|-------------|---------| -| `--model` | OpenRouter model identifier | `x-ai/grok-3-fast-beta` | +| `--model` | OpenRouter model identifier | `x-ai/grok-code-fast-1` | | `--system-prompt` | Custom AI personality prompt | Built-in | | `--max-tokens` | Maximum response length | `500` | | `--temperature` | AI creativity (0.0-2.0) | `0.7` | @@ -200,6 +200,7 @@ Core mention-response logic: - Extracts question text by removing bot @mention - Builds context from rant and recent comments - Coordinates with OpenRouterClient for AI response +- Filters self-mentions from AI responses to prevent self-reply loops - Posts formatted reply via devRant API #### OpenRouterClient.swift @@ -236,20 +237,20 @@ Async-safe logging: ### Default Model -Grokii uses `x-ai/grok-3-fast-beta` by default - xAI's fast inference model optimized for quick, accurate responses. +Grokii uses `x-ai/grok-code-fast-1` by default - xAI's fast inference model optimized for quick, accurate responses. ### Alternative Models Any OpenRouter-supported model can be used: ```bash -grokii chat -u USER -p PASS --model "anthropic/claude-3.5-sonnet" +grokii chat -u USER -p PASS --model "anthropic/claude-4.5-sonnet" grokii chat -u USER -p PASS --model "openai/gpt-4o" grokii chat -u USER -p PASS --model "meta-llama/llama-3.1-70b-instruct" -grokii chat -u USER -p PASS --model "google/gemini-pro-1.5" +grokii chat -u USER -p PASS --model "google/gemini-pro-2.5" ``` ### Temperature Settings diff --git a/Sources/Grokii/MentionBot.swift b/Sources/Grokii/MentionBot.swift index 4245500..e1cc8dc 100644 --- a/Sources/Grokii/MentionBot.swift +++ b/Sources/Grokii/MentionBot.swift @@ -201,8 +201,27 @@ actor MentionBot { return context } + private func filterSelfMentions(from text: String) -> String { + guard let pattern = try? NSRegularExpression( + pattern: "@\(NSRegularExpression.escapedPattern(for: botUsername))", + options: [.caseInsensitive] + ) else { + return text + } + + let range = NSRange(text.startIndex..., in: text) + return pattern.stringByReplacingMatches( + in: text, + options: [], + range: range, + withTemplate: "" + ).replacingOccurrences(of: " ", with: " ") + .trimmingCharacters(in: .whitespaces) + } + private func postReply(rantId: Int, replyTo: String, response: String) async { - let reply = "@\(replyTo) \(response)" + let filteredResponse = filterSelfMentions(from: response) + let reply = "@\(replyTo) \(filteredResponse)" guard !dryRun else { await logger.info("DRY RUN: Would post reply to rant \(rantId):\n\(reply)")