Реалізація AI-асистента для програмування (Code Assist) в мобільному додатку
Мобільний Code Assist — не просто «чат з GPT про код». Це редактор із синтаксичною підсвіткою, автодповненням, поясненням коду та можливістю виконати запрос у контексті відкритого файлу. Цільова аудиторія — мобільні IDE, навчальні платформи, інструменти для code review на телефоні.
Редактор коду: базові вимоги
Стандартний UITextView/EditText для коду не годиться. Потрібна синтаксична підсвітлення, моноширинний шрифт, горизонтальний скролінг та коректна обробка Tab/відступів.
На iOS — Runestone (відкритий, через Tree-sitter граматики) або Sourceful. На Android — CodeEditor від Rosemoe або вбудувати WebView з CodeMirror/Monaco.
// iOS з Runestone
import Runestone
let textView = TextView()
textView.theme = OneDarkTheme()
textView.language = TreeSitterLanguage.swift // або python, js, тощо
textView.font = UIFont.monospacedSystemFont(ofSize: 14, weight: .regular)
textView.showLineNumbers = true
textView.isLineWrappingEnabled = false // горизонтальний скролінг для коду
Tree-sitter граматики доступні для 50+ мов. Підсвітлення працює інкрементально — при зміні рядка перепарсюється тільки змінений участок, не весь файл. Це критично для великих файлів.
AI-частина: контекстні запити
Code Assist повинен розуміти контекст: яка мова відкрита, що знаходиться навколо курсору, який код виділено. Все це йде в промпт.
struct CodeAssistRequest {
let userQuestion: String
let codeContext: CodeContext
}
struct CodeContext {
let language: String
let fullCode: String // весь файл, якщо < 3000 токенів
let selectionStart: Int
let selectionEnd: Int
let cursorLine: Int
var selectedCode: String {
String(fullCode.utf16.prefix(selectionEnd).dropFirst(selectionStart)) ?? ""
}
var surroundingContext: String {
// 50 рядків навколо курсору
let lines = fullCode.components(separatedBy: "\n")
let from = max(0, cursorLine - 25)
let to = min(lines.count, cursorLine + 25)
return lines[from..<to].joined(separator: "\n")
}
}
func buildMessages(for request: CodeAssistRequest) -> [ChatMessage] {
let systemPrompt = """
You are a \(request.codeContext.language) expert. Answer questions about the provided code.
When suggesting code changes, output only the changed code block.
Language: \(request.codeContext.language)
"""
let userMessage = """
Code context:
```\(request.codeContext.language)
\(request.codeContext.surroundingContext)
```
\(request.codeContext.selectedCode.isEmpty ? "" : "Selected code:\n```\n\(request.codeContext.selectedCode)\n```\n")
Question: \(request.userQuestion)
"""
return [
ChatMessage(role: "system", content: systemPrompt),
ChatMessage(role: "user", content: userMessage)
]
}
Парсинг code блоків з відповіді
LLM повертає текст із markdown code блоками. Парсимо та пропонуємо застосувати.
// Android
fun parseCodeBlocks(response: String): List<CodeBlock> {
val regex = Regex("```(\\w+)?\\n([\\s\\S]*?)```")
return regex.findAll(response).map { match ->
CodeBlock(
language = match.groupValues[1].ifEmpty { "plaintext" },
code = match.groupValues[2].trimEnd()
)
}.toList()
}
data class CodeBlock(val language: String, val code: String)
У UI — кнопка «Застосувати» поряд з кожним code блоком. Застосування через replaceSelection() або вставку у конкретну позицію файлу.
Історія чату та багатоходові запити
Один запрос про код рідко достатньо. Потрібна історія діалогу — але не вся, інакше контекст переповнюється.
Стратегія: зберігаємо останні 6 пар запитання/відповідь + оригінальний системний промпт з контекстом файлу. При зміні файлу оновлюємо системний промпт — пересоздаємо історію.
Важливий нюанс: code блоки у відповідях LLM займають багато токенів. При зберіганні історії замінюємо великі code блоки на [code block replaced, N lines] — це зберігає контекст діалогу без раздування запиту.
On-device моделі для коду
Для продуктів, де важлива приватність коду, — Ollama з codellama:7b або qwen2.5-coder:7b на сервері користувача. Повноцінна on-device на мобільному телефоні поки нереалістична для кодових задач — мінімальна робоча модель вимагає ~4 GB RAM.
На iOS 18+ Apple Intelligence надає on-device LLM через Foundation Models, але з обмеженим контекстом та без спеціалізації на коді. Для code assist це не альтернатива cloud API.
Орієнтири за часом
Редактор з підсвіткою + базовий Q&A чат — 1 тиждень. Повноцінний Code Assist з контекстом файлу, парсингом code блоків, застосуванням змін та історією діалогу — 3–4 тижні.







