refactor: titles
This commit is contained in:
@@ -1819,107 +1819,6 @@ class ApiService {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Generate title for conversation using dedicated endpoint
|
||||
Future<String?> generateTitle({
|
||||
required String conversationId,
|
||||
required List<Map<String, dynamic>> messages,
|
||||
required String model,
|
||||
}) async {
|
||||
try {
|
||||
debugPrint('DEBUG: Generating title for conversation: $conversationId');
|
||||
|
||||
final response = await _dio.post(
|
||||
'/api/v1/tasks/title/completions',
|
||||
data: {'chat_id': conversationId, 'messages': messages, 'model': model},
|
||||
);
|
||||
|
||||
if (response.statusCode == 200 && response.data != null) {
|
||||
DebugLogger.log('Raw title response received successfully');
|
||||
|
||||
// Parse the complex response structure
|
||||
String? extractedTitle;
|
||||
|
||||
try {
|
||||
final responseData = response.data as Map<String, dynamic>;
|
||||
|
||||
// Check if there's a direct title field
|
||||
if (responseData.containsKey('title')) {
|
||||
extractedTitle = responseData['title']?.toString();
|
||||
}
|
||||
// Check if it's in choices format (OpenAI-style response)
|
||||
else if (responseData.containsKey('choices') &&
|
||||
responseData['choices'] is List) {
|
||||
final choices = responseData['choices'] as List;
|
||||
if (choices.isNotEmpty) {
|
||||
final firstChoice = choices[0] as Map<String, dynamic>;
|
||||
if (firstChoice.containsKey('message')) {
|
||||
final message = firstChoice['message'] as Map<String, dynamic>;
|
||||
final content = message['content']?.toString() ?? '';
|
||||
|
||||
// Extract title from JSON-formatted content
|
||||
if (content.contains('```json') && content.contains('```')) {
|
||||
// Extract JSON from markdown code block
|
||||
final jsonStart = content.indexOf('```json') + 7;
|
||||
final jsonEnd = content.lastIndexOf('```');
|
||||
if (jsonEnd > jsonStart) {
|
||||
final jsonString = content
|
||||
.substring(jsonStart, jsonEnd)
|
||||
.trim();
|
||||
try {
|
||||
final jsonData =
|
||||
jsonDecode(jsonString) as Map<String, dynamic>;
|
||||
extractedTitle = jsonData['title']?.toString();
|
||||
} catch (e) {
|
||||
debugPrint(
|
||||
'DEBUG: Failed to parse JSON from title response: $e',
|
||||
);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Try to parse the content directly as JSON
|
||||
try {
|
||||
final jsonData =
|
||||
jsonDecode(content) as Map<String, dynamic>;
|
||||
extractedTitle = jsonData['title']?.toString();
|
||||
} catch (e) {
|
||||
// If not JSON, use content as-is
|
||||
extractedTitle = content;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Clean up the extracted title
|
||||
if (extractedTitle != null && extractedTitle.isNotEmpty) {
|
||||
// Remove any remaining markdown formatting
|
||||
extractedTitle = extractedTitle
|
||||
.replaceAll(RegExp(r'```.*?```', dotAll: true), '')
|
||||
.trim();
|
||||
extractedTitle = extractedTitle
|
||||
.replaceAll(RegExp(r'^[{"]|["}]$'), '')
|
||||
.trim();
|
||||
|
||||
// Ensure it's not just "New Chat" or empty
|
||||
if (extractedTitle.isNotEmpty && extractedTitle != 'New Chat') {
|
||||
debugPrint(
|
||||
'DEBUG: Successfully extracted title: $extractedTitle',
|
||||
);
|
||||
return extractedTitle;
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint('DEBUG: Error parsing title response: $e');
|
||||
}
|
||||
|
||||
debugPrint('DEBUG: Could not extract valid title from response');
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint('DEBUG: Failed to generate title: $e');
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Send chat completed notification
|
||||
Future<void> sendChatCompleted({
|
||||
required String chatId,
|
||||
|
||||
Reference in New Issue
Block a user