'text', 'text' => $userPrompt, ]; // Attach files foreach ($fileIds as $fileId) { $content[] = [ 'type' => 'document', 'source' => [ 'type' => 'file', 'file_id' => $fileId, ], ]; } $response = Http::withHeaders([ 'x-api-key' => config('anthropic.api_key'), 'anthropic-version' => config('anthropic.api_version', '2023-06-01'), 'anthropic-beta' => 'files-api-2025-04-14', 'Content-Type' => 'application/json', ])->post(config('anthropic.base_url') . '/v1/messages', [ 'model' => config('anthropic.default_model', 'claude-sonnet-4-5-20250929'), 'max_tokens' => 16384, 'messages' => [ [ 'role' => 'user', 'content' => $content, ], ], ]); return $response->json(); } catch (\Illuminate\Http\Client\ConnectionException $exception) { $error = 'Failed to connect to Claude API'; throw new ConnectionErrorException( $error, $exception->getMessage(), $userPrompt, $exception->getTraceAsString() ); } catch (\Exception $exception) { throw new MalformedRequestException( 'Unable to get correct response from Claude API: ' . $exception->getMessage() ); } } }