SendChatMessageUseCase.php
- Pfad:
src/UseCases/Chat/SendChatMessageUseCase.php - Namespace: UseCases\Chat
- Zeilen: 152 | Größe: 5,476 Bytes
- Geändert: 2025-12-30 03:15:34 | Gescannt: 2025-12-31 10:22:15
Code Hygiene Score: 100
- Dependencies: 100 (25%)
- LOC: 99 (20%)
- Methods: 100 (20%)
- Secrets: 100 (15%)
- Classes: 100 (10%)
- Magic Numbers: 100 (10%)
Keine Issues gefunden.
Dependencies 9
- constructor Infrastructure\AI\ChatService
- constructor Domain\Repository\ChatSessionRepositoryInterface
- constructor Domain\Repository\ChatMessageRepositoryInterface
- constructor UseCases\Chat\ChatPromptLoader
- constructor Infrastructure\AI\ContentQualityValidator
- use Domain\Repository\ChatMessageRepositoryInterface
- use Domain\Repository\ChatSessionRepositoryInterface
- use Infrastructure\AI\ChatService
- use Infrastructure\AI\ContentQualityValidator
Klassen 1
-
SendChatMessageUseCaseclass Zeile 14
Funktionen 2
-
__construct()public Zeile 16 -
execute()public Zeile 41
Verwendet von 3
- ChatController.php constructor
- ChatController.php use
- ChatServiceProvider.php use
Versionen 27
-
v27
2025-12-29 00:09 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v26
2025-12-29 00:09 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v25
2025-12-29 00:08 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v24
2025-12-29 00:08 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v23
2025-12-28 02:21 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v22
2025-12-28 02:21 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v21
2025-12-28 02:21 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v20
2025-12-28 02:21 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v19
2025-12-28 02:21 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v18
2025-12-28 02:20 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v17
2025-12-28 02:20 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v16
2025-12-27 01:34 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v15
2025-12-25 09:41 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v14
2025-12-25 09:41 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v13
2025-12-23 08:17 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v12
2025-12-23 07:54 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v11
2025-12-23 03:37 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v10
2025-12-23 03:35 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v9
2025-12-23 03:35 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v8
2025-12-23 03:35 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v7
2025-12-23 03:33 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v6
2025-12-23 03:33 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v5
2025-12-23 02:38 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v4
2025-12-23 02:38 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v3
2025-12-23 02:38 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v2
2025-12-22 14:43 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation -
v1
2025-12-22 08:47 | claude-code-hook | modified
Claude Code Pre-Hook Backup vor Edit-Operation
Code
<?php
declare(strict_types=1);
namespace UseCases\Chat;
// @responsibility: Orchestriert Chat-Nachrichten mit AI-Service
use Domain\Repository\ChatMessageRepositoryInterface;
use Domain\Repository\ChatSessionRepositoryInterface;
use Infrastructure\AI\ChatService;
use Infrastructure\AI\ContentQualityValidator;
class SendChatMessageUseCase
{
public function __construct(
private ChatService $chatService,
private ChatSessionRepositoryInterface $sessionRepo,
private ChatMessageRepositoryInterface $messageRepo,
private ChatPromptLoader $promptLoader,
private ContentQualityValidator $qualityValidator
) {
}
/**
* Execute the use case
*
* @param string $sessionUuid Session UUID
* @param string $message User message text
* @param string $model AI model identifier
* @param array<string> $collections Qdrant collections to search
* @param int $contextLimit Number of context chunks
* @param int $authorProfileId Author profile ID (0 = none)
* @param int $systemPromptId System prompt config ID
* @param float $temperature AI temperature setting
* @param int $maxTokens Max tokens for response
* @param int $structureId Output structure ID (0 = frei)
* @param bool $qualityCheck Run quality validation on response
* @return ChatResponse
*/
public function execute(
string $sessionUuid,
string $message,
string $model,
array $collections = ['documents'],
int $contextLimit = 5,
int $authorProfileId = 0,
int $systemPromptId = 1,
float $temperature = 0.7,
int $maxTokens = 4096,
int $structureId = 0,
bool $qualityCheck = false
): ChatResponse {
// 1. Validate session
$session = $this->sessionRepo->findByUuid($sessionUuid);
if ($session === null) {
return ChatResponse::error('Session nicht gefunden.');
}
$sessionId = $session->getId() ?? 0;
// 2. Validate message
$message = trim($message);
if ($message === '') {
return ChatResponse::error('Bitte gib eine Frage ein.');
}
// 3. Save user message
$this->messageRepo->save(
sessionId: $sessionId,
role: 'user',
content: $message,
model: $model
);
// 4. Auto-set title from first message
if ($session->getTitle() === null) {
$title = mb_substr($message, 0, 50) . (mb_strlen($message) > 50 ? '...' : '');
$this->sessionRepo->updateTitle($sessionId, $title);
}
// 5. Get prompts via ChatPromptLoader
$stylePrompt = $this->promptLoader->getStylePrompt($authorProfileId);
$systemPrompt = $this->promptLoader->getSystemPrompt($systemPromptId);
$structurePrompt = $this->promptLoader->getStructurePrompt($structureId);
if ($structurePrompt !== null) {
$systemPrompt = ($systemPrompt ?? '') . "\n\n" . $structurePrompt;
}
// 7. Track timing and get AI response
$startTime = microtime(true);
try {
$result = $this->chatService->chat(
question: $message,
model: $model,
collections: $collections,
limit: $contextLimit,
stylePrompt: $stylePrompt,
customSystemPrompt: $systemPrompt,
temperature: $temperature,
maxTokens: $maxTokens
);
} catch (\Exception $e) {
return ChatResponse::error('Chat-Service Fehler: ' . $e->getMessage());
}
$endTime = microtime(true);
// 8. Prepare sources as JSON strings for storage
/** @var array<int, non-empty-string> $sourcesForStorage */
$sourcesForStorage = array_map(
static fn (array $source): string => json_encode($source, JSON_THROW_ON_ERROR),
$result['sources']
);
// 9. Save assistant message with tracking
$collectionsJson = json_encode($collections);
$this->messageRepo->save(
sessionId: $sessionId,
role: 'assistant',
content: $result['answer'],
model: $model,
tokensInput: $result['usage']['input_tokens'] ?? null,
tokensOutput: $result['usage']['output_tokens'] ?? null,
sources: $sourcesForStorage,
startMicrotime: $startTime,
endMicrotime: $endTime,
authorProfileId: $authorProfileId > 0 ? $authorProfileId : null,
systemPromptId: $systemPromptId > 0 ? $systemPromptId : null,
collectionsJson: $collectionsJson,
contextLimit: $contextLimit
);
// 10. Create response
$response = ChatResponse::fromServiceResponse($result, $endTime - $startTime);
// 11. Run quality validation if enabled
if ($qualityCheck) {
$structureName = $this->promptLoader->getStructureName($structureId);
$validation = $this->qualityValidator->validate(
question: $message,
answer: $result['answer'],
sources: $result['sources'],
structureName: $structureName
);
$response = $response->withQualityValidation($validation);
}
// 12. Return response
return $response;
}
}