Реализация 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, etc.
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 недели.







